fix: monkey-patch nio to forward decrypted Olm encryption_keys events

nio's _handle_olm_event silently drops unknown Olm event types
with 'Received unsupported Olm event'. Element X sends E2EE call
keys as encrypted to-device io.element.call.encryption_keys events.
After Olm decryption they were dropped before reaching any callback.

Patch intercepts the drop and forwards to on_to_device_unknown handler.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Christian Gick
2026-03-24 09:55:51 +02:00
parent 70b0b89290
commit dd904c6928

24
bot.py
View File

@@ -1364,6 +1364,30 @@ class Bot:
self.client.add_to_device_callback(self.on_key_verification, KeyVerificationCancel)
self.client.add_to_device_callback(self.on_to_device_unknown, UnknownToDeviceEvent)
# Monkey-patch nio's Olm handler to forward unknown Olm event types
# (like io.element.call.encryption_keys) instead of silently dropping them.
if self.client.olm:
_orig_handle_olm = self.client.olm._handle_olm_event
bot_ref = self
def _patched_handle_olm_event(sender, sender_key, payload):
result = _orig_handle_olm(sender, sender_key, payload)
if result is None and payload.get("type") not in ("m.room_key", "m.forwarded_room_key", "m.dummy"):
# Forward as callback — nio drops unknown Olm types but we need them
evt_type = payload.get("type", "")
content = payload.get("content", {})
logger.info("Forwarding decrypted Olm event type=%s from %s to handler", evt_type, sender)
asyncio.ensure_future(bot_ref.on_to_device_unknown(
type(
"DecryptedOlmUnknown", (),
{"source": {"type": evt_type, "content": content, "sender": sender},
"type": evt_type, "sender": sender}
)()
))
return result
self.client.olm._handle_olm_event = _patched_handle_olm_event
# Cache display name for mention matching in group rooms
try:
dn_resp = await self.client.get_displayname(BOT_USER)