Dateien Kopieren und Sandboxing

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Dateien Kopieren und Sandboxing

    Hallo,

    nach einem halben Jahr Entwicklung habe ich nun meine erste OS X App fertig.
    Nun habe ich die App im Store eingereicht und sie wurde erstmal abgelehnt weil Sandboxing nicht aktiviert war.
    Gut Sandboxing aktiviert und "User Selected File" markiert. Nun funktioniert meine App natürlich nicht mehr ;D.
    Eine Grundfunktion meiner App ist das Kopieren/Verschieben von Dateien.
    Das Funktioniert auch sehr gut solange man, nachdem aktivieren der Sandbox Funktion, die App nicht neu startet.
    Nachdem Neustart der App funktioniert die Kopierfunktion aber nichtmehr.

    Ich verwende für das Kopieren copyfile(3) und für das verschieben NSFileManager.
    Befindet sich beim verschieben der Source und Destination path auf einem anderen Laufwerk so wird ebenfalls copyfile(3) genutzt.

    In der Konsole Applikation steht folgende Fehlermeldung:
    sandboxd: open on "path" Operation not permitted
    und
    sandboxd: deny file-write-create "path"

    Also verhindert das "nette" Sandbox feature das mein Programm korrekt läuft.
    Was genau muss ich ändern oder beachten damit die Kopierfunktion wieder funktioniert?
    Ich habe mir einige Artikel über Sandboxing durchgelesen finde aber keine Möglichkeit zur Lösung.

    Der Benutzer bestimmt welche Dateien Kopiert werden, also hat der Nutzer volle Entscheidungsgewalt.
    Das heißt auch das er den Source und Destination path bestimmt. Egal ob von einer CD/DVD, USB, HDD, oder Netzwerk source.

    mfg.Jan
  • Google mal nach "NSURL security-scoped bookmark". Das könnte helfen. Ansonsten kann es durchaus sein, dass es Anwendungsfälle gibt, die in der Sandbox einfach nicht möglich sind. Wenn das bei Dir der Fall ist: Pech gehabt. Oder drüber nachdenken, dass Programm evtl. aufzuteilen in einen Sandbox-Teil und einen anderen und mit RPC oder so zu kommunizieren.

    schönen Gruß

    Christian
  • Danke für die Antwort.
    Ich habe das getestet und festgestellt das ich trotz security scope URL Bookmark kein recht habe auf ein Folder zuzugreifen. Auf eine Einzelne File aber keine Probleme damit habe.

    Komisch ist aber das beim ersten Start der App wenn der Nutzer über Drag n' Drop einen Speicher Ordner festlegt, die kopierfunktion funktioniert. Das liegt
    wahrscheinlich daran das der Nutzer im falle des Drag n' Drop automatisch der App das Recht gibt in dem gerade hinzugefügten Ordner zu schreiben.
    Bei einem Neustart der App ist der Ordner immer noch als Speicherort festgelegt aber die Berechtigung scheint nicht mehr vorhanden zu sein. Ich denke mal das ich den Security Token der beim erstellen einer security scope URL Bookmark erzeugt wird, speichern und beim Neustart wiederherstellen muss.

    Aber seltsam das der erste Kopiervorgang nach dem Hinzufügen des Ordners auch ohne security scope URL Bookmark funktioniert.

    Ich schau es mir die Tage mal an.
  • Hallo,
    ich hab das jetzt hinbekommen, danke schonmal, aber ein kleiner Fehler ist noch geblieben.
    Und zwar kann der Nutzer einen Speicherordner per Drag n' Drop festlegen.
    Daraufhin baut mein Programm ein Folder Tree auf.
    Dieser Tree geht runter bis zum root.

    /
    |->/Users
    -|-> /testUser
    --|-> /Downloads
    ---|-> /Used
    -----|-> /Test Copy //
    Zielordner

    Ich erstelle mit dem Ordner "Test Copy" ein Security Bookmark, dass funktioniert ohne Probleme.
    Wenn ich aber einen Security Bookmark für den Ordner "Used" erstellen will bekomm ich wieder die Sandbox Meldung deny file read data.

    Ich kann mir das wieder nur so erklären das der Ordner der Hinzugefügt wurde per Drag n' Drop (in dem fall der Ordner "Test Copy") vom Benutzer
    direkt hinzugefügt wurde und es deshalb geht. Die Pfade der darüber liegenden Ordner erzeuge ich durch die NSString Funktion - (NSArray *)pathComponents.

    Wenn das nicht möglich ist aus den darüber liegenden Ordner ein Security Bookmark zu erstellen, müsste ich meine App stark beschneiden. Das will ich aber nur ungern tun ;D.

    mfg.Jan
  • Wenn der User dir nur erlaubt hat in TestCopy zu lesen und zu schreiben, dann ist es doch selbstverständlich das Du nicht einfach die Parent-Ordner davon benutzen darfst. Das würde das Sandboxing ja ad absurdum führen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Du kannst (*) Dir die Bookmarks irgendwo abspeichern und nach dem erneuten Öffnen Deiner Anwendung wieder einlesen und daraus eine URL erzeugen. Mit dieser URL kannst Du dann (je nachdem) das Ziel lesen und oder schreiben. Das geht aber nicht für den ganzen Pfad, sondern nur für das letzte Element (logisch). Wichtig ist auch, dass Du vor Benutzung der URL diese mit "startAccessingSecurityScopedResource" sozusagen öffnest und anschliessend mit "stop..." wieder sperrst.

    Apropos "sperren", das ganze API ist (wie ich finde) etwas sperrig und wenn's nicht klappt ist es oft nicht gleich offensichtlich warum.

    schönen Gruß

    gandhi
    (*) Nein, wahrscheinlich musst Du sogar ;)