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.
This commit is contained in:
Goffi 2019-04-07 18:49:41 +02:00
commit f51e924eb6
7 changed files with 52 additions and 1 deletions

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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 """

View file

@ -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

View file

@ -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: