Skip to content

Commit 70c591e

Browse files
authored
Fix critical conditions in bot package (#65)
1 parent 33eb44a commit 70c591e

3 files changed

Lines changed: 62 additions & 58 deletions

File tree

bot/bot.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,8 @@ def me(self) -> User:
4747

4848
async def feed_webhook_update(self, update: Update) -> None:
4949
if not (
50-
(
51-
(user := update.effective_user)
52-
and (user.is_bot or await is_valid_user(self, user=user))
53-
and (message := update.effective_message)
54-
and message.text
55-
)
56-
or update.callback_query
57-
or update.pre_checkout_query
50+
(user := update.effective_user)
51+
and (user.id == self.telegram_id or await is_valid_user(self, user=user))
5852
):
5953
return
6054

bot/handler.py

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from telegram.models import CallbackQuery, Message, Update
1+
from telegram.models import Message, Update
22

33
from service.models import Connection, MessageKeyboardButton, Trigger
44

@@ -34,14 +34,16 @@ def __init__(self, bot: Bot) -> None:
3434
async def _get_wait_trigger_connections(
3535
self, update: Update, context: HandlerContext
3636
) -> list[Connection] | None:
37+
message: Message | None = update.message
3738
user_storage: Storage | None = context.user_storage
3839

39-
if not user_storage:
40-
return None
41-
42-
message: Message | None = update.effective_message
43-
44-
if not message or not message.text:
40+
if not (
41+
message
42+
and (user := message.user)
43+
and user.id != self.bot.telegram_id
44+
and message.text
45+
and user_storage
46+
):
4547
return None
4648

4749
trigger_id: int | None = await user_storage.get('expected_trigger_id')
@@ -50,32 +52,30 @@ async def _get_wait_trigger_connections(
5052
return None
5153

5254
trigger: Trigger = await self.bot.service.get_trigger(id=trigger_id)
53-
connections: list[Connection] = []
5455

55-
if trigger.command and message.text.startswith('/') and len(message.text) > 1:
56+
if TYPE_CHECKING:
57+
connections: list[Connection]
58+
59+
if (
60+
(trigger_command := trigger.command)
61+
and message.text.startswith('/')
62+
and len(message.text) > 1
63+
):
5664
command, _, payload = message.text.removeprefix('/').partition(' ')
5765

58-
if (
59-
trigger.command.payload and payload != trigger.command.payload
60-
) or command != trigger.command.command:
66+
if not (
67+
command == trigger_command.command
68+
and (not trigger_command.payload or payload == trigger_command.payload)
69+
):
6170
return None
6271

6372
connections = trigger.source_connections
64-
elif (
65-
(
66-
trigger.message
67-
and trigger.message.text
68-
and (
69-
message.text
70-
== (
71-
await replace_text_variables(
72-
trigger.message.text, context.variables
73-
)
74-
)
75-
)
73+
elif (trigger_message := trigger.message) and (
74+
not trigger_message.text
75+
or (
76+
message.text
77+
== await replace_text_variables(trigger_message.text, context.variables)
7678
)
77-
or trigger.message
78-
and not trigger.message.text
7979
):
8080
connections = trigger.source_connections
8181
else:
@@ -136,9 +136,14 @@ async def _get_message_triggers(
136136
async def _get_trigger_connections(
137137
self, update: Update, context: HandlerContext
138138
) -> list[Connection] | None:
139-
message: Message | None = update.effective_message
139+
message: Message | None = update.message
140140

141-
if not message or not message.text:
141+
if not (
142+
message
143+
and (user := message.user)
144+
and user.id != self.bot.telegram_id
145+
and message.text
146+
):
142147
return None
143148

144149
return list(
@@ -159,18 +164,19 @@ async def _get_trigger_connections(
159164
async def _get_command_keyboard_button_connections(
160165
self, update: Update, context: HandlerContext
161166
) -> list[Connection] | None:
162-
event_message: Message | None = update.effective_message
163-
callback_query: CallbackQuery | None = update.callback_query
164-
165167
buttons: list[MessageKeyboardButton] = []
166168

167-
if callback_query and callback_query.data and callback_query.data.isdigit():
169+
if (
170+
(callback_query := update.callback_query)
171+
and callback_query.data
172+
and callback_query.data.isdigit()
173+
):
168174
buttons = await self.bot.service.get_messages_keyboard_buttons(
169175
id=int(callback_query.data)
170176
)
171-
elif event_message and event_message.text:
177+
elif (message := update.message) and message.text:
172178
buttons = await self.bot.service.get_messages_keyboard_buttons(
173-
text=event_message.text
179+
text=message.text
174180
)
175181
else:
176182
return None

bot/handlers/message/handler.py

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from telegram.constants import MediaGroupLimit
22
from telegram.enums import InputMediaType
3-
from telegram.models import Chat, Message, ReplyParameters, Update, User
3+
from telegram.models import Chat, Message, ReplyParameters, Update
44
from telegram.types import KeyboardMarkup
55

66
from service.models import Connection
@@ -100,14 +100,14 @@ async def _send_media_group(
100100
async def _process_message(
101101
self,
102102
chat: Chat,
103-
event_message_id: int | None,
103+
reply_to_event_message_id: int | None,
104104
message: ServiceMessage,
105105
chat_storage: Storage,
106106
variables: Variables,
107107
) -> None:
108108
reply_parameters: ReplyParameters | None = (
109-
ReplyParameters(message_id=event_message_id)
110-
if message.settings.reply_to_user_message and event_message_id
109+
ReplyParameters(message_id=reply_to_event_message_id)
110+
if message.settings.reply_to_user_message and reply_to_event_message_id
111111
else None
112112
)
113113
media: Media = {
@@ -162,20 +162,28 @@ async def handle(
162162
self, update: Update, message: ServiceMessage, context: HandlerContext
163163
) -> list[Connection] | None:
164164
chat: Chat | None = update.effective_chat
165-
user: User | None = update.effective_user
166165
chat_storage: Storage | None = context.chat_storage
167166

168-
if not chat or not user or not chat_storage:
167+
if not (chat and chat_storage):
169168
return None
170169

171-
event_message: Message | None = update.effective_message
172-
event_message_id: int | None = (
173-
event_message.message_id if event_message else None
170+
reply_to_event_message_id: int | None = (
171+
event_message.message_id
172+
if (
173+
(event_message := update.effective_message)
174+
and (event_message_user := event_message and event_message.user)
175+
and event_message_user.id != self.bot.telegram_id
176+
)
177+
else None
174178
)
175179

176180
tasks: list[Awaitable[Any]] = [
177181
self._process_message(
178-
chat, event_message_id, message, chat_storage, context.variables
182+
chat,
183+
reply_to_event_message_id,
184+
message,
185+
chat_storage,
186+
context.variables,
179187
)
180188
]
181189

@@ -184,11 +192,7 @@ async def handle(
184192

185193
await asyncio.gather(*tasks)
186194

187-
if (
188-
message.settings.delete_user_message
189-
and event_message_id
190-
and not user.is_bot
191-
):
192-
await self.bot.telegram.delete_message(chat.id, event_message_id)
195+
if message.settings.delete_user_message and reply_to_event_message_id:
196+
await self.bot.telegram.delete_message(chat.id, reply_to_event_message_id)
193197

194198
return message.source_connections

0 commit comments

Comments
 (0)