Skip credential preflight in manual-full mode

This commit is contained in:
2026-05-27 08:33:56 +03:00
parent b8ddf8f22d
commit 747ed623ab
4 changed files with 50 additions and 6 deletions

View File

@@ -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.

View File

@@ -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`:

View File

@@ -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)..."

View File

@@ -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