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:
24
bot.py
24
bot.py
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user