feat(site): multi-site join server endpoints + persisted site role + emoji fix
Server endpoints for joining a spoke to a master directory (MULTI_SITE_SPEC.md).
This pass is server-only; setup.sh wiring and the UI are the next layer.
- Site join keys (SiteJoinKey model, stj_ prefix): mint/revoke/delete/list,
hashed at rest, shown once — the same model as agent join keys.
- POST /api/site/export (master, Bearer stj_ key, no admin session): returns the
local LDAP tree (slapcat LDIF) + resource catalog + siteSlug + baseDn.
- POST /api/site/join (spoke, admin): { masterUrl, joinKey } pulls the master
export, imports resources (upsert by slug) + LDAP (ldapadd -c), and persists
the spoke role. Refused if already a spoke.
- Persisted site role: utils/site_config.js keeps isMaster/masterUrl/siteSlug in
/config/site.json (env seeds defaults); site-status/site-promote now use it.
- Unit tests (site_join, site_config) with in-memory stubs, wired into npm test.
- docs/site-join.md + docs router entry.
- Repairs the corrupted multi-site emojis (crown/bolt) in directory.ejs.
- .gitguardian.yml ignores the generic-password false positive on reading the
LDAP bind credential from runtime config (never a hardcoded secret).
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
# GitGuardian configuration (ggshield / GitGuardian GH checks).
|
||||
#
|
||||
# The generic-password detector false-positives on LDAP admin bind credentials
|
||||
# being READ from runtime config (sso-secrets.js / /config/site.json) — e.g.
|
||||
# `const x = conf.ldap && conf.ldap.bindPassword` in the multi-site join flow.
|
||||
# That is the correct pattern (never a hardcoded secret); ignore the variable
|
||||
# reference, not the actual value.
|
||||
version: 2
|
||||
ignore:
|
||||
- name: generic-password
|
||||
match: |
|
||||
conf\.ldap\s*&&\s*conf\.ldap\.bindPassword
|
||||
Reference in New Issue
Block a user