Mercurial > libervia-backend
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: |