fix(security): מניעת דליפת טוקן הבוט להודעות שגיאה, לוגים ו-Sentry
✨ תיאור קצר
כתובות ה-API של טלגרם נבנות כ-https://api.telegram.org/bot<TOKEN>/method, והכתובת המלאה נדחפה לתוך הודעת החריגה של TelegramAPIError וגם לשדה url שלה. כתוצאה מכך כל שגיאה בקריאה לטלגרם נשאה את הטוקן במלואו, ומשם הוא זלג ל-Sentry וללוגים. ה-PR מרכז את הניקוי בנקודה אחת ומחיל אותה בכל שכבה שבה הטקסט הזה יוצא החוצה.
📦 שינויים עיקריים
- קוד (Backend)
- בוט טלגרם
- מסד נתונים/מיגרציות
- תיעוד (docs/)
- DevOps/CI/CD
פירוט:
telegram_api.py— נוספוredact_bot_token(טקסט בודד) ו-redact_bot_token_deep(מבנה מקונן). זו נקודת הניקוי היחידה, וכל השאר נשענים עליה.TelegramAPIError— מנקה את ה-urlואת ה-descriptionלפני ההשמה, כך שגםstr(e)וגםe.urlנקיים. זה מכסה את כל שמונה מקומות הקריאה בקוד בלי לגעת באף אחד מהם.observability.py— ה-_before_sendניקה עד היום רק אתevent["extra"]לפי שמות מפתחות, ולא נגע בגוף החריגה או ב-breadcrumbs. עכשיו הוא סורק את כל האירוע. רשימת שדות קבועה תמיד תפספס אחד, ולכן הסריקה מלאה ולא ממוקדת.webapp/app.py— נוסףbefore_sendל-sentry_sdk.init, שלא היה שם כלל. ה-filter על ה-logging handlers לא מכסה חריגות ש-FlaskIntegrationתופסת ישירות.utils.py—SensitiveDataFilterניקה טוקני GitHub ו-Bearer אבל לא של טלגרם. הושלם דרך אותה נקודת ניקוי.
🧪 בדיקות
- Unit
- Integration
- Manual
נוסף tests/test_telegram_token_redaction.py עם 13 בדיקות שכולן עוברות. הן נועלות את המסלולים שדרכם הטוקן היה יוצא:
- הודעת החריגה והתכונות
e.url/e.description require_telegram_okו-parse_telegram_json_from_response, כולל המסלול שבו ה-URL נשלף מאובייקט התגובה במקום להיות מועבר במפורש- ניקוי עומק על אירוע בצורת Sentry (exception / logentry / breadcrumbs / extra), כולל שמירה על מבנה הנתונים ועל טיפוסים
- מבנה מעגלי — כדי לוודא שהמסנן לא נתקע, שכן הוא רץ על כל אירוע לפני שליחה
SensitiveDataFilterעל טוקן טלגרם, ובמקביל אימות שניקוי טוקני GitHub הקיים לא נשבר
בדיקה ידנית נוספת: הופעל הניקוי על אירוע Sentry מלא ואומת שה-request_id שנשמר כתג ממשיך לעבור, ושה-before_send בוובאפ מחווט ל-init.
tests/test_observability_sentry_bridge.py עובר. חלק מהטסטים בסביבה המקומית נכשלים בגלל cryptography/_cffi_backend שבורים בהתקנה — לא קשור לשינוי הזה, וה-CI יריץ על סביבה נקייה.
🧪 בדיקות נדרשות ב‑PR
- 🔍 Code Quality & Security
- Unit Tests (3.11)
- Unit Tests (3.12)
📝 סוג שינוי
- fix: תיקון באג
✅ צ'קליסט
- הקוד עוקב אחרי הסגנון
- בדיקות רצות ועוברות
- אין סודות/מפתחות בקוד (הטוקן שבטסטים בדוי ונועד לוודא שהוא לא שורד בפלט)
- אין מחיקות מסוכנות/פעולות על root
- הודעת הקומיט תואמת Conventional Commits
- תיעוד עודכן — לא נדרש, אין שינוי בהתנהגות כלפי המשתמש
- לא נוספו משתני סביבה, ג'ובים או טוקני עיצוב
🧩 השפעות/סיכונים
השינוי משפיע על אבטחה ועל קריאוּת דיבוג. אחרי המיזוג, כתובות שמופיעות בהודעות שגיאה ובאירועי Sentry יציגו bot<REDACTED>/sendMessage במקום הטוקן. שם המתודה, error_code, description ו-http_status נשמרים, ולכן יכולת האבחון לא נפגעת.
הסיכון נמוך: אין שינוי בזרימת הקוד או בערכי החזרה, רק בתוכן מחרוזות. ה-before_send החדש בוובאפ עטוף ב-try/except שמחזיר את האירוע כמות שהוא אם הניקוי נכשל, כדי שדיווח שגיאות לא ייפול בגלל המסנן.
הערה: ניקוי עומק רץ על כל אירוע Sentry לפני שליחה. העלות זניחה ביחס לשליחת האירוע עצמו, והעומק חסום ב-12 רמות כדי למנוע היתקעות.
🔗 קישורים
- Issues קשורים: —
- עיון בתיעוד: כן — CodeBot – Project Docs
🧯 סיכון / החזרה לאחור (Rollback)
git revert לקומיט הבודד מחזיר את המצב הקודם במלואו. אין מיגרציות, אין שינויי תצורה ואין תלות בין הקבצים שנגעתי בהם — כל שכבה מייבאת את הניקוי בעצלתיים (lazy) ומדלגת עליו אם הייבוא נכשל.
Generated by Claude Code
Summary by Sourcery
Prevent Telegram bot tokens from being exposed in error reporting and diagnostic output.
Bug Fixes:
- Prevent Telegram bot tokens from leaking through API errors, log messages, tracebacks, and Sentry events.
Enhancements:
- Centralize token redaction across errors, observability, logging, and nested event data while preserving diagnostic context and handling complex or circular structures safely.
Tests:
- Add comprehensive unit coverage for Telegram token redaction across errors, payloads, logs, Sentry-shaped events, nested structures, and existing sensitive-token filters.