Odakle registracija montiranja uzima rječnik razina
Stanje
Prihvaćeno. Zamjenjuje prijašnje stanje u kojem je registracijski sloj vodio vlastiti popis razina.
Okolnosti
Rječnik razina određen je na točno jednom mjestu: u tablici koja iz razine radi retke ACL-a (Domain/MountAclWriter). Registracijski je sloj (Domain/RepoMountRegistry) ipak primljenu razinu provjeravao prema drugom, vlastitom popisu od tri niza i svaku nepoznatu vrijednost zamjenjivao najstrožom razinom private. Dok su razine bile tri, popisi su se podudarali.
S četvrtom razinom team razišli su se. Čarobnjak je nudio team, prava su bila zapisana prema pravilima razine team, a registracija je tiho spremila private. Posljedica: zapis montiranja i datoteka conf/acl.auth.php opisivali su različite razine – i to na zaslonu čiji stupac Pravila postoji upravo zato da to podudaranje učini vidljivim.
Isti se prekid poslije ponovio dvije razine niže, i to dvostruko. Sloj pohrane vodi vlastiti popis razina u Model/AdoGitMount, a oznaka vidljivosti u pregledniku repozitorija još jedan u Ui/BrowseView. Nijedan nije proširen kad su došle razine showcase i library, a obje nepoznatu razinu tiho zamjenjuju s private umjesto da je prijave. Nakon prebacivanja 53 imenska prostora sloj pohrane je svaki od njih ČITAO kao private, dok je conf/acl.auth.php ispravno dodjeljivao library — a tko bi na zaslonu mountova bilo što spremio, vratio bi private i zatvorio javno čitljiv izvorni kod, a da nije dirnuo nijednu razinu.
Mehanizam
Registracija sada rječnik traži od tablice koja pravila zapisuje, umjesto da vodi njezinu kopiju:
if (!MountAclWriter::isValidTier($tier)) { $tier = 'private'; }
Ograničenje na private ostaje: razina koju ova instalacija ne poznaje nikad ne smije dodijeliti više od najstrože. Promijenio se samo izvor onoga što je »poznato«.
Regresijski test prolazi kroz MountAclWriter::tiers() i provjerava da svaka ondje navedena razina nepromijenjena stigne do pohrane. Peta razina koja bi ondje bila dodana, a ovdje zaboravljena, ruši test umjesto da tiho nestane.
Posljedice
- U registraciji nikad više ne uvodite vlastiti popis razina – ni »za svaki slučaj«. Dva popisa istog rječnika razilaze se, a lom je tih.
- Regresijski test nemojte prepisivati na čvrsto zapisana imena razina. Njegova je vrijednost upravo u tome što pita tablicu, a ne njezinu kopiju.
- Povratak na najstrožu vrijednost je ispravan, tihi povratak nije. Sve tri kopije zamijenile su nepoznatu razinu bez riječi. Povratak štiti, šutnja skriva: u pogonu se tiho zamijenjena vrijednost ne razlikuje od ispravno pročitane.
- Rječnik stoji na četiri mjesta, a tri su od njih kopije. Izvor je tablica koja piše pravila. Uvjet sheme, model pohrane i oznaka vidljivosti pitaju nju ili se provjeravaju prema njoj — jedan test uspoređuje shemu i model u oba smjera, jer bi jednostrana provjera ostavila drugu rupu otvorenom.
- Montiranja razine
teamregistrirana prije ove promjene i dalje su krivo spremljena. Na popisu stoje kaoprivate, a njihova pravila odgovaraju raziniteam. Ispravak je jednokratan: u izborniku retka odaberiteteami Spremi. Postojeći podaci ne sele se sami jer ništa ne može pouzdano razlučiti je li spremljena razinaprivatetada bila željena ili nametnuta. - Nova razina treba samo jedan unos u
MountAclWriter::TIERS. Čarobnjak, izbornik retka, tablica razina i registracija čitaju odande.
Povezane teme
- Tehnička referenca: razina vidljivosti – sama tablica razina
- Dijagnostika: staro montiranje stoji kao private – simptom na postojećim podacima
- Vodič: razina vidljivosti – razina iz korisnikova kuta