Skip to content

Commit fa20786

Browse files
hanwgfrenck
authored andcommitted
Fix multiple webhook secrets for Telegram bot (home-assistant#149103)
1 parent 959c3a8 commit fa20786

File tree

3 files changed

+19
-12
lines changed

3 files changed

+19
-12
lines changed

homeassistant/components/telegram_bot/webhooks.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def __init__(
8282
self.base_url = config.data.get(CONF_URL) or get_url(
8383
hass, require_ssl=True, allow_internal=False
8484
)
85-
self.webhook_url = f"{self.base_url}{TELEGRAM_WEBHOOK_URL}"
85+
self.webhook_url = self.base_url + _get_webhook_url(bot)
8686

8787
async def shutdown(self) -> None:
8888
"""Shutdown the app."""
@@ -98,9 +98,11 @@ async def _try_to_set_webhook(self) -> bool:
9898
api_kwargs={"secret_token": self.secret_token},
9999
connect_timeout=5,
100100
)
101-
except TelegramError:
101+
except TelegramError as err:
102102
retry_num += 1
103-
_LOGGER.warning("Error trying to set webhook (retry #%d)", retry_num)
103+
_LOGGER.warning(
104+
"Error trying to set webhook (retry #%d)", retry_num, exc_info=err
105+
)
104106

105107
return False
106108

@@ -143,7 +145,6 @@ class PushBotView(HomeAssistantView):
143145
"""View for handling webhook calls from Telegram."""
144146

145147
requires_auth = False
146-
url = TELEGRAM_WEBHOOK_URL
147148
name = "telegram_webhooks"
148149

149150
def __init__(
@@ -160,6 +161,7 @@ def __init__(
160161
self.application = application
161162
self.trusted_networks = trusted_networks
162163
self.secret_token = secret_token
164+
self.url = _get_webhook_url(bot)
163165

164166
async def post(self, request: HomeAssistantRequest) -> Response | None:
165167
"""Accept the POST from telegram."""
@@ -183,3 +185,7 @@ async def post(self, request: HomeAssistantRequest) -> Response | None:
183185
await self.application.process_update(update)
184186

185187
return None
188+
189+
190+
def _get_webhook_url(bot: Bot) -> str:
191+
return f"{TELEGRAM_WEBHOOK_URL}_{bot.id}"

tests/components/telegram_bot/test_telegram_bot.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ async def test_webhook_endpoint_generates_telegram_text_event(
364364
events = async_capture_events(hass, "telegram_text")
365365

366366
response = await client.post(
367-
TELEGRAM_WEBHOOK_URL,
367+
f"{TELEGRAM_WEBHOOK_URL}_123456",
368368
json=update_message_text,
369369
headers={"X-Telegram-Bot-Api-Secret-Token": mock_generate_secret_token},
370370
)
@@ -391,7 +391,7 @@ async def test_webhook_endpoint_generates_telegram_command_event(
391391
events = async_capture_events(hass, "telegram_command")
392392

393393
response = await client.post(
394-
TELEGRAM_WEBHOOK_URL,
394+
f"{TELEGRAM_WEBHOOK_URL}_123456",
395395
json=update_message_command,
396396
headers={"X-Telegram-Bot-Api-Secret-Token": mock_generate_secret_token},
397397
)
@@ -418,7 +418,7 @@ async def test_webhook_endpoint_generates_telegram_callback_event(
418418
events = async_capture_events(hass, "telegram_callback")
419419

420420
response = await client.post(
421-
TELEGRAM_WEBHOOK_URL,
421+
f"{TELEGRAM_WEBHOOK_URL}_123456",
422422
json=update_callback_query,
423423
headers={"X-Telegram-Bot-Api-Secret-Token": mock_generate_secret_token},
424424
)
@@ -594,7 +594,7 @@ async def test_webhook_endpoint_unauthorized_update_doesnt_generate_telegram_tex
594594
events = async_capture_events(hass, "telegram_text")
595595

596596
response = await client.post(
597-
TELEGRAM_WEBHOOK_URL,
597+
f"{TELEGRAM_WEBHOOK_URL}_123456",
598598
json=unauthorized_update_message_text,
599599
headers={"X-Telegram-Bot-Api-Secret-Token": mock_generate_secret_token},
600600
)
@@ -618,7 +618,7 @@ async def test_webhook_endpoint_without_secret_token_is_denied(
618618
async_capture_events(hass, "telegram_text")
619619

620620
response = await client.post(
621-
TELEGRAM_WEBHOOK_URL,
621+
f"{TELEGRAM_WEBHOOK_URL}_123456",
622622
json=update_message_text,
623623
)
624624
assert response.status == 401
@@ -636,7 +636,7 @@ async def test_webhook_endpoint_invalid_secret_token_is_denied(
636636
async_capture_events(hass, "telegram_text")
637637

638638
response = await client.post(
639-
TELEGRAM_WEBHOOK_URL,
639+
f"{TELEGRAM_WEBHOOK_URL}_123456",
640640
json=update_message_text,
641641
headers={"X-Telegram-Bot-Api-Secret-Token": incorrect_secret_token},
642642
)

tests/components/telegram_bot/test_webhooks.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from telegram import WebhookInfo
88
from telegram.error import TimedOut
99

10+
from homeassistant.components.telegram_bot.webhooks import TELEGRAM_WEBHOOK_URL
1011
from homeassistant.config_entries import ConfigEntryState
1112
from homeassistant.core import HomeAssistant
1213

@@ -115,7 +116,7 @@ async def test_webhooks_update_invalid_json(
115116
client = await hass_client()
116117

117118
response = await client.post(
118-
"/api/telegram_webhooks",
119+
f"{TELEGRAM_WEBHOOK_URL}_123456",
119120
headers={"X-Telegram-Bot-Api-Secret-Token": mock_generate_secret_token},
120121
)
121122
assert response.status == 400
@@ -139,7 +140,7 @@ async def test_webhooks_unauthorized_network(
139140
return_value=IPv4Network("1.2.3.4"),
140141
) as mock_remote:
141142
response = await client.post(
142-
"/api/telegram_webhooks",
143+
f"{TELEGRAM_WEBHOOK_URL}_123456",
143144
json="mock json",
144145
headers={"X-Telegram-Bot-Api-Secret-Token": mock_generate_secret_token},
145146
)

0 commit comments

Comments
 (0)