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.
72 lines
2.4 KiB
Python
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()
|