À un moment donné, mon application doit effectuer des tâches administratives telles que la création d'un fichier dans / etc ou l'exécution de commandes avec des privilèges root.
Je sais que je pourrais simplement faire un Q&D:
os.popen("pkexec foo bar")
Mais je sais aussi que ce n'est pas la manière propre prévue de le faire. Un peu ennuyeux pour l'utilisateur car il doit toujours saisir à nouveau son mot de passe au lieu d'avoir une gestion de type session.
J'étais très optimiste lorsque j'ai trouvé l'exemple en python pour l'authentification.
C'est un exemple simple qui fonctionne immédiatement:
import dbus
bus = dbus.SystemBus()
proxy = bus.get_object('org.freedesktop.PolicyKit1', '/org/freedesktop/PolicyKit1/Authority')
authority = dbus.Interface(proxy, dbus_interface='org.freedesktop.PolicyKit1.Authority')
system_bus_name = bus.get_unique_name()
subject = ('system-bus-name', {'name' : system_bus_name})
action_id = 'org.freedesktop.policykit.exec'
details = {}
flags = 1 # Drapeau AllowUserInteraction
cancellation_id = '' # Pas de ID d'annulation
result = authority.CheckAuthorization(subject, action_id, details, flags, cancellation_id)
print result
J'ai été assez naïf de penser qu'après l'autorisation, je pourrais simplement continuer dans le script avec des commandes os.popen(). Maintenant, je sais mieux :(
Je peux voir le résultat du tuple dans l'exemple ci-dessus, mais dans la documentation ultérieure, je n'ai pas pu trouver de code fonctionnel pour continuer à ce point.
Que dois-je faire avec ce résultat? Comment puis-je continuer à effectuer les tâches dont j'ai besoin? Y a-t-il une référence en python avec des exemples qui proposent les méthodes disponibles?
J'ai essayé de répertorier les méthodes d'autorisation en utilisant dir() mais je n'ai trouvé aucun indice sur la marche à suivre.
Je veux vraiment éviter d'utiliser mon solution de secours mais ce serait mon dernier recours. S'il vous plaît, aidez-moi à faire les choses correctement :)
Merci et cordialement
André
Éditer:
Comme je n'ai pas réussi à le faire fonctionner et que ma solution précédente consistant à démarrer mon programme avec gksu ne fonctionne pas en dehors de /opt/, j'ai finalement dû abandonner et implémenter mille demandes de mot de passe pour que le programme fonctionne de manière rudimentaire pour obtenir au moins un T-shirt dans l'AppShowdown.
Je n'ai pas remarqué le problème car j'ai d'abord fait un partage rapide. Là tout fonctionnait bien. Demander une fois le mot de passe au début. Je suis totalement abattu maintenant. Ma contribution à l'AppShowdown était https://launchpad.net/armorforge. ;-(