mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-10-18 03:45:02 +03:00
feat(sub): add Incy app-management parameters (#6650)
* feat(sub): add Incy app-management parameters The panel already pushes a set of Happ headers, but INCY documents its own lowercase header names and its own value domains, so a Happ-shaped payload gets ignored by the client (per-app mode is bypass|proxy, not on|bypass, and per-app-proxy-enable has no Happ counterpart at all). Add a sibling Incy path that emits exactly the documented headers. Covered, per https://docs.incy.cc/en/app-management/: - profile-description, sort-order, support-email, announce-url, premium-url - banner text/button/URL and the two hex colours - hide-url, hide-check, no-limit-enabled - per-app split tunnelling (enable/mode/list) - TCP fragmentation (enable/length/interval/packets) - UDP noise packets (enable/type/packet/delay) - DoH pre-resolution (enable/domain/IP) Each string setting is tri-state: an empty value omits the header, so an untouched panel never overrides the subscriber's own choice in the app. Values are validated against the documented domains and dropped when they do not match, and non-ASCII text is base64-wrapped the way the docs require for Cyrillic. INCY identifies itself as INCY/<version>/<platform>, which gates the headers behind the same auto-detect switch the Happ path uses. Headers the panel already emits for every client (Profile-Title, Support-Url, Profile-Web-Page-Url, Announce, Profile-Update-Interval, Subscription-Userinfo) and Incy's routing line are left as they are. The Premium API (theme, defaultPingProtocol, fallbackHosts, ...) is a separate encrypted endpoint and stays out of scope here. * fix(sub): keep Incy per-app list entries separate on the wire The Incy settings textarea takes one package per line, as Incy documents for per-app-proxy-list, but the header path ran the value through sanitizeHeaderValue, which deletes CR/LF. "com.google.chrome\norg.telegram.messenger" reached the client as the single bogus package "com.google.chromeorg.telegram.messenger", so per-app split tunnelling silently matched no app. Join comma- or line-separated entries as CSV instead. Also drop three tests that could not fail: TestIncyExcludesHappOnlyHeaders (ApplyIncyHeaders has no path that emits Happ headers, and the non-Happ UA gate is already pinned by TestApplyHappHeaders_Gating) and two UI tests that only asserted updateSetting received the key the JSX passes it. --------- Co-authored-by: DIMFLIX <dimflix@users.noreply.github.com> Co-authored-by: MHSanaei <ho3ein.sanaei@gmail.com>
This commit is contained in:
@@ -1670,7 +1670,76 @@
|
||||
"discordNotifyTimeDesc": "Как часто бот Discord отправляет периодические отчёты. Выберите готовый интервал или «Произвольный», чтобы ввести выражение crontab.",
|
||||
"discordNotifyBackup": "Резервное копирование базы данных",
|
||||
"discordNotifyBackupDesc": "Отправлять уведомление с файлом резервной копии базы данных",
|
||||
"discordEventBusNotifyDesc": "Выберите события для Discord уведомлений"
|
||||
"discordEventBusNotifyDesc": "Выберите события для Discord уведомлений",
|
||||
"subIncyAppAutoDetect": "Автоопределение заголовков Incy",
|
||||
"subIncyAppAutoDetectDesc": "Отправлять заголовки Incy, когда User-Agent клиента — INCY.",
|
||||
"subIncyNotSet": "Не задано",
|
||||
"subIncyOn": "Вкл",
|
||||
"subIncyOff": "Выкл",
|
||||
"subIncyGroupApp": "Приложение",
|
||||
"subIncyProfileDescription": "Описание профиля",
|
||||
"subIncyProfileDescriptionDesc": "Отдельное описание подписки. Не-ASCII текст уходит в base64.",
|
||||
"subIncySortOrder": "Порядок серверов",
|
||||
"subIncySortOrderDesc": "Для этой подписки на iOS/Android, глобально на десктопе.",
|
||||
"subIncySortNone": "Как в подписке",
|
||||
"subIncySortPing": "По пингу",
|
||||
"subIncySortName": "По имени",
|
||||
"subIncySupportEmail": "Email поддержки",
|
||||
"subIncySupportEmailDesc": "Добавляет кнопку «Email» в карточку подписки.",
|
||||
"subIncyAnnounceUrl": "Ссылка объявления",
|
||||
"subIncyAnnounceUrlDesc": "Куда ведёт объявление на главном экране.",
|
||||
"subIncyPremiumUrl": "Ссылка Premium",
|
||||
"subIncyPremiumUrlDesc": "Кнопка Premium в карточке; приоритетна и для кнопки баннера.",
|
||||
"subIncyGroupBanners": "Баннеры",
|
||||
"subIncyBannerText": "Текст баннера",
|
||||
"subIncyBannerTextDesc": "Переопределяет текст баннера. Только для premium-провайдеров.",
|
||||
"subIncyBannerButtonText": "Текст кнопки баннера",
|
||||
"subIncyBannerButtonTextDesc": "Подпись кнопки баннера. Пустое значение скрывает кнопку.",
|
||||
"subIncyBannerButtonUrl": "Ссылка кнопки баннера",
|
||||
"subIncyBannerButtonUrlDesc": "URL кнопки баннера.",
|
||||
"subIncyBannerBgColor": "Фон баннера",
|
||||
"subIncyBannerBgColorDesc": "HEX-цвет, например #E53E3E.",
|
||||
"subIncyBannerButtonColor": "Цвет кнопки баннера",
|
||||
"subIncyBannerButtonColorDesc": "HEX-цвет, например #38A169.",
|
||||
"subIncyGroupPrivacy": "Приватность",
|
||||
"subIncyHideUrl": "Скрыть URL подписки",
|
||||
"subIncyHideUrlDesc": "Скрывает URL из «Поделиться», копирования, QR и бэкапов.",
|
||||
"subIncyHideCheck": "Скрыть кнопку проверки",
|
||||
"subIncyHideCheckDesc": "Убирает кнопку проверки соединения с главного экрана.",
|
||||
"subIncyNoLimit": "Режим No-Limit (iOS)",
|
||||
"subIncyNoLimitDesc": "Экономный по памяти режим, чтобы туннель жил в пределах 50 МБ на iOS.",
|
||||
"subIncyPerAppEnable": "Режим per-app (Android)",
|
||||
"subIncyPerAppEnableDesc": "Включает split-туннель по приложениям. «Выкл» перебивает выбор юзера.",
|
||||
"subIncyPerAppMode": "Логика per-app",
|
||||
"subIncyPerAppModeDesc": "proxy — через VPN только выбранные приложения, bypass — наоборот.",
|
||||
"subIncyPerAppModeProxy": "Только выбранные",
|
||||
"subIncyPerAppModeBypass": "Выбранные в обход",
|
||||
"subIncyPerAppList": "Список приложений",
|
||||
"subIncyPerAppListDesc": "Пакеты через запятую или с новой строки, либо URL на текстовый файл.",
|
||||
"subIncyGroupNetwork": "Сеть",
|
||||
"subIncyFragmentationEnable": "Фрагментация",
|
||||
"subIncyFragmentationEnableDesc": "Включает фрагментацию TCP, перебивая глобальную настройку.",
|
||||
"subIncyFragmentLength": "Длина фрагмента",
|
||||
"subIncyFragmentLengthDesc": "Диапазон в байтах, например 10-30.",
|
||||
"subIncyFragmentInterval": "Интервал фрагментации",
|
||||
"subIncyFragmentIntervalDesc": "Диапазон в миллисекундах, например 20-40.",
|
||||
"subIncyFragmentPackets": "Пакеты фрагментации",
|
||||
"subIncyFragmentPacketsDesc": "Какие TCP-пакеты фрагментировать: tlshello, 1-3, 1 или all.",
|
||||
"subIncyNoisesEnable": "Шумовые пакеты",
|
||||
"subIncyNoisesEnableDesc": "Шлёт случайный UDP-шум перед хендшейком VPN.",
|
||||
"subIncyNoisesType": "Тип шума",
|
||||
"subIncyNoisesTypeDesc": "rand, str или hex.",
|
||||
"subIncyNoisesPacket": "Содержимое шумового пакета",
|
||||
"subIncyNoisesPacketDesc": "Полезная нагрузка; для rand — диапазон длины, например 10-20.",
|
||||
"subIncyNoisesDelay": "Задержка шума",
|
||||
"subIncyNoisesDelayDesc": "Диапазон задержки в миллисекундах, например 10-50.",
|
||||
"subIncyResolveEnable": "Резолв адреса сервера (DoH)",
|
||||
"subIncyResolveEnableDesc": "Резолвит адрес сервера через DoH до подключения.",
|
||||
"subIncyResolveDnsDomain": "DoH-эндпоинт",
|
||||
"subIncyResolveDnsDomainDesc": "URL DoH-сервера, обычно заканчивается на /dns-query.",
|
||||
"subIncyResolveDnsIp": "IP DoH-сервера",
|
||||
"subIncyResolveDnsIpDesc": "IP DoH-сервера, нужен для bootstrap.",
|
||||
"subIncyGroupRouting": "Маршрутизация"
|
||||
},
|
||||
"xray": {
|
||||
"importRules": "Импорт правил",
|
||||
|
||||
Reference in New Issue
Block a user