2012-05-09 10 views
9

Weiß jemand, ob es eine Möglichkeit gibt, herauszufinden, ob ein bestimmter Speicherort auf dem Dateisystem unter der Sandbox verfügbar ist?Mac Sandbox: Testen, ob auf eine Datei zugegriffen werden kann

Ich möchte testen, ob eine bestimmte Datei unter den normalen Powerbox-Regeln zugänglich ist; das ist bereits in der Power-Box mit dem Öffnen/Speichern-Dialog, etc.

Kann ich dies vor auslösen eine Sandbox-Ausnahme?

Kann ich fangen eine Sandbox-Ausnahme?

Mit freundlichen Grüßen,

Frank

+0

Ich bin neugierig, warum Sie testen möchten, ob ein Standort zugänglich ist. Normalerweise geben Sie * an, auf welche Speicherorte in den Berechtigungen zugegriffen werden kann, und erhalten dann über das Feld zum Öffnen/Speichern Zugriff auf andere Dateien. –

Antwort

9

Sie das OS access() Systemaufruf für einen schnellen und einfachen Test verwenden können, von man access:

#include <unistd.h>

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

Die access() - Funktion prüft die Erreichbarkeit der Datei mit dem Pfad für die von amode angegebenen Zugriffsberechtigungen. Der Wert von amode ist der bitweise inklusive OR der zu prüfenden Zugriffsrechte (R_OK für Leseberechtigung, W_OK für Schreibberechtigung und X_OK für Ausführen/Suche Erlaubnis) oder der Existenztest, F_OK. Alle Komponenten des Pfadnamens Pfad werden auf Zugriffsberechtigungen überprüft (einschließlich F_OK).

Wenn der Pfad nicht oder, wenn eine der gewünschten Zugriffsmodi gewährt würde nicht gefunden werden, dann wird ein Wert von -1 zurückgegeben und der globalen Integer-Variable errno gesetzt, um den Fehler anzuzeigen. Andernfalls wird ein 0-Wert zurückgegeben.

Sie könnten ziemlich hoch diese für Objective-C mit so etwas wie:

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

Woher wissen Sie, dass dies mit Powerbox Einschränkungen funktioniert? Dies sind keine traditionellen Unix-Zugriffsrechte, weißt du ... (Annahme # 1: der Pfad wäre der gleiche, Annahme # 2: Fehler würde das Programm nicht beenden) –

+0

Nun, ich habe es versucht und es funktioniert gut. Die Sandbox fängt Aufrufe auf Unix-Ebene ab und es sieht so aus, als ob die Überprüfung keine Sandbox-Nachrichten auslöst. Ausgezeichnet! Tausend Dank. –

+0

@DietrichEpp - Die Sandbox funktioniert auf Betriebssystemebene; d. h. "unter" Cocoa, Posix, Mach usw. Aufrufe wie 'access()' berücksichtigen die Beschränkungen, die durch die Sandbox, durch ACLs und durch die traditionellen Unix-RWX-Einstellungen auferlegt werden. – CRD

2

ein paar Dinge. Verwenden Sie fileSystemRepresentation immer dann, wenn Sie eine Pfadzeichenfolge benötigen. Außerdem ist R_OK ausreichend, wenn Sie nur wissen möchten, ob für den angegebenen Pfad ein Loch in der Sandbox vorhanden ist.

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