История изменений
Здесь отображаются последние записи из файла docs/CHANGELOG.md. Данные
обновляются автоматически при каждом релизе и полностью совпадают с документацией.
Версия 2.0.10
2025-12-14
🐛 Исправления Android приложения
- Исправлено сохранение токена:
- Заменен асинхронный
apply()на синхронныйcommit()вPreferencesManager - Токен теперь сохраняется синхронно, что гарантирует его сохранение при перезапуске приложения
- Добавлено логирование операций сохранения/загрузки токена
- Изменен порядок инициализации в
MainActivity: сначала загрузка токена, затем настройка UI - Исправлена проблема с исчезающей кнопкой запуска:
- Добавлен
editTextTokenвconstraint_referenced_idsдляbarrierToken - Добавлен
android:visibility="visible"дляbuttonStart - Удалены конфликтующие constraints из
buttonStart - Исправлены проблемы с Foreground Service (Android 14+):
- Добавлен
android:foregroundServiceType="specialUse"вAndroidManifest.xml - Добавлено свойство
PROPERTY_SPECIAL_USE_FGS_SUBTYPEсо значением "VPN" - Добавлены разрешения
FOREGROUND_SERVICEиFOREGROUND_SERVICE_SPECIAL_USE - Вызов
startForeground()перенесен вonCreate()для Android 14+ - Исправлены ошибки
ForegroundServiceDidNotStartInTimeExceptionиMissingForegroundServiceTypeException
✨ Новые возможности
- Добавлены временные метки в логи:
- Создан класс
LogUtilsдля логирования с временными метками - Формат меток:
[yyyy-MM-dd HH:mm:ss.SSS] - Все логи приложения теперь содержат временные метки
- Заменены все вызовы
Log.d/e/i/w/vнаLogUtils.d/e/i/w/vво всех файлах - Улучшена диагностика перехвата трафика:
- Добавлены HTTP запросы для тестирования перехватчика (в дополнение к HTTPS)
- Разрешен cleartext трафик для
httpbin.orgвnetwork_security_config.xml - Добавлено расширенное логирование в
MtsHttpInterceptorдля диагностики - Добавлены логи перед вызовом
createFactory()для отслеживания инициализации
🔧 Технические улучшения
- Интеграция NetBare библиотеки:
- Использована альтернативная библиотека
MegatronKing/NetBare-Android - Создан
MtsHeadersApplicationдля инициализации NetBare и генерации SSL сертификатов - Рефакторинг
MtsVpnServiceдля работы с новым API NetBare - Создан
MtsHttpInterceptorдля перехвата HTTP трафика через NetBare - Обновлен
MainActivityдля использования нового API NetBare - Настроен
NetBareConfigсexcludeSelf(false)для тестирования - Улучшена обработка ошибок:
- Добавлена обработка
NetworkOnMainThreadExceptionдля тестовых запросов - Добавлена обработка
SSLHandshakeExceptionс кастомным TrustManager для тестирования - Улучшено логирование ошибок с временными метками
📝 Документация
- Обновлена документация по использованию NetBare
- Добавлены инструкции по настройке Foreground Service для Android 14+
Версия 2.0.9
2025-01-20
🐛 Исправления Android приложения
- Исправлено перекрытие кнопок после сохранения токена:
- Использован
Barrierв ConstraintLayout для корректного позиционирования buttonStartтеперь привязан кBarrier, который отслеживает оба элемента (layoutTokenDisplayиbuttonSaveToken)- Кнопки больше не наезжают друг на друга при переключении режимов отображения токена
- Улучшен поиск МТС Защитника:
- Поиск теперь проверяет ВСЕ приложения, включая без launch intent
- Добавлены ключевые слова:
'who_calls','who calls'для поиска по package name - Расширен список ключевых слов для диагностики (включая
'who') - Приложения с ключевыми словами добавляются в список, даже без launch intent
- Известные package names добавляются всегда, даже без launch intent
- Улучшено логирование для диагностики проблем поиска
- Улучшена диагностика:
- Логирование первых 20 установленных приложений для отладки
- Детальная информация о найденных МТС-приложениях
- Предупреждения, если МТС Защитник не найден
🆕 Android приложение для сбора заголовков МТС Защитник
- Создано Android приложение (
android-mts-headers/): - Перехват HTTP заголовков при проверке номеров в МТС Защитник
- Автоматическая отправка заголовков на сервер через API endpoint
- Поле для ввода API токена для авторизации
- Сохранение токена в SharedPreferences
- Автоматическая передача токена в заголовке
X-API-Key - UI для управления перехватом и тестирования отправки
- Компоненты приложения:
MtsHeadersInterceptor- OkHttp Interceptor для перехвата заголовковHeadersParser- парсер заголовков и извлечение токеновHeadersUploader- отправка данных на сервер через RetrofitRandomNumberChecker- генератор случайных номеровPreferencesManager- управление настройками приложения
🗄️ База данных для хранения заголовков
- Таблица
mts_headers_history: - Хранит историю всех заголовков от Android приложения
- Поля:
user_agent,device_id,firebase_token,cookie_ma_id,cookie_ma_last_sync all_headers(JSONB) - все заголовки в формате JSONchecked_number,app_version,device_info- Индексы по
created_atиfirebase_token - Таблица
mts_headers_current: - Хранит актуальные заголовки (последняя версия)
- Связь с
mts_headers_historyчерезsource_history_id - Обновляется при каждой загрузке новых заголовков
🔌 API Endpoint для приема заголовков
- POST
/internal/mts-headers/upload: - Принимает заголовки от Android приложения
- Опциональная авторизация через токен (
X-API-Keyили query параметрtoken) - Сохраняет в историю и обновляет актуальные заголовки
- Возвращает
history_idдля отслеживания - Обратная совместимость: работает и без токена
🔄 Улучшенная логика получения заголовков МТС
- Обновлена функция
get_mts_headers(): - Сначала пытается получить заголовки из БД (
mts_headers_current) - Если данных нет, использует старую логику генерации/кэширования
- Автоматически обновляет
ma_last_syncпри использовании данных из БД - Приоритет: БД → переменные окружения → кэш Redis → генерация
🔐 Улучшенная логика Firebase AppCheck токена
- Автоматическое обновление токена:
- Проверка срока действия токена (1 час)
- Автоматическое обновление при истечении или если до истечения осталось менее 5 минут
- Константы
TOKEN_TTL = 3600иTOKEN_REFRESH_THRESHOLD = 300 - Функция
check_token_expiration()для проверки валидности - Стратегия получения токена:
1. Пытается получить через Firebase API (если есть все данные)
2. Проверяет переменную окружения MTS_FIREBASE_APPCHECK
3. Проверяет кэш Redis
4. Использует шаблон из MTS_FIREBASE_APPCHECK_TEMPLATE
- Логирование:
- Предупреждение, если токен не удалось получить
- Не прерывает выполнение - API может работать и без токена
📝 Документация
- Добавлена документация для Android приложения (
docs/android_app_mts_headers.md) - Описание API endpoint, примеры кода на Kotlin
- Варианты перехвата трафика (Interceptor, VPN, Accessibility)
Версия 2.0.8
2025-01-20
🔄 Улучшения резервного копирования
- Восстановление бэкапов через админ-панель:
- Добавлена функция восстановления базы данных из резервной копии (
/admin/backup/restore) - Подтверждение перед восстановлением для предотвращения случайных действий
- Автоматическая распаковка gzip архивов
- Обработка ошибок и таймаутов
- Верификация целостности бэкапов:
- Проверка целостности бэкапов через админ-панель (
/admin/backup/verify) - Валидация SQL дампа PostgreSQL
- Информативные сообщения о статусе проверки
- Удаление бэкапов:
- Возможность удаления отдельных бэкапов через админ-панель (
/admin/backup/delete) - Подтверждение перед удалением
- Настройка retention:
- Таблица
backup_settingsдля хранения настроек резервного копирования - Страница настроек (
/admin/backup/settings) для изменения срока хранения (1-365 дней) - Настройки сохраняются в базе данных
- Улучшенная статистика:
- Отображение возраста каждого бэкапа
- Предупреждения о бэкапах, которые будут удалены (на основе retention)
- Информация о следующем автоматическом бэкапе
- Общий размер всех бэкапов
- Кнопка для настройки retention прямо из списка бэкапов
🚀 Прогресс-бар для создания бэкапа
- Фоновая обработка через Arq worker:
- Создание бэкапа вынесено в фоновую задачу
backup_create_task - Не блокирует интерфейс админ-панели
- Использование Arq worker для надежной обработки с retry механизмами
- Визуальный прогресс:
- Прогресс-бар с отображением процентов выполнения
- Статусные сообщения для каждого этапа:
- 0% - "Инициализация создания бэкапа..."
- 30% - "Создание дампа базы данных..."
- 100% - "Бэкап успешно создан"
- Автоматическое обновление прогресса каждую секунду
- Автоматическое перенаправление на список бэкапов после завершения
- Endpoint для отслеживания прогресса:
- Новый endpoint
/admin/backup/progress?key={progress_key}для получения статуса - Возвращает JSON с текущим этапом, процентом выполнения и сообщением
🔧 Архитектурные улучшения
- HTTP API в контейнере num-backup:
- Реализован внутренний Flask API (
backup_api.py) в контейнереnum-backup - Endpoints:
/health,/backup/create,/backup/restore,/backup/verify,/backup/list - Замена прямых вызовов
docker execна HTTP запросы черезhttpx - Улучшенная обработка ошибок и таймаутов
- Конфигурация:
- Добавлена переменная окружения
BACKUP_API_URLдля настройки адреса API бэкапов - По умолчанию:
http://num-backup:8001 - Healthcheck контейнера
num-backupобновлен для проверки HTTP API
🗄️ База данных
- Добавлена таблица
backup_settingsдля хранения настроек резервного копирования - Миграция включает значение по умолчанию для
retention_days(7 дней)
Версия 2.0.7
2025-11-27
🐛 Исправления
- Якорные ссылки в документации:
- Исправлена проблема с неработающими якорными ссылками в
Project.mdи других документах. - Добавлено расширение
attr_listдля поддержки атрибутов{#id}в заголовках Markdown. - Добавлен JavaScript для обработки кликов по якорным ссылкам с плавной прокруткой.
- Добавлены CSS стили для якорных ссылок (цвет, hover-эффекты, scroll-margin-top).
- Теперь все ссылки в оглавлении работают корректно и обеспечивают плавную прокрутку к разделам.
🔍 Поиск по маске
- Добавлена форма поиска по маске в пользовательском интерфейсе (символ
*в конце). Возвращает совпадения из базы перенесённых номеров (MNP) и DEF/ABC диапазонов. - В админке появилась страница
/admin/search/maskс отчётом (таблицы MNP/DEF, настройка лимита выводимых записей) и ссылкой с главной страницы.
🆕 Версионирование API и фича-флаги
- Поддерживаются дополнительные способы выбора версии (
api_version,X-API-Version,Accept: application/vnd.num.v{N}+json). Ответы возвращают заголовокX-API-Version. - У токенов можно задавать
preferred_api_versionи список разрешённых фич (enabled_features). Клиенты могут запрашивать фичи черезfeatures/X-API-Features, а ответ содержит итоговый список в заголовкеX-API-Features. - Фича
callerid_plaintextзащищает plaintext-ответы (используются для интеграции с CallerID/Asterisk).
📚 Улучшения документации в админке
- Многоуровневое меню документации:
- Файлы документации теперь организованы в иерархическую структуру с папками (например,
functions/). - Папки можно раскрывать/сворачивать, состояние сохраняется в
localStorage. - Папка с активным файлом автоматически раскрывается.
- Поддержка Markdown и MarkdownV2:
- Добавлена библиотека
markdown==3.7для рендеринга Markdown-файлов в HTML. - Поддержка двух форматов: стандартный Markdown и Telegram MarkdownV2.
- Кнопки переключения формата в интерфейсе документации.
- Красивое форматирование с поддержкой заголовков, списков, таблиц, кода, ссылок и изображений.
- Для файлов без расширения
.mdотображается как plain text.
🎨 Улучшения интерфейса
- Прокручиваемое меню в админке:
- Боковое меню теперь имеет фиксированную максимальную высоту с прокруткой.
- Заголовок "Навигация" закреплён сверху (sticky).
- Кастомный тонкий скроллбар для лучшего внешнего вида.
- Более компактное отображение элементов меню.
- Футер в пользовательской части:
- Футер вынесен за пределы основного контента и всегда находится внизу страницы.
- Удалена техническая информация об API из футера для упрощения интерфейса.
- Единообразная структура layout с админ-панелью.
🐛 Исправления
- Исправлена проблема с исчезновением пункта меню "Пользователи" при навигации в админ-панели. Состояние раскрытых групп меню теперь сохраняется в
localStorage, что предотвращает случайное скрытие пунктов меню при переходах между страницами. - Исправлена проблема с раскрытием меню в админке. JavaScript теперь корректно инициализируется после загрузки DOM.
🧰 Прочее
- Версия приложения обновлена до
2.0.7во всех скриптах, миграциях и документации. - Исправлена ошибка запуска (
NameError: Any) вadmin.py. - В публичном интерфейсе и админке появились страницы «История изменений», автоматически читающие
docs/CHANGELOG.md. - В админке добавлен раздел
/admin/docsдля просмотра всех Markdown-файлов из каталогаdocs/(с кнопкой «Открыть оригинал» и переходом к changelog).
Версия 2.0.6
2025-11-24
🔐 Система ролей в админ-панели
- Разделение прав доступа:
- Создана функция
superuser_authдля проверки прав суперадмина. - Все эндпоинты работы с пользователями (
/admin/users/*) защищены проверкой прав суперадмина. - Обычные админы могут управлять только API токенами, суперадмины могут создавать и управлять пользователями.
- Пункт меню "Пользователи" автоматически скрывается для не-суперадминов.
- При попытке доступа к защищенным эндпоинтам возвращается ошибка 403 Forbidden.
🔒 Система лимитов запросов
- Лимиты для массовых запросов:
- Добавлены отдельные лимиты для bulk-запросов (
bulk_rate_limit_per_day/hour/min) в таблицеapi_tokens. - Лимиты считаются по количеству номеров, а не запросов.
- Создана таблица
api_token_bulk_statsдля отслеживания количества номеров в массовых запросах. - Все bulk endpoints (
/v2/bulk,/v2/yandex-spam-check/bulk,/v2/tbank-check/bulk) проверяют лимиты на количество номеров. - Админка обновлена для управления лимитами массовых запросов.
- Лимиты по IP адресам для публичной части:
- Добавлена таблица
ip_rate_limitsдля хранения лимитов запросов с одного IP (настраивается через БД). - Добавлена таблица
ip_request_statsдля отслеживания запросов по IP адресам. - Публичный endpoint
/проверяет лимиты по IP при реальных запросах на проверку номеров. - Добавлена страница
/admin/ip-limitsдля управления лимитами и просмотра статистики по IP. - Лимиты по умолчанию: 100 запросов в день с одного IP.
📦 Прочее
- Версия приложения повышена до
2.0.6и отражена во всех документах и SQL-скриптах.
📞 CallerID / Asterisk интеграция
- Эндпоинты
/v2и/v2/operatorполучили параметрfield, позволяющий вернуть одно значение (например,operatorилиoperator_code) в видеtext/plain. - Добавлен whitelisting допустимых полей (
operator,operator_code,msisdn, и т.д.) и понятные ошибки при неверном значении. - Использовать удобно из Asterisk/FreePBX: запрос
.../v2/operator?num=XXX&field=operatorмоментально отдаёт имя оператора для CallerID.
🆕 Версионирование API и фича-флаги
- Добавлены альтернативные способы выбора версии: query-параметр
api_version, заголовокX-API-Version, а также медиа-типAccept: application/vnd.num.v{N}+json. - У токенов появилось поле
preferred_api_version, позволяющее в админке принудительно закрепить версию для конкретного клиента. Ответы всегда содержат заголовокX-API-Version. - Реализованы фича-флаги (
enabled_features), передаваемые через queryfeaturesили заголовокX-API-Features. Сейчас доступен флагcallerid_plaintext. - В админ-панели можно управлять версией и списком фич для каждого токена.
🔍 Поиск по маске
- В пользовательском интерфейсе появилась форма поиска по маске (например,
7999*), показывающая совпадения из перенесённых номеров и DEF диапазонов. - В админке добавлена страница
/admin/search/maskс отчётом (таблицы MNP/DEF, настройка лимита результатов).