we now detect loop when server isn't RFC complient and handle badly subscription acknoledgment. Fixes #1864
This commit is contained in:
		
							parent
							
								
									134483f936
								
							
						
					
					
						commit
						394381a78a
					
				
					 1 changed files with 17 additions and 1 deletions
				
			
		|  | @ -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: | ||||||
|  | @ -1528,7 +1531,20 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco) | ||||||
| 			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: | 			else: | ||||||
| 				self.dispatch('SUBSCRIBED', (jid_stripped, resource)) | 				# 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: | ||||||
|  | 					self.dispatch('SUBSCRIBED', (jid_stripped, resource)) | ||||||
| 			# BE CAREFUL: no con.updateRosterItem() in a callback | 			# BE CAREFUL: no con.updateRosterItem() in a callback | ||||||
| 			gajim.log.debug(_('we are now subscribed to %s') % who) | 			gajim.log.debug(_('we are now subscribed to %s') % who) | ||||||
| 		elif ptype == 'unsubscribe': | 		elif ptype == 'unsubscribe': | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue