Make generated stanza id truly random

Fix long-standing security issues where stanza @id be predictable.

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
This commit is contained in:
Maxime “pep” Buquet 2019-07-13 14:07:31 +02:00
parent 4435c81d77
commit b29bb30eb7
No known key found for this signature in database
GPG Key ID: DEDA74AEECA9D0F2
2 changed files with 8 additions and 11 deletions

View File

@ -340,6 +340,13 @@ class SlixTest(unittest.TestCase):
self.xmpp.default_lang = None self.xmpp.default_lang = None
self.xmpp.peer_default_lang = None self.xmpp.peer_default_lang = None
def new_id():
self.xmpp._id += 1
return str(self.xmpp._id)
self.xmpp._id = 0
self.xmpp.new_id = new_id
# Must have the stream header ready for xmpp.process() to work. # Must have the stream header ready for xmpp.process() to work.
if not header: if not header:
header = self.xmpp.stream_header header = self.xmpp.stream_header

View File

@ -201,11 +201,6 @@ class XMLStream(asyncio.BaseProtocol):
self.__event_handlers = {} self.__event_handlers = {}
self.__filters = {'in': [], 'out': [], 'out_sync': []} self.__filters = {'in': [], 'out': [], 'out_sync': []}
self._id = 0
#: We use an ID prefix to ensure that all ID values are unique.
self._id_prefix = '%s-' % uuid.uuid4()
# Current connection attempt (Future) # Current connection attempt (Future)
self._current_connection_attempt = None self._current_connection_attempt = None
@ -243,12 +238,7 @@ class XMLStream(asyncio.BaseProtocol):
ID values. Using this method ensures that all new ID values ID values. Using this method ensures that all new ID values
are unique in this stream. are unique in this stream.
""" """
self._id += 1 return uuid.uuid4().hex
return self.get_id()
def get_id(self):
"""Return the current unique stream ID in hexadecimal form."""
return "%s%X" % (self._id_prefix, self._id)
def connect(self, host='', port=0, use_ssl=False, def connect(self, host='', port=0, use_ssl=False,
force_starttls=True, disable_starttls=False): force_starttls=True, disable_starttls=False):