2012-05-09 24 views
9

Có ai biết liệu có cách nào để tìm hiểu xem một vị trí hệ thống tệp cụ thể có thể truy cập được dưới hộp cát không?Mac Sandbox: kiểm tra xem một tệp có thể truy cập được không

Tôi muốn kiểm tra xem một tệp cụ thể có thể truy cập được theo các quy tắc Powerbox thông thường hay không; đã được thêm vào hộp nguồn bằng hộp thoại mở/lưu, v.v.

Tôi có thể làm điều này trước khi kích hoạt ngoại lệ sandbox?

Tôi có thể bắt ngoại lệ sandbox không?

Trân trọng,

Frank

+0

Tôi tò mò tại sao bạn muốn kiểm tra xem có thể truy cập vị trí hay không. Thông thường, bạn * chỉ định * vị trí nào có thể truy cập trong các quyền, và sau đó nhận quyền truy cập vào các tệp khác thông qua hộp mở/lưu. –

Trả lời

9

Bạn có thể sử dụng hệ điều hành access() gọi hệ thống cho một thử nghiệm nhanh chóng và đơn giản, từ man access:

#include <unistd.h>

int truy cập (const char * path, int amode);

Chức năng truy cập() kiểm tra khả năng truy cập của tệp có tên theo đường dẫn cho quyền truy cập được chỉ định bởi amode. Giá trị của amode là bao gồm bit hoặc OR của các quyền truy cập cần được kiểm tra (R_OK cho quyền đọc, W_OK cho phép ghi và X_OK để thực thi/tìm kiếm sự cho phép ) hoặc kiểm tra sự tồn tại, F_OK. Tất cả các thành phần của đường dẫn đều được chọn cho các quyền truy cập (bao gồm F_OK).

Nếu không tìm thấy đường dẫn hoặc nếu bất kỳ chế độ truy nhập mong muốn nào không được cấp thì giá trị -1 được trả về và biến số nguyên chung errno được đặt để cho biết lỗi. Nếu không, giá trị 0 sẽ được trả về.

Bạn khá này lên cho Objective-C có thể sử dụng một cái gì đó như:

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

Làm thế nào để bạn biết điều này làm việc với các hạn chế Powerbox? Đây không phải là quyền truy cập Unix truyền thống, bạn biết đấy ... (giả định # 1: đường dẫn sẽ giống nhau, giả định # 2: thất bại sẽ không chấm dứt chương trình) –

+0

Vâng, tôi đã thử nó và nó hoạt động tốt. Sandbox chặn các cuộc gọi cấp unix và có vẻ như kiểm tra không kích hoạt bất kỳ tin nhắn sandboxd nào. Xuất sắc! Cảm ơn rất nhiều. –

+0

@DietrichEpp - Hộp cát hoạt động ở cấp hệ điều hành; tức là "bên dưới" Cocoa, Posix, Mach, vv Các cuộc gọi như 'truy cập()' tính đến các hạn chế áp đặt bởi sandbox, bởi ACL, và bởi các thiết lập rwx Unix truyền thống. – CRD

2

Một vài điều. Luôn sử dụng fileSystemRepresentation khi bạn cần một chuỗi đường dẫn. Ngoài ra, R_OK là đủ nếu bạn chỉ muốn biết nếu có một lỗ trong hộp cát cho đường dẫn đã chỉ định.

-(BOOL)isAccessibleFromSandbox:(NSString*)path 
{ 
    return(access(path.fileSystemRepresentation, R_OK) == 0); 
} 
Các vấn đề liên quan