Commit Graph

2035 Commits

Author SHA1 Message Date
chillpad
e86fe4d67c hide additional options block 2026-07-26 01:56:45 +03:00
Egor
9f98fca2ea Merge pull request #512 from BEDOLAGA-DEV/release-please--branches--main--components--cabinet-frontend
chore(main): release 1.63.0
2026-07-25 01:30:31 +03:00
github-actions[bot]
ebf4d2e047 chore(main): release 1.63.0 2026-07-24 22:29:29 +00:00
Egor
73f255be57 Merge pull request #510 from BEDOLAGA-DEV/dev
Dev
2026-07-25 01:28:52 +03:00
Fringg
51d0f0431a fix(security): инлайновые regex-барьеры для CodeQL в openAppScheme и redirect.html
Хелпер-функции (isSafeToOpen/isSafeAppLink) CodeQL как санитайзеры не
распознаёт — js/xss и js/client-side-unvalidated-url-redirection
продолжали флаговаться на sink'ах. Проверки перенесены инлайн к sink'ам
как префикс-якорные RegExp-гарды (распознаваемый барьер): scheme://
обязателен, javascript/data/vbscript/file/blob/about/intent/content/
filesystem (и http для redirect.html) отбрасываются. Семантика та же.
2026-07-25 00:32:00 +03:00
Fringg
aa6bf44db9 fix(security): внутренний гард openAppScheme от опасных схем (CodeQL)
Callers валидируют вход (allowlist в DeepLinkRedirect, конфиг в
Connection), но сама утилита доверяла аргументу — забытая валидация в
будущем call-site стала бы client-side XSS через
location.href='javascript:…'. Теперь схема парсится и javascript/data/
vbscript/file/blob/about/intent/content/filesystem отбрасываются до
любого sink'а (зеркало isSafeAppLink из redirect.html).
2026-07-25 00:20:52 +03:00
Fringg
17e27d3437 fix(sbp-recurring): отступ между тогглом автопродления и СБП-блоком
Карточки-соседи слипались: у тоггла нет нижнего маргина, у СБП-блока не
было верхнего, парент вертикальных отступов не даёт. mt-3 зеркально
внутреннему ритму карточки.
2026-07-24 19:23:46 +03:00
Fringg
f448c14994 feat(sbp-recurring): СБП-оформление подписки на форме покупки тарифа
Вторая CTA «Оформить с автооплатой СБП» под кнопкой покупки с баланса
(и в daily-ветке) — показывается по platega_recurrent_enabled из
purchase-options. POST /platega-recurrent/purchase → редирект в банк
(первое списание = подтверждение привязки), инвалидация подписочных и
sbp-запросов, переход в /subscriptions. Локали en/ru/zh/fa.
2026-07-24 19:07:23 +03:00
Fringg
faf4c450b0 fix(sbp-recurring): компактный layout СБП-блока на десктопе
Кнопки растягивались w-full на всю ширину карточки подписки (~1600px на
десктопе) — гигантская плашка вместо контрола. Теперь заголовок и статус
слева, компактное действие справа — зеркально соседнему тогглу
«Автопродление»; на мобиле кнопка по-прежнему на всю ширину
(w-full sm:w-auto).
2026-07-24 17:45:11 +03:00
Fringg
6c6901db66 Merge PR #476: не гонять tsc при docker-сборке
tsc в vite-проекте ничего не эмитит (noEmit) — только тип-гейт, который
уже стоит в CI и в самом docker-воркфлоу (build-and-push: needs: lint).
build:docker = vite build; npm run build с tsc сохранён для людей и CI.
~10s с каждой сборки образа. Спасибо @kewldan.
2026-07-24 16:46:01 +03:00
Fringg
b8d5df223b Merge PR #509: отправлять пустые промогруппы и описание при PATCH тарифа
Форма слала undefined при пустом выборе, а PATCH применяет поле только
при его наличии — снять все промогруппы или очистить описание было
невозможно. Теперь при редактировании поля уходят всегда ([] и '');
create не меняется (бэкенд маппит пустое в None). Закрывает #455.
Спасибо @kewldan.
2026-07-24 16:41:19 +03:00
Fringg
2cd494e949 Merge PR #508: различать устаревшего бота и ненастроенного на логине
404 на /cabinet/branding/telegram-widget и deeplink-роутах = сборка бота
старше v3.24/v3.33 — вместо «бот не настроен» показываем auth.botOutdated
(4 локали). README: фактический минимум v3.33.0. Закрывает #345.
Спасибо @kewldan.
2026-07-24 15:00:36 +03:00
Fringg
90a4a7bf67 Merge PR #507: секция вывода средств — всем реферерам
Гейт partner_status === 'approved' был чисто фронтовым: бэкенд-эндпоинты
вывода и referral_withdrawal_service партнёрство не проверяют, а страница
запроса вывода тоже не гейтится. Секция остаётся под админским флагом
partner_section_visible. Закрывает #472. Спасибо @kewldan.
2026-07-24 14:54:57 +03:00
Fringg
05a7c6b02a Merge PR #506: приветствие без пустого имени для email-пользователей
displayName() получил фолбэк на локальную часть email; без имени вовсе —
dashboard.welcomeNoName без запятой (4 локали). Закрывает #423.
Спасибо @kewldan.
2026-07-24 14:50:21 +03:00
Fringg
0a8b1a46d1 fix(ci): рабочий Trivy-пин, lowercase-референс образа, CodeQL v4
- trivy-action@0.24.0 — несуществующий тег (у trivy-action теги с
  префиксом v): резолв экшенов в Set up job валил бы весь docker-воркфлоу
  даже на PR. Пин на SHA v0.36.0 — как в бот-репо.
