Od kod registracija priklopa dobi besedišče ravni
Stanje
Sprejeto. Nadomešča prejšnje stanje, v katerem je registracijski sloj vodil svoj seznam ravni.
Okoliščine
Besedišče ravni je opredeljeno na natanko enem mestu: v tabeli, ki iz ravni naredi vrstice ACL (Domain/MountAclWriter). Registracijski sloj (Domain/RepoMountRegistry) pa je prejeto raven preverjal proti drugemu, lastnemu seznamu treh nizov in vsako neznano vrednost nadomestil z najbolj omejujočo ravnjo private. Dokler so bile ravni tri, sta se seznama ujemala.
S četrto ravnjo team sta se razšla. Čarovnik je ponudil team, pravice so bile zapisane po pravilih ravni team, registracija pa je tiho shranila private. Posledica: zapis priklopa in datoteka conf/acl.auth.php sta opisovala različni ravni – prav na zaslonu, katerega stolpec Pravila obstaja zato, da to ujemanje pokaže.
Isti zlom se je pozneje ponovil dve ravni nižje, in to dvakrat. Sloj shrambe vodi lasten seznam ravni v Model/AdoGitMount, oznaka vidnosti v brskalniku repozitorijev pa še enega v Ui/BrowseView. Nobeden ni bil razširjen, ko sta prišli ravni showcase in library, in oba neznano raven tiho nadomestita s private, namesto da bi jo javila. Po prestavitvi 53 imenskih prostorov je sloj shrambe torej vsakega od njih BRAL kot private, medtem ko je conf/acl.auth.php pravilno podeljeval library — kdor bi na zaslonu priklopov karkoli shranil, pa bi zapisal nazaj private in zaprl javno berljivo izvorno kodo, ne da bi se dotaknil katere koli ravni.
Mehanizem
Registracija zdaj besedišče vpraša tabelo, ki pravila zapisuje, namesto da bi vodila njeno kopijo:
if (!MountAclWriter::isValidTier($tier)) { $tier = 'private'; }
Omejitev na private ostaja: raven, ki je ta namestitev ne pozna, ne sme nikoli podeliti več kot najbolj omejujoča. Spremenil se je le vir tega, kaj je »znano«.
Regresijski preizkus se sprehodi čez MountAclWriter::tiers() in preveri, da vsaka tam navedena raven nespremenjena pride do shrambe. Peta raven, ki bi bila dodana tam in pozabljena tu, preizkus podre, namesto da bi tiho izginila.
Posledice
- V registraciji nikoli več ne uvajajte svojega seznama ravni – tudi »za vsak primer« ne. Dva seznama istega besedišča se razideta, prelom pa je tih.
- Regresijskega preizkusa ne prepisujte na trdno zapisana imena ravni. Njegova vrednost je prav v tem, da vpraša tabelo in ne njene kopije.
- Vrnitev na najstrožjo vrednost je pravilna, tiha vrnitev ni. Vse tri kopije so neznano raven zamenjale brez besede. Vrnitev ščiti, molk skriva: v obratovanju se tiho zamenjana vrednost ne razlikuje od pravilno prebrane.
- Besedišče stoji na štirih mestih, tri od njih so kopije. Vir je tabela, ki piše pravila. Pogoj sheme, model shrambe in oznaka vidnosti jo vprašajo ali pa se preverjajo proti njej — en test primerja shemo in model v obe smeri, ker bi enostranska preverba pustila drugo vrzel odprto.
- Priklopi ravni
team, registrirani pred to spremembo, so še vedno napačno shranjeni. Na seznamu stojijo kotprivate, njihova pravila pa ustrezajo ravniteam. Popravek je enkraten: v meniju vrstice izberiteteamin Shrani. Obstoječi podatki se ne preselijo sami, ker ni mogoče zanesljivo razločiti, ali je bila shranjena ravenprivatetakrat želena ali vsiljena. - Nova raven potrebuje en sam vnos v
MountAclWriter::TIERS. Čarovnik, meni vrstice, preglednica ravni in registracija berejo od tam.
Sorodne teme
- Tehnična referenca: raven vidnosti – sama preglednica ravni
- Diagnostika: star priklop je zapisan kot private – simptom pri obstoječih podatkih
- Vodnik: raven vidnosti – raven z vidika uporabnika