we now detect loop when server isn't RFC complient and handle badly subscription acknoledgment. Fixes #1864

This commit is contained in:
Yann Leboulanger 2006-07-26 11:13:07 +00:00
parent 134483f936
commit 394381a78a
1 changed files with 17 additions and 1 deletions

View File

@ -1055,6 +1055,9 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco)
# keep the jids we auto added (transports contacts) to not send the # keep the jids we auto added (transports contacts) to not send the
# SUBSCRIBED event to gui # SUBSCRIBED event to gui
self.automatically_added = [] self.automatically_added = []
# keep the latest subscribed event for each jid to prevent loop when we
# acknoledge presences
self.subscribed_events = {}
try: try:
idle.init() idle.init()
except: except:
@ -1527,6 +1530,19 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco)
elif ptype == 'subscribed': elif ptype == 'subscribed':
if jid_stripped in self.automatically_added: if jid_stripped in self.automatically_added:
self.automatically_added.remove(jid_stripped) self.automatically_added.remove(jid_stripped)
else:
# detect a subscription loop
if not self.subscribed_events.has_key(jid_stripped):
self.subscribed_events[jid_stripped] = []
self.subscribed_events[jid_stripped].append(time.time())
block = False
if len(self.subscribed_events[jid_stripped]) > 5:
if time.time() - self.subscribed_events[jid_stripped][0] < 5:
block = True
self.subscribed_events[jid_stripped] = self.subscribed_events[jid_stripped][1:]
if block:
gajim.config.set_per('account', self.name,
'dont_ack_subscription', True)
else: else:
self.dispatch('SUBSCRIBED', (jid_stripped, resource)) self.dispatch('SUBSCRIBED', (jid_stripped, resource))
# BE CAREFUL: no con.updateRosterItem() in a callback # BE CAREFUL: no con.updateRosterItem() in a callback