Commit graph

17 commits

Author SHA1 Message Date
Folist
a986d34b21 1.3.11: авторы в группах по типу чата (GitHub #3), время у сообщений, доставленных с опозданием (GitHub #2) 2026-10-16 18:39:54 +03:00
Folist
df6c4afa4e 1.3.10: фото из MAX первым способом MAX web (baseUrl как есть) — склейка baseUrl+token, которой мост качал фото с первого выпуска, получает 400 на всех фото 2026-10-16 11:07:15 +03:00
Folist
ef547287f7 1.3.9: скриншоты из MAX (второй способ скачать фото — baseUrl как в MAX web, после отказа CDN), сообщение ждёт переподключения к MAX до 30 с, ошибки отправки словами, повтор загрузки файла при сбое подключения 2026-10-16 10:45:27 +03:00
Folist
c52e8c7cda 1.3.8: каналы MAX (подписка, ссылки max.ru, /leavegroup — архив, отписка в MAX понимается), «📌 Закреп» в трансляции и включение за один /broadcast, повторы скачивания и заглушки с причиной, вытянутые картинки файлом, превью ссылок, MAX 26.35.2, отчёты об обрывах связи с MAX 2026-10-15 21:50:22 +03:00
Folist
869876178c Релиз 1.3.7: выход из MAX без удаления (/logout, пульт; сессия завершается и в MAX, /kill тоже), «🔁 Перезапустить мост» в пульте, сторож Telegram (переподключение при зависшем приёме), HISTORY_LIMIT при первой синхронизации, подсказка админу в личке; новость на сайте 2026-10-13 13:31:55 +03:00
Folist
7e50dcd810 Релиз 1.3.6: фото из MAX, которое Telegram не берёт как фото, приходит файлом, а не «[фото]»; подпись пересылки — название чата-источника (личный — собеседник) без «MAX chat N»; комментарии — HEIC из MAX приходит WebP (проверено вживую), ветка форматов — подстраховка; новость на сайте 2026-10-13 12:12:36 +03:00
Folist
f71fbdc5f6 Сайт под 1.3.5: раздел «Новости» (/news/) — лента версий из CHANGELOG.md с заголовками из scripts/news.json, RSS, плашка «Новое» на главной; scripts/build-news.mjs собирает всё это; карточки трансляции, контактов MAX и групп MAX, вопрос про трансляцию в FAQ, llms.txt 2026-10-13 02:07:23 +03:00
Folist
897e357bb3 Ченджлог из CHANGELOG.md вместо заголовков коммитов: парсер в version.ts (GitHub-путь через raw-файл на теге вместо compare-API), release.sh требует заполненный раздел версии, тесты парсера 2026-08-29 08:38:55 +03:00
Folist
335871ee6c Безопасность и надёжность (полный аудит): зеркало и телеметрия переведены на HTTPS, ключ подписи релизов закреплён в install.sh, контейнер работает без root, авто-реконнект при повреждённом кадре MAX, корректное завершение по SIGTERM, таймауты скачиваний и лимиты памяти 2026-08-25 22:19:52 +03:00
Folist
57ae210fdb Подпись обновлений включена: релизы подписываются SSH-ключом, update.sh проверяет
Переиспользуем существующий SSH-ключ мейнтейнера (git ssh-signature format, не GPG). allowed_signers
пришпилен в репо; update.sh/release.sh делают verify-tag по нему перед сборкой/публикацией. Теги
подписываются нейтральной личностью Telemax Release <release@telemax> — личный email в историю не течёт.
На хосте нужен только ssh-keygen (уже есть через openssh).
2026-08-22 17:25:50 +03:00
Folist
a518a7d408 Headless-мост: веб-панель вырезана, опциональные стикеры (slim/full), подпись обновлений
Вырезана веб-панель целиком (express/ws/react/vite/tailwind, TLS-серт, /api/*, API_KEY, порт 3000) — мост теперь headless: MAX по исходящему сокету, Telegram long-polling, управление и авторизация только в боте (/login, /panel). Убрана поверхность атаки, bundle меньше.

Анимированные стикеры (.tgs) стали опциональными: build-arg STICKERS=full|slim. full (деф.) ставит Chromium+ffmpeg (образ ~1.7 ГБ); slim пропускает их (~0.3 ГБ, быстрая сборка), анимированные уходят статической картинкой (thumbnail). setup.sh спрашивает при установке (30с таймаут, не тормозит).

Подпись обновлений (Phase C): update.sh/release.sh проверяют GPG-подпись релизного тега при наличии pinned-ключа release-signing-key.asc (транспорт GitHub/зеркало недоверенный, важна только подпись мейнтейнера). Активируется после добавления публичного ключа.
2026-08-22 15:32:57 +03:00
Folist
02130e4eae release.sh: SSH к зеркалу по DDNS-имени вместо сырого IP прода
Убираем хардкод IP прод-сервера из репозитория — ходим на зеркало по тому же
DDNS-имени, что уже используется в клиентском коде (version.ts/update.sh/
install.sh). IP в публичном коде больше нет.
2026-08-20 22:13:56 +03:00
Folist
5f31221186 Фикс задвоения сообщений на реконнекте + накопительный чейнджлог зеркала
Живые входящие (handleMaxPush) теперь двигают historyBackfillCursor после
доставки — раньше только бэкфилл и исходящие двигали его, поэтому catch-up на
реконнекте MAX-сессии перечитывал уже доставленные входящие (time > устаревший
курсор) и слал их в Telegram повторно. Симметрично уже существующему
rememberOutgoingSend для исходящих.

Зеркальный latest.json теперь несёт карту changelogs (версия -> заметки);
version.ts собирает все версии новее текущей, так что прыжок через несколько
версий показывает изменения каждой, а не только последней (как compare-API GitHub).
2026-08-20 20:27:36 +03:00
Folist
83f1ba0123 install.sh: установка и обновление с зеркала при недоступном GitHub
git clone/pull теперь при неответе GitHub (флаг/фильтрация) переключаются на
резервное зеркало; GIT_TERMINAL_PROMPT=0, чтобы скрытый репозиторий падал сразу,
а не висел на запросе логина. Бутстрап отдаётся с зеркала (release.sh кладёт
install.sh в веб-корень).
2026-08-20 16:58:03 +03:00
Folist
1bccd782e0 Устойчивость обновлений: фолбэк на self-hosted зеркало при недоступном GitHub
update.sh и проверка версии при неответе GitHub переключаются на резервное
зеркало (bare-репо + latest.json за DuckDNS-именем): обновления и уведомления
о версии работают, даже если GitHub недоступен или аккаунт скрыт. Зеркало
наполняется на релизе через scripts/release.sh (пуш в оба remote + latest.json).

MIRROR_BASE_URL / MIRROR_GIT_URL — переопределяемы через env, чтобы зеркало
можно было перенести без правки кода у установок.
2026-08-20 12:19:33 +03:00
Folist
8afc421b0a Support password-protected MAX accounts (2FA on top of SMS)
Full flow reverse-engineered and confirmed live: CHECK_CODE responds
with a passwordChallenge (trackId + optional hint) instead of a login
token when the account has a password set. A new opcode, CHECK_PASSWORD
(0x0073), exchanges {trackId, password} for the same 663-char login
token CHECK_CODE would have returned directly — from there it's an
ordinary LOGIN.

verifyCode() now returns a discriminated union (ok / password_required)
instead of throwing either way, so callers can actually ask for a
password instead of just failing. Wired through everywhere MAX auth
happens: the web panel gets a new password step (with hint), setup.sh's
console flow prompts for it too, and the dev auth-cli script handles it
via the same file-polling pattern it already used for the SMS code.

A wrong password doesn't burn the trackId (confirmed live) — both the
web UI and setup.sh let you retry it freely without a fresh SMS. It's
only consumed on success, matching MAX's own behavior.
2026-08-14 11:58:47 +03:00
Folist
50c304fa8c Initial public release: MAX <-> Telegram bridge
Two-way message/media bridge between MAX and Telegram forum topics, with
group management, polls, calls, forwarding, and admin commands (/help,
/reboot, /kill, /donate) from Telegram. Includes one-command install
(install.sh) and interactive first-run setup (setup.sh) for a bare Ubuntu
server.
2026-08-13 16:00:10 +03:00