как записать данные в /usr/libexec/cups/filter/ вне песочницы

У меня есть приложение в песочнице (для развертывания в App Store), которому необходимо установить один файл в /usr/libexec/cups/filter/ и два файла в /private/etc/cups/ . Эта установка выполняется не регулярно, а при выполнении из пользовательского интерфейса. Возможно ли это при запросе «Полный доступ к диску» или другими способами?

    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()

let outFile: FileHandle? = попробуй! FileHandle(forWritingTo: outFileUrl) выдает следующее исключение:

2019-07-29 15:16:46.985094+0200 ezeep Connector для macOS [33450:488523] Неустранимая ошибка: «попробуйте!» выражение неожиданно вызвало ошибку: Error Domain=NSCocoaErrorDomain Code=4 «Файл «тест» не существует». UserInfo={NSFilePath=/usr/libexec/cups/filter/test, NSUunderlyingError=0x600000c5e610 {Домен ошибки=NSPOSIXErrorDomain Code=2 "Нет такого файла или каталога"}}: файл /Users/rwelz/Documents/Develop/PROJEKTE/ThinPrint /in GIT/ThinPrint/EZEEP/Xcode/ezeep Connector для macOS/ezeep Connector для macOS/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), я получаю «У вас нет разрешения на сохранение файл "тест" в папке filter"

Мне нужно запустить как root, что не разрешено в песочнице.

Любые другие идеи?

с уважением Роберт


person Robert    schedule 29.07.2019    source источник
comment
Кстати: ls -l /usr/libexec/cups is drwxr-xr-x 24 root wheel 768B 29 июля 16:13 filter/ и ls -l /private/etc/cups drwxr-xr-x 14 root _lp 448B 7 июня 08 :12 чашек/   -  person Robert    schedule 29.07.2019


Ответы (1)


Я решил создать установщик pkg, который можно сохранить на диск из пункта меню в моем изолированном приложении. Диалоговое окно сохранения также предлагается при первом запуске приложения. Затем пользователь должен открыть пакет и авторизоваться как администратор, чтобы начать установку. В сценарии postflight pkg он отправляет приложению событие Apple ( osascript -e 'указать ПУТЬ приложения к start_action', чтобы сообщить приложению, что оно может продолжать работу.

На самом деле установщик устанавливает фиктивный ppd вместе с фильтром cups в /Library/Printers/PPDs/Contents/Resources/, и мое приложение запрашивает cups для этого драйвера принтера (соответственно ppd), чтобы убедиться, что /usr/libexec/cups/filer /мой_фильтр установлен.

Теперь давайте посмотрим, что Apple думает об этом решении при рассмотрении моего приложения;)

person Robert    schedule 28.11.2019