Philipp Hörist pushed to branch master at gajim / python-nbxmpp


Commits:
bb783cb0 by Philipp Hörist at 2026-08-10T23:48:08+02:00
imprv: OMEMO: Harden bundle parser

- - - - -


2 changed files:

- nbxmpp/modules/omemo.py
- test/unit/test_omemo.py


Changes:

=====================================
nbxmpp/modules/omemo.py
=====================================
@@ -275,7 +275,9 @@ def _parse_bundle(item: Node | None, device_id: int) -> 
OMEMOBundle:
         raise MalformedStanzaError("No bundle node found", item)
 
     result = {}
-    signed_prekey_node = bundle.getTag("signedPreKeyPublic")
+    signed_prekey_node = bundle.getTag(
+        "signedPreKeyPublic", namespace=Namespace.OMEMO_TEMP
+    )
     try:
         result["spk"] = {"key": b64decode(signed_prekey_node.getData())}
     except Exception as error:
@@ -288,26 +290,32 @@ def _parse_bundle(item: Node | None, device_id: int) -> 
OMEMOBundle:
     except Exception as error:
         raise MalformedStanzaError("Invalid signedPreKeyId: %s" % error, item)
 
-    signed_signature_node = bundle.getTag("signedPreKeySignature")
+    signed_signature_node = bundle.getTag(
+        "signedPreKeySignature", namespace=Namespace.OMEMO_TEMP
+    )
     try:
         result["spk_signature"] = b64decode(signed_signature_node.getData())
     except Exception as error:
         error = "Failed to decode signedPreKeySignature: %s" % error
         raise MalformedStanzaError(error, item)
 
-    identity_key_node = bundle.getTag("identityKey")
+    identity_key_node = bundle.getTag("identityKey", 
namespace=Namespace.OMEMO_TEMP)
     try:
         result["ik"] = b64decode(identity_key_node.getData())
     except Exception as error:
         error = "Failed to decode IdentityKey: %s" % error
         raise MalformedStanzaError(error, item)
 
-    prekeys = bundle.getTag("prekeys")
-    if prekeys is None or not prekeys.getChildren():
+    prekeys_node = bundle.getTag("prekeys", namespace=Namespace.OMEMO_TEMP)
+    if prekeys_node is None:
         raise MalformedStanzaError("No prekeys node found", item)
 
+    prekeys = prekeys_node.getTags("preKeyPublic", 
namespace=Namespace.OMEMO_TEMP)
+    if not prekeys:
+        raise MalformedStanzaError("No prekeys found", item)
+
     result["otpks"] = []
-    for prekey in prekeys.getChildren():
+    for prekey in prekeys:
         try:
             id_ = int(prekey.getAttr("preKeyId"))
         except Exception as error:


=====================================
test/unit/test_omemo.py
=====================================
@@ -1,5 +1,6 @@
 import unittest
 
+from nbxmpp.modules.omemo import _parse_bundle
 from nbxmpp.modules.omemo import _parse_devicelist
 from nbxmpp.simplexml import Node
 
@@ -19,3 +20,21 @@ class OMEMOTest(unittest.TestCase):
 
         devices = _parse_devicelist(Node(node=devicelist))
         self.assertEqual(devices, [912561474, 532656838])
+
+        bundle = """
+          <item id='current'>
+            <bundle xmlns='eu.siacs.conversations.axolotl'>
+              <signedPreKeyPublic 
signedPreKeyId='1'>dGVzdHBheWxvYWQ=</signedPreKeyPublic>
+              <signedPreKeySignature>dGVzdHBheWxvYWQ=</signedPreKeySignature>
+              <identityKey>dGVzdHBheWxvYWQ=</identityKey>
+              <prekeys>
+                <preKeyPublic preKeyId='1'>dGVzdHBheWxvYWQ=</preKeyPublic>
+                <preKeyPublic preKeyId='2'>dGVzdHBheWxvYWQ=</preKeyPublic>
+                <preKeyPublic preKeyId='3'>dGVzdHBheWxvYWQ=</preKeyPublic>
+                <preKeyPublic preKeyId='3' 
xmlns="test.namespace">dGVzdHBheWxvYWQ=</preKeyPublic>
+              </prekeys>
+            </bundle>
+          </item>"""
+
+        omemo_bundle = _parse_bundle(Node(node=bundle), 1)
+        self.assertEqual(len(omemo_bundle.otpks), 3)



View it on GitLab: 
https://dev.gajim.org/gajim/python-nbxmpp/-/commit/bb783cb00888889449eb8780e0cbebcab29e51e0

-- 
View it on GitLab: 
https://dev.gajim.org/gajim/python-nbxmpp/-/commit/bb783cb00888889449eb8780e0cbebcab29e51e0
You're receiving this email because of your account on dev.gajim.org.


_______________________________________________
Commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to