Mac沙盒:测试文件是否可访问

11

有人知道如何查找特定文件系统位置是否在沙盒下可以访问吗?

我想测试特定文件是否在正常的Powerbox规则下可访问;也就是已经使用打开/保存对话框等添加到power box中。

我能在触发沙盒异常之前做到这一点吗?

我能捕获沙箱异常吗?

最好的问候,

弗兰克


我很好奇你为什么想要测试一个位置是否可访问。通常,您需要在授权文件中指定可访问的位置,然后通过打开/保存对话框来访问其他文件。 - Dietrich Epp
2个回答

11
您可以使用操作系统的access()系统调用进行快速且简单的测试,man access 中有详细说明:

#include <unistd.h>

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

access()函数检查由path命名的文件对于amode指定的访问权限的可访问性。 amode的值是要检查的访问权限(读取权限的R_OK,写入权限的W_OK和执行/搜索权限的X_OK)或存在性测试F_OK的按位包含OR。路径名path的所有组件都将用于访问权限检查(包括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:失败不会终止程序) - Dietrich Epp
好的,我尝试了一下,它运行得很好。沙盒确实拦截了Unix级别的调用,而且看起来检查也没有触发任何sandboxd消息。太棒了!非常感谢。 - Frank R.
@DietrichEpp - 沙盒在操作系统级别运行;即在 Cocoa、Posix、Mach 等“之下”。像 access() 这样的调用会考虑到沙盒、访问控制列表(ACLs)和传统的 Unix rwx 设置所施加的限制。 - CRD
@CRD:我只是想知道这个在哪里有文档记录,因为我找不到它。 - Dietrich Epp
@DietrichEpp - 我不知道它是否直接记录为这样,但沙盒文档将很难填满一整个书架;-) 由于它是操作系统的一部分,它作为所有系统调用和库API的基础。当然,并非所有库API都会产生“沙盒化”的结果,但没有一个应该绕过沙盒限制(尽管沙盒肯定不是无错误的)。对于像访问这样的系统调用来说,产生错误答案几乎会在沙盒模式下破坏操作系统。 - CRD

3
一些事情。在需要路径字符串时,始终使用fileSystemRepresentation。此外,如果您只想知道指定路径的沙盒中是否有空洞,则R_OK就足够了。
-(BOOL)isAccessibleFromSandbox:(NSString*)path
{
    return( access( path.fileSystemRepresentation, R_OK) == 0 );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接