f90d319eeb
jump-secrets.js's ldap.url was 'ldap://sso-manager:389' with tlsOptions set. ldapts treats a non-empty tlsOptions as "use implicit TLS" regardless of URL scheme, so every LDAP connection from jump-host opened a raw TLS handshake against sso-manager's plaintext-LDAP port — slapd dropped the connection before any LDAP message parsed (visible in slapd.log as "connection lost" right after ACCEPT, no BIND ever logged). Every SSH login failed with a generic "Permission denied" for any account, any password — indistinguishable from a wrong credential. Root-caused by building a local theta-env stack, restarting jump-host with edited config, and calling userLdap.getUser/checkPassword directly inside the container: got "Client network socket disconnected before secure TLS connection was established" instead of a vague auth failure. Switching to ldaps://sso-manager:636 (already exposed by the same container, already what tlsOptions was meant for) fixes it — verified getUser/checkPassword succeed and a real SSH login authenticates. Companion defensive fix: simpleworkjs/ldap#1 (rejects this exact ldap://+tlsOptions combination going forward, for proxy/sso too). Existing deployments must edit their own ./config/jump-secrets.js (this template only affects fresh bootstraps) — see the PR description. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>