refactor(xray-proxy): срезана accidental-сложность CLI, тестов и спеки

- Зачем:
  - CLI и спека были переусложнены относительно принятой модели угроз
    (один пользователь, доверенная машина): лишняя ось версий Xray и
    защита от входов, которые не возникают при ручном редактировании.
- Что:
  - убрана поддержка Xray 25.12.8 — поддерживается только 26.3.27;
    allowInsecure валидируется, но никогда не эмитится в JSON.
  - удалена проверка владения сокетом через /proc/net/tcp; идентичность
    процесса и сверка адрес/порт со state сохранены.
  - валидация INI/профиля/адреса/query сведена к отказам на реальные
    опечатки; scoped IPv6 отклоняется одинаково на Python 3.8 и 3.9+.
  - удалены fsync/O_EXCL-церемония, SIGALRM-таймер, zombie-инспекция,
    мёртвый отпечаток профиля и двойной разбор extra/alpn.
  - shell.bash принимает вывод env без ре-валидации, сохранив атомарность;
    спека и issue 01–05 приведены к новому объёму (тикет 06, леджер).
- Проверка:
  - python3 -m unittest discover -s tests — 34 теста OK.
  - bash tests/test_proxy_launchers.sh — 8 проверок PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
ddadminandClaude Fable 5 committed 2026-07-20 04:13:54 -04:00
1 parent 71e16a795a
commit 98bfd6338a
12 files changed
+384 -508

No files matched your search

