diff --git a/gajim/common/connection_handlers_events.py b/gajim/common/connection_handlers_events.py index 2c8596a57..29ebf1be2 100644 --- a/gajim/common/connection_handlers_events.py +++ b/gajim/common/connection_handlers_events.py @@ -2318,33 +2318,13 @@ class AgentInfoReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): if self.id_ in self.conn.disco_info_ids: self.conn.disco_info_ids.remove(self.id_) if self.id_ is None: - log.warning('Invalid IQ received without an ID. Ignoring it: %s' % \ - self.stanza) + log.warning('Invalid IQ received without an ID. ' + 'Ignoring it: %s', self.stanza) return # According to XEP-0030: # For identity: category, type is mandatory, name is optional. # For feature: var is mandatory - self.identities, self.features, self.data = [], [], [] - q = self.stanza.getTag('query') - self.node = q.getAttr('node') - if not self.node: - self.node = '' - qc = self.stanza.getQueryChildren() - if not qc: - qc = [] - - for i in qc: - if i.getName() == 'identity': - attr = {} - for key in i.getAttrs().keys(): - attr[key] = i.getAttr(key) - self.identities.append(attr) - elif i.getName() == 'feature': - var = i.getAttr('var') - if var: - self.features.append(var) - elif i.getName() == 'x' and i.getNamespace() == nbxmpp.NS_DATA: - self.data.append(nbxmpp.DataForm(node=i)) + self.identities, self.features, self.data, self.node = self.parse_stanza(self.stanza) if not self.identities: # ejabberd doesn't send identities when we browse online users @@ -2354,6 +2334,33 @@ class AgentInfoReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): self.get_jid_resource() return True + @classmethod + def parse_stanza(cls, stanza): + identities, features, data, node = [], [], [], None + q = stanza.getTag('query') + node = q.getAttr('node') + if not node: + node = '' + + qc = stanza.getQueryChildren() + if not qc: + qc = [] + + for i in qc: + if i.getName() == 'identity': + attr = {} + for key in i.getAttrs().keys(): + attr[key] = i.getAttr(key) + identities.append(attr) + elif i.getName() == 'feature': + var = i.getAttr('var') + if var: + features.append(var) + elif i.getName() == 'x' and i.getNamespace() == nbxmpp.NS_DATA: + data.append(nbxmpp.DataForm(node=i)) + + return identities, features, data, node + class AgentInfoErrorReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'agent-info-error-received' base_network_events = [] diff --git a/test/unit/test_caps_cache.py b/test/unit/test_caps_cache.py index a0bbdd545..66fcc02c7 100644 --- a/test/unit/test_caps_cache.py +++ b/test/unit/test_caps_cache.py @@ -6,12 +6,46 @@ import unittest import lib lib.setup_env() -from nbxmpp import NS_MUC, NS_PING, NS_XHTML_IM +from nbxmpp import NS_MUC, NS_PING, NS_XHTML_IM, Iq from gajim.common import caps_cache as caps from gajim.common.contacts import Contact +from gajim.common.connection_handlers_events import AgentInfoReceivedEvent from mock import Mock +COMPLEX_EXAMPLE = ''' + + + + + + + + + + +urn:xmpp:dataforms:softwareinfo + + +ipv4 +ipv6 + + +Mac + + +10.5.1 + + +Psi + + +0.11 + + + +''' + class CommonCapsTest(unittest.TestCase): @@ -93,8 +127,10 @@ class TestCapsCache(CommonCapsTest): def test_hash(self): '''tests the hash computation''' - computed_hash = caps.compute_caps_hash(self.identities, self.features) - self.assertEqual(self.caps_hash, computed_hash) + stanza = Iq(node=COMPLEX_EXAMPLE) + identities, features, data, _ = AgentInfoReceivedEvent.parse_stanza(stanza) + computed_hash = caps.compute_caps_hash(identities, features, data) + self.assertEqual('q07IKJEyjvHSyhy//CH0CxmKi8w=', computed_hash) class TestClientCaps(CommonCapsTest):