From 95806be3ed2e02448e312b3e94e8baff3f3e656c Mon Sep 17 00:00:00 2001 From: andrey271192 <76248502+andrey271192@users.noreply.github.com> Date: Fri, 12 Jun 2026 12:34:18 +0300 Subject: [PATCH] fix: preserve wireguard key padding --- CHANGELOG.md | 4 +++- app.py | 31 ++++++++++++++++++++++++++++++- docs/TROUBLESHOOTING.md | 2 +- overlay/lib-core.sh | 7 ++++++- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c95c132..44f1e1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ phobos-update beta # или: phobos-update dev ## stable ### v1.2.8 +- **fix:** Android/iOS phone configs теперь восстанавливают потерянный `=` в WireGuard `PrivateKey/PublicKey/PresharedKey`. Это закрывает ошибку PhobosWG «Неправильная длина ключа в PublicKey». +- **fix:** `lib-core.sh` больше не теряет финальный `=` при чтении `server.env`, поэтому новые клиентские `.conf` получают полный `PublicKey`. - **fix:** Android PhobosWG больше не получает `PresharedKey = none` в phobos payload, из-за чего импорт мог падать с «Неправильная длина ключа в PublicKey». - **fix:** клиентский router package теперь содержит обязательные `lib-client.sh`, `install-obfuscator.sh`, `install-wireguard.sh` и дополнительные helper-скрипты из PCA repo, поэтому `wget .../init/TOKEN.sh | sh` больше не падает с `can't open './lib-client.sh'`. - **fix:** поле имени клиента больше не даёт ошибку в консоли Chrome из-за HTML `pattern`. @@ -57,7 +59,7 @@ phobos-update beta # или: phobos-update dev |--------|----------|---------| | 1.2.7 / 1.3.x | PhobosWG: «невозможно импортировать туннель» | `phobos://` дополняется `= none` для всех обязательных полей (`PresharedKey`) по спеке формата | | 1.2.8 / 1.3.x | Stable не показывал кнопку скачивания APK без локального файла | кнопка **PhobosWG (APK)** всегда доступна на Android-странице; `/download/apk` ведет на public stable release | -| 1.2.8 / 1.3.x | Android PhobosWG: «Неправильная длина ключа в PublicKey» | Android payload нормализован без `PresharedKey = none`, QR/link нужно открыть заново | +| 1.2.8 / 1.3.x | Android PhobosWG: «Неправильная длина ключа в PublicKey» | Android/iOS payload восстанавливает потерянный `=` в WireGuard ключах и не добавляет `PresharedKey = none`; QR/link нужно открыть заново | | 1.2.8 / 1.3.x | Router init: `can't open './lib-client.sh'` | обязательные router helper-скрипты добавлены в PCA overlay и managed update | | 1.2.8 / 1.3.x | Stable `/clients`: `lib-core.sh: No such file or directory`, `check_root/load_env: command not found` | `lib-core.sh` добавлен в public repo, installer и updater | | 1.2.8 / 1.3.x | Install `[6/9] PCA patches`: `curl: (23) Failure writing output to destination` | `fetch()` создаёт папку назначения перед `curl -o` | diff --git a/app.py b/app.py index 0d8b4a5..256e050 100644 --- a/app.py +++ b/app.py @@ -707,7 +707,10 @@ def build_phone_config(cid, mode="android"): pass out = [] for ln in wg.split("\n"): - out.append("Endpoint = %s:51820" % server_ip if ln.strip().startswith("Endpoint") else ln) + if ln.strip().startswith("Endpoint"): + out.append("Endpoint = %s:51820" % server_ip) + else: + out.append(_normalize_wg_key_line(ln)) return "\n".join(out) + "\n", None inst = "" if os.path.exists(instpath): @@ -746,6 +749,9 @@ def _prepare_phoboswg_payload(conf): key, value = ln.split("=", 1) k = key.strip().lower() v = value.strip() + if k in ("privatekey", "publickey", "presharedkey"): + ln = "%s = %s" % (key.strip(), _normalize_wg_key_value(v)) + v = _normalize_wg_key_value(v) if k == "presharedkey" and v.lower() in ("", "none"): continue if header.lower() == "[peer]" and k == "allowedips": @@ -771,6 +777,29 @@ def _prepare_phoboswg_payload(conf): return "\n".join(out).rstrip("\n") + "\n" +def _normalize_wg_key_line(line): + if "=" not in line: + return line + key, value = line.split("=", 1) + if key.strip().lower() not in ("privatekey", "publickey", "presharedkey"): + return line + return "%s = %s" % (key.strip(), _normalize_wg_key_value(value.strip())) + + +def _normalize_wg_key_value(value): + """Restore dropped base64 padding for WireGuard 32-byte keys.""" + value = (value or "").strip() + if not value or value.lower() == "none": + return value + alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" + if any(ch not in alphabet for ch in value): + return value + padded = value + ("=" * ((4 - len(value) % 4) % 4)) + if len(padded) == 44: + return padded + return value + + def _pad_conf_with_none(conf): """Legacy helper kept for old endpoints that may call it.""" return _prepare_phoboswg_payload(conf) diff --git a/docs/TROUBLESHOOTING.md b/docs/TROUBLESHOOTING.md index 5670309..ed01aa1 100644 --- a/docs/TROUBLESHOOTING.md +++ b/docs/TROUBLESHOOTING.md @@ -555,7 +555,7 @@ phobos-update stable ### Android PhobosWG: `Неправильная длина ключа в PublicKey` -Причина: старый phobos payload мог добавлять `PresharedKey = none` или отдавать старый QR/ссылку после обновления панели. PhobosWG воспринимает это как битый ключ. +Причина: старый phobos payload мог добавлять `PresharedKey = none`, отдавать старый QR/ссылку после обновления панели или терять финальный `=` в WireGuard `PublicKey`. PhobosWG воспринимает это как битый ключ. Решение: diff --git a/overlay/lib-core.sh b/overlay/lib-core.sh index 08c79f3..2f6eaff 100644 --- a/overlay/lib-core.sh +++ b/overlay/lib-core.sh @@ -25,7 +25,12 @@ check_root() { load_env() { if [ -f "$SERVER_ENV" ]; then - while IFS='=' read -r k v; do + while IFS= read -r line || [ -n "$line" ]; do + case "$line" in + ''|\#*) continue ;; + esac + k="${line%%=*}" + v="${line#*=}" case "$k" in ''|\#*) continue ;; esac