fix(telegram): redact bot token from connect/disconnect/send_document/send_video errors

_redact_telegram_error_text() strips bot tokens from api.telegram.org
URLs embedded in transport-error text, and is already applied across the
send/edit transient-error paths. Four sites still built their message
from the raw exception:

- connect()'s fatal-error handler is the most severe: the raw text is
  passed to _set_fatal_error(), which persists it via
  write_runtime_status() to a dashboard/admin-facing runtime status
  file, not just a log line. A transient network error during startup
  commonly embeds the request URL
  (https://api.telegram.org/bot<TOKEN>/getMe), so this could leak the
  live bot token into that surface.
- disconnect(), send_document(), send_video() build the same unredacted
  pattern into a warning log line (lower blast radius, but the same
  leak class).

Fix: route all four through the existing _redact_telegram_error_text()
helper before building the message/log line, mirroring the send/edit
paths exactly. Also drops exc_info=True from the two logger.error/
logger.warning calls that had it — exc_info prints the exception's own
traceback (including its unredacted message) separately from the format
string, which would otherwise defeat the redaction; the already-redacted
sibling call sites in this file follow the same convention.
This commit is contained in:
srojk34 2026-07-05 17:12:52 +03:00 committed by Teknium
parent f10851e3fd
commit 1e2914b40a
2 changed files with 147 additions and 5 deletions

View file

@ -3306,9 +3306,10 @@ class TelegramAdapter(BasePlatformAdapter):
except Exception as e:
self._release_platform_lock()
message = f"Telegram startup failed: {e}"
safe_error = _redact_telegram_error_text(e)
message = f"Telegram startup failed: {safe_error}"
self._set_fatal_error("telegram_connect_error", message, retryable=True)
logger.error("[%s] Failed to connect to Telegram: %s", self.name, e, exc_info=True)
logger.error("[%s] Failed to connect to Telegram: %s", self.name, safe_error)
return False
async def _set_status_indicator(self, online: bool) -> None:
@ -3446,7 +3447,10 @@ class TelegramAdapter(BasePlatformAdapter):
await self._app.stop()
await self._app.shutdown()
except Exception as e:
logger.warning("[%s] Error during Telegram disconnect: %s", self.name, e, exc_info=True)
logger.warning(
"[%s] Error during Telegram disconnect: %s",
self.name, _redact_telegram_error_text(e),
)
self._release_platform_lock()
self._app = None
@ -6099,7 +6103,10 @@ class TelegramAdapter(BasePlatformAdapter):
)
return SendResult(success=True, message_id=str(msg.message_id))
except Exception as e:
logger.warning("[%s] Failed to send document: %s", self.name, e, exc_info=True)
logger.warning(
"[%s] Failed to send document: %s",
self.name, _redact_telegram_error_text(e),
)
return await super().send_document(chat_id, file_path, caption, file_name, reply_to, metadata=metadata)
async def send_video(
@ -6146,7 +6153,10 @@ class TelegramAdapter(BasePlatformAdapter):
)
return SendResult(success=True, message_id=str(msg.message_id))
except Exception as e:
logger.warning("[%s] Failed to send video: %s", self.name, e, exc_info=True)
logger.warning(
"[%s] Failed to send video: %s",
self.name, _redact_telegram_error_text(e),
)
return await super().send_video(chat_id, video_path, caption, reply_to, metadata=metadata)
async def send_image(