- image-ref из github.repository сохраняет регистр (BEDOLAGA-DEV/…), а
  OCI требует lowercase — добавлен lowercase-шаг.
- codeql-action v3 → v4 (v3 закатный; бот-репо уже на v4).
2026-07-24 14:39:25 +03:00
Fringg
9f16e6b028 Merge PR #504: CI security — dependabot + CodeQL + npm audit + Trivy
SAST (CodeQL security-and-quality), npm audit (non-blocking), Trivy-скан
GHCR-образа → SARIF в Security tab, еженедельный dependabot с
группировкой PR. Спасибо @AirP0WeR.
2026-07-24 14:38:43 +03:00
Fringg
21ab524aa4 Merge PR #503: deep-link на iOS через top-level переход
iOS запускает кастомную схему только из top-level навигации с жестом —
скрытый iframe молча игнорируется (кнопка «Добавить подписку» не
работала в Safari и миниаппе, больнее всего на iOS-first INCY).
iframe оставлен для Android in-app браузеров (ERR_UNKNOWN_URL_SCHEME).
Симметрично в openAppScheme.ts и redirect.html. Спасибо @AirP0WeR.
2026-07-24 14:30:10 +03:00
Fringg
8b666589eb Merge PR #502: ужесточить resolveSupportContact
Схема support_url валидируется (http/https/tg, чужое → null), legacy
SUPPORT_USERNAME проверяется регуляркой (URL-образное не клеится в
t.me/https://…), null → кнопка контакта не рендерится вместо дефолтного
@support. Ветки ticketsDisabled/both переведены на общий резолв.
Спасибо @AirP0WeR.
2026-07-24 14:21:59 +03:00
Fringg
2e17f8a7e0 Merge PR #505: локализовать дефолт экрана подписки на канал
Захардкоженный английский дефолт бэкенда из 403 channel_subscription_required
перебивал переведённую blocking.channel.defaultMessage. Хелпер
customChannelMessage() отбрасывает известный дефолт и пустые значения,
кастомный текст проходит как есть. Закрывает #311. Спасибо @kewldan.
2026-07-24 14:08:57 +03:00
Fringg
42a7190241 fix(sbp-recurring): toast ошибки отмены + per-sub ключ inline-confirm в админке
- cancelSbpMutation: onError-тост с detail бэкенда (зеркально enable) —
  молчаливый провал отмены выглядел как успех
- SubscriptionTab: ключ подтверждения cancelSbpRecurring_{subId} —
  взведённый confirm не переживает переключение подписки в пикере
- Локали: subscription.sbpRecurring.cancelError (en/ru/zh/fa)
2026-07-24 07:28:50 +03:00
Fringg
9fb80a6af4 Merge branch 'feat/platega-sbp-recurring' into dev: СБП-автопродление Platega в кабинете
Тоггл/статус/отмена на странице подписки (включая суточные тарифы),
СБП-привязки в сохранённых методах, WS-уведомления о событиях списаний,
статус и отмена автооплаты в админ-карточке юзера. Работает только при
включённом PLATEGA_RECURRENT_ENABLED на бэкенде (403 = блок скрыт).
2026-07-24 06:45:39 +03:00
Fringg
332849393c feat(admin): статус и отмена СБП-автопродления в карточке юзера 2026-07-24 06:45:00 +03:00
Fringg
e8409a9007 feat(ws): уведомления о событиях СБП-автопродления 2026-07-24 06:42:39 +03:00
Fringg
d938ac2dd9 feat(balance): СБП-привязки в сохранённых методах 2026-07-24 06:11:25 +03:00
Fringg
29a36837c8 feat(subscription): блок СБП-автопродления на странице подписки 2026-07-24 02:31:20 +03:00
Fringg
9093aec207 feat(subscription): API и утилиты СБП-автопродления Platega 2026-07-24 02:14:41 +03:00
kewldan
f1413de598 fix(tariffs): отправлять пустые промогруппы и описание при редактировании тарифа 2026-07-23 04:09:22 +03:00
kewldan
b3b07c322d fix(auth): различать устаревшего бота и ненастроенного на экране логина 2026-07-23 04:09:06 +03:00
kewldan
ce13792f96 fix(referral): показывать секцию вывода средств всем реферерам 2026-07-23 03:36:30 +03:00
kewldan
147b1fbb2e fix(dashboard): приветствие без пустого имени для email-пользователей 2026-07-23 03:36:26 +03:00
kewldan
5e2e3214c9 fix(blocking): локализовать дефолтное сообщение на экране подписки на канал 2026-07-23 03:36:17 +03:00
airp0wer
aa1ecbfdef ci(security): dependabot + CodeQL + npm audit + Trivy-скан образа
- .github/dependabot.yml: еженедельные обновления npm/github-actions/docker
  со сгруппированными PR
- codeql.yml: SAST (javascript-typescript, security-and-quality) на push/PR
  в main/dev + еженедельный проход
- security-audit.yml: npm audit --audit-level=high (пока non-blocking)
- docker.yml: Trivy-скан запушенного образа с выгрузкой SARIF в Security tab
  (non-blocking), least-privilege permissions на workflow
2026-07-21 10:42:06 +03:00
airp0wer
03aa2e6312 fix(connection): открывать deep-link приложения на iOS через top-level переход, а не iframe
На iOS кастомная схема (incy://, happ://, …) запускается только top-level
навигацией, привязанной к жесту пользователя. Запуск из скрытого iframe iOS
молча игнорирует — приложение не открывается даже если установлено, поэтому
кнопка «Добавить подписку» на iPhone (Safari и TG-миниапп) не срабатывала.
Заметнее всего на INCY: это iOS-first клиент, его аудитория целиком на iPhone.

openAppScheme и public/miniapp/redirect.html теперь на iOS используют
window.location.href (вызов синхронный, внутри обработчика клика — жест
сохраняется), а contained-iframe остаётся для Android in-app браузеров, где
top-level переход к нерешаемой схеме рисует полноэкранный
net::ERR_UNKNOWN_URL_SCHEME и стирает fallback-UI (Telegram bug #654272).

Добавлен юнит-тест на выбор пути: iOS и iPadOS-as-Mac → location.href,
Android и desktop → iframe.
2026-07-21 10:36:42 +03:00
airp0wer
ebde1f6174 fix(support): ужесточить resolveSupportContact — схема, legacy-username, null
Инкремент поверх f04675b (#501 был технически перекрыт им). resolveSupportContact
теперь не только не клеит t.me с внешним URL, но и отсекает битый конфиг вместо
того, чтобы уводить пользователя по мусорной ссылке:

1. Валидация схемы support_url — открываем только http/https/tg, чужая схема
   (javascript:, data: и т.п.) больше не уходит в опенер как есть, а даёт null.
2. Валидация legacy username регуляркой ^[A-Za-z0-9_]{3,}$ — старый бэк с
   URL-образным SUPPORT_USERNAME больше не собирает битый t.me/https://…,
   URL-образное отдаём резолвить бэку.
3. null → кнопка не рендерится — при ненастроенном/битом контакте (в т.ч. ушёл
   дефолт @support) кнопку в Support.tsx не показываем, а не открываем молча
   https://t.me/support.

Заодно url-ветка в ticketsDisabled и карточка both-режима ходят через
resolveSupportContact — ушёл прямой openLink(support_url!) с non-null assertion,
три ветки getSupportMessage схлопнуты в две (profile и fallback идентичны).
2026-07-21 10:28:31 +03:00
Fringg
f04675b249 fix(support): не склеивать t.me со ссылкой на внешний хелпдеск
SUPPORT_USERNAME на бэке принимает и @username, и произвольный URL. Кабинет
же во всех трёх ветках клеил `https://t.me/${support_username}`, из-за чего
внешний хелпдеск превращался в https://t.me/https://help.example.com и не
открывался. Бэк теперь отдаёт контакт разрезолвленным (support_url +
contact_is_telegram) — клеить на клиенте нечего.

Логика вынесена в resolveSupportContact: три копии склейки (profile, fallback
и карточка режима both) заменены одним вызовом. Старый бэк не шлёт support_url,
для него сохранено прежнее поведение — новый фронт не ломается на неподнятом
бэкенде.

Заодно ушли три non-null assertion на support_username.
2026-07-20 21:41:08 +03:00
Egor
37713d07cf Merge pull request #500 from BEDOLAGA-DEV/release-please--branches--main--components--cabinet-frontend
chore(main): release 1.62.0
2026-07-19 17:56:03 +03:00
github-actions[bot]
4019f9dbad chore(main): release 1.62.0 2026-07-19 14:55:28 +00:00
Egor
cc82bb22ce Merge pull request #499 from BEDOLAGA-DEV/dev
Dev
2026-07-19 17:54:52 +03:00
Fringg
b97c3dc2f2 Merge branch 'fix/payment-methods-locale-duplicate' into dev: дубликат ключа admin.paymentMethods.description 2026-07-19 17:44:27 +03:00
Fringg
46c1bc79a4 fix(admin): дубликат ключа admin.paymentMethods.description
Ключ был объявлен дважды: как подзаголовок страницы списка методов
и как подпись поля формы. Побеждало последнее определение, поэтому
на странице «Платёжные методы» вместо «Настройка порядка и условий
отображения» показывалось «Описание».

Подзаголовок переименован в subtitle, пара description/descriptionHint
осталась за полем формы. В zh/fa подписи поля не было вовсе — там под
description лежал текст подзаголовка, поэтому форма показывала не то;
добавлены недостающие переводы вместо русского фолбэка.

Заодно форматирование AdminPaymentMethodEdit.tsx: шаг format:check
в CI не доходил до выполнения, пока падал lint.

Чинит красный lint в CI ветки dev.
2026-07-19 17:44:22 +03:00
Fringg
da74d03596 Merge branch 'feat/cispay-payment-method' into dev: способ оплаты cisPay 2026-07-19 17:38:36 +03:00
Fringg
4b982175d7 feat(payments): способ оплаты cisPay
Регистрация нового провайдера пополнения (api.cispay.app, карта и СБП)
во фронтенде: метка в METHOD_LABELS, иконка, узел настроек
payments_cispay и локали ru/en/zh/fa.

Бэкенд отдаёт метод динамически, поэтому страницы статистики и транзакций
подхватывают его автоматически через METHOD_LABELS и PaymentMethodIcon.
2026-07-19 17:38:32 +03:00
Egor
6d1513092b Merge PR #496: кнопка построения полной реферальной сети 2026-07-19 16:36:28 +03:00
Egor
0b53e0e35f Merge PR #495: приоритет админского display_name/description над локалью на балансе 2026-07-19 16:34:40 +03:00
Egor
424d77455e Merge PR #493: состав промокода чекбоксами — баланс / дни / промогруппа 2026-07-19 16:29:08 +03:00
Egor
10b58cdc1f Merge PR #492: кнопка «Отправить сообщение» в карточке пользователя 2026-07-19 16:26:15 +03:00
Egor
812f73dd07 Merge pull request #498 from BEDOLAGA-DEV/main
w
2026-07-19 16:24:28 +03:00
Fringg
61d3169e7d Merge PR #491: vitest-чек синхронности en/ru локалей + запуск тестов в CI 2026-07-19 16:23:26 +03:00
Fringg
1fddd9473c test(i18n): опустошить allowlist после мержа #489 + перевод realtimeTitle
Поверх #491: #489 уже в dev — записи resetPassword.*/expiredDate_trial и
placeholder-исключение serverAccess из allowlist удалены (по инструкции
самого теста); последняя дыра admin.remnawave.traffic.realtimeTitle закрыта
переводом — проверка синхронности теперь строгая, без известных исключений
2026-07-19 16:23:17 +03:00
Fringg
b771152bb2 Merge branch 'test/locale-sync' into test-merge-491 2026-07-19 16:22:02 +03:00