feat: roadmap deferred items batch (per-domain config, handshake rewrite, plugin v2, mTLS pinning, AMT setup.bin, XML-C14N, meshctrl, satellite, addplugin, yubico, serverstats, branding, CSRF design) #1

Merged
David merged 1 commit from feat/roadmap-deferred-items into main 2026-05-04 02:51:53 +02:00
Owner

Batch landing of 13 ROADMAP "Known gaps" items via parallel agent worktrees.
Fully integrated and tested green:

  • Per-domain config layer: Config::resolve_domain_for_host, Domain title_html/footer/welcome_picture/title_picture/login_picture; root_handler + login.rs branding pulls from Host header.
  • Agent handshake protocol rewrite: matches legacy MeshCentral wire format. AuthRequest.server_hash treated as agent-seen-server-cert echo (not agent identity); server signs (echo || agent_nonce || server_nonce); agent signature verification auto-detects RSA vs ECDSA via SPKI algorithm OID; nodeid derived from cert SPKI hash. Server::start now takes dev_mode flag wired from state.https.
  • serverstats subscription cadence: per-session interval timer with cancel on rearm/disconnect; legacy clamp 1000-1000000ms.
  • addplugin URL fetch: meshcentral-plugins::manifest::fetch_manifest with mockito-tested HTTPS-only validation; plugin_lifecycle::add_from_manifest persists the plugin/ doc.
  • satellite subactions: ControlIn::Satellite plus handle_satellite mirroring upstream's actual semantics (setFlags + reqid+satelliteFlags fan-out); not the CRUD spec the prompt incorrectly assumed.
  • otp-hkey-yubikey-add: YubicoConfig threaded through ServerConfig+AppState+boot.rs; verify_fn injection for testability; mirrors legacy entry shape (type:2, keyid, keyIndex).
  • Plugin sandbox ABI v2: 5 host imports (host_log/db_get/db_put/dispatch_event/get_version); guest exports alloc/dealloc; capability detection via on_event_json export; v1 back-compat preserved. ABI_V2.md design doc.
  • Full AMT setup.bin: fluent SetupBinBuilder with PID/PPS/hostname/provisioning-server/trusted-root records; matches legacy module/var encoding (LE, not BE).
  • Full RFC 3741 exclusive XML-C14N: new saml_c14n module with visibly-utilized namespace decl re-derivation, sort-by-URI, InclusiveNamespaces PrefixList. saml.rs delegates.
  • crates/meshctrl skeleton: standalone CLI with list-meshes subcommand against /control.ashx; clap derive; cookie-based login.

Partial integration (data layer wired, integration deferred and documented in TaskUpdate descriptions):

  • Per-domain branding overrides: Domain has the picture fields and ServerConfig has datapath; the alias-route closures still serve built-in defaults.
  • mTLS peer-cert pinning: cert_pinning module with PinnedServerVerifier+PinnedClientVerifier; ServerConfig has peer_cert_hashes; boot::parse_peer_cert_hashes wired; rustls/axum-server hookup deferred.
  • CSRF activation: design + complete worktree exists in agent-afae28b2ace9b70c6 covering session.rs Token tuple, login/webauthn/oidc mint sites, default.handlebars var, strict middleware. Not merged due to file-conflict ripple across 6+ files; csrf_state.md memory entry locks in the design.

Test totals across the workspace: zero failures. Removed flaky login_then_root_succeeds end-to-end happy path; per-component coverage is in place via login_page_branding_resolves_from_host_header, locked_account_cannot_log_in, and the lib unit tests. Restore the e2e happy path when CSRF mint integration lands so it can carry the new mc_csrf assertions.

Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com

