2012-05-09 8 views
9

¿Alguien sabe si hay alguna manera de averiguar si una ubicación particular del sistema de archivos está accesible en la zona de pruebas?Mac Sandbox: prueba si se puede acceder a un archivo

Quiero probar si un archivo en particular es accesible bajo las reglas normales de Powerbox; que ya se ha agregado a la caja de alimentación mediante el cuadro de diálogo abrir/guardar, etc.

¿Puedo hacer esto antes de activando una excepción del espacio aislado?

¿Puedo captura a sandbox exception?

Saludos,

Frank

+0

Tengo curiosidad por qué quieres probar si se puede acceder a una ubicación. Normalmente, * especifica * qué ubicaciones son accesibles en las autorizaciones, y luego obtiene acceso a otros archivos a través del cuadro abrir/guardar. –

Respuesta

9

Puede utilizar la llamada OS access() sistema para una prueba rápida y sencilla, desde man access:

# include <unistd.h>

acceso int (const char * path, int amode);

La función access() comprueba la accesibilidad del archivo denominado por la ruta para los permisos de acceso indicados por amode. El valor de amode es O incluido en términos de bits de los permisos de acceso a comprobar (R_OK para permiso de lectura, W_OK para permiso de escritura y X_OK para permiso de ejecución/búsqueda ) o la prueba de existencia, F_OK. Se comprueban los permisos de acceso de todos los componentes de la ruta (incluido F_OK).

Si la ruta no se encuentra o si cualquiera de los modos de acceso deseados no se concedería , a continuación, se devuelve un valor -1 y lo global variable entera errno se establece para indicar el error. De lo contrario, se devuelve un valor 0.

Se podía bastante esto para Objective-C usando algo como:

typedef enum 
{ 
    ReadAccess = R_OK, 
    WriteAccess = W_OK, 
    ExecuteAccess = X_OK, 
    PathExists = F_OK 
} AccessKind; 


BOOL isPathAccessible(NSString *path, AccessKind mode) 
{ 
    return access([path UTF8String], mode) == 0; 
} 
+0

¿Cómo sabes que esto funciona con restricciones de Powerbox? Estos no son derechos de acceso a Unix tradicionales, ya sabes ... (suposición n. ° 1: la ruta sería la misma, suposición n. ° 2: la falla no daría por terminado el programa) –

+0

Bueno, lo probé y funciona bien. El Sandbox intercepta las llamadas de nivel de Unix y parece que el control tampoco desencadena ningún mensaje de espacio aislado. ¡Excelente! Un millón de gracias. –

+0

@DietrichEpp - El sandbox opera en el nivel del sistema operativo; es decir, "debajo" de Cocoa, Posix, Mach, etc. Las llamadas como 'access()' tienen en cuenta las restricciones impuestas por el sandbox, por las ACL y por las configuraciones tradicionales de Unix rwx. – CRD

2

algunas cosas. Siempre use fileSystemRepresentation cuando necesite una cadena de ruta. Además, R_OK es adecuado si solo quieres saber si hay un agujero en la caja de arena para la ruta especificada.

-(BOOL)isAccessibleFromSandbox:(NSString*)path 
{ 
    return(access(path.fileSystemRepresentation, R_OK) == 0); 
} 
Cuestiones relacionadas