Ti trovi qui: start » it » Documentazione interna » Estensioni DokuWiki (WvdS) » ADO-Git » Da dove la registrazione dei mount prende il vocabolario dei livelli

Da dove la registrazione dei mount prende il vocabolario dei livelli

Stato

Accettato. Sostituisce lo stato precedente, in cui lo strato di registrazione teneva un proprio elenco di livelli.

Contesto

Il vocabolario dei livelli è definito in un unico punto: la tabella che trasforma un livello in righe ACL (Domain/MountAclWriter). Lo strato di registrazione (Domain/RepoMountRegistry) verificava tuttavia il livello ricevuto rispetto a un secondo elenco proprio, lungo tre stringhe, e sostituiva ogni valore sconosciuto con il più restrittivo private. Finché i livelli erano tre, i due elenchi coincidevano.

Con il quarto livello, team, si sono separati. La procedura offriva team, i permessi venivano scritti secondo le regole di team e la registrazione memorizzava in silenzio private. Il risultato: il record del mount e il file conf/acl.auth.php descrivevano livelli diversi — proprio sulla schermata la cui colonna Regole esiste per rendere visibile quella corrispondenza.

Lo stesso guasto si è ripetuto due livelli più in basso, e per due volte. Il livello di archiviazione tiene un proprio elenco di livelli in Model/AdoGitMount, e il contrassegno di visibilità nel browser dei repository ne tiene un altro in Ui/BrowseView. Nessuno dei due è stato esteso quando sono arrivati showcase e library, ed entrambi sostituiscono in silenzio un livello sconosciuto con private invece di segnalarlo. Dopo il cambio di livello di 53 spazi dei nomi, l'archiviazione LEGGEVA quindi ognuno di essi come private mentre conf/acl.auth.php concedeva correttamente library — e salvare qualsiasi cosa dalla schermata dei mount avrebbe riscritto private, chiudendo codice sorgente leggibile pubblicamente senza che nessuno avesse toccato un livello.

Meccanismo

La registrazione chiede ora il vocabolario alla tabella che scrive le regole, invece di tenerne una copia:

if (!MountAclWriter::isValidTier($tier)) {
    $tier = 'private';
}

Il vincolo a private resta: un livello che questa installazione non conosce non deve mai concedere più del più restrittivo. È cambiata soltanto la fonte di ciò che è «noto».

Un test di regressione scorre MountAclWriter::tiers() e verifica che ogni livello ivi indicato raggiunga inalterato l'archivio. Un quinto livello aggiunto là e dimenticato qui fa fallire il test anziché sparire in silenzio.

Conseguenze

  • Non date mai più alla registrazione un elenco di livelli proprio — nemmeno «per sicurezza». Due elenchi dello stesso vocabolario divergono, e la rottura è silenziosa.
  • Non riscrivete il test di regressione su nomi di livello fissi. Il suo valore sta nel chiedere alla tabella e non alla sua copia.
  • Ripiegare sul valore più restrittivo è giusto; ripiegare in silenzio no. Tutte e tre le copie hanno sostituito un livello sconosciuto senza dire nulla. Il ripiego protegge, il silenzio nasconde: in esercizio un valore sostituito in silenzio non si distingue da uno letto correttamente.
  • Il vocabolario risiede in quattro punti, tre dei quali sono copie. La fonte è la tabella che scrive le regole. Il vincolo dello schema, il modello di archiviazione e il contrassegno di visibilità la interrogano oppure vengono verificati rispetto a essa — un test confronta schema e modello in entrambe le direzioni, perché una verifica unilaterale lascerebbe aperta l'altra lacuna.
  • I mount di livello team registrati prima di questa modifica sono ancora memorizzati in modo errato. Nell'elenco risultano private, mentre le loro regole corrispondono a team. La correzione è una tantum: nel menu di riga scegliere team e Salva. I dati esistenti non migrano da soli, perché nulla può distinguere con certezza se un private memorizzato fosse allora voluto oppure imposto.
  • Un nuovo livello richiede una sola voce in MountAclWriter::TIERS. La procedura, il menu di riga, la tabella dei livelli e la registrazione leggono da lì.

Argomenti correlati

it/wiki/dwe/wkdoadogit/note-tier-vocabulary.txt · Ultima modifica: da 0.0.0.0