Mac Sandbox:测试文件是不是可访问
Posted
技术标签:
【中文标题】Mac Sandbox:测试文件是不是可访问【英文标题】:Mac Sandbox: testing whether a file is accessibleMac Sandbox:测试文件是否可访问 【发布时间】:2012-05-09 09:02:49 【问题描述】:有人知道是否有办法查明在沙盒下是否可以访问特定的文件系统位置?
我想测试在正常的 Powerbox 规则下是否可以访问特定文件;即已使用打开/保存对话框等添加到电源盒中。
我可以在触发沙盒异常之前执行此操作吗?
我可以捕获沙盒异常吗?
最好的问候,
弗兰克
【问题讨论】:
我很好奇您为什么要测试某个位置是否可访问。通常,您指定在权利中可以访问哪些位置,然后通过打开/保存框访问其他文件。 【参考方案1】:您可以使用操作系统access()
系统调用进行快速简单的测试,来自man access
:
#include
int access(const char *path, int amode);
access() 函数检查以路径命名的文件的可访问性 amode 指示的访问权限。 amode 的值为 要检查的访问权限的按位或运算(R_OK 为 读权限,W_OK 写权限,X_OK 执行/搜索 许可)或存在测试,F_OK。路径名的所有组成部分 路径检查访问权限(包括 F_OK)。
如果找不到路径或任何所需的访问模式无法找到 被授予,然后返回 -1 值和全局整数变量 errno 设置为指示错误。否则,返回 0 值。
您可以使用以下方式为 Objective-C 美化这个:
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;
【讨论】:
你怎么知道这适用于 Powerbox 限制?这些不是传统的 Unix 访问权限,你知道...(假设 #1:路径相同,假设 #2:失败不会终止程序) 嗯,我试过了,效果很好。沙盒确实拦截了 unix 级别的调用,并且看起来检查也不会触发任何沙盒消息。优秀的!谢谢一百万。 @DietrichEpp - 沙盒在操作系统级别运行;即“低于” Cocoa、Posix、Mach 等。像access()
这样的调用考虑了沙箱、ACL 和传统 Unix rwx 设置施加的限制。
@CRD:我只是想知道这是在哪里记录的,因为我找不到它。
@DietrichEpp - 我不知道它是否直接记录在案,但是沙盒文档几乎不会填满书架;-) 由于它是操作系统的一部分,它是所有系统调用和库 API。当然,并非所有库 API 都会产生“沙盒化”结果,但没有一个应该绕过沙盒限制(尽管沙盒肯定不是没有错误的)。对于系统调用,例如访问,产生错误的答案几乎会破坏沙盒模式下的操作系统。【参考方案2】:
一些事情。当您需要路径字符串时,请始终使用 fileSystemRepresentation。此外,如果您只想知道指定路径的沙箱中是否存在漏洞,R_OK 就足够了。
-(BOOL)isAccessibleFromSandbox:(NSString*)path
return( access( path.fileSystemRepresentation, R_OK) == 0 );
【讨论】:
以上是关于Mac Sandbox:测试文件是不是可访问的主要内容,如果未能解决你的问题,请参考以下文章
Mac App Store Sandbox - 安装用户脚本?
Mac OSX Cocoa App:是不是可以让您的 App 使用 san francisco 字体(用于 Apple Watch 的字体)?