From 6a3def212c84f662cdfaed57f53a1482ac4946d1 Mon Sep 17 00:00:00 2001 From: Vladless Date: Wed, 1 Oct 2025 13:57:44 +0300 Subject: [PATCH 1/5] contributing guidelines / code of conduct / security policy / pr template --- .github/pull_request_template.md | 21 +++++++++++++++++++++ CODE_OF_CONDUCT.md | 25 +++++++++++++++++++++++++ SECURITY.md | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 .github/pull_request_template.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 SECURITY.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..0f33e308 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,21 @@ +### Описание изменений +Опишите, что изменилось и зачем. + +### Ветка назначения +- [ ] dev (основная ветка разработки) +- [ ] main (только для критических исправлений безопасности) + +### Тип изменений +- [ ] Новая функциональность +- [ ] Исправление ошибки +- [ ] Рефакторинг +- [ ] Документация +- [ ] Другое + +### Чек-лист +- [ ] Изменения протестированы локально +- [ ] Документация обновлена (если требуется) +- [ ] Нет лишних изменений в коде + +### Связанные задачи +Укажите номер issue, если PR его закрывает (например: Closes #123). diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..32b9e946 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,25 @@ +# Code of Conduct + +## Общие правила + +- Уважайте друг друга. Недопустимы оскорбления, дискриминация или токсичное поведение. +- Обсуждения должны оставаться по теме и в конструктивной форме. +- Личные и конфиденциальные данные публиковать запрещено. +- Нарушения могут привести к предупреждению, ограничению участия или блокировке по усмотрению мейнтейнеров. + +## Участники GitHub + +- Могут предлагать изменения через **Issues** и **Pull Requests**. +- Их вклад рассматривается и принимается по решению мейнтейнеров. +- Дискуссии ограничены рамками кода и технических вопросов. + +## Участники сообщества в Telegram + +- Имеют приоритетное взаимодействие с разработчиком. +- Могут обсуждать проект шире: идеи, улучшения, новые направления. +- Влияние на развитие кода выше, чем у участников извне. +- Общение остаётся в рамках уважения и конструктивности. + +## Контакты + +По вопросам поведения используйте Issues с меткой `conduct` или обращайтесь через сообщество в Telegram. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..7cedcdb5 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,32 @@ +# Security Policy + +## Поддерживаемые ветки +- Рассматриваются только `main` (последняя стабильная) и `dev` (текущая разработка). +- Другие ветки и теги не поддерживаются. + +## Как сообщить об уязвимости +- Не создавайте публичные Issues или Pull Requests. +- Сообщите напрямую владельцу: [@solonet_sup](https://t.me/solonet_sup). +- Также можно уведомить через сообщество в Telegram (доступно после вступления). +- Укажите: ветку (`main`/`dev`), версию/коммит, шаги воспроизведения, ожидаемое и фактическое поведение, возможное влияние, логи или скриншоты. + +## Процесс +1. Подтверждаем получение отчёта. +2. Анализируем и определяем критичность. +3. Исправления выпускаются в `dev`. +4. Если уязвимость критическая — фикс публикуется напрямую в `main`. +5. После релиза уведомляем сообщество и при необходимости публикуем рекомендации по обновлению. + +## Область действия +- Бот (aiogram), веб-админка (flask), внутренние модули/плагины и API проекта. +- Вне области: сторонние сервисы и библиотеки (платёжные провайдеры, Telegram, панели и т. п.). Для них обращайтесь к поставщику напрямую. + +## Ответственное раскрытие +- Просим не публиковать детали до выхода исправления. +- Тесты проводите только на своих данных и аккаунтах. +- Атаки на инфраструктуру или пользователей строго запрещены. + +## Лучшие практики при отчёте +- Минимальный PoC без риска для данных и доступности. +- Чёткие и воспроизводимые шаги. +- Возможные предложения по снижению риска до исправления. From 478a6ecd8b3851db362b7856a685a7da7f15b4f2 Mon Sep 17 00:00:00 2001 From: Vladless Date: Wed, 1 Oct 2025 14:06:24 +0300 Subject: [PATCH 2/5] add issue template --- .github/ISSUE_TEMPLATE/issue.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/ISSUE_TEMPLATE/issue.md diff --git a/.github/ISSUE_TEMPLATE/issue.md b/.github/ISSUE_TEMPLATE/issue.md new file mode 100644 index 00000000..65f27655 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue.md @@ -0,0 +1 @@ +<сюда вставь содержимое из примера выше> From e16f5a50eea82836c5b91c079781f45a2690966c Mon Sep 17 00:00:00 2001 From: Vladless Date: Wed, 1 Oct 2025 14:12:26 +0300 Subject: [PATCH 3/5] update issue template --- .github/ISSUE_TEMPLATE/issue.md | 37 ++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/issue.md b/.github/ISSUE_TEMPLATE/issue.md index 65f27655..df13d59e 100644 --- a/.github/ISSUE_TEMPLATE/issue.md +++ b/.github/ISSUE_TEMPLATE/issue.md @@ -1 +1,36 @@ -<сюда вставь содержимое из примера выше> +--- +name: Issue +about: Сообщить об ошибке, предложить улучшение или указать на уязвимость +title: "[ISSUE] " +labels: triage +assignees: '' +--- + +### Тип +- [ ] Баг +- [ ] Фича +- [ ] Безопасность + +### Кратко +Опишите суть задачи. + +### Шаги воспроизведения (для багов/безопасности) +1. +2. +3. + +### Ожидаемое / Фактическое +- + +### Окружение +- Ветка: main/dev +- Коммит: +- ОС: +- Python: + +### Дополнительно (для фич) +Опишите мотивацию, альтернативы. + +### Примечание по безопасности +Не публикуйте PoC публично. +Для сообщений об уязвимостях свяжитесь напрямую: [@solonet_sup](https://t.me/solonet_sup). From e1602da083bae80c492316a81eb697004351b732 Mon Sep 17 00:00:00 2001 From: Capybara-z Date: Sat, 25 Oct 2025 18:29:12 +0300 Subject: [PATCH 4/5] fix sender banning issues --- handlers/admin/sender/sender_handler.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/handlers/admin/sender/sender_handler.py b/handlers/admin/sender/sender_handler.py index 22317026..5685954a 100644 --- a/handlers/admin/sender/sender_handler.py +++ b/handlers/admin/sender/sender_handler.py @@ -67,15 +67,15 @@ async def send_broadcast_batch(bot, messages, batch_size=15, session=None): await try_add_blocked_user(tg_id, session) results.append(False) except TelegramBadRequest as bad_request: - if "chat not found" in str(bad_request).lower(): + error_msg = str(bad_request).lower() + if "chat not found" in error_msg: logger.warning(f"🚫 Чат не найден для пользователя {tg_id}.") + await try_add_blocked_user(tg_id, session) else: logger.warning(f"📩 Не удалось отправить сообщение пользователю {tg_id}: {bad_request}") - await try_add_blocked_user(tg_id, session) results.append(False) except Exception as retry_error: logger.error(f"❌ Ошибка повторной отправки пользователю {tg_id}: {retry_error}") - await try_add_blocked_user(tg_id, session) results.append(False) except TelegramForbiddenError: @@ -83,15 +83,15 @@ async def send_broadcast_batch(bot, messages, batch_size=15, session=None): await try_add_blocked_user(tg_id, session) results.append(False) except TelegramBadRequest as bad_request: - if "chat not found" in str(bad_request).lower(): + error_msg = str(bad_request).lower() + if "chat not found" in error_msg: logger.warning(f"🚫 Чат не найден для пользователя {tg_id}.") + await try_add_blocked_user(tg_id, session) else: logger.warning(f"📩 Не удалось отправить сообщение пользователю {tg_id}: {bad_request}") - await try_add_blocked_user(tg_id, session) results.append(False) except Exception as e: logger.error(f"❌ Ошибка отправки сообщения пользователю {tg_id}: {e}") - await try_add_blocked_user(tg_id, session) results.append(False) await asyncio.sleep(min_interval) From e29e903efa833aceee0b90486548dbbe39625c3a Mon Sep 17 00:00:00 2001 From: Capybara-z Date: Sat, 1 Nov 2025 14:54:27 +0300 Subject: [PATCH 5/5] Fix special tariff notifications --- handlers/notifications/general_notifications.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/handlers/notifications/general_notifications.py b/handlers/notifications/general_notifications.py index 15cc200b..e5af42c5 100644 --- a/handlers/notifications/general_notifications.py +++ b/handlers/notifications/general_notifications.py @@ -355,7 +355,7 @@ async def handle_expired_keys( subgroup_title=tariff.get("subgroup_title", ""), ), ) - continue + except Exception as e: logger.error(f"Ошибка авто-продления для пользователя {tg_id}: {e}") continue @@ -530,6 +530,10 @@ async def process_auto_renew_or_notify( tariff_details=expiry_data["tariff_details"], ) + last_notification_time = await get_last_notification_time(conn, tg_id, notification_id) + if last_notification_time is not None: + return + if use_change_tariff_kb: keyboard = build_change_tariff_kb(email) else: