MacOS créer un dossier dans /Library/Application Support

Bonjour
Je cherche à partager un fichier pour toutes les sessions utilisateurs du MAC
D'après la doc et sauf erreur de ma part /library/Application Support serait l'emplacement idéal
Je vais donc créer depuis mon application lors de son premier lancement un sous dossier avec le nom de mon application et c'est la que ca coince
Je suis confronté à un problème de droits et je ne sais pas comment m'y prendre ( si ce n'est créer le dossier manuellement depuis le Finder )
Si je créer le dossier principal depuis le Finder, il me demande bien mon mot de passe et crée le dossier
Comment faire par programmation ?
Ah, pour l'accès j'utilise:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSLocalDomainMask,YES);
Si j'utilise le mask NSUserDomainMask je n'ai pas de soucis, mais ce n'est pas ce que je souhaite
Merci par avance pour vos idées

Réponses

  • Pour commencer, quand tu dis Je suis confronté à un problème de droits as-tu un message d'erreur à nous montrer ?
    D'une manière générale tu trouveras surement la réponse à tes question dans ce poste de blog.

  • CéroceCéroce Membre, Modérateur

    C'est le sandboxing qui t'en empêche. Normalement, l'appli est restreinte à son dossier dans ~/Library/Application Support et quelques autres chemins (je ne me souviens plus lesquels).

    À mon avis, pour faire cela, tu seras obligé de demander à l'utilisateur de choisir le dossier avec un NSOpenPanel.
    En passant par le panneau de sélection, le système enregistre que l'utilisateur a donné l'accès à l'application, et l'appli peut sortir de la sandbox.

  • @Pyroh a dit :
    Pour commencer, quand tu dis Je suis confronté à un problème de droits as-tu un message d'erreur à nous montrer ?
    D'une manière générale tu trouveras surement la réponse à tes question dans ce poste de blog.

    Merci pour le lien, je vais creuser.
    Oui j'ai le message d'erreur:
    Printing description of erroCreateDirectory:
    Error Domain=NSCocoaErrorDomain Code=513 "Vous n’êtes pas autorisé à enregistrer le fichier « XXXXX » dans le dossier « Application Support

  • @Céroce a dit :
    C'est le sandboxing qui t'en empêche. Normalement, l'appli est restreinte à son dossier dans ~/Library/Application Support et quelques autres chemins (je ne me souviens plus lesquels).

    À mon avis, pour faire cela, tu seras obligé de demander à l'utilisateur de choisir le dossier avec un NSOpenPanel.
    En passant par le panneau de sélection, le système enregistre que l'utilisateur a donné l'accès à l'application, et l'appli peut sortir de la sandbox.

    Merci pout ta réponse
    Je pensais au sandboxing et j'ai ajouté le sandbox et coché des droits mais il n'y a pas le Library/Application Support
    Si je laisse choisir le dossier, les utilisateurs feront n'importe quoi et leur dire d'aller chercher le dossier Application Support va être compliqué ...

  • CéroceCéroce Membre, Modérateur

    Les utilisateurs n'ont pas besoin d'aller chercher le dossier, tu peux ouvrir le NSOpenPanel sur le bon chemin et leur demander de sélectionner le dossier.
    Il y a des logiciels qui le font. J'admets que c'est une solution compliquée, mais tu n'as pas vraiment le choix.

    Peux-tu nous dire pourquoi tu veux accéder au dossier pour tous les utilisateurs ? Peut-être y a-t-il des solutions alternatives.

  • TiSiAiTiSiAi Membre
    août 2020 modifié #7

    @Céroce a dit :
    Les utilisateurs n'ont pas besoin d'aller chercher le dossier, tu peux ouvrir le NSOpenPanel sur le bon chemin et leur demander de sélectionner le dossier.
    Il y a des logiciels qui le font. J'admets que c'est une solution compliquée, mais tu n'as pas vraiment le choix.

    Peux-tu nous dire pourquoi tu veux accéder au dossier pour tous les utilisateurs ? Peut-être y a-t-il des solutions alternatives.

    Merci pour ta réponse.
    Je vais essayer ta méthode, ca sera tout de même plus simple, que de demander à l'utilisateur de créer lui même le dossier. J'avais lancé le Finder sur Application Support et je lui aurais demandé de créer le dossier.
    J'ai remarqué qu'une fois le dossier principal crée, l'application avait les droits de créer des sous dossiers et fichiers normalement ...
    Le but est de partager une base de données SQLITE pour toutes les sessions utilisateurs.
    Les personnes sont amenées à avoir chacune leur session et ses propres documents mais elles doivent accéder depuis le logiciel à des données communes

    [EDIT]
    autre soucis même sans le SandBox:
    Si je crée le dossier principal à la main, l'application peut créer les sous dossier mais le propriétaire des dossiers crées et fichiers crées restent l'utilisateur qui a lancé l'application la première fois.
    Du coup, la base de données est en lecture seule pour les autres utilisateurs.
    Je peux encore changer les attributs après coup mais ca devient compliqué car j'aurai ensuite des autres fichiers et dossiers à créer, donc le propriétaire des fichiers sera figé et sur les autres sessions je serai en lecture seule ..

    Du coup, quelle serait la meilleure méthode pour que différentes sessions puis lire et écrire des données avec une application ?
    Je dois mal m'y prendre...
    Je voudrais en gros un joli dossier partagé et que tout ce qui est dedans soit accessibles à tous les utilisateurs du MAC
    J'avais à l'époque tenté le dossier partagé et j'avais les même soucis sur les accès en écriture d'une session à l'autre n'étant pas le propriétaire ....
    [EDIT]

    Merci par avance

  • PyrohPyroh Membre
    août 2020 modifié #8

    Alors tout ça va pouvoir se solutionner avec les attributs de fichier. La solution la plus simple et de donner accès en lecture/écriture à tout le monde sur ces fichiers.
    Pour ça on va utiliser l'attribut posixPermissions et le mettre à rw-rw-rw ou 666. En code ça donne ça :

    let path = /* Chemin vers ton fichier ou dossier */
    
    do {
        var attributes = try FileManager.default.attributesOfItem(atPath: path)
        attributes[.posixPermissions] = NSNumber(integerLiteral: 666)
        try FileManager.default.setAttributes(attributes, ofItemAtPath: path)
    } catch {
        fatalError(error.localizedDescription)
    }
    

    C'est juste pour les fichiers déjà créés après normalement tous les utilisateurs auront accès aux fichier/dossiers.
    À la création tu peux utiliser createDirectory(at url: URL, withIntermediateDirectories createIntermediates: Bool, attributes: [FileAttributeKey : Any]? = nil) en passant [.posixPermissions: NSNumber(integerLiteral: 666)] à attributes.

    C'est une solution après tu peux aussi regarder du côté du groupe everyone ou staff et jouer avec les permissions de groupe de tes fichiers.

  • TiSiAiTiSiAi Membre
    août 2020 modifié #9

    Merci pour ta réponse @Pyroh et pour tout le détail.
    Tu confirmes ce que j'ai commencé à expérimenter.
    Pour la base de données, ca fonctionne bien et un utilisateur invité sur une autre session y a bien accès en lecture écriture.
    Il me reste par contre un autre soucis, le logiciel créer aussi des dossier pour y stocker divers documents.
    J'ai utilisé la même méthode avec l'affectation des attributs mais si le logiciel est lancé sur une session où l'utilisateur n'est pas administrateur alors les permissions ne sont fixées que sur l'utilisateur et pas sur les autres groupes ( logique dans un sens bien qu'il est le propriétaire à la création alors pourquoi refuser de donner des droits à d'autres en même temps )
    J'ai tenté de forcer également les permissions si le logiciel est ensuite lancé sur une session utilisateur où ce dernier est admin mais les droits ne sont pas fixés vu qu'il n'a pas les droits.
    Pour résumer, partager la base fonctionnera si l'utilisateur Admin lance le logiciel pour la première fois et crée les fichiers et dossiers.
    Il me reste à trouver une astuce pour les dossiers qui seront crées à l'utilisation du logiciel par un utilisateur normal.
    Les utilisateurs qui seront amené à utiliser le logiciel ne maitriseront vraiment pas l'environnement donc je dois faire en sorte qu'il lance le logiciel et ne se soucie de rien.
    Merci encore pour ta réponse, c'est super sympa
    [EDIT]
    Problème des droits sur la création des dossiers résolu. J'ai du merder qq part.
    à tester mais ca semble ok, par contre pour les droits j'ai du mettre 777 et non pas 666 sinon j'avais pas le droit de copier un fichier dans le dossier crée.
    [EDIT]

  • CéroceCéroce Membre, Modérateur

    En vérité, c'est un problème compliqué de base, exacerbé par le sandboxing.

    La solution adoptée par Apple en passant d'iPhoto à Photos:

    • iPhoto: on pouvait partager la bibliothèque de photos entre les utilisateurs
    • Photos: chaque utilisateur a sa propre bibliothèque, s'il veulent la partager, ils prennent un compte iCloud et activent le partage de photos.

    Cela dit, je ne donne pas tout à fait tort à leur approche, beaucoup de Mac n'ont qu'un compte utilisateur… J'avais écrit une appli (PortraiMatic) qui permettait ce partage et personne n'utilisait cette fonctionnalité. Quand j'ai commencé à la vendre sur le MacAppStore, j'ai supprimé la fonctionnalité, et personne ne s'est jamais plaint.

  • RenaudRenaud Membre
    août 2020 modifié #11

    Pour info, à ce sujet, CloudKit permet le multi-utilisateur et les bases de données publiques.

    Ça crée un jeu de problèmes différents (il faut un compte payant, un AppleID pour chaque utilisateur sur la machine, et des limites de quantité), mais cela offre aussi d'autres avantages - persistence entre les différents appareils, et pas de souci que tu pourrais avoir avec un dossier partagé (tels que accès concurrents et permissions).

  • Je n'ai besoin que de partager sur le même poste et uniquement entre les sessions.
    Si les données étaient sur un serveur avec une vraie base de donnée, je n'aurais pas de soucis
    La c'est voulu pour la simplicité de l'installation mais dans certains cas d'utilisation le poste restera sur le lieu de travail et plusieurs utilisateurs interviendront et auront chacun leur session et leurs documents persos.
    Je rejoins @Céroce pour le coup, cela ne va concerner qu'une minorité

Connectez-vous ou Inscrivez-vous pour répondre.