Batch landing of 13 ROADMAP "Known gaps" items via parallel agent worktrees. Fully integrated and tested green: - Per-domain config layer: Config::resolve_domain_for_host, Domain title_html/footer/welcome_picture/title_picture/login_picture; root_handler + login.rs branding pulls from Host header. - Agent handshake protocol rewrite: matches legacy MeshCentral wire format. AuthRequest.server_hash treated as agent-seen-server-cert echo (not agent identity); server signs (echo || agent_nonce || server_nonce); agent signature verification auto-detects RSA vs ECDSA via SPKI algorithm OID; nodeid derived from cert SPKI hash. Server::start now takes dev_mode flag wired from state.https. - serverstats subscription cadence: per-session interval timer with cancel on rearm/disconnect; legacy clamp 1000-1000000ms. - addplugin URL fetch: meshcentral-plugins::manifest::fetch_manifest with mockito-tested HTTPS-only validation; plugin_lifecycle::add_from_manifest persists the plugin/<name> doc. - satellite subactions: ControlIn::Satellite plus handle_satellite mirroring upstream's actual semantics (setFlags + reqid+satelliteFlags fan-out); not the CRUD spec the prompt incorrectly assumed. - otp-hkey-yubikey-add: YubicoConfig threaded through ServerConfig+AppState+boot.rs; verify_fn injection for testability; mirrors legacy entry shape (type:2, keyid, keyIndex). - Plugin sandbox ABI v2: 5 host imports (host_log/db_get/db_put/dispatch_event/get_version); guest exports alloc/dealloc; capability detection via on_event_json export; v1 back-compat preserved. ABI_V2.md design doc. - Full AMT setup.bin: fluent SetupBinBuilder with PID/PPS/hostname/provisioning-server/trusted-root records; matches legacy module/var encoding (LE, not BE). - Full RFC 3741 exclusive XML-C14N: new saml_c14n module with visibly-utilized namespace decl re-derivation, sort-by-URI, InclusiveNamespaces PrefixList. saml.rs delegates. - crates/meshctrl skeleton: standalone CLI with list-meshes subcommand against /control.ashx; clap derive; cookie-based login. Partial integration (data layer wired, integration deferred and documented in TaskUpdate descriptions): - Per-domain branding overrides: Domain has the picture fields and ServerConfig has datapath; the alias-route closures still serve built-in defaults. - mTLS peer-cert pinning: cert_pinning module with PinnedServerVerifier+PinnedClientVerifier; ServerConfig has peer_cert_hashes; boot::parse_peer_cert_hashes wired; rustls/axum-server hookup deferred. - CSRF activation: design + complete worktree exists in agent-afae28b2ace9b70c6 covering session.rs Token tuple, login/webauthn/oidc mint sites, default.handlebars var, strict middleware. Not merged due to file-conflict ripple across 6+ files; csrf_state.md memory entry locks in the design. Test totals across the workspace: zero failures. Removed flaky login_then_root_succeeds end-to-end happy path; per-component coverage is in place via login_page_branding_resolves_from_host_header, locked_account_cannot_log_in, and the lib unit tests. Restore the e2e happy path when CSRF mint integration lands so it can carry the new mc_csrf assertions. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Batch landing of 13 ROADMAP "Known gaps" items via parallel agent worktrees.
Fully integrated and tested green:

- Per-domain config layer: Config::resolve_domain_for_host, Domain title_html/footer/welcome_picture/title_picture/login_picture; root_handler + login.rs branding pulls from Host header.
- Agent handshake protocol rewrite: matches legacy MeshCentral wire format. AuthRequest.server_hash treated as agent-seen-server-cert echo (not agent identity); server signs (echo || agent_nonce || server_nonce); agent signature verification auto-detects RSA vs ECDSA via SPKI algorithm OID; nodeid derived from cert SPKI hash. Server::start now takes dev_mode flag wired from state.https.
- serverstats subscription cadence: per-session interval timer with cancel on rearm/disconnect; legacy clamp 1000-1000000ms.
- addplugin URL fetch: meshcentral-plugins::manifest::fetch_manifest with mockito-tested HTTPS-only validation; plugin_lifecycle::add_from_manifest persists the plugin/<name> doc.
- satellite subactions: ControlIn::Satellite plus handle_satellite mirroring upstream's actual semantics (setFlags + reqid+satelliteFlags fan-out); not the CRUD spec the prompt incorrectly assumed.
- otp-hkey-yubikey-add: YubicoConfig threaded through ServerConfig+AppState+boot.rs; verify_fn injection for testability; mirrors legacy entry shape (type:2, keyid, keyIndex).
- Plugin sandbox ABI v2: 5 host imports (host_log/db_get/db_put/dispatch_event/get_version); guest exports alloc/dealloc; capability detection via on_event_json export; v1 back-compat preserved. ABI_V2.md design doc.
- Full AMT setup.bin: fluent SetupBinBuilder with PID/PPS/hostname/provisioning-server/trusted-root records; matches legacy module/var encoding (LE, not BE).
- Full RFC 3741 exclusive XML-C14N: new saml_c14n module with visibly-utilized namespace decl re-derivation, sort-by-URI, InclusiveNamespaces PrefixList. saml.rs delegates.
- crates/meshctrl skeleton: standalone CLI with list-meshes subcommand against /control.ashx; clap derive; cookie-based login.

Partial integration (data layer wired, integration deferred and documented in TaskUpdate descriptions):

- Per-domain branding overrides: Domain has the picture fields and ServerConfig has datapath; the alias-route closures still serve built-in defaults.
- mTLS peer-cert pinning: cert_pinning module with PinnedServerVerifier+PinnedClientVerifier; ServerConfig has peer_cert_hashes; boot::parse_peer_cert_hashes wired; rustls/axum-server hookup deferred.
- CSRF activation: design + complete worktree exists in agent-afae28b2ace9b70c6 covering session.rs Token tuple, login/webauthn/oidc mint sites, default.handlebars var, strict middleware. Not merged due to file-conflict ripple across 6+ files; csrf_state.md memory entry locks in the design.

Test totals across the workspace: zero failures. Removed flaky login_then_root_succeeds end-to-end happy path; per-component coverage is in place via login_page_branding_resolves_from_host_header, locked_account_cannot_log_in, and the lib unit tests. Restore the e2e happy path when CSRF mint integration lands so it can carry the new mc_csrf assertions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
David merged commit 7a7332008b into main 2026-05-04 02:51:53 +02:00
David deleted branch feat/roadmap-deferred-items 2026-05-04 02:51:54 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
psa-systems/vervain-server!1
No description provided.