From 4af4f90a3d7f2f2b5a8457139e7671047d1af08e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 19 Feb 2018 18:09:12 +0200 Subject: [PATCH 1/2] Add some empty parameter checks --- mautrix_appservice/intent_api.py | 37 ++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/mautrix_appservice/intent_api.py b/mautrix_appservice/intent_api.py index 0fd002e0..44d1c1c3 100644 --- a/mautrix_appservice/intent_api.py +++ b/mautrix_appservice/intent_api.py @@ -409,9 +409,19 @@ class IntentAPI: @staticmethod def _get_event_url(room_id, event_type, txn_id): + if not room_id: + raise ValueError("Room ID not given") + elif not event_type: + raise ValueError("Event type not given") + elif not txn_id: + raise ValueError("Transaction ID not given") return f"/rooms/{quote(room_id)}/send/{quote(event_type)}/{quote(txn_id)}" async def send_event(self, room_id, event_type, content, txn_id=None): + if not room_id: + raise ValueError("Room ID not given") + elif not event_type: + raise ValueError("Event type not given") await self.ensure_joined(room_id) await self._ensure_has_power_level_for(room_id, event_type) @@ -424,29 +434,47 @@ class IntentAPI: @staticmethod def _get_state_url(room_id, event_type, state_key=""): + if not room_id: + raise ValueError("Room ID not given") + elif not event_type: + raise ValueError("Event type not given") url = f"/rooms/{quote(room_id)}/state/{quote(event_type)}" if state_key: url += f"/{quote(state_key)}" return url async def send_state_event(self, room_id, event_type, content, state_key=""): + if not room_id: + raise ValueError("Room ID not given") + elif not event_type: + raise ValueError("Event type not given") await self.ensure_joined(room_id) await self._ensure_has_power_level_for(room_id, event_type) url = self._get_state_url(room_id, event_type, state_key) return await self.client.request("PUT", url, content) async def get_state_event(self, room_id, event_type, state_key=""): + if not room_id: + raise ValueError("Room ID not given") + elif not event_type: + raise ValueError("Event type not given") await self.ensure_joined(room_id) url = self._get_state_url(room_id, event_type, state_key) return await self.client.request("GET", url) def join_room(self, room_id): + if not room_id: + raise ValueError("Room ID not given") return self.ensure_joined(room_id, ignore_cache=True) def _join_room_direct(self, room): + if not room: + raise ValueError("Room ID not given") return self.client.request("POST", f"/join/{quote(room)}") def leave_room(self, room_id): + if not room_id: + raise ValueError("Room ID not given") try: self.state_store.left(room_id, self.mxid) return self.client.request("POST", f"/rooms/{quote(room_id)}/leave") @@ -455,6 +483,8 @@ class IntentAPI: raise def get_room_memberships(self, room_id): + if not room_id: + raise ValueError("Room ID not given") return self.client.request("GET", f"/rooms/{quote(room_id)}/members") async def get_room_members(self, room_id, allowed_memberships=("join",)): @@ -472,6 +502,8 @@ class IntentAPI: # region Ensure functions async def ensure_joined(self, room_id, ignore_cache=False): + if not room_id: + raise ValueError("Room ID not given") if not ignore_cache and self.state_store.is_joined(room_id, self.mxid): return await self.ensure_registered() @@ -506,6 +538,11 @@ class IntentAPI: self.state_store.registered(self.mxid) async def _ensure_has_power_level_for(self, room_id, event_type): + if not room_id: + raise ValueError("Room ID not given") + elif not event_type: + raise ValueError("Event type not given") + if not self.state_store.has_power_levels(room_id): await self.get_power_levels(room_id) if self.state_store.has_power_level(room_id, self.mxid, event_type): From 1a1d7e6d900bb9b56433a97a0041f2315ffe2b1a Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 19 Feb 2018 18:10:14 +0200 Subject: [PATCH 2/2] Synchronize all users and fix joining chats via invite links, deleting portals --- mautrix_telegram/commands/telegram.py | 7 ++++--- mautrix_telegram/portal.py | 21 +++++++++++++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/mautrix_telegram/commands/telegram.py b/mautrix_telegram/commands/telegram.py index f77c2110..cb1f0b17 100644 --- a/mautrix_telegram/commands/telegram.py +++ b/mautrix_telegram/commands/telegram.py @@ -151,11 +151,12 @@ async def join(evt): for chat in updates.chats: portal = po.Portal.get_by_entity(chat) if portal.mxid: - await portal.create_matrix_room(evt.sender, chat, [evt.sender.mxid]) - return await evt.reply(f"Created room for {portal.title}") - else: await portal.invite_matrix([evt.sender.mxid]) return await evt.reply(f"Invited you to portal of {portal.title}") + else: + await evt.reply(f"Creating room for {chat.title}... This might take a while.") + await portal.create_matrix_room(evt.sender, chat, [evt.sender.mxid]) + return await evt.reply(f"Created room for {portal.title}") @command_handler() diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py index f7290287..6a65aede 100644 --- a/mautrix_telegram/portal.py +++ b/mautrix_telegram/portal.py @@ -360,10 +360,18 @@ class Portal: return chat.users, chat.full_chat.participants.participants elif self.peer_type == "channel": try: - participants = await user.client(GetParticipantsRequest( - entity, ChannelParticipantsRecent(), offset=0, limit=100, hash=0 - )) - return participants.users, participants.participants + users, participants = [], [] + offset = 0 + while True: + response = await user.client(GetParticipantsRequest( + entity, ChannelParticipantsSearch(""), offset=offset, limit=100, hash=0 + )) + if not response.users: + break + participants += response.participants + users += response.users + offset += len(response.users) + return users, participants except ChatAdminRequiredError: return [], [] elif self.peer_type == "user": @@ -986,6 +994,11 @@ class Portal: self.db.commit() def delete(self): + try: + del self.by_tgid[self.tgid_full] + del self.by_mxid[self.mxid] + except KeyError: + pass self.db.delete(self.to_db()) self.db.commit()