From f51e924eb66923e24834d07356520f9c9d4ff2c8 Mon Sep 17 00:00:00 2001 From: Goffi Date: Sun, 7 Apr 2019 18:49:41 +0200 Subject: [PATCH] core: added a rosterResync method to bridge: rosterResync do a full resynchronisation of roster with server. This should not be needed, but may be useful if user suspect a sync issue for whatever reason. --- sat/bridge/bridge_constructor/bridge_template.ini | 10 ++++++++++ sat/bridge/dbus_bridge.py | 6 ++++++ sat/bridge/pb.py | 2 +- sat/core/sat_main.py | 5 +++++ sat/core/xmpp.py | 13 +++++++++++++ sat_frontends/bridge/dbus_bridge.py | 9 +++++++++ sat_frontends/bridge/pb.py | 8 ++++++++ 7 files changed, 52 insertions(+), 1 deletion(-) diff --git a/sat/bridge/bridge_constructor/bridge_template.ini b/sat/bridge/bridge_constructor/bridge_template.ini index d2becb19..14bfd616 100644 --- a/sat/bridge/bridge_constructor/bridge_template.ini +++ b/sat/bridge/bridge_constructor/bridge_template.ini @@ -692,6 +692,16 @@ doc=Remove a contact from profile's roster doc_param_0=entity_jid: JID to remove from roster doc_param_1=%(doc_profile_key)s +[rosterResync] +async= +type=method +category=core +sig_in=s +sig_out= +param_0_default="@DEFAULT@" +doc=Do a full resynchronisation of roster with server +doc_param_0=%(doc_profile_key)s + [launchAction] async= type=method diff --git a/sat/bridge/dbus_bridge.py b/sat/bridge/dbus_bridge.py index 454a1e3c..a0200a8b 100644 --- a/sat/bridge/dbus_bridge.py +++ b/sat/bridge/dbus_bridge.py @@ -510,6 +510,12 @@ class DbusObject(dbus.service.Object): def progressGetAllMetadata(self, profile): return self._callback("progressGetAllMetadata", unicode(profile)) + @dbus.service.method(const_INT_PREFIX+const_CORE_SUFFIX, + in_signature='s', out_signature='', + async_callbacks=('callback', 'errback')) + def rosterResync(self, profile_key="@DEFAULT@", callback=None, errback=None): + return self._callback("rosterResync", unicode(profile_key), callback=callback, errback=errback) + @dbus.service.method(const_INT_PREFIX+const_CORE_SUFFIX, in_signature='s', out_signature='b', async_callbacks=None) diff --git a/sat/bridge/pb.py b/sat/bridge/pb.py index 10660afc..f93f7c8d 100644 --- a/sat/bridge/pb.py +++ b/sat/bridge/pb.py @@ -20,9 +20,9 @@ from sat.core.log import getLogger -log = getLogger(__name__) from twisted.spread import jelly, pb from twisted.internet import reactor +log = getLogger(__name__) ## jelly hack diff --git a/sat/core/sat_main.py b/sat/core/sat_main.py index ded0cc73..ca513e28 100644 --- a/sat/core/sat_main.py +++ b/sat/core/sat_main.py @@ -145,6 +145,7 @@ class SAT(service.Service): self.bridge.register_method("addContact", self._addContact) self.bridge.register_method("updateContact", self._updateContact) self.bridge.register_method("delContact", self._delContact) + self.bridge.register_method("rosterResync", self._rosterResync) self.bridge.register_method("isConnected", self.isConnected) self.bridge.register_method("launchAction", self.launchCallback) self.bridge.register_method("actionsGet", self.actionsGet) @@ -809,6 +810,10 @@ class SAT(service.Service): self.profiles[profile].presence.unsubscribe(to_jid) # is not asynchronous return self.profiles[profile].roster.removeItem(to_jid) + def _rosterResync(self, profile_key): + client = self.getClient(profile_key) + return client.roster.resync() + ## Discovery ## # discovery methods are shortcuts to self.memory.disco # the main difference with client.disco is that self.memory.disco manage cache diff --git a/sat/core/xmpp.py b/sat/core/xmpp.py index 84bbeb42..e0b29e23 100644 --- a/sat/core/xmpp.py +++ b/sat/core/xmpp.py @@ -1170,6 +1170,19 @@ class SatRosterProtocol(xmppim.RosterClientProtocol): roster_item_elt = roster_item.toElement().toXml() roster_cache[roster_jid_s] = roster_item_elt + @defer.inlineCallbacks + def resync(self): + """Ask full roster to resync database + + this should not be necessary, but may be used if user suspsect roster + to be somehow corrupted + """ + roster_cache = self.roster_cache + yield roster_cache.clear() + self._jids.clear() + self._groups.clear() + yield self.requestRoster() + @defer.inlineCallbacks def requestRoster(self): """Ask the server for Roster list """ diff --git a/sat_frontends/bridge/dbus_bridge.py b/sat_frontends/bridge/dbus_bridge.py index 0922bfad..a395b35a 100644 --- a/sat_frontends/bridge/dbus_bridge.py +++ b/sat_frontends/bridge/dbus_bridge.py @@ -726,6 +726,15 @@ class Bridge(object): kwargs['error_handler'] = error_handler return self.db_core_iface.progressGetAllMetadata(profile, **kwargs) + def rosterResync(self, profile_key="@DEFAULT@", callback=None, errback=None): + if callback is None: + error_handler = None + else: + if errback is None: + errback = log.error + error_handler = lambda err:errback(dbus_to_bridge_exception(err)) + return self.db_core_iface.rosterResync(profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler) + def saveParamsTemplate(self, filename, callback=None, errback=None): if callback is None: error_handler = None diff --git a/sat_frontends/bridge/pb.py b/sat_frontends/bridge/pb.py index bce4421a..5a266189 100644 --- a/sat_frontends/bridge/pb.py +++ b/sat_frontends/bridge/pb.py @@ -526,6 +526,14 @@ class Bridge(object): errback = self._generic_errback d.addErrback(errback) + def rosterResync(self, profile_key="@DEFAULT@", callback=None, errback=None): + d = self.root.callRemote("rosterResync", profile_key) + if callback is not None: + d.addCallback(lambda __: callback()) + if errback is None: + errback = self._generic_errback + d.addErrback(errback) + def saveParamsTemplate(self, filename, callback=None, errback=None): d = self.root.callRemote("saveParamsTemplate", filename) if callback is not None: