https://gitlab.synchro.net/main/sbbs/-/commit/cc8f3254781763bddaef82b3
Modified Files:
src/syncterm/ssh.c
Log Message:
syncterm: simplify SSH auth flow; PuTTY-style KBI password autofill
Replace the auth state machine in ssh_connect() with a flat, strongest-to-weakest order driven by the RFC 4252 "none" probe:
1. probe; if "none" was accepted we're done
2. publickey (if advertised)
3. password (if advertised — stored value first, then up to 3 prompts)
4. keyboard-interactive (if advertised)
Each method is gated on the server's advertised list, so users aren't
prompted for credentials the server would reject regardless (e.g. an
OpenSSH target with PasswordAuthentication=no no longer cycles three
dead password prompts before falling through to KBI).
Also fixes a latent bug in the SSHNA path that unconditionally set
auth_rc=0 on any non-error return from dssh_auth_get_methods, even
when the response was "methods available, none-auth not accepted".
In kbi_prompt_cb:
- Auto-fill the saved password when the server sends exactly the
literal prompt "Password: " (PuTTY-style: single prompt, echo off,
literal text match). This avoids burning credentials on 2FA
"Passcode:" prompts, GPG-style "Passphrase:" prompts, password-
change flows, or anything else dressed up to look password-like.
The fire-once latch ensures a wrong saved password doesn't loop;
subsequent prompts fall through to the user.
- Strip a trailing ':' from the server's prompt before passing it
to uifcinput(), since uifc.input always appends ':' itself and
"Password:" would otherwise render as "Password::".
Drops the speculative "Cryptlib mishandles failed ssh-ed25519 publickey
probe" gate — the comment was likely a debugging artifact, not a
verified server behavior, and gating production logic on an
unreproducible claim made the flow harder to reason about than the
risk justified.
Co-Authored-By: Claude Opus 4.7 (1M context) <
[email protected]>
---
■ Synchronet ■ Vertrauen ■ Home of Synchronet ■ [vert/cvs/bbs].synchro.net