ÿØÿà JFIF    ÿÛ „ ( %!1!%*+...983,7(-.- PK]@$__pycache__/constants.cpython-36.pycnu[3 uAc@s dZdZdS)z*This module contains some constant values.ig@@Ng`Mb@A)__doc__Zmethod_call_no_timeoutrr/usr/lib/python3.6/constants.pys PK]rbb b )__pycache__/mainloop.cpython-36.opt-1.pycnu[3 uAc# @s@dZddlmZd ZGdddeZGdddeZddZd S) zVThis module contains mainloop wrappers. Currently only glib main loops are supported.)absolute_importMainLoopset_typecsXeZdZdZdZfddZeddZddZd d Z d d Z d dZ ddZ Z S)raAn abstract main loop wrapper class and factory. Use MainLoop() to get a main loop wrapper object for a main loop type previously registered with set_type(). Defaults to glib main loops. Actual main loop wrapper classes are derived from this class.Ncs.tjdkrtjdtt|jtjf||S)Nglib)rZ_mainloop_classrsuper__new___MainLoop__mainloop_class)clsargskwargs) __class__/usr/lib/python3.6/mainloop.pyr*s   zMainLoop.__new__cCsHtjdk rtddti}||kr.||t_ntd|dj|fdS)zxSet a main loop type for non-blocking interfaces. mltype: "glib" (currently only glib main loops are supported)Nz(The main loop type can only be set once.rz0'%s' is not one of the valid main loop types: %sz, )rr RuntimeError GlibMainLoop ValueErrorjoin)r mltypeZ ml_type_classr r rr1s  zMainLoop.set_typecCs tdS)z$Returns if there are pending events.N)NotImplementedError)selfr r rpendingCszMainLoop.pendingcCs tdS)z Iterates over one pending event.N)r)rr r riterateHszMainLoop.iteratecCsx|jr|jqWdS)z!Iterates over all pending events.N)rr)rr r riterate_over_pending_eventsMs z$MainLoop.iterate_over_pending_eventscCs tdS)zRuns the main loop.N)r)rr r rrunSsz MainLoop.runcCs tdS)zQuits the main loop.N)r)rr r rquitXsz MainLoop.quit)__name__ __module__ __qualname____doc__rr classmethodrrrrrr __classcell__r r )r rr s  c@seZdZddZdS)rcCsFddlm}|j}|j}||_|j|_|j|_|j|_|j |_ dS)N)_glib) Z _wrappersr"rZ get_contextZ _mainlooprZ iterationrrr)rr"ZmlZctxr r r__init__`s zGlibMainLoop.__init__N)rrrr#r r r rr^srcCs$ddlm}|dttj|dS)zSet a main loop type for non-blocking interfaces. mltype: "glib" (currently only glib main loops are supported) Deprecated, use MainLoop.set_type() instead.r)warnzuse MainLoop.set_type() insteadN)warningsr$DeprecationWarningrr)rr$r r rrls  N)rr)rZ __future__r__all__objectrrrr r r rs  >PK] NN(__pycache__/introspection.cpython-36.pycnu[3 uAc@sdZddlmZddlmZddlmZddlmZGddde Z Gdd d ee e Z Gd d d e Z Gd d d e ZGddde eZGddde ZGddde ZGddde ZGddde eZddZdS)z?Classes and functions to easily access DBus introspection data.)absolute_import) ElementTree)StringIO)with_metaclassc@s(eZdZdZiZeddZddZdS) IElemMetazMetaclass for introspection elements. Sets elemname class member automatically from class name if not set explicitly. Registers classes for their element names.cCs>d}x4|D],}|j}||kr.t|r.|d7}||7}q W|S)N_)lowerlen)clsZclsnameelemnamecZc_lowerr#/usr/lib/python3.6/introspection.pyclsname_to_elemname(s  zIElemMeta.clsname_to_elemnamecCs|dkrtj||||Sd|krL|jds6td|tj|dd|d<|d}|tjkrntd||ftj||||}|tj|<|S)NIElemr z;Class '%s' needs to set elemname (or be called 'IElem...'))z4Class '%s' tries to register duplicate elemname '%s')type__new__ startswith TypeErrorrrelemnames_to_classes)r namebasesZdctr klsrrrr3s     zIElemMeta.__new__N)__name__ __module__ __qualname____doc__r classmethodrrrrrrr s rcs@eZdZdZd fdd Zd ddZddZed d ZZ S) rz&Base class for introspection elements.Ncs*tjj|jtjd}tt|j|||S)N)rrgettagsuperrr)r elemparentr) __class__rrrOsz IElem.__new__cs$|_|_fdd|D_dS)Ncsg|]}t|dqS))r$)r).0r )selfrr Wsz"IElem.__init__..)r#r$child_elements)r'r#r$r)r'r__init__TszIElem.__init__cCsZd|jr|jn d|jj|jf}x2|jD](}x"t|jdD]}|d|7}q>Wq*W|S)Nz%s %rz unknown:%s z %s)r r#r!attribr)strsplit)r'sr Zccrrr__str__Ys  z IElem.__str__cCs|jjS)N)r#r,)r'rrrr,asz IElem.attrib)N)N) rrrrrr*r0propertyr, __classcell__rr)r%rrLs  rc@seZdZdZdZdS) IElemUnknownz-Catch-all for unknown introspection elements.N)rrrrr rrrrr3fsr3c@seZdZdZeddZdS)IElemNameMixinz,Mixin for introspection elements with names.cCs |jdS)Nr)r,)r'rrrroszIElemNameMixin.nameN)rrrrr1rrrrrr4lsr4cs"eZdZdZdfdd ZZS) IElemNodezIntrospection node.Ncs(tt|j||dd|jD|_dS)NcSsg|]}t|tr|qSr) isinstancer5)r&r rrrr({sz&IElemNode.__init__..)r"r5r*r)Z child_nodes)r'r#r$)r%rrr*wszIElemNode.__init__)N)rrrrr*r2rr)r%rr5tsr5c@seZdZdZdS)IElemInterfacezIntrospection interface.N)rrrrrrrrr7~sr7c@seZdZdZdS) IElemMethodzIntrospection interface method.N)rrrrrrrrr8sr8c@seZdZdZdS)IElemArgzIntrospection method argument.N)rrrrrrrrr9sr9c@seZdZdZdS) IElemSignalzIntrospection interface signal.N)rrrrrrrrr:sr:cCs.t}t|dst|}|j|}t|}|S)Nread)rhasattrrparser)Zstring_or_fileZtreeZxml_rootZ elem_rootrrr introspects   r>N)rZ __future__rZxml.etree.ElementTreeriorZsixrrrobjectrr3r4r5r7r8r9r:r>rrrrs    , PK]Rf0__pycache__/bus.cpython-36.pycnu[3 uAcY@sXdZddlmZddlZddlmZddlmZx"d D]Zed ee ej d q6WdS)zQThis module contains functions which create monkey-patched/augmented D-Bus buses.)absolute_importN)proxies) constantsBus SystemBus SessionBus StarterBuszdef %(name)s(*args, **kwargs): busobj = dbus.%(name)s(*args, **kwargs) busobj.ProxyObjectClass = proxies.ProxyObject busobj.default_timeout = %(default_timeout)s return busobj )namemodnameZdefault_timeout)rrrr ) __doc__Z __future__rZdbusrrr exec__name__Zmethod_call_no_timeoutrr/usr/lib/python3.6/bus.pys    PK] NN.__pycache__/introspection.cpython-36.opt-1.pycnu[3 uAc@sdZddlmZddlmZddlmZddlmZGddde Z Gdd d ee e Z Gd d d e Z Gd d d e ZGddde eZGddde ZGddde ZGddde ZGddde eZddZdS)z?Classes and functions to easily access DBus introspection data.)absolute_import) ElementTree)StringIO)with_metaclassc@s(eZdZdZiZeddZddZdS) IElemMetazMetaclass for introspection elements. Sets elemname class member automatically from class name if not set explicitly. Registers classes for their element names.cCs>d}x4|D],}|j}||kr.t|r.|d7}||7}q W|S)N_)lowerlen)clsZclsnameelemnamecZc_lowerr#/usr/lib/python3.6/introspection.pyclsname_to_elemname(s  zIElemMeta.clsname_to_elemnamecCs|dkrtj||||Sd|krL|jds6td|tj|dd|d<|d}|tjkrntd||ftj||||}|tj|<|S)NIElemr z;Class '%s' needs to set elemname (or be called 'IElem...'))z4Class '%s' tries to register duplicate elemname '%s')type__new__ startswith TypeErrorrrelemnames_to_classes)r namebasesZdctr klsrrrr3s     zIElemMeta.__new__N)__name__ __module__ __qualname____doc__r classmethodrrrrrrr s rcs@eZdZdZd fdd Zd ddZddZed d ZZ S) rz&Base class for introspection elements.Ncs*tjj|jtjd}tt|j|||S)N)rrgettagsuperrr)r elemparentr) __class__rrrOsz IElem.__new__cs$|_|_fdd|D_dS)Ncsg|]}t|dqS))r$)r).0r )selfrr Wsz"IElem.__init__..)r#r$child_elements)r'r#r$r)r'r__init__TszIElem.__init__cCsZd|jr|jn d|jj|jf}x2|jD](}x"t|jdD]}|d|7}q>Wq*W|S)Nz%s %rz unknown:%s z %s)r r#r!attribr)strsplit)r'sr Zccrrr__str__Ys  z IElem.__str__cCs|jjS)N)r#r,)r'rrrr,asz IElem.attrib)N)N) rrrrrr*r0propertyr, __classcell__rr)r%rrLs  rc@seZdZdZdZdS) IElemUnknownz-Catch-all for unknown introspection elements.N)rrrrr rrrrr3fsr3c@seZdZdZeddZdS)IElemNameMixinz,Mixin for introspection elements with names.cCs |jdS)Nr)r,)r'rrrroszIElemNameMixin.nameN)rrrrr1rrrrrr4lsr4cs"eZdZdZdfdd ZZS) IElemNodezIntrospection node.Ncs(tt|j||dd|jD|_dS)NcSsg|]}t|tr|qSr) isinstancer5)r&r rrrr({sz&IElemNode.__init__..)r"r5r*r)Z child_nodes)r'r#r$)r%rrr*wszIElemNode.__init__)N)rrrrr*r2rr)r%rr5tsr5c@seZdZdZdS)IElemInterfacezIntrospection interface.N)rrrrrrrrr7~sr7c@seZdZdZdS) IElemMethodzIntrospection interface method.N)rrrrrrrrr8sr8c@seZdZdZdS)IElemArgzIntrospection method argument.N)rrrrrrrrr9sr9c@seZdZdZdS) IElemSignalzIntrospection interface signal.N)rrrrrrrrr:sr:cCs.t}t|dst|}|j|}t|}|S)Nread)rhasattrrparser)Zstring_or_fileZtreeZxml_rootZ elem_rootrrr introspects   r>N)rZ __future__rZxml.etree.ElementTreeriorZsixrrrobjectrr3r4r5r7r8r9r:r>rrrrs    , PK])*#__pycache__/__init__.cpython-36.pycnu[3 uAc@s`ddlmZddlmZddlmZmZmZddlmZddlmZddlm Z ddlm Z d S) )absolute_import)bus) SessionBus SystemBus StarterBus)proxies)service)polkit)mainloopN) Z __future__rrrrrrr r r r r /usr/lib/python3.6/__init__.pys     PK]gIhh'__pycache__/polkit.cpython-36.opt-1.pycnu[3 uAcI$@sdZddlmZddlZddlZddlmZddlmZddlm Z dd d d d d gZ ddZ dZ Gdd d e Zdeddfdd ZGdd d ejZGddde ZeZdd Zdifdd ZdS)zmThis module contains convenience decorators and functions for using PolicyKit with dbus services and clients.)absolute_importN) decorator)reduce)method_call_no_timeout require_auth enable_proxyAUTHFAIL_DONTCATCHNotAuthorizedExceptionAreAuthorizationsObtainableIsSystemBusNameAuthorizedAsynccsfdd}|S)uDecorator for DBus service methods. Specify that a user needs a specific PolicyKit authorization `polkit_auth´ to execute it.cst|d|S)NZ_slip_polkit_auth_required)setattr)method) polkit_auth/usr/lib/python3.6/polkit.pyrequire_auth_decorator/s z,require_auth..require_auth_decoratorr)rrr)rrr)s zBorg.fedoraproject.slip.dbus.service.PolKit.NotAuthorizedException.c@s eZdZdS)r N)__name__ __module__ __qualname__rrrrr <scs6fdd|dk r"t|Sfdd}|SdS)uDecorator for DBus proxy methods. Let's you (optionally) specify either a result value or an exception type and a callback which is returned, thrown or called respectively if a PolicyKit authorization doesn't exist or can't be obtained in the DBus mechanism, i.e. an appropriate DBus exception is thrown. An exception constructor may and a callback must accept an `action_id´ parameter which will be set to the id of the PolicyKit action for which authorization could not be obtained. Examples: 1) Return `False´ in the event of an authorization problem, and call `error_handler´: def error_handler(action_id=None): print "Authorization problem:", action_id class MyProxy(object): @polkit.enable_proxy(authfail_result=False, authfail_callback=error_handler) def some_method(self, ...): ... 2) Throw a `MyAuthError´ instance in the event of an authorization problem: class MyAuthError(Exception): def __init__(self, *args, **kwargs): action_id = kwargs.pop("action_id") super(MyAuthError, self).__init__(*args, **kwargs) self.action_id = action_id class MyProxy(object): @polkit.enable_proxy(authfail_exception=MyAuthError) def some_method(self, ...): ...csy |||Stjk r}zr|j}|jts2|ttd}dk rT|ddk ry|d}Wn}YnX|tkrSd}~XnXdS)N) action_id)dbus DBusExceptionZ get_dbus_name startswithAUTH_EXC_PREFIXlenr )funcpkeZexc_namerZaf_exc)authfail_callbackauthfail_exceptionauthfail_resultrr _enable_proxyvs$    z#enable_proxy.._enable_proxyNcs t|S)N)r)r)r#rrdecorateszenable_proxy..decorate)r)rr"r!r r$r)r#r r!r"rr@s 6  cs$eZdZdZdZfddZZS)r zqException which a DBus service method throws if an authorization required for executing it can't be obtained.zAorg.fedoraproject.slip.dbus.service.PolKit.NotAuthorizedExceptioncs(|jjd||_tt|j||dS)N.) __class___dbus_error_namesuperr __init__)selfrrr)r&rrr)s zNotAuthorizedException.__init__)rrr__doc__r'r) __classcell__rr)r&rr sc@seZdZdZdZdZdZdZdZdZ dZ e ddZ e dd Ze d d Ze d d Ze ddZddZddZddZdifddZdS)PolKitz"Convenience wrapper around polkit.zorg.freedesktop.PolicyKit1z%/org/freedesktop/PolicyKit1/Authorityz$org.freedesktop.PolicyKit1.AuthorityNcCs4||jkr0tjr0tjjtjdt_dt_dt_dS)N) _dbus_namer- _PolKit__busZremove_signal_receiver_PolKit__signal_receiver_PolKit__interface)clsnameZ old_ownerZ new_ownerrrr_on_name_owner_changeds zPolKit._on_name_owner_changedcCs0tjs*tjt_tjj|jdd|jdt_tjS)NZNameOwnerChangedzorg.freedesktop.DBus)Zhandler_functionZ signal_nameZdbus_interfaceZarg0)r-r/rZ SystemBusZadd_signal_receiverr4r.r0)r*rrr_buss  z PolKit._buscCstjs|jjt_tjS)N)r-_PolKit__bus_namer5Zget_unique_name)r*rrr _bus_names zPolKit._bus_namec CsFtjs@y"tj|jj|j|j|jt_Wntj k r>YnXtjS)N) r-r1r Interfacer5 get_objectr. _dbus_path_dbus_interfacer)r*rrr _interfaces  zPolKit._interfacecCs t|jS)N)boolr<)r*rrr_polkit_presentszPolKit._polkit_presentc Cs>|jjdd}tj|d}y|j|}Wnd}YnX|S)Nzorg.freedesktop.DBusz/org/freedesktop/DBus)r5r9rr8ZGetConnectionUnixUser)r*system_bus_nameZ bus_objectZ bus_interfaceZuidrrrZ__dbus_system_bus_name_uids  z!PolKit.__dbus_system_bus_name_uidcCs6|js dS|jjdd|jif|idd\}}}|p4|S)NTzsystem-bus-namer3r)r>r<CheckAuthorizationr7)r*Z authorization is_authorized is_challengedetailsrrrZ__authorization_is_obtainables  z$PolKit.__authorization_is_obtainablecs8js dSt|tttfs |f}tfdd|d}|S)NTcs|o j|S)N)$_PolKit__authorization_is_obtainable)xy)r*rrsz4PolKit.AreAuthorizationsObtainable..)r> isinstancetuplelistsetr)r*authorizationsZ obtainabler)r*rr s z"PolKit.AreAuthorizationsObtainableTc sd|js |dkp|j|dkSd}|r0|dO}fdd}|jjdd|if|||d||tddS) Nrrcs|\}}}|dS)Nr)argsrBrCrD) reply_handlerrrreply_cb s z7PolKit.IsSystemBusNameAuthorizedAsync..reply_cbzsystem-bus-namer3r@)rO error_handlerZtimeout)r>!_PolKit__dbus_system_bus_name_uidr<rAr) r*r?rrOrQ challengerDflagsrPr)rOrr s   z%PolKit.IsSystemBusNameAuthorizedAsync)rrrr+r.r:r;r1r/r6r0 classmethodr4propertyr5r7r<r>rRrEr r rrrrr-s"     r-cCs tj|S)N)__polkitr )rMrrrr sTcCstj||||||S)N)rWr )r?rrOrQrSrDrrrr s )r+Z __future__r collectionsrr functoolsrZ constantsr__all__rrobjectr rrr r-rWr r rrrrs(     WoPK]`:"__pycache__/proxies.cpython-36.pycnu[3 uAc`@sPdZddlmZddlZddlmZGdddejjZGdd d ejj Z dS) z{This module contains D-Bus proxy classes which implement the default timeout of the augmented bus classes in slip.dbus.bus.)absolute_importN) constantsc@s$eZdZiZeddZddZdS) _ProxyMethodcCsB|j|jkr6t|jjdd}|dkr*tj}||j|j<|j|jS)Ndefault_timeout)Z _connection_connections_default_timeoutsgetattr_proxyZ_busrZmethod_call_no_timeout)selfZdtr /usr/lib/python3.6/proxies.pyr&s   z_ProxyMethod.default_timeoutcOs.|jddkr|j|d<tjjj|f||S)NZtimeout)getrdbusproxiesr__call__)r argskwargsr r r r/s z_ProxyMethod.__call__N)__name__ __module__ __qualname__rpropertyrrr r r r r"s rc@seZdZeZdS) ProxyObjectN)rrrrZProxyMethodClassr r r r r6sr) __doc__Z __future__rZ dbus.proxiesrrrrrr r r r s   PK])*)__pycache__/__init__.cpython-36.opt-1.pycnu[3 uAc@s`ddlmZddlmZddlmZmZmZddlmZddlmZddlm Z ddlm Z d S) )absolute_import)bus) SessionBus SystemBus StarterBus)proxies)service)polkit)mainloopN) Z __future__rrrrrrr r r r r /usr/lib/python3.6/__init__.pys     PK]rbb b #__pycache__/mainloop.cpython-36.pycnu[3 uAc# @s@dZddlmZd ZGdddeZGdddeZddZd S) zVThis module contains mainloop wrappers. Currently only glib main loops are supported.)absolute_importMainLoopset_typecsXeZdZdZdZfddZeddZddZd d Z d d Z d dZ ddZ Z S)raAn abstract main loop wrapper class and factory. Use MainLoop() to get a main loop wrapper object for a main loop type previously registered with set_type(). Defaults to glib main loops. Actual main loop wrapper classes are derived from this class.Ncs.tjdkrtjdtt|jtjf||S)Nglib)rZ_mainloop_classrsuper__new___MainLoop__mainloop_class)clsargskwargs) __class__/usr/lib/python3.6/mainloop.pyr*s   zMainLoop.__new__cCsHtjdk rtddti}||kr.||t_ntd|dj|fdS)zxSet a main loop type for non-blocking interfaces. mltype: "glib" (currently only glib main loops are supported)Nz(The main loop type can only be set once.rz0'%s' is not one of the valid main loop types: %sz, )rr RuntimeError GlibMainLoop ValueErrorjoin)r mltypeZ ml_type_classr r rr1s  zMainLoop.set_typecCs tdS)z$Returns if there are pending events.N)NotImplementedError)selfr r rpendingCszMainLoop.pendingcCs tdS)z Iterates over one pending event.N)r)rr r riterateHszMainLoop.iteratecCsx|jr|jqWdS)z!Iterates over all pending events.N)rr)rr r riterate_over_pending_eventsMs z$MainLoop.iterate_over_pending_eventscCs tdS)zRuns the main loop.N)r)rr r rrunSsz MainLoop.runcCs tdS)zQuits the main loop.N)r)rr r rquitXsz MainLoop.quit)__name__ __module__ __qualname____doc__rr classmethodrrrrrr __classcell__r r )r rr s  c@seZdZddZdS)rcCsFddlm}|j}|j}||_|j|_|j|_|j|_|j |_ dS)N)_glib) Z _wrappersr"rZ get_contextZ _mainlooprZ iterationrrr)rr"ZmlZctxr r r__init__`s zGlibMainLoop.__init__N)rrrr#r r r rr^srcCs$ddlm}|dttj|dS)zSet a main loop type for non-blocking interfaces. mltype: "glib" (currently only glib main loops are supported) Deprecated, use MainLoop.set_type() instead.r)warnzuse MainLoop.set_type() insteadN)warningsr$DeprecationWarningrr)rr$r r rrls  N)rr)rZ __future__r__all__objectrrrr r r rs  >PK]UKCC!__pycache__/polkit.cpython-36.pycnu[3 uAcI$@sdZddlmZddlZddlZddlmZddlmZddlm Z dd d d d d gZ ddZ dZ Gdd d e Zdeddfdd ZGdd d ejZGddde ZeZdd Zdifdd ZdS)zmThis module contains convenience decorators and functions for using PolicyKit with dbus services and clients.)absolute_importN) decorator)reduce)method_call_no_timeout require_auth enable_proxyAUTHFAIL_DONTCATCHNotAuthorizedExceptionAreAuthorizationsObtainableIsSystemBusNameAuthorizedAsynccsfdd}|S)uDecorator for DBus service methods. Specify that a user needs a specific PolicyKit authorization `polkit_auth´ to execute it.cst|dstt|d|S)NZ_dbus_is_methodZ_slip_polkit_auth_required)hasattrAssertionErrorsetattr)method) polkit_auth/usr/lib/python3.6/polkit.pyrequire_auth_decorator/s z,require_auth..require_auth_decoratorr)rrr)rrr)s zBorg.fedoraproject.slip.dbus.service.PolKit.NotAuthorizedException.c@s eZdZdS)r N)__name__ __module__ __qualname__rrrrr <scs|dkst|tjstdtfks0dks0tdksHttjsHtdks^tts^tfdd|dk rt|Sfdd}|SdS)uDecorator for DBus proxy methods. Let's you (optionally) specify either a result value or an exception type and a callback which is returned, thrown or called respectively if a PolicyKit authorization doesn't exist or can't be obtained in the DBus mechanism, i.e. an appropriate DBus exception is thrown. An exception constructor may and a callback must accept an `action_id´ parameter which will be set to the id of the PolicyKit action for which authorization could not be obtained. Examples: 1) Return `False´ in the event of an authorization problem, and call `error_handler´: def error_handler(action_id=None): print "Authorization problem:", action_id class MyProxy(object): @polkit.enable_proxy(authfail_result=False, authfail_callback=error_handler) def some_method(self, ...): ... 2) Throw a `MyAuthError´ instance in the event of an authorization problem: class MyAuthError(Exception): def __init__(self, *args, **kwargs): action_id = kwargs.pop("action_id") super(MyAuthError, self).__init__(*args, **kwargs) self.action_id = action_id class MyProxy(object): @polkit.enable_proxy(authfail_exception=MyAuthError) def some_method(self, ...): ...Ncsy |||Stjk r}zr|j}|jts2|ttd}dk rT|ddk ry|d}Wn}YnX|tkrSd}~XnXdS)N) action_id)dbus DBusExceptionZ get_dbus_name startswithAUTH_EXC_PREFIXlenr )funcpkeZexc_namerZaf_exc)authfail_callbackauthfail_exceptionauthfail_resultrr _enable_proxyvs$    z#enable_proxy.._enable_proxycs t|S)N)r)r)r%rrdecorateszenable_proxy..decorate) isinstance collectionsCallablerr issubclass Exceptionr)rr$r#r"r&r)r%r"r#r$rr@s*    cs$eZdZdZdZfddZZS)r zqException which a DBus service method throws if an authorization required for executing it can't be obtained.zAorg.fedoraproject.slip.dbus.service.PolKit.NotAuthorizedExceptioncs(|jjd||_tt|j||dS)N.) __class___dbus_error_namesuperr __init__)selfrrr )r-rrr0s zNotAuthorizedException.__init__)rrr__doc__r.r0 __classcell__rr)r-rr sc@seZdZdZdZdZdZdZdZdZ dZ e ddZ e dd Ze d d Ze d d Ze ddZddZddZddZdifddZdS)PolKitz"Convenience wrapper around polkit.zorg.freedesktop.PolicyKit1z%/org/freedesktop/PolicyKit1/Authorityz$org.freedesktop.PolicyKit1.AuthorityNcCs4||jkr0tjr0tjjtjdt_dt_dt_dS)N) _dbus_namer4 _PolKit__busZremove_signal_receiver_PolKit__signal_receiver_PolKit__interface)clsnameZ old_ownerZ new_ownerrrr_on_name_owner_changeds zPolKit._on_name_owner_changedcCs0tjs*tjt_tjj|jdd|jdt_tjS)NZNameOwnerChangedzorg.freedesktop.DBus)Zhandler_functionZ signal_nameZdbus_interfaceZarg0)r4r6rZ SystemBusZadd_signal_receiverr;r5r7)r1rrr_buss  z PolKit._buscCstjs|jjt_tjS)N)r4_PolKit__bus_namer<Zget_unique_name)r1rrr _bus_names zPolKit._bus_namec CsFtjs@y"tj|jj|j|j|jt_Wntj k r>YnXtjS)N) r4r8r Interfacer< get_objectr5 _dbus_path_dbus_interfacer)r1rrr _interfaces  zPolKit._interfacecCs t|jS)N)boolrC)r1rrr_polkit_presentszPolKit._polkit_presentc Cs>|jjdd}tj|d}y|j|}Wnd}YnX|S)Nzorg.freedesktop.DBusz/org/freedesktop/DBus)r<r@rr?ZGetConnectionUnixUser)r1system_bus_nameZ bus_objectZ bus_interfaceZuidrrrZ__dbus_system_bus_name_uids  z!PolKit.__dbus_system_bus_name_uidcCs6|js dS|jjdd|jif|idd\}}}|p4|S)NTzsystem-bus-namer:r)rErCCheckAuthorizationr>)r1Z authorization is_authorized is_challengedetailsrrrZ__authorization_is_obtainables  z$PolKit.__authorization_is_obtainablecs8js dSt|tttfs |f}tfdd|d}|S)NTcs|o j|S)N)$_PolKit__authorization_is_obtainable)xy)r1rrsz4PolKit.AreAuthorizationsObtainable..)rEr'tuplelistsetr)r1authorizationsZ obtainabler)r1rr s z"PolKit.AreAuthorizationsObtainableTc sd|js |dkp|j|dkSd}|r0|dO}fdd}|jjdd|if|||d||tddS) Nrrcs|\}}}|dS)Nr)argsrIrJrK) reply_handlerrrreply_cb s z7PolKit.IsSystemBusNameAuthorizedAsync..reply_cbzsystem-bus-namer:rG)rU error_handlerZtimeout)rE!_PolKit__dbus_system_bus_name_uidrCrHr) r1rFrrUrW challengerKflagsrVr)rUrr s   z%PolKit.IsSystemBusNameAuthorizedAsync)rrrr2r5rArBr8r6r=r7 classmethodr;propertyr<r>rCrErXrLr r rrrrr4s"     r4cCs tj|S)N)__polkitr )rSrrrr sTcCstj||||||S)N)r]r )rFrrUrWrYrKrrrr s )r2Z __future__rr(rr functoolsrZ constantsr__all__rrobjectr rrr r4r]r r rrrrs(     WoPK]`:(__pycache__/proxies.cpython-36.opt-1.pycnu[3 uAc`@sPdZddlmZddlZddlmZGdddejjZGdd d ejj Z dS) z{This module contains D-Bus proxy classes which implement the default timeout of the augmented bus classes in slip.dbus.bus.)absolute_importN) constantsc@s$eZdZiZeddZddZdS) _ProxyMethodcCsB|j|jkr6t|jjdd}|dkr*tj}||j|j<|j|jS)Ndefault_timeout)Z _connection_connections_default_timeoutsgetattr_proxyZ_busrZmethod_call_no_timeout)selfZdtr /usr/lib/python3.6/proxies.pyr&s   z_ProxyMethod.default_timeoutcOs.|jddkr|j|d<tjjj|f||S)NZtimeout)getrdbusproxiesr__call__)r argskwargsr r r r/s z_ProxyMethod.__call__N)__name__ __module__ __qualname__rpropertyrrr r r r r"s rc@seZdZeZdS) ProxyObjectN)rrrrZProxyMethodClassr r r r r6sr) __doc__Z __future__rZ dbus.proxiesrrrrrr r r r s   PK]Rf0$__pycache__/bus.cpython-36.opt-1.pycnu[3 uAcY@sXdZddlmZddlZddlmZddlmZx"d D]Zed ee ej d q6WdS)zQThis module contains functions which create monkey-patched/augmented D-Bus buses.)absolute_importN)proxies) constantsBus SystemBus SessionBus StarterBuszdef %(name)s(*args, **kwargs): busobj = dbus.%(name)s(*args, **kwargs) busobj.ProxyObjectClass = proxies.ProxyObject busobj.default_timeout = %(default_timeout)s return busobj )namemodnameZdefault_timeout)rrrr ) __doc__Z __future__rZdbusrrr exec__name__Zmethod_call_no_timeoutrr/usr/lib/python3.6/bus.pys    PK]x"__pycache__/service.cpython-36.pycnu[3 uAc@sdZddlmZddlZddlZddlmZddlmZ ddl m Z d d d gZ da d d Zeadd ZddZddZdadaddZGdd d ejjZGdd d eeejjZdS)zMThis module contains convenience functions for using dbus-activated services.)absolute_importN)with_metaclass)_glib)polkitObject InterfaceType set_mainloopcCs tjdS)N) __mainloop__quitr r /usr/lib/python3.6/service.py__glib_quit_cb__)srcCs|adS)N)r )Zmainloopr r rr 4scCs|adS)N) __quit_cb__)quit_cbr r r set_quit_cb9srcCs tdS)N)rr r r rr>srZ__slip_dbus_service_sender____slip_dbus_service_reply_cb____slip_dbus_service_error_cb__csjdk rjdntdjdk r4jdntd fdd}xLddtDD]6}|dkr|_ql|dkr|_qlt||t|qlWj|_|S) NFTcsj }|dk rVddr4 =rLd=d=j|t dtdd|dk rr fdd}fdd}tj|||d n f}j|SdS) NrrZ_slip_polkit_auth_requireddefault_polkit_auth_requiredcs|rrfqd}yf}Wn&tk rX}z |}WYdd}~XnX|rh|q|dkrxq|ntjjdS)N) ExceptionrZNotAuthorizedExceptiontimeout_restart)Zis_autherrorresulte) action_iderror_cbkmethodmethod_is_asyncpreply_cbselfr r reply_handlerqs  z:wrap_method..wrapped_method..reply_handlercs|jdS)N)r)r)rr"r r error_handlersz:wrap_method..wrapped_method..error_handler)r#r$)get sender_seengetattrrZIsSystemBusNameAuthorizedAsyncr)r"r rsenderr#r$Zretval)async_callbackshide_async_callbackshide_sender_keywordrrsender_keyword)rrrr r!r"rwrapped_method[s,       " z#wrap_method..wrapped_methodcss"|]}|dddkr|VqdS)NZ_dbus_r ).0xr r r szwrap_method.._dbus_sender_keyword_dbus_async_callbacks)r2SENDER_KEYWORDr3ASYNC_CALLBACKSdirsetattrr'__name__)rr-attrr )r)r*r+rrr,r wrap_methodHs(  Er:cseZdZfddZZS)r csDx,|jD] \}}t|ddr t|||<q Wtt|j||||S)NZ_dbus_is_methodF)itemsr'r:superr __new__)clsnamebasesZdctZattrnamer9) __class__r rr=s zInterfaceType.__new__)r8 __module__ __qualname__r= __classcell__r r )rArr scsbeZdZdZdZeZdZeZiZ iZ dZ dfdd Z ddZ dd Zdd d Zd d ZZS)rFNcs2tt|j||||dkr(|jj|_n||_dS)N)r<r__init__rA persistent)r"connZ object_pathZbus_namerG)rAr rrFs zObject.__init__cCs2|j r ttjdkr tdSdt_|jt_dS)NrF)rGlenrsendersrcurrent_sourcedefault_durationduration)r"r r r _timeout_cbs zObject._timeout_cbcCs|j}| r||ftjkrtjj||ftj|j|ttj|dkrjtj|jtj|=tj|=|j rttjdkrtjdkrt dS)Nr) connectionrrJremoveconnections_sendersrIconnections_smobjsrGrKr)r"r?Z old_ownerZ new_ownerrHr r r_name_owner_changeds zObject._name_owner_changedcCsf|s |jj}tj s|tjkr$|t_|j s:ttjdkrbtjrLtj tjtj tjd|j t_dS)Nri) rArLrrMrGrIrJrKGLibZ source_removeZ timeout_addrN)r"rMr r rrs  zObject.timeout_restartcCsp||jftjkrltjj||jf|jtjkrZttj|j<|jj|jdd|dtj|j<tj|jj|dS)NZNameOwnerChangedzorg.freedesktop.DBus)Zhandler_functionZ signal_nameZdbus_interfaceZarg1) rOrrJaddrQsetZadd_signal_receiverrSrR)r"r(r r rr&s zObject.sender_seen)NNNN)N)r8rBrCrGrLrMrKrVrJrQrRrrFrNrSrr&rDr r )rArrs  )rr)__doc__Z __future__rZdbusZ dbus.serviceZsixrZ _wrappersrrTr__all__r rrr rrr4r5r:Zservicer rr r r rs&     g PK]@*__pycache__/constants.cpython-36.opt-1.pycnu[3 uAc@s dZdZdS)z*This module contains some constant values.ig@@Ng`Mb@A)__doc__Zmethod_call_no_timeoutrr/usr/lib/python3.6/constants.pys PK]x(__pycache__/service.cpython-36.opt-1.pycnu[3 uAc@sdZddlmZddlZddlZddlmZddlmZ ddl m Z d d d gZ da d d Zeadd ZddZddZdadaddZGdd d ejjZGdd d eeejjZdS)zMThis module contains convenience functions for using dbus-activated services.)absolute_importN)with_metaclass)_glib)polkitObject InterfaceType set_mainloopcCs tjdS)N) __mainloop__quitr r /usr/lib/python3.6/service.py__glib_quit_cb__)srcCs|adS)N)r )Zmainloopr r rr 4scCs|adS)N) __quit_cb__)quit_cbr r r set_quit_cb9srcCs tdS)N)rr r r rr>srZ__slip_dbus_service_sender____slip_dbus_service_reply_cb____slip_dbus_service_error_cb__csjdk rjdntdjdk r4jdntd fdd}xLddtDD]6}|dkr|_ql|dkr|_qlt||t|qlWj|_|S) NFTcsj }|dk rVddr4 =rLd=d=j|t dtdd|dk rr fdd}fdd}tj|||d n f}j|SdS) NrrZ_slip_polkit_auth_requireddefault_polkit_auth_requiredcs|rrfqd}yf}Wn&tk rX}z |}WYdd}~XnX|rh|q|dkrxq|ntjjdS)N) ExceptionrZNotAuthorizedExceptiontimeout_restart)Zis_autherrorresulte) action_iderror_cbkmethodmethod_is_asyncpreply_cbselfr r reply_handlerqs  z:wrap_method..wrapped_method..reply_handlercs|jdS)N)r)r)rr"r r error_handlersz:wrap_method..wrapped_method..error_handler)r#r$)get sender_seengetattrrZIsSystemBusNameAuthorizedAsyncr)r"r rsenderr#r$Zretval)async_callbackshide_async_callbackshide_sender_keywordrrsender_keyword)rrrr r!r"rwrapped_method[s,       " z#wrap_method..wrapped_methodcss"|]}|dddkr|VqdS)NZ_dbus_r ).0xr r r szwrap_method.._dbus_sender_keyword_dbus_async_callbacks)r2SENDER_KEYWORDr3ASYNC_CALLBACKSdirsetattrr'__name__)rr-attrr )r)r*r+rrr,r wrap_methodHs(  Er:cseZdZfddZZS)r csDx,|jD] \}}t|ddr t|||<q Wtt|j||||S)NZ_dbus_is_methodF)itemsr'r:superr __new__)clsnamebasesZdctZattrnamer9) __class__r rr=s zInterfaceType.__new__)r8 __module__ __qualname__r= __classcell__r r )rArr scsbeZdZdZdZeZdZeZiZ iZ dZ dfdd Z ddZ dd Zdd d Zd d ZZS)rFNcs2tt|j||||dkr(|jj|_n||_dS)N)r<r__init__rA persistent)r"connZ object_pathZbus_namerG)rAr rrFs zObject.__init__cCs2|j r ttjdkr tdSdt_|jt_dS)NrF)rGlenrsendersrcurrent_sourcedefault_durationduration)r"r r r _timeout_cbs zObject._timeout_cbcCs|j}| r||ftjkrtjj||ftj|j|ttj|dkrjtj|jtj|=tj|=|j rttjdkrtjdkrt dS)Nr) connectionrrJremoveconnections_sendersrIconnections_smobjsrGrKr)r"r?Z old_ownerZ new_ownerrHr r r_name_owner_changeds zObject._name_owner_changedcCsf|s |jj}tj s|tjkr$|t_|j s:ttjdkrbtjrLtj tjtj tjd|j t_dS)Nri) rArLrrMrGrIrJrKGLibZ source_removeZ timeout_addrN)r"rMr r rrs  zObject.timeout_restartcCsp||jftjkrltjj||jf|jtjkrZttj|j<|jj|jdd|dtj|j<tj|jj|dS)NZNameOwnerChangedzorg.freedesktop.DBus)Zhandler_functionZ signal_nameZdbus_interfaceZarg1) rOrrJaddrQsetZadd_signal_receiverrSrR)r"r(r r rr&s zObject.sender_seen)NNNN)N)r8rBrCrGrLrMrKrVrJrQrRrrFrNrSrr&rDr r )rArrs  )rr)__doc__Z __future__rZdbusZ dbus.serviceZsixrZ _wrappersrrTr__all__r rrr rrr4r5r:Zservicer rr r r rs&     g PK],Vr constants.pynu[# -*- coding: utf-8 -*- # slip.dbus.constants -- constant values # # Copyright © 2011 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Authors: # Nils Philippsen """This module contains some constant values.""" # The maximum value of a 32bit signed integer is the magic value to indicate an # infinite timeout for dbus. Unlike the C interface which deals with # milliseconds as integers, the python interface uses seconds as floats for the # timeout. Therefore we need to use the Python float (C double) value that # gives 0x7FFFFFFF if multiplied by 1000.0 and cast into an integer. # # This calculation should be precise enough to get a value of 0x7FFFFFFF on the # C side. If not, it will still amount to a very long time (not quite 25 days) # which should be enough for all intents and purposes. method_call_no_timeout = 0x7FFFFFFF / 1000.0 PK]$:YYbus.pynu[# -*- coding: utf-8 -*- # slip.dbus.bus -- augmented dbus buses # # Copyright © 2009, 2011 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Authors: # Nils Philippsen """This module contains functions which create monkey-patched/augmented D-Bus buses.""" from __future__ import absolute_import import dbus from . import proxies from . import constants for name in ("Bus", "SystemBus", "SessionBus", "StarterBus"): exec( """def %(name)s(*args, **kwargs): busobj = dbus.%(name)s(*args, **kwargs) busobj.ProxyObjectClass = proxies.ProxyObject busobj.default_timeout = %(default_timeout)s return busobj """ % { "name": name, "modname": __name__, "default_timeout": constants.method_call_no_timeout}) PK]DD`` proxies.pynu[# -*- coding: utf-8 -*- # slip.dbus.proxies -- slightly augmented dbus proxy classes # # Copyright © 2005-2007 Collabora Ltd. # Copyright © 2009, 2011 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Authors: # Nils Philippsen """This module contains D-Bus proxy classes which implement the default timeout of the augmented bus classes in slip.dbus.bus.""" from __future__ import absolute_import import dbus.proxies from . import constants class _ProxyMethod(dbus.proxies._ProxyMethod): _connections_default_timeouts = {} @property def default_timeout(self): if self._connection not in self._connections_default_timeouts: dt = getattr(self._proxy._bus, "default_timeout", None) if dt is None: dt = constants.method_call_no_timeout self._connections_default_timeouts[self._connection] = dt return self._connections_default_timeouts[self._connection] def __call__(self, *args, **kwargs): if kwargs.get('timeout') is None: kwargs["timeout"] = self.default_timeout return dbus.proxies._ProxyMethod.__call__(self, *args, **kwargs) class ProxyObject(dbus.proxies.ProxyObject): ProxyMethodClass = _ProxyMethod PK]bΜ# # mainloop.pynu[# -*- coding: utf-8 -*- # slip.dbus.mainloop -- mainloop wrappers # # Copyright © 2009, 2012 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Authors: # Nils Philippsen """This module contains mainloop wrappers. Currently only glib main loops are supported.""" from __future__ import absolute_import __all__ = ("MainLoop", "set_type") class MainLoop(object): """An abstract main loop wrapper class and factory. Use MainLoop() to get a main loop wrapper object for a main loop type previously registered with set_type(). Defaults to glib main loops. Actual main loop wrapper classes are derived from this class.""" __mainloop_class = None def __new__(cls, *args, **kwargs): global _mainloop_class if MainLoop._mainloop_class is None: MainLoop.set_type("glib") return super(MainLoop, cls).__new__( MainLoop.__mainloop_class, *args, **kwargs) @classmethod def set_type(cls, mltype): """Set a main loop type for non-blocking interfaces. mltype: "glib" (currently only glib main loops are supported)""" if MainLoop.__mainloop_class is not None: raise RuntimeError("The main loop type can only be set once.") ml_type_class = {"glib": GlibMainLoop} if mltype in ml_type_class: MainLoop.__mainloop_class = ml_type_class[mltype] else: raise ValueError( "'%s' is not one of the valid main loop types:\n%s" % (mltype, ", ".join(ml_type_class))) def pending(self): """Returns if there are pending events.""" raise NotImplementedError() def iterate(self): """Iterates over one pending event.""" raise NotImplementedError() def iterate_over_pending_events(self): """Iterates over all pending events.""" while self.pending(): self.iterate() def run(self): """Runs the main loop.""" raise NotImplementedError() def quit(self): """Quits the main loop.""" raise NotImplementedError() class GlibMainLoop(MainLoop): def __init__(self): from .._wrappers import _glib ml = _glib.MainLoop() ctx = ml.get_context() self._mainloop = ml self.pending = ctx.pending self.iterate = ctx.iteration self.run = ml.run self.quit = ml.quit def set_type(mltype): """Set a main loop type for non-blocking interfaces. mltype: "glib" (currently only glib main loops are supported) Deprecated, use MainLoop.set_type() instead.""" from warnings import warn warn("use MainLoop.set_type() instead", DeprecationWarning) MainLoop.set_type(mltype) PK]introspection.pynu[# -*- coding: utf-8 -*- # slip.dbus.introspection -- access dbus introspection data # # Copyright © 2011 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Authors: # Nils Philippsen """Classes and functions to easily access DBus introspection data.""" from __future__ import absolute_import from xml.etree.ElementTree import ElementTree from io import StringIO from six import with_metaclass class IElemMeta(type): """Metaclass for introspection elements. Sets elemname class member automatically from class name if not set explicitly. Registers classes for their element names.""" elemnames_to_classes = {} @classmethod def clsname_to_elemname(cls, clsname): elemname = "" for c in clsname: c_lower = c.lower() if c_lower != c: if len(elemname): elemname += "_" elemname += c_lower return elemname def __new__(cls, name, bases, dct): if name == "IElem": return type.__new__(cls, name, bases, dct) if 'elemname' not in dct: if not name.startswith("IElem"): raise TypeError( "Class '%s' needs to set elemname (or be called " "'IElem...'))" % name) dct['elemname'] = IElemMeta.clsname_to_elemname(name[5:]) elemname = dct['elemname'] if elemname in IElemMeta.elemnames_to_classes: raise TypeError( "Class '%s' tries to register duplicate elemname '%s'" % (name, elemname)) kls = type.__new__(cls, name, bases, dct) IElemMeta.elemnames_to_classes[elemname] = kls return kls class IElem(with_metaclass(IElemMeta, object)): """Base class for introspection elements.""" def __new__(cls, elem, parent=None): kls = IElemMeta.elemnames_to_classes.get( elem.tag, IElemMeta.elemnames_to_classes[None]) return super(IElem, cls).__new__(kls, elem, parent) def __init__(self, elem, parent=None): self.elem = elem self.parent = parent self.child_elements = [IElem(c, parent=self) for c in elem] def __str__(self): s = "%s %r" % (self.elemname if self.elemname else "unknown:%s" % self.elem.tag, self.attrib) for c in self.child_elements: for cc in str(c).split("\n"): s += "\n %s" % (cc) return s @property def attrib(self): return self.elem.attrib class IElemUnknown(IElem): """Catch-all for unknown introspection elements.""" elemname = None class IElemNameMixin(object): """Mixin for introspection elements with names.""" @property def name(self): return self.attrib['name'] class IElemNode(IElem, IElemNameMixin): """Introspection node.""" def __init__(self, elem, parent=None): super(IElemNode, self).__init__(elem, parent) self.child_nodes = [ c for c in self.child_elements if isinstance(c, IElemNode)] class IElemInterface(IElem): """Introspection interface.""" class IElemMethod(IElem): """Introspection interface method.""" class IElemArg(IElem): """Introspection method argument.""" class IElemSignal(IElem, IElemNameMixin): """Introspection interface signal.""" def introspect(string_or_file): tree = ElementTree() # assume string if read() method doesn't exist, works for string, unicode, # dbus.String if not hasattr(string_or_file, "read"): string_or_file = StringIO(string_or_file) xml_root = tree.parse(string_or_file) elem_root = IElem(xml_root) return elem_root PK]!+ service.pynu[# -*- coding: utf-8 -*- # slip.dbus.service -- convenience functions for using dbus-activated # services # # Copyright © 2008, 2009, 2015 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Authors: # Nils Philippsen "This module contains convenience functions for using dbus-activated services." from __future__ import absolute_import import dbus import dbus.service from six import with_metaclass from .._wrappers import _glib as GLib from . import polkit __all__ = ["Object", "InterfaceType", "set_mainloop"] __mainloop__ = None def __glib_quit_cb__(): global __mainloop__ # assume a Glib mainloop __mainloop__.quit() __quit_cb__ = __glib_quit_cb__ def set_mainloop(mainloop): global __mainloop__ __mainloop__ = mainloop def set_quit_cb(quit_cb): global __quit_cb__ __quit_cb__ = quit_cb def quit_cb(): global __quit_cb__ __quit_cb__() SENDER_KEYWORD = "__slip_dbus_service_sender__" ASYNC_CALLBACKS = ("__slip_dbus_service_reply_cb__", "__slip_dbus_service_error_cb__") def wrap_method(method): global SENDER_KEYWORD global ASYNC_CALLBACKS if method._dbus_sender_keyword is not None: sender_keyword = method._dbus_sender_keyword hide_sender_keyword = False else: sender_keyword = SENDER_KEYWORD hide_sender_keyword = True if method._dbus_async_callbacks is not None: async_callbacks = method._dbus_async_callbacks method_is_async = True else: async_callbacks = ASYNC_CALLBACKS method_is_async = False hide_async_callbacks = not method_is_async def wrapped_method(self, *p, **k): sender = k.get(sender_keyword) if sender is not None: # i.e. called over the bus, not locally reply_cb = k[async_callbacks[0]] error_cb = k[async_callbacks[1]] if hide_sender_keyword: del k[sender_keyword] if hide_async_callbacks: del k[async_callbacks[0]] del k[async_callbacks[1]] self.sender_seen(sender) action_id = getattr(method, "_slip_polkit_auth_required", getattr(self, "default_polkit_auth_required", None)) if sender is not None and action_id: def reply_handler(is_auth): if is_auth: if method_is_async: # k contains async callbacks, simply pass on reply_cb # and error_cb method(self, *p, **k) else: # execute the synchronous method ... error = None try: result = method(self, *p, **k) except Exception as e: error = e # ... and call the reply or error callback if error: error_cb(error) else: # reply_cb((None,)) != reply_cb() if result is None: reply_cb() else: reply_cb(result) else: error_cb(polkit.NotAuthorizedException(action_id)) self.timeout_restart() def error_handler(error): error_cb(error) self.timeout_restart() polkit.IsSystemBusNameAuthorizedAsync( sender, action_id, reply_handler=reply_handler, error_handler=error_handler) else: # no action id, or run locally, no need to do anything fancy retval = method(self, *p, **k) self.timeout_restart() return retval for attr in (x for x in dir(method) if x[:6] == "_dbus_"): if attr == "_dbus_sender_keyword": wrapped_method._dbus_sender_keyword = sender_keyword elif attr == "_dbus_async_callbacks": wrapped_method._dbus_async_callbacks = async_callbacks else: setattr(wrapped_method, attr, getattr(method, attr)) # delattr (method, attr) wrapped_method.__name__ = method.__name__ return wrapped_method class InterfaceType(dbus.service.InterfaceType): def __new__(cls, name, bases, dct): for (attrname, attr) in dct.items(): if getattr(attr, "_dbus_is_method", False): dct[attrname] = wrap_method(attr) return super(InterfaceType, cls).__new__(cls, name, bases, dct) class Object(with_metaclass(InterfaceType, dbus.service.Object)): # timeout & persistence persistent = False default_duration = 5 duration = default_duration current_source = None senders = set() connections_senders = {} connections_smobjs = {} # PolicyKit default_polkit_auth_required = None def __init__( self, conn=None, object_path=None, bus_name=None, persistent=None): super(Object, self).__init__(conn, object_path, bus_name) if persistent is None: self.persistent = self.__class__.persistent else: self.persistent = persistent def _timeout_cb(self): if not self.persistent and len(Object.senders) == 0: quit_cb() return False Object.current_source = None Object.duration = self.default_duration return False def _name_owner_changed(self, name, old_owner, new_owner): conn = self.connection if not new_owner and (old_owner, conn) in Object.senders: Object.senders.remove((old_owner, conn)) Object.connections_senders[conn].remove(old_owner) if len(Object.connections_senders[conn]) == 0: Object.connections_smobjs[conn].remove() del Object.connections_senders[conn] del Object.connections_smobjs[conn] if not self.persistent and len(Object.senders) == 0 and \ Object.current_source is None: quit_cb() def timeout_restart(self, duration=None): if not duration: duration = self.__class__.default_duration if not Object.duration or duration > Object.duration: Object.duration = duration if not self.persistent or len(Object.senders) == 0: if Object.current_source: GLib.source_remove(Object.current_source) Object.current_source = \ GLib.timeout_add(Object.duration * 1000, self._timeout_cb) def sender_seen(self, sender): if (sender, self.connection) not in Object.senders: Object.senders.add((sender, self.connection)) if self.connection not in Object.connections_senders: Object.connections_senders[self.connection] = set() Object.connections_smobjs[self.connection] = \ self.connection.add_signal_receiver( handler_function=self._name_owner_changed, signal_name='NameOwnerChanged', dbus_interface='org.freedesktop.DBus', arg1=sender) Object.connections_senders[self.connection].add(sender) PK]?CI$I$ polkit.pynu[# -*- coding: utf-8 -*- # slip.dbus.polkit -- convenience decorators and functions for using PolicyKit # with dbus services and clients # # Copyright © 2008, 2009, 2012, 2013, 2015 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Authors: # Nils Philippsen """This module contains convenience decorators and functions for using PolicyKit with dbus services and clients.""" from __future__ import absolute_import import collections import dbus from decorator import decorator from functools import reduce from .constants import method_call_no_timeout __all__ = ["require_auth", "enable_proxy", "AUTHFAIL_DONTCATCH", "NotAuthorizedException", "AreAuthorizationsObtainable", "IsSystemBusNameAuthorizedAsync"] def require_auth(polkit_auth): """Decorator for DBus service methods. Specify that a user needs a specific PolicyKit authorization `polkit_auth´ to execute it.""" def require_auth_decorator(method): assert hasattr(method, "_dbus_is_method") setattr(method, "_slip_polkit_auth_required", polkit_auth) return method return require_auth_decorator AUTH_EXC_PREFIX = \ "org.fedoraproject.slip.dbus.service.PolKit.NotAuthorizedException." class AUTHFAIL_DONTCATCH(object): pass def enable_proxy( func=None, authfail_result=AUTHFAIL_DONTCATCH, authfail_exception=None, authfail_callback=None): """Decorator for DBus proxy methods. Let's you (optionally) specify either a result value or an exception type and a callback which is returned, thrown or called respectively if a PolicyKit authorization doesn't exist or can't be obtained in the DBus mechanism, i.e. an appropriate DBus exception is thrown. An exception constructor may and a callback must accept an `action_id´ parameter which will be set to the id of the PolicyKit action for which authorization could not be obtained. Examples: 1) Return `False´ in the event of an authorization problem, and call `error_handler´: def error_handler(action_id=None): print "Authorization problem:", action_id class MyProxy(object): @polkit.enable_proxy(authfail_result=False, authfail_callback=error_handler) def some_method(self, ...): ... 2) Throw a `MyAuthError´ instance in the event of an authorization problem: class MyAuthError(Exception): def __init__(self, *args, **kwargs): action_id = kwargs.pop("action_id") super(MyAuthError, self).__init__(*args, **kwargs) self.action_id = action_id class MyProxy(object): @polkit.enable_proxy(authfail_exception=MyAuthError) def some_method(self, ...): ...""" assert(func is None or isinstance(func, collections.Callable)) assert( authfail_result in (None, AUTHFAIL_DONTCATCH) or authfail_exception is None) assert( authfail_callback is None or isinstance(authfail_callback, collections.Callable)) assert( authfail_exception is None or issubclass(authfail_exception, Exception)) def _enable_proxy(func, *p, **k): try: return func(*p, **k) except dbus.DBusException as e: exc_name = e.get_dbus_name() if not exc_name.startswith(AUTH_EXC_PREFIX): raise action_id = exc_name[len(AUTH_EXC_PREFIX):] if authfail_callback is not None: authfail_callback(action_id=action_id) if authfail_exception is not None: try: af_exc = authfail_exception(action_id=action_id) except: af_exc = authfail_exception() raise af_exc if authfail_result is AUTHFAIL_DONTCATCH: raise return authfail_result if func is not None: return decorator(_enable_proxy, func) else: def decorate(func): return decorator(_enable_proxy, func) return decorate class NotAuthorizedException(dbus.DBusException): """Exception which a DBus service method throws if an authorization required for executing it can't be obtained.""" _dbus_error_name = \ "org.fedoraproject.slip.dbus.service.PolKit.NotAuthorizedException" def __init__(self, action_id, *p, **k): self._dbus_error_name = self.__class__._dbus_error_name + "." +\ action_id super(NotAuthorizedException, self).__init__(*p, **k) class PolKit(object): """Convenience wrapper around polkit.""" _dbus_name = 'org.freedesktop.PolicyKit1' _dbus_path = '/org/freedesktop/PolicyKit1/Authority' _dbus_interface = 'org.freedesktop.PolicyKit1.Authority' __interface = None __bus = None __bus_name = None __signal_receiver = None @classmethod def _on_name_owner_changed(cls, name, old_owner, new_owner): if name == cls._dbus_name and PolKit.__bus: PolKit.__bus.remove_signal_receiver(PolKit.__signal_receiver) PolKit.__bus = None PolKit.__signal_receiver = None PolKit.__interface = None @property def _bus(self): if not PolKit.__bus: PolKit.__bus = dbus.SystemBus() PolKit.__signal_receiver = PolKit.__bus.add_signal_receiver( handler_function=self._on_name_owner_changed, signal_name='NameOwnerChanged', dbus_interface='org.freedesktop.DBus', arg0=self._dbus_name) return PolKit.__bus @property def _bus_name(self): if not PolKit.__bus_name: PolKit.__bus_name = self._bus.get_unique_name() return PolKit.__bus_name @property def _interface(self): if not PolKit.__interface: try: PolKit.__interface = dbus.Interface(self._bus.get_object( self._dbus_name, self._dbus_path), self._dbus_interface) except dbus.DBusException: pass return PolKit.__interface @property def _polkit_present(self): return bool(self._interface) def __dbus_system_bus_name_uid(self, system_bus_name): bus_object = self._bus.get_object( 'org.freedesktop.DBus', '/org/freedesktop/DBus') bus_interface = dbus.Interface(bus_object, 'org.freedesktop.DBus') try: uid = bus_interface.GetConnectionUnixUser(system_bus_name) except: uid = None return uid def __authorization_is_obtainable(self, authorization): if not self._polkit_present: return True (is_authorized, is_challenge, details) = \ self._interface.CheckAuthorization( ("system-bus-name", {"name": self._bus_name}), authorization, {}, 0, "") return is_authorized or is_challenge def AreAuthorizationsObtainable(self, authorizations): if not self._polkit_present: return True if not isinstance(authorizations, (tuple, list, set)): authorizations = (authorizations,) obtainable = \ reduce( lambda x, y: x and self.__authorization_is_obtainable(y), authorizations, True) return obtainable def IsSystemBusNameAuthorizedAsync( self, system_bus_name, action_id, reply_handler, error_handler, challenge=True, details={}): if not self._polkit_present: return reply_handler(action_id is None or self.__dbus_system_bus_name_uid(system_bus_name) == 0) flags = 0 if challenge: flags |= 0x1 def reply_cb(args): (is_authorized, is_challenge, details) = args reply_handler(is_authorized) self._interface.CheckAuthorization( ("system-bus-name", {"name": system_bus_name}), action_id, details, flags, "", reply_handler=reply_cb, error_handler=error_handler, timeout=method_call_no_timeout) __polkit = PolKit() def AreAuthorizationsObtainable(authorizations): return __polkit.AreAuthorizationsObtainable(authorizations) def IsSystemBusNameAuthorizedAsync( system_bus_name, action_id, reply_handler, error_handler, challenge=True, details={}): return __polkit.IsSystemBusNameAuthorizedAsync( system_bus_name, action_id, reply_handler, error_handler, challenge, details) PK]4 __init__.pynu[# -*- coding: utf-8 -*- from __future__ import absolute_import from . import bus from .bus import SessionBus, SystemBus, StarterBus from . import proxies from . import service from . import polkit from . import mainloop PK]@$__pycache__/constants.cpython-36.pycnu[PK]rbb b )1__pycache__/mainloop.cpython-36.opt-1.pycnu[PK] NN( __pycache__/introspection.cpython-36.pycnu[PK]Rf0 __pycache__/bus.cpython-36.pycnu[PK] NN.#__pycache__/introspection.cpython-36.opt-1.pycnu[PK])*#^6__pycache__/__init__.cpython-36.pycnu[PK]gIhh'78__pycache__/polkit.cpython-36.opt-1.pycnu[PK]`:"V__pycache__/proxies.cpython-36.pycnu[PK])*)-\__pycache__/__init__.cpython-36.opt-1.pycnu[PK]rbb b # ^__pycache__/mainloop.cpython-36.pycnu[PK]UKCC!j__pycache__/polkit.cpython-36.pycnu[PK]`:(U__pycache__/proxies.cpython-36.opt-1.pycnu[PK]Rf0$__pycache__/bus.cpython-36.opt-1.pycnu[PK]x"__pycache__/service.cpython-36.pycnu[PK]@*__pycache__/constants.cpython-36.opt-1.pycnu[PK]x(+__pycache__/service.cpython-36.opt-1.pycnu[PK],Vr mconstants.pynu[PK]$:YYibus.pynu[PK]DD`` proxies.pynu[PK]bΜ# # mainloop.pynu[PK]introspection.pynu[PK]!+ service.pynu[PK]?CI$I$ polkit.pynu[PK]4 d4__init__.pynu[PK}5