comparison sat_frontends/bridge/dbus_bridge.py @ 3028:ab2696e34d29

Python 3 port: /!\ this is a huge commit /!\ starting from this commit, SàT is needs Python 3.6+ /!\ SàT maybe be instable or some feature may not work anymore, this will improve with time This patch port backend, bridge and frontends to Python 3. Roughly this has been done this way: - 2to3 tools has been applied (with python 3.7) - all references to python2 have been replaced with python3 (notably shebangs) - fixed files not handled by 2to3 (notably the shell script) - several manual fixes - fixed issues reported by Python 3 that where not handled in Python 2 - replaced "async" with "async_" when needed (it's a reserved word from Python 3.7) - replaced zope's "implements" with @implementer decorator - temporary hack to handle data pickled in database, as str or bytes may be returned, to be checked later - fixed hash comparison for password - removed some code which is not needed anymore with Python 3 - deactivated some code which needs to be checked (notably certificate validation) - tested with jp, fixed reported issues until some basic commands worked - ported Primitivus (after porting dependencies like urwid satext) - more manual fixes
author Goffi <goffi@goffi.org>
date Tue, 13 Aug 2019 19:08:41 +0200
parents 82b781c46841
children a1bc34f90fa5
comparison
equal deleted inserted replaced
3027:ff5bcb12ae60 3028:ab2696e34d29
1 #!/usr/bin/env python2 1 #!/usr/bin/env python3
2 #-*- coding: utf-8 -*- 2 #-*- coding: utf-8 -*-
3 3
4 # SAT communication bridge 4 # SAT communication bridge
5 # Copyright (C) 2009-2019 Jérôme Poisson (goffi@goffi.org) 5 # Copyright (C) 2009-2019 Jérôme Poisson (goffi@goffi.org)
6 6
16 16
17 # You should have received a copy of the GNU Affero General Public License 17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. 18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 19
20 from sat.core.i18n import _ 20 from sat.core.i18n import _
21 from bridge_frontend import BridgeException 21 from .bridge_frontend import BridgeException
22 import dbus 22 import dbus
23 from sat.core.log import getLogger 23 from sat.core.log import getLogger
24 log = getLogger(__name__) 24 log = getLogger(__name__)
25 from sat.core.exceptions import BridgeExceptionNoService, BridgeInitError 25 from sat.core.exceptions import BridgeExceptionNoService, BridgeInitError
26 26
68 const_OBJ_PATH) 68 const_OBJ_PATH)
69 self.db_core_iface = dbus.Interface(self.db_object, 69 self.db_core_iface = dbus.Interface(self.db_object,
70 dbus_interface=const_INT_PREFIX + const_CORE_SUFFIX) 70 dbus_interface=const_INT_PREFIX + const_CORE_SUFFIX)
71 self.db_plugin_iface = dbus.Interface(self.db_object, 71 self.db_plugin_iface = dbus.Interface(self.db_object,
72 dbus_interface=const_INT_PREFIX + const_PLUGIN_SUFFIX) 72 dbus_interface=const_INT_PREFIX + const_PLUGIN_SUFFIX)
73 except dbus.exceptions.DBusException, e: 73 except dbus.exceptions.DBusException as e:
74 if e._dbus_error_name in ('org.freedesktop.DBus.Error.ServiceUnknown', 74 if e._dbus_error_name in ('org.freedesktop.DBus.Error.ServiceUnknown',
75 'org.freedesktop.DBus.Error.Spawn.ExecFailed'): 75 'org.freedesktop.DBus.Error.Spawn.ExecFailed'):
76 errback(BridgeExceptionNoService()) 76 errback(BridgeExceptionNoService())
77 elif e._dbus_error_name == 'org.freedesktop.DBus.Error.NotSupported': 77 elif e._dbus_error_name == 'org.freedesktop.DBus.Error.NotSupported':
78 log.error(_(u"D-Bus is not launched, please see README to see instructions on how to launch it")) 78 log.error(_("D-Bus is not launched, please see README to see instructions on how to launch it"))
79 errback(BridgeInitError) 79 errback(BridgeInitError)
80 else: 80 else:
81 errback(e) 81 errback(e)
82 callback() 82 callback()
83 #props = self.db_core_iface.getProperties() 83 #props = self.db_core_iface.getProperties()
100 def getPluginMethod(*args, **kwargs): 100 def getPluginMethod(*args, **kwargs):
101 # We first check if we have an async call. We detect this in two ways: 101 # We first check if we have an async call. We detect this in two ways:
102 # - if we have the 'callback' and 'errback' keyword arguments 102 # - if we have the 'callback' and 'errback' keyword arguments
103 # - or if the last two arguments are callable 103 # - or if the last two arguments are callable
104 104
105 async = False 105 async_ = False
106 args = list(args) 106 args = list(args)
107 107
108 if kwargs: 108 if kwargs:
109 if 'callback' in kwargs: 109 if 'callback' in kwargs:
110 async = True 110 async_ = True
111 _callback = kwargs.pop('callback') 111 _callback = kwargs.pop('callback')
112 _errback = kwargs.pop('errback', lambda failure: log.error(unicode(failure))) 112 _errback = kwargs.pop('errback', lambda failure: log.error(str(failure)))
113 try: 113 try:
114 args.append(kwargs.pop('profile')) 114 args.append(kwargs.pop('profile'))
115 except KeyError: 115 except KeyError:
116 try: 116 try:
117 args.append(kwargs.pop('profile_key')) 117 args.append(kwargs.pop('profile_key'))
118 except KeyError: 118 except KeyError:
119 pass 119 pass
120 # at this point, kwargs should be empty 120 # at this point, kwargs should be empty
121 if kwargs: 121 if kwargs:
122 log.warnings(u"unexpected keyword arguments, they will be ignored: {}".format(kwargs)) 122 log.warnings("unexpected keyword arguments, they will be ignored: {}".format(kwargs))
123 elif len(args) >= 2 and callable(args[-1]) and callable(args[-2]): 123 elif len(args) >= 2 and callable(args[-1]) and callable(args[-2]):
124 async = True 124 async_ = True
125 _errback = args.pop() 125 _errback = args.pop()
126 _callback = args.pop() 126 _callback = args.pop()
127 127
128 method = getattr(self.db_plugin_iface, name) 128 method = getattr(self.db_plugin_iface, name)
129 129
130 if async: 130 if async_:
131 kwargs['timeout'] = const_TIMEOUT 131 kwargs['timeout'] = const_TIMEOUT
132 kwargs['reply_handler'] = _callback 132 kwargs['reply_handler'] = _callback
133 kwargs['error_handler'] = lambda err: _errback(dbus_to_bridge_exception(err)) 133 kwargs['error_handler'] = lambda err: _errback(dbus_to_bridge_exception(err))
134 134
135 return method(*args, **kwargs) 135 return method(*args, **kwargs)
178 error_handler = None 178 error_handler = None
179 else: 179 else:
180 if errback is None: 180 if errback is None:
181 errback = log.error 181 errback = log.error
182 error_handler = lambda err:errback(dbus_to_bridge_exception(err)) 182 error_handler = lambda err:errback(dbus_to_bridge_exception(err))
183 return unicode(self.db_core_iface.asyncGetParamA(name, category, attribute, security_limit, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler)) 183 return str(self.db_core_iface.asyncGetParamA(name, category, attribute, security_limit, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler))
184 184
185 def asyncGetParamsValuesFromCategory(self, category, security_limit=-1, profile_key="@DEFAULT@", callback=None, errback=None): 185 def asyncGetParamsValuesFromCategory(self, category, security_limit=-1, profile_key="@DEFAULT@", callback=None, errback=None):
186 if callback is None: 186 if callback is None:
187 error_handler = None 187 error_handler = None
188 else: 188 else:
207 if errback is None: 207 if errback is None:
208 errback = log.error 208 errback = log.error
209 error_handler = lambda err:errback(dbus_to_bridge_exception(err)) 209 error_handler = lambda err:errback(dbus_to_bridge_exception(err))
210 return self.db_core_iface.delContact(entity_jid, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler) 210 return self.db_core_iface.delContact(entity_jid, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler)
211 211
212 def discoFindByFeatures(self, namespaces, identities, bare_jid=False, service=True, roster=True, own_jid=True, local_device=False, profile_key=u"@DEFAULT@", callback=None, errback=None): 212 def discoFindByFeatures(self, namespaces, identities, bare_jid=False, service=True, roster=True, own_jid=True, local_device=False, profile_key="@DEFAULT@", callback=None, errback=None):
213 if callback is None: 213 if callback is None:
214 error_handler = None 214 error_handler = None
215 else: 215 else:
216 if errback is None: 216 if errback is None:
217 errback = log.error 217 errback = log.error
218 error_handler = lambda err:errback(dbus_to_bridge_exception(err)) 218 error_handler = lambda err:errback(dbus_to_bridge_exception(err))
219 return self.db_core_iface.discoFindByFeatures(namespaces, identities, bare_jid, service, roster, own_jid, local_device, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler) 219 return self.db_core_iface.discoFindByFeatures(namespaces, identities, bare_jid, service, roster, own_jid, local_device, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler)
220 220
221 def discoInfos(self, entity_jid, node=u'', use_cache=True, profile_key=u"@DEFAULT@", callback=None, errback=None): 221 def discoInfos(self, entity_jid, node='', use_cache=True, profile_key="@DEFAULT@", callback=None, errback=None):
222 if callback is None: 222 if callback is None:
223 error_handler = None 223 error_handler = None
224 else: 224 else:
225 if errback is None: 225 if errback is None:
226 errback = log.error 226 errback = log.error
227 error_handler = lambda err:errback(dbus_to_bridge_exception(err)) 227 error_handler = lambda err:errback(dbus_to_bridge_exception(err))
228 return self.db_core_iface.discoInfos(entity_jid, node, use_cache, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler) 228 return self.db_core_iface.discoInfos(entity_jid, node, use_cache, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler)
229 229
230 def discoItems(self, entity_jid, node=u'', use_cache=True, profile_key=u"@DEFAULT@", callback=None, errback=None): 230 def discoItems(self, entity_jid, node='', use_cache=True, profile_key="@DEFAULT@", callback=None, errback=None):
231 if callback is None: 231 if callback is None:
232 error_handler = None 232 error_handler = None
233 else: 233 else:
234 if errback is None: 234 if errback is None:
235 errback = log.error 235 errback = log.error
255 kwargs={} 255 kwargs={}
256 if callback is not None: 256 if callback is not None:
257 kwargs['timeout'] = const_TIMEOUT 257 kwargs['timeout'] = const_TIMEOUT
258 kwargs['reply_handler'] = callback 258 kwargs['reply_handler'] = callback
259 kwargs['error_handler'] = error_handler 259 kwargs['error_handler'] = error_handler
260 return unicode(self.db_core_iface.encryptionNamespaceGet(arg_0, **kwargs)) 260 return str(self.db_core_iface.encryptionNamespaceGet(arg_0, **kwargs))
261 261
262 def encryptionPluginsGet(self, callback=None, errback=None): 262 def encryptionPluginsGet(self, callback=None, errback=None):
263 if callback is None: 263 if callback is None:
264 error_handler = None 264 error_handler = None
265 else: 265 else:
271 kwargs['timeout'] = const_TIMEOUT 271 kwargs['timeout'] = const_TIMEOUT
272 kwargs['reply_handler'] = callback 272 kwargs['reply_handler'] = callback
273 kwargs['error_handler'] = error_handler 273 kwargs['error_handler'] = error_handler
274 return self.db_core_iface.encryptionPluginsGet(**kwargs) 274 return self.db_core_iface.encryptionPluginsGet(**kwargs)
275 275
276 def encryptionTrustUIGet(self, namespace, arg_1, profile_key, callback=None, errback=None): 276 def encryptionTrustUIGet(self, to_jid, namespace, profile_key, callback=None, errback=None):
277 if callback is None: 277 if callback is None:
278 error_handler = None 278 error_handler = None
279 else: 279 else:
280 if errback is None: 280 if errback is None:
281 errback = log.error 281 errback = log.error
282 error_handler = lambda err:errback(dbus_to_bridge_exception(err)) 282 error_handler = lambda err:errback(dbus_to_bridge_exception(err))
283 return unicode(self.db_core_iface.encryptionTrustUIGet(namespace, arg_1, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler)) 283 return str(self.db_core_iface.encryptionTrustUIGet(to_jid, namespace, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler))
284 284
285 def getConfig(self, section, name, callback=None, errback=None): 285 def getConfig(self, section, name, callback=None, errback=None):
286 if callback is None: 286 if callback is None:
287 error_handler = None 287 error_handler = None
288 else: 288 else:
292 kwargs={} 292 kwargs={}
293 if callback is not None: 293 if callback is not None:
294 kwargs['timeout'] = const_TIMEOUT 294 kwargs['timeout'] = const_TIMEOUT
295 kwargs['reply_handler'] = callback 295 kwargs['reply_handler'] = callback
296 kwargs['error_handler'] = error_handler 296 kwargs['error_handler'] = error_handler
297 return unicode(self.db_core_iface.getConfig(section, name, **kwargs)) 297 return str(self.db_core_iface.getConfig(section, name, **kwargs))
298 298
299 def getContacts(self, profile_key="@DEFAULT@", callback=None, errback=None): 299 def getContacts(self, profile_key="@DEFAULT@", callback=None, errback=None):
300 if callback is None: 300 if callback is None:
301 error_handler = None 301 error_handler = None
302 else: 302 else:
366 kwargs={} 366 kwargs={}
367 if callback is not None: 367 if callback is not None:
368 kwargs['timeout'] = const_TIMEOUT 368 kwargs['timeout'] = const_TIMEOUT
369 kwargs['reply_handler'] = callback 369 kwargs['reply_handler'] = callback
370 kwargs['error_handler'] = error_handler 370 kwargs['error_handler'] = error_handler
371 return unicode(self.db_core_iface.getMainResource(contact_jid, profile_key, **kwargs)) 371 return str(self.db_core_iface.getMainResource(contact_jid, profile_key, **kwargs))
372 372
373 def getParamA(self, name, category, attribute="value", profile_key="@DEFAULT@", callback=None, errback=None): 373 def getParamA(self, name, category, attribute="value", profile_key="@DEFAULT@", callback=None, errback=None):
374 if callback is None: 374 if callback is None:
375 error_handler = None 375 error_handler = None
376 else: 376 else:
380 kwargs={} 380 kwargs={}
381 if callback is not None: 381 if callback is not None:
382 kwargs['timeout'] = const_TIMEOUT 382 kwargs['timeout'] = const_TIMEOUT
383 kwargs['reply_handler'] = callback 383 kwargs['reply_handler'] = callback
384 kwargs['error_handler'] = error_handler 384 kwargs['error_handler'] = error_handler
385 return unicode(self.db_core_iface.getParamA(name, category, attribute, profile_key, **kwargs)) 385 return str(self.db_core_iface.getParamA(name, category, attribute, profile_key, **kwargs))
386 386
387 def getParamsCategories(self, callback=None, errback=None): 387 def getParamsCategories(self, callback=None, errback=None):
388 if callback is None: 388 if callback is None:
389 error_handler = None 389 error_handler = None
390 else: 390 else:
403 error_handler = None 403 error_handler = None
404 else: 404 else:
405 if errback is None: 405 if errback is None:
406 errback = log.error 406 errback = log.error
407 error_handler = lambda err:errback(dbus_to_bridge_exception(err)) 407 error_handler = lambda err:errback(dbus_to_bridge_exception(err))
408 return unicode(self.db_core_iface.getParamsUI(security_limit, app, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler)) 408 return str(self.db_core_iface.getParamsUI(security_limit, app, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler))
409 409
410 def getPresenceStatuses(self, profile_key="@DEFAULT@", callback=None, errback=None): 410 def getPresenceStatuses(self, profile_key="@DEFAULT@", callback=None, errback=None):
411 if callback is None: 411 if callback is None:
412 error_handler = None 412 error_handler = None
413 else: 413 else:
440 kwargs={} 440 kwargs={}
441 if callback is not None: 441 if callback is not None:
442 kwargs['timeout'] = const_TIMEOUT 442 kwargs['timeout'] = const_TIMEOUT
443 kwargs['reply_handler'] = callback 443 kwargs['reply_handler'] = callback
444 kwargs['error_handler'] = error_handler 444 kwargs['error_handler'] = error_handler
445 return unicode(self.db_core_iface.getVersion(**kwargs)) 445 return str(self.db_core_iface.getVersion(**kwargs))
446 446
447 def getWaitingSub(self, profile_key="@DEFAULT@", callback=None, errback=None): 447 def getWaitingSub(self, profile_key="@DEFAULT@", callback=None, errback=None):
448 if callback is None: 448 if callback is None:
449 error_handler = None 449 error_handler = None
450 else: 450 else:
514 kwargs={} 514 kwargs={}
515 if callback is not None: 515 if callback is not None:
516 kwargs['timeout'] = const_TIMEOUT 516 kwargs['timeout'] = const_TIMEOUT
517 kwargs['reply_handler'] = callback 517 kwargs['reply_handler'] = callback
518 kwargs['error_handler'] = error_handler 518 kwargs['error_handler'] = error_handler
519 return unicode(self.db_core_iface.menuHelpGet(menu_id, language, **kwargs)) 519 return str(self.db_core_iface.menuHelpGet(menu_id, language, **kwargs))
520 520
521 def menuLaunch(self, menu_type, path, data, security_limit, profile_key, callback=None, errback=None): 521 def menuLaunch(self, menu_type, path, data, security_limit, profile_key, callback=None, errback=None):
522 if callback is None: 522 if callback is None:
523 error_handler = None 523 error_handler = None
524 else: 524 else:
551 kwargs={} 551 kwargs={}
552 if callback is not None: 552 if callback is not None:
553 kwargs['timeout'] = const_TIMEOUT 553 kwargs['timeout'] = const_TIMEOUT
554 kwargs['reply_handler'] = callback 554 kwargs['reply_handler'] = callback
555 kwargs['error_handler'] = error_handler 555 kwargs['error_handler'] = error_handler
556 return unicode(self.db_core_iface.messageEncryptionGet(to_jid, profile_key, **kwargs)) 556 return str(self.db_core_iface.messageEncryptionGet(to_jid, profile_key, **kwargs))
557 557
558 def messageEncryptionStart(self, to_jid, namespace='', replace=False, profile_key="@NONE@", callback=None, errback=None): 558 def messageEncryptionStart(self, to_jid, namespace='', replace=False, profile_key="@NONE@", callback=None, errback=None):
559 if callback is None: 559 if callback is None:
560 error_handler = None 560 error_handler = None
561 else: 561 else:
643 kwargs={} 643 kwargs={}
644 if callback is not None: 644 if callback is not None:
645 kwargs['timeout'] = const_TIMEOUT 645 kwargs['timeout'] = const_TIMEOUT
646 kwargs['reply_handler'] = callback 646 kwargs['reply_handler'] = callback
647 kwargs['error_handler'] = error_handler 647 kwargs['error_handler'] = error_handler
648 return unicode(self.db_core_iface.profileNameGet(profile_key, **kwargs)) 648 return str(self.db_core_iface.profileNameGet(profile_key, **kwargs))
649 649
650 def profileSetDefault(self, profile, callback=None, errback=None): 650 def profileSetDefault(self, profile, callback=None, errback=None):
651 if callback is None: 651 if callback is None:
652 error_handler = None 652 error_handler = None
653 else: 653 else: