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:
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 получает только короткий обзор, пример подключения пакета и
|
||||
|
||||
Reference in new issue
Block a user