[DOCS] CONTEXT: connettori per-azienda implementati (org_connectors, secret nel vault via CLI)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile 2026-05-30 10:52:03 +02:00
parent 0dc2a11040
commit 109aa57d04

View File

@ -17,7 +17,15 @@ Le `Edit` falliscono **silenziosamente** quando l'ancora non combacia col file r
### 🔌 Connettori per-azienda nella card (RICHIESTA UTENTE, in sospeso — decisione necessaria)
Utente vuole: "le credenziali si configurano nella card per ogni azienda cliente" → card in **companies.html** (consulente), storage segreti scelto **vault-steward**.
**Finding (verificato sull'host)**: vault-steward (`server.js` 2123 righe) e `nis2-vault-proxy` esistono; nis2-app ha `VAULT_APP_TOKEN` scoped `tier1__nis2-app__*` e fetcha al boot (READ). **NON risulta un'API runtime che l'app possa usare per SCRIVERE nuovi segreti**: il populate è operazione ADMIN via `docker exec vault-steward node scripts/vault-repopulate.js` + `register-app` (CLI), non esposta al token applicativo. `VAULT_STEWARD.md` non montato nel devenv.
**Decisione aperta**: (A) config in DB + secret inseriti separatamente nel vault via CLI (nessun secret nel prodotto); (B) tabella `org_connectors` con secret cifrato AES nel DB NIS2 (devia da "mai segreti nel DB applicativo"). companies.html è SANO (548 righe, usa OrganizationController). Nessun codice ancora scritto per questa feature.
**DECISO e IMPLEMENTATO** (opzione A — commit `6c8f8e2`): config in DB, secret nel vault via CLI.
- Migrazione `029`: tabella `org_connectors` (organization_id, connector_type ENUM 8 tipi, display_name, enabled, config JSON NON-segreto, vault_key_alias, secret_status, last_status). **NESSUN segreto nel DB.**
- `OrganizationController`: `listConnectors`/`saveConnector`/`deleteConnector` + `connectorOrgGuard` (org_admin/compliance_manager della propria org, o firm che la gestisce, o super_admin). **Difesa secret-strip**: client_secret/api_key/password/private_key/token inviati vengono rimossi prima del save (verificato E2E: NON entrano nel DB). `saveConnector` ritorna `cli_hint` col comando `vault-cli.js migrate <alias> <key> <value>`.
- Route `organizations/{id}/connectors` GET/PUT/DELETE (type nel body).
- UI: pannello "Connettori" nella card di `companies.html` (8 tipi, tenant/client id, toggle attivo, badge stato segreto, modal). Servito 200, JS valido.
- **Vault write-path confermato assente** per l'app: `server.js` (615 righe) espone solo `GET /v1/credentials/*` + tier2 unlock/lock; scrivere segreti è solo CLI admin (`vault-cli.js migrate`). Doc: `/opt/devenv/VAULT_STEWARD.md`.
- E2E in prod: list vuota 200 → save m365 201 (secret strippato) → DB pulito → delete OK.
### Stato git fine sessione: origin/main = `6c8f8e2`, ahead 0. Tutto su Gitea.
---