Passa al contenuto principale

Impostazioni e Audit (SuperAdmin)

La dashboard del tenant espone un'area impostazioni operatore in /dashboard/amministrazione/settings/*, protetta da IsSuperAdminGuard. Ogni pagina è supportata da un controller autenticato tramite cookie; gli endpoint sensibili riverificano il ruolo SuperAdmin lato server. L'editor JSON grezzo della configurazione si trova in /dashboard/amministrazione/configurazione-tecnica ed è deliberatamente escluso dalle superfici di navigazione.

Feature flag​

Pagina/dashboard/amministrazione/settings/feature-flags
APIGET/POST /api/v1/admin/feature-flags
AccessoLettura anonima (bootstrap del login); il salvataggio richiede Admin

La pagina carica l'intera lista dei flag e la salva in blocco — ogni interruttore della pagina viene inviato in un'unica richiesta. I flag protetti (chiavi _system_* e enable_subscriptions una volta consolidato il marcatore di cutover delle sottoscrizioni) vengono ignorati silenziosamente quando il valore è invariato e rifiutati con errors.general.permissionDenied quando si tenta una modifica reale, così un batch non correlato non blocca mai la pagina.

I feature flag sono entità sottoposte ad audit (FeatureFlag : BaseAuditEntity), quindi ogni modifica di valore è registrata nella pista di audit con attore e marche temporali. Vedi Feature Flag per l'elenco e la semantica dei flag.

Token API​

Pagina/dashboard/amministrazione/settings/token-api
API/api/v1/api-tokens
AccessoSolo SuperAdmin
  • Crea un token con un nome, uno o più permessi (scope), origini consentite (separate da virgole; * disabilita il pinning dell'origine) e un expiresAt opzionale.
  • Il token in chiaro è mostrato una sola volta, alla creazione. Il database conserva solo un hash SHA-256 più un prefisso di 8 caratteri (TokenPrefix) usato per l'identificazione.
  • L'applicazione dell'origine è rigorosa: un token senza AllowedOrigins viene rifiutato, e una richiesta la cui Origin non è in lista viene respinta anche se il token è valido.
  • La modifica aggiorna nome/permessi/origini/scadenza/stato attivo; la revoca elimina il record del token. lastUsedAt ed expiresAt sono visibili nella tabella.

I token di API pubblica lato tenant (lettore blog nativo, sitemap, integrazioni) si gestiscono da CLI con flo instance api-token ls|create|grant|revoke <id>.

Webhook​

Pagina/dashboard/amministrazione/settings/webhook
API/api/v1/webhook-configs
AccessoSolo SuperAdmin

I webhook attivano flussi esterni (GitHub Actions / pipeline GitLab) quando cambiano le entità dinamiche:

  • Provider: GitHub, GitLab o Generic; Repository, WorkflowFile e Branch di destinazione.
  • Eventi: create,update,delete,publish separati da virgole; una lista vuota si attiva su ogni evento. È possibile allegare InputsJson aggiuntivi per il workflow.
  • Token di autenticazione: cifrato a riposo con ASP.NET Data Protection (Flo.Webhook.AuthToken.v1); mai restituito in chiaro.
  • Log di consegna: ogni configurazione traccia LastTriggeredAt, LastTriggerStatus, LastTriggerError e TriggerCount. POST /{id}/trigger e POST /{id}/test eseguono una consegna manuale dalla UI (solo SuperAdmin).

Origini CORS​

Pagina/dashboard/amministrazione/settings/origini-cors
API/api/v1/cors-origins
AccessoSolo SuperAdmin

Le origini sono memorizzate nel database e applicate dalla policy CORS dinamica del backend invece della configurazione statica. Gli operatori possono creare, aggiornare ed eliminare le origini; ogni voce ha un flag attivo e una descrizione. GET /active restituisce la lista effettiva e POST /initialize inizializza le origini di sviluppo locale predefinite (localhost:4200, 4201, 8080, 10001, 10002). Le origini frontend per i tenant Cloudflare Pages vengono normalmente inserite automaticamente al momento del provisioning.

Pista di audit​

Pagina/dashboard/amministrazione/settings/audit-trail
API/api/v1/audit-logs
AccessoLettura: Admin+ (indirizzi IP: solo SuperAdmin)
  • Solo accodamento: ApplicationDbContext rifiuta aggiornamenti ed eliminazioni delle righe AuditLog; solo i percorsi di manutenzione di AuditLogService possono modificarle.
  • Cattura automatica: le modifiche alle entità sono accodate nella stessa transazione della modifica stessa, con attore, azione (Created/Modified/Deleted), nome/ID entità, valori vecchi/nuovi e marca temporale. AuditLog stesso non è mai sottoposto ad audit e le scritture esclusivamente di macchina sono escluse.
  • Conservazione: predefinita 730 giorni, configurabile da 30 a 3650 tramite GET/PUT /retention. DELETE /purge?retentionDays= rimuove le voci più vecchie (minimo 30).
  • Cronologia entità: GET /entity/{entityName}/{entityId} restituisce la cronologia completa delle modifiche di un record; la UI espande ogni riga per mostrare il JSON vecchio/nuovo.
  • Esportazioni: GET /export-query scarica la query filtrata come JSON (limite di 50.000 voci); GET /export/user/{userId} è l'esportazione GDPR Articolo 15 (solo SuperAdmin).
  • Lapidi (tombstone): l'anonimizzazione GDPR (POST /anonymize/user/{userId}, Articolo 17) e le eliminazioni accodano una lapide di audit che registra l'azione di manutenzione, il conteggio e i dettagli, così il log resta auto-descrittivo dopo la redazione dei dati.
  • Catena di salt: l'hashing di anonimizzazione usa AUDIT_HASH_SALTS (catena separata da virgole, l'ultimo salt è quello corrente) con AuditLog:HashSalt come fallback; la rotazione dei segreti da CLI accoda nuovi salt senza invalidare gli hash precedenti.

Eventi di autenticazione (accessi falliti)​

Pagina/dashboard/amministrazione/settings/accessi-errori
API/api/v1/auth-events
AccessoSolo SuperAdmin

Registra i fallimenti del login social da due sorgenti: server (scambi Google/Apple rifiutati) e client (la pagina di login segnala i fallimenti lato browser — popup bloccato, adblock — tramite un POST /client anonimo fire-and-forget). L'endpoint GET filtra per metodo (google/apple), motivo, sorgente e intervallo di date, e restituisce pagine da 50 voci. Le segnalazioni client accettano solo motivi in allow-list e non si fidano mai di IP/user-agent forniti nel body.

Provider di login​

Pagina/dashboard/amministrazione/settings/provider-accesso
API/api/v1/external-auth-settings
AccessoSolo SuperAdmin

Memorizza i Client ID Google e Apple usati dal login social. Nessun client secret è conservato nel database del tenant — solo gli identificatori pubblici, con upsert per provider.

Template email​

Pagina/dashboard/amministrazione/settings/template-email
APIGET /api/v1/newsletter/templates/*
AccessoSuperAdmin (permesso di notifiche operative per la lista)

Elenca i template email transazionali noti al renderer con nome base, lingua e variabili segnaposto, e rende un'anteprima HTML live per qualsiasi template. I template risiedono su disco nell'immagine applicativa; la pagina è una superficie di ispezione in sola lettura. Vedi Configurazione Email per provider e mittenti.

Log di consegna email​

Pagina/dashboard/amministrazione/settings/log-consegna-email
API/api/v1/email-delivery-logs
AccessoSolo SuperAdmin

Un'unica griglia su tutti i provider email, che unisce il log di consegna locale (scritto da ogni percorso di invio) con le analytics live dei provider. Filtri: intervallo date, stato, provider, destinatario, ID job di invio e canale; paginazione a 25 righe. GET /availability guida la visibilità della scheda Impostazioni ed è sempre abilitato.

Editor di configurazione​

Pagina/dashboard/amministrazione/configurazione-tecnica
API/api/v1/config-editor
AccessoSolo SuperAdmin

Modifica JSON grezza per tre file: theme (flo.theme.json), brand-config (flo.configs.json) e whitelabel (<env>.config.json). Il servizio valida il JSON prima di scrivere, crea un backup .bak.<yyyyMMddHHmmss> con marca temporale prima di ogni salvataggio e conserva i 5 backup più recenti. Le chiavi file sono in allow-list e il path traversal è rifiutato. Tutte le letture e scritture sono protette da lease: su uno standby DR la pagina è in sola lettura (vedi Failover e Disaster Recovery).

Log applicativi​

Pagina/dashboard/amministrazione/settings/log
API/api/v1/logs
AccessoSolo SuperAdmin

Visualizzatore dei log lato server sui file Serilog rotanti dell'applicazione:

  • Periodi: 24h, 48h, 72h, 1w (predefinito), 1m, all.
  • Filtri: livelli di log (VRB, DBG, INF, WRN, ERR, FTL), ricerca a testo libero, percorso della richiesta e contesto sorgente; dal più recente con paginazione (max 5.000 righe per query).
  • Vista per utente: GET /user/{userId}.
  • Esportazioni: CSV (/export/csv) e JSON (/export/json).
  • GET /diagnostic riporta dove risiedono i file di log sul filesystem del container.

Per i log a livello container (blue/green/Traefik/Postgres) usa la CLI: flo logs app|db|proxy|errors|days|day|raw <id>.