如何将数据写入沙箱外部的/ usr / libexec / cups / filter /

问题描述 投票:0回答:1

我在沙箱中有一个应用程序(用于App Store部署),需要将一个文件安装到/ usr / libexec / cups / filter /中,将两个文件安装到/ private / etc / cups /中。此安装不是定期完成,而是从UI执行时。当要求“完全磁盘访问”或通过其他方式时,这可能吗?

    var inFilePath = Bundle.main.url(forResource: "thnucups", withExtension: nil, subdirectory: "thnuclnt/x86_64-darwin")!

    let inFile: FileHandle? = try! FileHandle(forReadingFrom: inFilePath)

    let data = inFile?.readDataToEndOfFile()

    inFile?.closeFile()

    var destPath = "/usr/libexec/cups/filter/test";

    let outFileUrl = URL(fileURLWithPath: destPath)

    FileManager.default.createFile(atPath: destPath, contents: nil, attributes: nil)

    let outFile: FileHandle? = try! FileHandle(forWritingTo: outFileUrl)

    outFile?.write(data!)

    outFile?.closeFile()

让outFile:FileHandle? =尝试! FileHandle(forWritingTo:outFileUrl)引发以下异常:

2019-07-29 15:16:46.985094 + 0200 ezeep Connector for macOS [33450:488523]致命错误:'尝试!'表达式意外引发错误:Error Domain = NSCocoaErrorDomain Code = 4“文件“ test”不存在”。 UserInfo = {NSFilePath = / usr / libexec / cups / filter / test,NSUnderlyingError = 0x600000c5e610 {Error Domain = NSPOSIXErrorDomain代码= 2“没有这样的文件或目录”}}:文件/ Users / rwelz / Documents / Develop / PROJEKTE / ThinPrint / in适用于macOS的GIT / ThinPrint / EZEEP / Xcode / ezeep连接器/适用于macOS / ezDeep连接器/AppDelegate.swift,行146


现在带有:

    let dialog = NSOpenPanel()

    dialog.allowsMultipleSelection = false
    dialog.canCreateDirectories = false
    dialog.canChooseDirectories = true
    dialog.canChooseFiles = false

    dialog.begin
    { (result) -> Void in
        if result == .OK
        {
            let url = dialog.url

            do
            {
                try data?.write(to: outFileUrl)
            }
            catch
            {
                print("Error: Exception caught: " + error.localizedDescription)

            }
        }
    }

我不再遇到异常,但是由于/ usr / libexec / cups / filter具有drwxr-xr-x根轮(没有以root身份运行时没有写访问权限),我得到“您没有权限将文件“ test”保存在文件夹过滤器中]

我需要以root用户身份运行,这在沙箱中是不允许的。

还有其他想法吗?

罗伯特

swift macos appstore-sandbox
1个回答
0
投票

我决定构建一个pkg安装程序,该安装程序可以从沙盒应用程序中的菜单项保存到磁盘。当应用程序首次启动时,还会提供保存对话框。然后,用户必须打开pkg并以admin身份验证才能开始安装。在pkg的postflight脚本中,它将Apple事件发送到应用程序(osascript -e'告诉应用程序PATH到start_action的路径,以使应用程序知道它可以继续进行。

实际上,安装程序将虚拟ppd和cups过滤器一起安装到/ Library / Printers / PPDs / Contents / Resources /中,我的应用程序查询该打印机驱动程序的cups(分别为ppd),以确保/ usr / libexec / cups / filer / my_filter已安装。

现在让我们在查看我的应用程序时看看苹果对解决方案有何看法;)

© www.soinside.com 2019 - 2024. All rights reserved.