aa3b3ed515
The web management UI was a bespoke minimal theme with LDAP-bind login.
Rebuild it to match the SSO Manager and Proxy — same stack, same look/feel,
same auth model. The SSH bridge, audit, metrics, and access logic are
unchanged; this is purely the web layer.
Frontend (mirrors proxy/sso):
- Express + EJS with the shared top.ejs/bottom.ejs shell, Bootstrap 5,
jQuery, jq-repeat, FontAwesome, Socket.IO, and the shared app-base.js /
val.js client framework (copied verbatim). Vendor libs served from
node_modules via /static-modules; app assets via /static.
- Dashboard / Sessions / Audit pages render in the common look/feel,
loading data through the authenticated /api/* endpoints.
Auth (mirrors proxy):
- OIDC against the SSO (utils/oidc.js + routes/auth.js + models/oidc_state)
plus a local anti-lockout admin (models/user_redis.js, bootstrapped from
auth.adminUsers[0] / auth.localAdminPass). AuthToken sessions carry the
group snapshot; middleware gates the data API on adminGroups or the local
admin. New config: oidc{} + auth.adminUsers/localAdminPass.
- /api/user/me drives the client login state; "Log in with SSO" hidden when
oidc.enabled is false.
Verified end to end: local admin login -> token -> /api/user/me isAdmin,
metrics/sessions/audit 200 with token / 401 without / 401 bad password;
static + page shells serve; 26 tests green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.9 KiB
2.9 KiB
Changelog
All notable changes to this project are documented here. Format loosely
follows Keep a Changelog; versions
correspond to git tags (vX.Y.Z) and nodejs/package.json's version.
[1.1.0] - 2026-07-23
Changed
- Rebuilt the web UI on the shared theta42 app stack so it looks and behaves like the SSO Manager and Proxy: Express + EJS with the same
top.ejs/bottom.ejsshell, Bootstrap 5, jQuery, jq-repeat, FontAwesome, the sharedapp-base.jsclient framework, and Socket.IO — replacing the bespoke minimal theme. Dashboard, Sessions, and Audit pages now render in the common look/feel. - Web-UI auth is now OIDC + a local anti-lockout admin (the proxy's model), replacing the direct LDAP-bind login. Normal users log in through the SSO ("Log in with SSO"); a local
auth.adminUsersaccount (bootstrapped on first boot, password fromauth.localAdminPass) still works if the SSO is unreachable. Admin access is gated byauth.adminGroupsor the local admin account. New config:oidcblock +auth.adminUsers/localAdminPass. Note: the SSH bridge and its own LDAP auth are unchanged — this only affects the web management UI.
[1.0.1] - 2026-07-23
Fixed
- Test scripts use shell-expanded globs and CI provides a redis service, so
npm testruns green on the Node 20/22 CI runners (thenode --test**glob and the redis-backed models only worked locally before). No runtime change.
[1.0.0] - 2026-07-23
Added
- Initial release. An SSH jump host for the theta42 stack:
- Username-grammar routing:
ssh {uid}_-_{target}@jumphostbridges straight to the downstream host (target= a directory host slug, bare hostname, or IP). Shell, exec, and the SFTP subsystem all pass through, so WinSCP/sftpwork. - Interactive TUI picker: plain
ssh {uid}@jumphostlists the hosts the user can reach (from the SSO directory) and bridges to the chosen one. - LDAP auth of the inbound user (publickey against the user's
sshPublicKey, or password via LDAP bind — password policy is off/local/all). - Directory-driven access: reachable hosts are the union of the user's
LDAP groups × the SSO directory (
/api/discovery/resources?group=). - Per-user key injection: the jump host appends its own public key to the
user's
sshPublicKeyon first use, then connects downstream as that user (downstream hosts already serve LDAP keys via ldap-client's AuthorizedKeysCommand). - Web UI + HTTP API (
:3002) for auditing and metrics: active sessions, paged audit log, per-user/per-host counters. Admin login gated by LDAP group membership. - Audit logging of every connection attempt/session (user, target, method, result, bytes, duration, downstream host-key fingerprint).
- Packaged like theta42/proxy: idempotent
ops/install.sh+ systemd unit, all-in-one Docker image, standalonedocker-compose.yml.
- Username-grammar routing: