def test_http_client_keys_query(self, http_client): http_client.connect(TransportType.HTTP2) _, _ = http_client.login("1234") http_client.receive(self.login_byte_response) response = http_client.next_response() assert isinstance(response, LoginResponse) assert http_client.access_token == "ABCD" _, _ = http_client.sync() http_client.receive(self.sync_byte_response) response = http_client.next_response() assert isinstance(response, SyncResponse) assert http_client.access_token == "ABCD" event = MegolmEvent.from_dict( self._load_response("tests/data/events/megolm.json")) http_client.request_room_key(event) http_client.receive(self.empty_response(5)) response = http_client.next_response() assert isinstance(response, RoomKeyRequestResponse) assert ("X3lUlvLELLYxeTx4yOVu6UDpasGEVO0Jbu+QFnm0cKQ" in http_client.outgoing_key_requests)
async def room_key(self, event: RoomKeyEvent): """Callback for ToDevice events like room key events.""" events = self.store.get_encrypted_events(event.session_id) waiting_for_keys = self.store.get_encrypted_events_for_user( event.sender) if len(events): log_func = logger.info else: log_func = logger.debug log_func( "Got room key event for session %s, user %s, matched sessions: %s", event.session_id, event.sender, len(events), ) log_func( "Waiting to decrypt %s events from sender %s", len(waiting_for_keys), event.sender, ) if not events: return for encrypted_event in events: try: event_dict = json.loads(encrypted_event["event"]) params = event_dict["source"] params["room_id"] = event_dict["room_id"] params["transaction_id"] = event_dict["transaction_id"] megolm_event = MegolmEvent.from_dict(params) except Exception as ex: logger.warning("Failed to restore MegolmEvent for %s: %s", encrypted_event["event_id"], ex) continue try: # noinspection PyTypeChecker decrypted = self.client.decrypt_event(megolm_event) except Exception as ex: logger.warning("Error decrypting event %s: %s", megolm_event.event_id, ex) continue if isinstance(decrypted, Event): logger.info("Successfully decrypted stored event %s", decrypted.event_id) parsed_event = Event.parse_event(decrypted.source) logger.info("Parsed event: %s", parsed_event) self.store.remove_encrypted_event(decrypted.event_id) # noinspection PyTypeChecker await self.decrypted_callback(encrypted_event["room_id"], parsed_event) else: logger.warning("Failed to decrypt event %s", decrypted.event_id)