Files
entropy/rigo/test_polkit.py
Fabio Erculiani efde0c2ec3 [Rigo/RigoDaemon] greatly simplify resource passing rendezvous
Completely move the arbitration to RigoDaemon, making Rigo passively
accepting the former requests.
Moreover, complete support for bottom notification area and start
implementing app management events.
2012-03-18 07:57:57 +01:00

72 lines
2.4 KiB
Python

import os
from threading import Semaphore
from gi.repository import GLib, Polkit, GObject
class AuthenticationController(object):
"""
This class handles User authentication required
for privileged activies, like Repository updates
and Application management.
"""
def __init__(self, mainloop):
self._authenticated = False
self._authenticated_sem = Semaphore(1)
self._mainloop = mainloop
def authenticate(self, action_id, authentication_callback):
"""
Authenticate current User asking Administrator
passwords.
authentication_callback is the function that
is called after the authentication procedure,
providing one boolean argument describing the
process result: True for authenticated, False
for not authenticated.
This method must be called from the MainLoop.
If authentication has been already
"""
self._authenticated_sem.acquire()
if self._authenticated:
try:
authentication_callback(True)
finally:
self._authenticated_sem.release()
return
def _polkit_auth_callback(authority, res, loop):
authenticated = False
try:
result = authority.check_authorization_finish(res)
if result.get_is_authorized():
authenticated = True
elif result.get_is_challenge():
authenticated = True
except GObject.GError as err:
raise err
finally:
self._authenticated = authenticated
self._authenticated_sem.release()
authentication_callback(authenticated)
# authenticated_sem will be released in the callback
authority = Polkit.Authority.get()
subject = Polkit.UnixProcess.new(os.getppid())
authority.check_authorization(
subject,
action_id,
None,
Polkit.CheckAuthorizationFlags.ALLOW_USER_INTERACTION,
None, # Gio.Cancellable()
_polkit_auth_callback,
self._mainloop)
def callback(result):
print "Auth status", result
mainloop = GLib.MainLoop()
ctrl = AuthenticationController(mainloop)
GLib.idle_add(ctrl.authenticate, "org.sabayon.RigoDaemon.update", callback)
mainloop.run()