160
165
raise AccessDeniedException(ex.message)
164
class BackendService(PolicyKitService):
165
INTERFACE_NAME = 'com.hp.hplip'
166
SERVICE_NAME = 'com.hp.hplip'
169
def __init__(self, connection=None, path='/'):
170
if connection is None:
171
connection = get_service_bus()
173
super(BackendService, self).__init__(connection, path)
175
self.name = dbus.service.BusName(self.SERVICE_NAME, connection)
176
self.loop = gobject.MainLoop()
180
log.debug("Starting back-end service loop")
181
# self.start_idle_timeout()
184
@dbus.service.method(dbus_interface=INTERFACE_NAME,
185
in_signature='s', out_signature='b',
186
sender_keyword='sender')
187
def installPlugin(self, src_dir, sender=None):
189
self.check_permission(sender, INSTALL_PLUGIN_ACTION)
190
except AccessDeniedException, e:
193
log.debug("installPlugin: received '%s'" % src_dir)
195
if not copyPluginFiles(src_dir):
196
log.syslog("Plugin installation failed")
202
@dbus.service.method(dbus_interface=INTERFACE_NAME,
203
in_signature='', out_signature='b',
204
sender_keyword='sender')
205
def shutdown(self, sender=None):
206
log.debug("Stopping backend service")
168
def check_permission_v1(self, sender, connection, action=POLICY_KIT_ACTION):
169
if not sender or not connection:
170
log.error("Session not authorized by PolicyKit")
171
raise AccessDeniedException('Session not authorized by PolicyKit')
173
system_bus = dbus.SystemBus()
174
obj = system_bus.get_object("org.freedesktop.PolicyKit1",
175
"/org/freedesktop/PolicyKit1/Authority",
176
"org.freedesktop.PolicyKit1.Authority")
177
policy_kit = dbus.Interface(obj, "org.freedesktop.PolicyKit1.Authority")
178
info = dbus.Interface(connection.get_object("org.freedesktop.DBus",
179
"/org/freedesktop/DBus/Bus",
181
"org.freedesktop.DBus")
182
pid = info.GetConnectionUnixProcessID(sender)
186
{ 'pid' : dbus.UInt32(pid, variant_level = 1) }
188
details = { '' : '' }
189
flags = dbus.UInt32(1) # AllowUserInteraction = 0x00000001
192
(ok, notused, details) = \
193
policy_kit.CheckAuthorization(subject,
199
log.error("Session not authorized by PolicyKit version 1")
204
if utils.to_bool(sys_conf.get('configure', 'policy-kit')):
205
class BackendService(PolicyKitService):
206
INTERFACE_NAME = 'com.hp.hplip'
207
SERVICE_NAME = 'com.hp.hplip'
208
LOGFILE_NAME = '/tmp/hp-pkservice.log'
210
def __init__(self, connection=None, path='/', logfile=LOGFILE_NAME):
211
if connection is None:
212
connection = get_service_bus()
214
super(BackendService, self).__init__(connection, path)
216
self.name = dbus.service.BusName(self.SERVICE_NAME, connection)
217
self.loop = gobject.MainLoop()
220
log.set_logfile("%s.%d" % (logfile, os.getpid()))
221
log.set_level("debug")
223
def run(self, version=None):
225
version = policykit_version()
227
log.error("Unable to determine installed PolicyKit version")
230
self.version = version
231
log.set_where(Logger.LOG_TO_CONSOLE_AND_FILE)
232
log.debug("Starting back-end service loop (version %d)" % version)
237
@dbus.service.method(dbus_interface=INTERFACE_NAME,
238
in_signature='s', out_signature='b',
239
sender_keyword='sender',
240
connection_keyword='connection')
241
def installPlugin(self, src_dir, sender=None, connection=None):
242
if self.version == 0:
244
self.check_permission_v0(sender, INSTALL_PLUGIN_ACTION)
245
except AccessDeniedException, e:
248
elif self.version == 1:
249
if not self.check_permission_v1(sender,
251
INSTALL_PLUGIN_ACTION):
255
log.error("installPlugin: invalid PolicyKit version %d" % self.version)
258
log.debug("installPlugin: installing from '%s'" % src_dir)
260
if not copyPluginFiles(src_dir):
261
log.error("Plugin installation failed")
267
@dbus.service.method(dbus_interface=INTERFACE_NAME,
268
in_signature='s', out_signature='b',
269
sender_keyword='sender',
270
connection_keyword='connection')
271
def shutdown(self, arg, sender=None, connection=None):
272
log.debug("Stopping backend service")
213
279
class PolicyKit(object):
280
def __init__(self, version=None):
282
version = policykit_version()
284
log.debug("Unable to determine installed PolicyKit version")
215
287
self.bus = dbus.SystemBus()
216
288
self.obj = self.bus.get_object(POLICY_KIT_ACTION, "/")
217
289
self.iface = dbus.Interface(self.obj, dbus_interface=POLICY_KIT_ACTION)
290
self.version = version
220
292
def installPlugin(self, src_dir):
221
auth = PolicyKitAuthentication()
222
if not auth.is_authorized(INSTALL_PLUGIN_ACTION):
223
if not auth.obtain_authorization(INSTALL_PLUGIN_ACTION):
293
if self.version == 0:
294
auth = PolicyKitAuthentication()
295
if not auth.is_authorized(INSTALL_PLUGIN_ACTION):
296
if not auth.obtain_authorization(INSTALL_PLUGIN_ACTION):
227
300
ok = self.iface.installPlugin(src_dir)