summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormathieui <mathieui@mathieui.net>2021-04-19 19:53:33 +0200
committermathieui <mathieui@mathieui.net>2021-04-19 19:53:33 +0200
commit0d52344a31d67b9899b551cc1ef551def4b98eea (patch)
tree8a73a267e44469414e5966a521d7458553b1c41d
parent7057773d1878d1b7c2780425d07889d6e5be4082 (diff)
parent768089d45719aecc6a18606b2e9b30d80074a3ac (diff)
downloadslixmpp-0d52344a31d67b9899b551cc1ef551def4b98eea.tar.gz
slixmpp-0d52344a31d67b9899b551cc1ef551def4b98eea.tar.bz2
slixmpp-0d52344a31d67b9899b551cc1ef551def4b98eea.tar.xz
slixmpp-0d52344a31d67b9899b551cc1ef551def4b98eea.zip
Merge branch 'fix-component-handshake' into 'master'
Fix component handshake Closes #3464 See merge request poezio/slixmpp!156
-rw-r--r--itests/test_privatestorage.py3
-rw-r--r--slixmpp/componentxmpp.py8
-rw-r--r--slixmpp/stanza/__init__.py7
-rw-r--r--slixmpp/stanza/handshake.py25
-rw-r--r--slixmpp/xmlstream/stanzabase.py27
-rw-r--r--slixmpp/xmlstream/xmlstream.py9
-rw-r--r--tests/test_stanza_element.py1
7 files changed, 62 insertions, 18 deletions
diff --git a/itests/test_privatestorage.py b/itests/test_privatestorage.py
index fd7f3f1b..55fa941b 100644
--- a/itests/test_privatestorage.py
+++ b/itests/test_privatestorage.py
@@ -22,7 +22,8 @@ class TestPrivateStorage(SlixIntegration):
el,
)
result = await self.clients[0]['xep_0049'].retrieve('bookmarks')
- self.assertEqual(str(result['private']['bookmarks']), str(el))
+
+ self.assertEqual(result['private']['bookmarks'], el)
# Purge bookmarks
await self.clients[0]['xep_0049'].store(
diff --git a/slixmpp/componentxmpp.py b/slixmpp/componentxmpp.py
index 3a16f942..8927712e 100644
--- a/slixmpp/componentxmpp.py
+++ b/slixmpp/componentxmpp.py
@@ -10,6 +10,7 @@ import logging
import hashlib
from slixmpp.basexmpp import BaseXMPP
+from slixmpp.stanza import Handshake
from slixmpp.xmlstream import XMLStream
from slixmpp.xmlstream import ET
from slixmpp.xmlstream.matcher import MatchXPath
@@ -123,9 +124,10 @@ class ComponentXMPP(BaseXMPP):
sid = xml.get('id', '')
pre_hash = bytes('%s%s' % (sid, self.secret), 'utf-8')
- handshake = ET.Element('{jabber:component:accept}handshake')
- handshake.text = hashlib.sha1(pre_hash).hexdigest().lower()
- self.send_xml(handshake)
+ handshake = Handshake()
+ handshake['value'] = hashlib.sha1(pre_hash).hexdigest().lower()
+
+ self.send(handshake)
def _handle_handshake(self, xml):
"""The handshake has been accepted.
diff --git a/slixmpp/stanza/__init__.py b/slixmpp/stanza/__init__.py
index 6e2e9718..1371fad2 100644
--- a/slixmpp/stanza/__init__.py
+++ b/slixmpp/stanza/__init__.py
@@ -1,4 +1,3 @@
-
# Slixmpp: The Slick XMPP Library
# Copyright (C) 2010 Nathanael C. Fritz
# This file is part of Slixmpp.
@@ -10,3 +9,9 @@ from slixmpp.stanza.message import Message
from slixmpp.stanza.presence import Presence
from slixmpp.stanza.stream_features import StreamFeatures
from slixmpp.stanza.stream_error import StreamError
+from slixmpp.stanza.handshake import Handshake
+
+__all__ = [
+ 'Error', 'Iq', 'Message', 'Presence', 'StreamFeatures', 'StreamError',
+ 'Handshake'
+]
diff --git a/slixmpp/stanza/handshake.py b/slixmpp/stanza/handshake.py
new file mode 100644
index 00000000..c58f69aa
--- /dev/null
+++ b/slixmpp/stanza/handshake.py
@@ -0,0 +1,25 @@
+# Slixmpp: The Slick XMPP Library
+# Copyright (C) 2021 Mathieu Pasquet
+# This file is part of Slixmpp.
+# See the file LICENSE for copying permission.
+
+from slixmpp.xmlstream import StanzaBase
+
+
+class Handshake(StanzaBase):
+
+ """
+ Jabber Component protocol handshake
+ """
+ namespace = 'jabber:component:accept'
+ name = 'handshake'
+ interfaces = {'value'}
+
+ def set_value(self, value: str):
+ self.xml.text = value
+
+ def get_value(self) -> str:
+ return self.xml.text
+
+ def del_value(self):
+ self.xml.text = ''
diff --git a/slixmpp/xmlstream/stanzabase.py b/slixmpp/xmlstream/stanzabase.py
index 207ae588..7679f73a 100644
--- a/slixmpp/xmlstream/stanzabase.py
+++ b/slixmpp/xmlstream/stanzabase.py
@@ -487,7 +487,7 @@ class ElementBase(object):
else:
return None if check else self.init_plugin(name, lang)
- def init_plugin(self, attrib, lang=None, existing_xml=None, reuse=True):
+ def init_plugin(self, attrib, lang=None, existing_xml=None, element=None, reuse=True):
"""Enable and initialize a stanza plugin.
:param string attrib: The :attr:`plugin_attrib` value of the
@@ -504,7 +504,10 @@ class ElementBase(object):
if reuse and (attrib, lang) in self.plugins:
return self.plugins[(attrib, lang)]
- plugin = plugin_class(parent=self, xml=existing_xml)
+ if element is not None:
+ plugin = element
+ else:
+ plugin = plugin_class(parent=self, xml=existing_xml)
if plugin.is_extension:
self.plugins[(attrib, None)] = plugin
@@ -1172,14 +1175,18 @@ class ElementBase(object):
else:
raise TypeError
self.xml.append(item.xml)
- self.iterables.append(item)
- if item.__class__ in self.plugin_iterables:
- if item.__class__.plugin_multi_attrib:
- self.init_plugin(item.__class__.plugin_multi_attrib)
- elif item.__class__ == self.plugin_tag_map.get(item.tag_name(), None):
+ if item.__class__ == self.plugin_tag_map.get(item.tag_name(), None):
self.init_plugin(item.plugin_attrib,
existing_xml=item.xml,
+ element=item,
reuse=False)
+ elif item.__class__ in self.plugin_iterables:
+ self.iterables.append(item)
+ if item.__class__.plugin_multi_attrib:
+ self.init_plugin(item.__class__.plugin_multi_attrib)
+ else:
+ self.iterables.append(item)
+
return self
def appendxml(self, xml):
@@ -1269,14 +1276,14 @@ class ElementBase(object):
# Check that this stanza is a superset of the other stanza.
values = self.values
+ other_values = other.values
for key in other.keys():
- if key not in values or values[key] != other[key]:
+ if key not in values or values.get(key) != other_values.get(key):
return False
# Check that the other stanza is a superset of this stanza.
- values = other.values
for key in self.keys():
- if key not in values or values[key] != self[key]:
+ if key not in values or other_values.get(key) != values.get(key):
return False
# Both stanzas are supersets of each other, therefore they
diff --git a/slixmpp/xmlstream/xmlstream.py b/slixmpp/xmlstream/xmlstream.py
index 9fd21c58..4cb51b94 100644
--- a/slixmpp/xmlstream/xmlstream.py
+++ b/slixmpp/xmlstream/xmlstream.py
@@ -1140,9 +1140,12 @@ class XMLStream(asyncio.BaseProtocol):
if not self._always_send_everything and not self._session_started:
# Avoid circular imports
from slixmpp.stanza.rootstanza import RootStanza
- from slixmpp.stanza import Iq
- is_bind = isinstance(data, Iq) and data.get_plugin('bind', check=True)
- if isinstance(data, (RootStanza, str)) and not is_bind:
+ from slixmpp.stanza import Iq, Handshake
+ passthrough = (
+ (isinstance(data, Iq) and data.get_plugin('bind', check=True))
+ or isinstance(data, Handshake)
+ )
+ if isinstance(data, (RootStanza, str)) and not passthrough:
self.__queued_stanzas.append(data)
log.debug('NOT SENT: %s %s', type(data), data)
return
diff --git a/tests/test_stanza_element.py b/tests/test_stanza_element.py
index 8ebc9b23..1172e885 100644
--- a/tests/test_stanza_element.py
+++ b/tests/test_stanza_element.py
@@ -456,6 +456,7 @@ class TestElementBase(SlixTest):
class TestSubStanza(ElementBase):
name = "sub"
+ plugin_attrib = name
namespace = "baz"
interfaces = {'attrib'}