Exemple #1
0
    async def _discover(cls, domain: str,
                        session: ClientSession) -> Optional[URL]:
        well_known = URL.build(scheme="https",
                               host=domain,
                               path="/.well-known/matrix/client")
        async with session.get(well_known) as resp:
            if resp.status == 404:
                return None
            elif resp.status != 200:
                raise WellKnownUnexpectedStatus(resp.status)
            try:
                data = await resp.json(content_type=None)
            except (json.JSONDecodeError, ContentTypeError) as e:
                raise WellKnownNotJSON() from e

        try:
            homeserver_url = data["m.homeserver"]["base_url"]
        except KeyError as e:
            raise WellKnownMissingHomeserver() from e
        parsed_url = URL(homeserver_url)
        if not parsed_url.is_absolute():
            raise WellKnownNotURL()
        elif parsed_url.scheme not in ("http", "https"):
            raise WellKnownUnsupportedScheme(parsed_url.scheme)

        try:
            async with session.get(parsed_url /
                                   "_matrix/client/versions") as resp:
                data = VersionsResponse.deserialize(await resp.json())
                assert len(data.versions) > 0
        except (ClientError, json.JSONDecodeError, SerializerError,
                AssertionError) as e:
            raise WellKnownInvalidVersionsResponse() from e

        return parsed_url
Exemple #2
0
    def __init__(
        self,
        command_processor: cmd.CommandProcessor | None = None,
        bridge: br.Bridge | None = None,
    ) -> None:
        self.az = bridge.az
        self.config = bridge.config
        self.bridge = bridge
        self.commands = command_processor or cmd.CommandProcessor(bridge=bridge)
        self.media_config = MediaRepoConfig(upload_size=50 * 1024 * 1024)
        self.versions = VersionsResponse.deserialize({"versions": ["v1.3"]})
        self.az.matrix_event_handler(self.int_handle_event)

        self.e2ee = None
        if self.config["bridge.encryption.allow"]:
            if not EncryptionManager:
                self.log.fatal(
                    "Encryption enabled in config, but dependencies not installed.",
                    exc_info=encryption_import_error,
                )
                sys.exit(31)
            if not encrypt_attachment:
                self.log.fatal(
                    "Encryption enabled in config, but media encryption dependencies "
                    "not installed.",
                    exc_info=media_encrypt_import_error,
                )
                sys.exit(31)
            self.e2ee = EncryptionManager(
                bridge=bridge,
                user_id_prefix=self.user_id_prefix,
                user_id_suffix=self.user_id_suffix,
                homeserver_address=self.config["homeserver.address"],
                db_url=self.config["appservice.database"],
                key_sharing_config=self.config["bridge.encryption.key_sharing"],
            )

        self.management_room_text = self.config.get(
            "bridge.management_room_text",
            {
                "welcome": "Hello, I'm a bridge bot.",
                "welcome_connected": "Use `help` for help.",
                "welcome_unconnected": "Use `help` for help on how to log in.",
            },
        )
        self.management_room_multiple_messages = self.config.get(
            "bridge.management_room_multiple_messages",
            False,
        )
Exemple #3
0
    async def versions(self, no_cache: bool = False) -> VersionsResponse:
        """
        Get client-server spec versions supported by the server.

        Args:
            no_cache: If true, the versions will always be fetched from the server
                      rather than using cached results when availab.e.

        Returns:
            The supported Matrix spec versions and unstable features.
        """
        if no_cache or not self.versions_cache:
            resp = await self.api.request(Method.GET, Path.versions)
            self.versions_cache = VersionsResponse.deserialize(resp)
        return self.versions_cache
Exemple #4
0
 async def versions(self) -> VersionsResponse:
     """Get client-server spec versions supported by the server."""
     resp = await self.api.request(Method.GET, "_matrix/client/versions")
     return VersionsResponse.deserialize(resp)