From 747ed623ab534e2573e9ab2aedb3c3abb1af025c Mon Sep 17 00:00:00 2001 From: Dmitriy Petrov Date: Wed, 27 May 2026 08:33:56 +0300 Subject: [PATCH] Skip credential preflight in manual-full mode --- .../skills/lemana-vpn-sso-autofill/SKILL.md | 2 +- README.md | 4 +- bin/vpn-lemanapro.sh | 11 ++++-- tests/smoke.sh | 39 ++++++++++++++++++- 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/.agents/skills/lemana-vpn-sso-autofill/SKILL.md b/.agents/skills/lemana-vpn-sso-autofill/SKILL.md index d860f10..f590c6e 100644 --- a/.agents/skills/lemana-vpn-sso-autofill/SKILL.md +++ b/.agents/skills/lemana-vpn-sso-autofill/SKILL.md @@ -48,7 +48,7 @@ vpn-lemanapro.sh --patch-only - `vpn` / `vpn-auto`: hidden browser, autofill, auto-submit. - `vpn --manual` / `vpn-manual`: visible browser, autofill, no submit. -- `vpn --manual-full` / `vpn-manual-full`: visible browser, no autofill, no submit. +- `vpn --manual-full` / `vpn-manual-full`: visible browser, no autofill, no submit, and no saved LDAP/TOTP preflight. - `vpn-debug`: visible browser and raw logs. When diagnosing SSO, use manual mode first. Do not repeatedly start automatic mode if a connection attempt is already in progress. diff --git a/README.md b/README.md index 5823d5c..c8aef01 100644 --- a/README.md +++ b/README.md @@ -370,7 +370,7 @@ open ~/Applications/LemanaVPN.app # открыть Swift-приложение - `auto` — режим по умолчанию. Браузер скрытый, LDAP-пароль и TOTP берутся из Bitwarden/Keychain, Keycloak форма заполняется и отправляется автоматически. - `manual` — браузер видимый, LDAP-пароль и TOTP берутся из Bitwarden/Keychain и подставляются в поля, но кнопки входа не нажимаются. Нажимаешь сам после проверки формы. -- `manual-full` — браузер видимый, auto-fill отключён полностью: поля Keycloak заполняешь и отправляешь сам. +- `manual-full` — браузер видимый, auto-fill отключён полностью, проверки сохранённых LDAP/TOTP credentials пропускаются: поля Keycloak заполняешь и отправляешь сам. - `--manual-sso` оставлен как совместимый alias для `--manual`. - `--manual-no-autofill` оставлен как совместимый alias для `--manual-full`. @@ -512,6 +512,8 @@ vpn --manual vpn --manual-full ``` +Этот режим не требует заранее сохранённого LDAP username/password/TOTP и не запускает Bitwarden/Keychain preflight. + Если установка падает на строке `install: /usr/local/sbin/...: No such file or directory`, значит на машине не было `/usr/local/sbin`. Актуальный `install.sh` создаёт эту директорию сам; достаточно повторить установку свежей командой `curl`. CLI перед подключением патчит `openconnect-lite`: diff --git a/bin/vpn-lemanapro.sh b/bin/vpn-lemanapro.sh index 2b25d88..86f0852 100755 --- a/bin/vpn-lemanapro.sh +++ b/bin/vpn-lemanapro.sh @@ -1027,9 +1027,14 @@ else printf '{"event":"modules","modules":%s}\n' "$(_module_status_json)" fi -_ensure_username -_sync_credentials -_ensure_keychain_credentials +if [[ "$CONNECT_MODE" == "manual-full" ]]; then + _emit '{"event":"credential_source","source":"manual-full","message":"Manual-full mode skips saved credential checks"}' \ + "Manual-full mode: skipping saved credential checks." +else + _ensure_username + _sync_credentials + _ensure_keychain_credentials +fi _patch_oc _emit '{"event":"connecting"}' "Connecting to VPN (lemanapro)..." diff --git a/tests/smoke.sh b/tests/smoke.sh index 60fec9b..9cda20e 100755 --- a/tests/smoke.sh +++ b/tests/smoke.sh @@ -298,6 +298,43 @@ exit 0 SH chmod +x "$fake_oc_bin" +fake_missing_keychain_bin="$TMP_DIR/fake-missing-keychain-bin" +mkdir -p "$fake_missing_keychain_bin" +cat > "$fake_missing_keychain_bin/security" <<'SH' +#!/bin/sh +exit 1 +SH +chmod +x "$fake_missing_keychain_bin/security" + +manual_full_no_credentials_home="$TMP_DIR/manual-full-no-credentials-home" +manual_full_no_credentials_capture="$TMP_DIR/manual-full-no-credentials-capture" +mkdir -p "$manual_full_no_credentials_home" +manual_full_no_credentials_output="$( + HOME="$manual_full_no_credentials_home" \ + PATH="$fake_missing_keychain_bin:$PATH" \ + LEMANA_VPN_CONFIG_DIR="$manual_full_no_credentials_home/.config/lemana-vpn" \ + OPENCONNECT_LITE_CONFIG_DIR="$manual_full_no_credentials_home/.config/openconnect-lite" \ + LEMANA_VPN_CREDENTIAL_SOURCE=keychain \ + LEMANA_VPN_OC_BIN="$fake_oc_bin" \ + LEMANA_VPN_OC_PYTHON=python3 \ + LEMANA_VPN_WEBENGINE_PROCESS="$fake_webengine" \ + LEMANA_VPN_AUTHENTICATOR="$fake_authenticator" \ + LEMANA_VPN_PATCH_BACKUP_DIR="$TMP_DIR/manual-full-no-credentials-patch-backups" \ + LEMANA_VPN_DNS_CLEANUP="$TMP_DIR/no-dns-cleanup" \ + LEMANA_VPN_CONNECT_LOG="$TMP_DIR/manual-full-no-credentials.log" \ + LEMANA_VPN_CAPTURE_LAUNCH="$manual_full_no_credentials_capture" \ + bash "$ROOT/bin/vpn-lemanapro.sh" --manual-full --json +)" + +printf '%s\n' "$manual_full_no_credentials_output" | grep -q '"event":"manual_sso","autofill":false,"submit":false' +if printf '%s\n' "$manual_full_no_credentials_output" | grep -Eq '"event":"(username_required|keychain_required)"'; then + echo "manual-full should not require saved username or Keychain credentials before opening the browser" >&2 + exit 1 +fi +grep -q -- '--browser-display-mode shown' "$manual_full_no_credentials_capture" +grep -q '^autofill_disable=1$' "$manual_full_no_credentials_capture" +grep -q '^autofill_click=0$' "$manual_full_no_credentials_capture" + if command -v expect >/dev/null 2>&1; then first_username_home="$TMP_DIR/first-username-home" mkdir -p "$first_username_home/.config/lemana-vpn" "$first_username_home/.config/openconnect-lite" @@ -329,7 +366,7 @@ spawn env \ LEMANA_VPN_DNS_CLEANUP=$env(TMP_DIR)/no-dns-cleanup \ LEMANA_VPN_CONNECT_LOG=$env(TMP_DIR)/first-username.log \ LEMANA_VPN_CAPTURE_LAUNCH=$env(MANUAL_FULL_CAPTURE) \ - bash $env(ROOT)/bin/vpn-lemanapro.sh --manual-full --json + bash $env(ROOT)/bin/vpn-lemanapro.sh --manual --json expect "Corporate LDAP username:" send "lemana-first-user\r" expect eof