@@ -118,11 +118,10 @@ dotfiles `.bash_custom` подключает их двумя независим
`xray-proxy env` сначала выполняет ту же проверку доступности, что и `run`, а
затем печатает восемь строк `KEY=value`: HTTP, HTTPS, ALL и NO_PROXY в верхнем
и нижнем регистре. Переносы строк и NUL в значениях запрещены. `shell.bash`
сначала целиком получает успешный ответ, затем разбирает строки по первому `=`,
проверяет точный белый список ключей и отсутствие повторов, и лишь после этого
экспортирует значения через `printf -v`. `eval` не используется, частичного
изменения окружения при ошибке нет.
и нижнем регистре. `shell.bash` сначала целиком получает успешный ответ, затем
разбирает строки по первому `=`, принимает только известные ключи и лишь после
полной проверки экспортирует полученные значения через `printf -v`. `eval` не
используется, частичного изменения окружения при ошибке нет.
У `env` stdout зарезервирован только для восьми машинно-читаемых строк.
Предупреждения и ошибки идут в stderr; обычная безопасная сводка этой командой
@@ -245,8 +244,7 @@ Xray. Параметры query не зависят от порядка, но н
транспорт, защиту, SNI, ALPN, Host, наличие и длину пути, fingerprint и локальный
порт. XHTTP `path` может содержать tenant ID или bearer-подобный токен, поэтому
его содержимое никогда не печатается. Обычный режим не выводит подробный журнал
Xray: `-v` добавляет информационные сообщения, а `--debug` включает подробную
диагностику. UUID, REALITY password/public key, short ID и другие чувствительные
Xray. UUID, REALITY password/public key, short ID и другие чувствительные
значения обозначаются без фрагментов исходного значения.
В создаваемом JSON журнал доступа отключён, а уровень ошибок по умолчанию —
`warning`.
@@ -264,14 +262,6 @@ Hiddify Manager может добавлять `allowInsecure=true` и `insecure=
Соединение после этого может успешно заработать или завершиться ошибкой
сертификата; отдельного раннего отказа нет.
При фактически выбранном Xray 25.12.8 преобразователь сохраняет
`allowInsecure=true` только для согласованного истинного legacy-значения и
предупреждает одновременно об отключённой проверке сертификата и об
использовании старой совместимой версии. Ложное или отсутствующее значение не
включает поле. Автоматический откат с 26.x на 25.12.8 запрещён. Новые
`pcs`/`vcn` в режиме 25.12.8 отклоняются как несовместимые вместо попытки
угадать их старое представление.
### Установка Xray
`xray-proxy install` — отдельная явная операция. Она устанавливает Xray в
@@ -294,18 +284,12 @@ Hiddify Manager может добавлять `allowInsecure=true` и `insecure=
Перед созданием JSON CLI разрешает первый `xray` из `PATH` до одного пути и
запускает этим файлом `xray version`. Первая строка должна начинаться с точного
токена `Xray VERSION`, после полного токена версии допускается только конец
строки либо ASCII-пробел. Принимаются только версии 25.12.8 и 26.3.27; ведущий
строки либо ASCII-пробел. Принимается только версия 26.3.27; ведущий
мусор, похожий более длинный токен, пустой, неверный, завершившийся ошибкой или
содержащий другую версию вывод запрещает запуск. Тот же разрешённый файл
используется для `run -test` и основного процесса. Версия никогда не выводится
из содержимого VLESS-ссылки.
Xray 25.12.8 — документированный запасной вариант только для старых Hiddify-
профилей, которым действительно требуется `allowInsecure=true`. Это последняя
версия ветки 25.x, где поле применяется без календарного запрета:
[релиз 25.12.8](https://github.com/XTLS/Xray-core/releases/tag/v25.12.8) и
[реализация TLS 25.12.8](https://github.com/XTLS/Xray-core/blob/v25.12.8/infra/conf/transport_internet.go).
`start` никогда не скачивает бинарник. Если `xray` отсутствует в `PATH`, команда
завершается с подсказкой выполнить `xray-proxy install`.
@@ -324,8 +308,8 @@ CLI предоставляет `install`, `start`, `stop`, `status`, `env` и `r
Супервизор владеет блокировкой, дочерним процессом и служебным каталогом
`~/.local/state/xray-proxy/`. Файл состояния содержит PID и время старта обоих
процессов, путь к бинарнику, порт и безопасный отпечаток профиля, но не VLESS-
ссылку и не её секреты. `status` и `stop` сверяют PID со временем старта и
процессов, путь к бинарнику и порт, но не VLESS-ссылку и не её секреты. `status`
и `stop` сверяют PID со временем старта и
ожидаемым исполняемым файлом, поэтому повторное использование PID не считается
управляемым процессом. `stop` посылает SIGTERM супервизору, а тот завершает Xray
и очищает состояние. Если супервизор аварийно исчез, `stop` может завершить
@@ -402,10 +386,9 @@ README репозитория только кратко описывает по
разделяет обязательную проверку процесса и необязательную внешнюю диагностику.
- VLESS-ссылка содержит чувствительные данные. CLI сокращает секреты в выводе,
не журналирует их и использует закрытые пользовательские файлы.
- Устаревшие Hiddify-поля `allowInsecure` и `insecure` неоднозначны. Xray 26.x
игнорирует их на уровне преобразователя и проверяет сертификат; Xray 25.12.8
сохраняет их только после явного выбора версии. Оба пути сопровождаются
предупреждением.
- Устаревшие Hiddify-поля `allowInsecure` и `insecure` неоднозначны. Они не
переносятся в Xray 26.3.27, сертификат проверяется обычным способом, а
истинное значение сопровождается предупреждением.
- Старые дистрибутивы могут иметь Python ниже 3.8. CLI проверяет версию до
основной работы и сообщает обнаруженную и требуемую версии.
- `NO_PROXY` реализуется программами неодинаково. README рекомендует точные IP
@@ -423,11 +406,10 @@ README репозитория только кратко описывает по
`headerType=none`, `allowInsecure` и `insecure`.
- Неподдерживаемые транспорт, защита, отсутствующие обязательные поля и любой
неизвестный query-параметр дают понятный отказ до запуска Xray.
- Сгенерированный JSON проходит `xray run -test` отдельно на Xray 26.3.27 и
25.12.8 для заявленных совместимыми сочетаний. Интеграционная проверка каждой
версии подтверждает, что один локальный вход принимает HTTP и SOCKS.
- Тесты отдельно проверяют современное удаление устаревших insecure-полей и их
сохранение для явно выбранного Xray 25.12.8.
- Сгенерированный JSON проходит `xray run -test` на Xray 26.3.27 для заявленных
сочетаний. Интеграционная проверка подтверждает, что один локальный вход
принимает HTTP и SOCKS.
- Тесты отдельно проверяют удаление устаревших insecure-полей.
- Тесты подтверждают сокращение секретов и отсутствие полной VLESS-ссылки в
stdout, stderr, служебных файлах и аргументах дочернего процесса.
- Установка проверяется на корректной и повреждённой SHA-256 без записи вне
@@ -440,13 +422,14 @@ README репозитория только кратко описывает по
- `run` сохраняет аргументы и код возврата, не оставляет proxy-переменные в
родительской Bash-сессии и не запускает команду при недоступном прокси.
- `env` не печатает частичный результат при ошибке, а `shell.bash` отклоняет
неизвестные и повторные ключи без `eval` и без частичного экспорта.
неизвестные строки без `eval` и без частичного экспорта.
- Регрессионные Bash-тесты подтверждают прежнее поведение Hiddify при отсутствии
машинного конфига, оба регистра proxy-переменных, настраиваемый `NO_PROXY` и
отсутствие автоматического запроса внешнего IP в `proxy_on`/`proxy_off`.
- Ручная проверка выполняется минимум на Ubuntu с Python 3.10 и на одной целевой
удалённой системе; отдельным пунктом проверяется доступная версия Python в
РЕД ОС перед заявлением её поддержки.
удалённой системе. РЕД ОС, Astra Linux и Alt Linux проверяются по мере
доступности: недоступная среда явно записывается как неподтверждённая, а
поддержка заявляется только после проверки версии Python и полного прогона.
## Влияние на документацию
@@ -458,8 +441,7 @@ README репозитория только кратко описывает по
- создание машинного INI из шаблона и отдельного файла VLESS-ссылки;
- команды управления, `proxy_on/off`, `pclaude/pcodex`;
- настройка `NO_PROXY`, ограничения CIDR и диагностика;
- поддерживаемые семейства VLESS, современную проверку сертификата и явный
запасной вариант Xray 25.12.8 для `allowInsecure`;
- поддерживаемые семейства VLESS и современную проверку сертификата;
- отсутствие systemd, автозапуска и автоматического перехода между прокси.
Корневой README получает только короткий обзор, пример подключения пакета и