Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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(
            "1",
            "@ephemeral:example.org.uk",
            0,
            "ABCD",
            "IDDEVICE",
            "test_session_id",
            "",
            http_client.olm._megolm_algorithm,
            TEST_ROOM_ID,
        )

        http_client.request_room_key(event)
        http_client.receive(self.empty_response(5))
        response = http_client.next_response()

        assert isinstance(response, RoomKeyRequestResponse)
        assert "test_session_id" in http_client.outgoing_key_requests