Contenuto

Pinakes 0.7.87 è online, ed è una versione fatta quasi solo di cose che non si vedevano. Nessuna funzione nuova: sei correzioni, e il filo che le tiene insieme è che nessuna di esse sembrava un guasto. Una passava per un test capriccioso, una per una mappa che «a volte non carica», una non si manifestava affatto e stava lì da mesi su ogni installazione aggiornata.

Il test che tremava aveva ragione

C’era un test della batteria di rilascio che andava rosso e verde senza che il codice intorno cambiasse. La tentazione, in questi casi, è marcarlo come instabile e andare avanti. È quasi sempre la scelta sbagliata, e questa volta dietro c’era un difetto vero, presente nella 0.7.86 e capace di colpire chiunque.

Succede così. Torni sul sito dopo aver chiuso il browser, con la spunta «ricordami» attiva. Il browser chiede diverse cose nello stesso istante: la pagina, e ciò che la pagina si va a prendere da sola — sul cruscotto, per esempio, il conteggio dei prestiti attivi. Nessuna di quelle richieste ha una sessione, tutte si autenticano dallo stesso cookie, e ognuna si creava la propria sessione con il proprio gettone di sicurezza. Il browser tiene l’ultimo cookie che riceve. Quindi il gettone stampato dentro la pagina poteva appartenere a una sessione già abbandonata, e il primo modulo che inviavi tornava indietro con «Errore di Sicurezza».

Per l’utente è il peggior tipo di guasto: non c’è niente da capire, non c’è niente da raccontare a chi assiste, e riprovando funziona. Infatti non l’ha mai segnalato nessuno.

La parte che vale la pena raccontare è come ci sono arrivato, perché ho sbagliato due volte prima di indovinare. La prima ipotesi era che il gettone ruotasse a ogni richiesta: falsa, tre richieste consecutive restituiscono lo stesso valore. La seconda era che le richieste in volo cambiassero il gettone mentre lo leggevo: falsa anche quella, aspettare la quiete della rete non cambia nulla, perché il valore vecchio è già nel documento. Quello che ha chiuso la questione è stato guardare i cookie emessi: quando il modulo passava, la pagina creava una sessione; quando falliva, ne creava due. E il registro del server lo diceva senza ambiguità — gettone non corrispondente, ma con l’identificativo dell’utente valorizzato: la sessione era autenticata, semplicemente non era quella in cui la pagina era stata disegnata.

La correzione: la prima richiesta che si autentica da un cookie annota la sessione che ha creato, e una richiesta sorella che arriva nei secondi successivi si unisce a quella invece di farsene un’altra. L’annotazione sta su file — deve essere visibile a qualunque processo del server, non solo a quello che l’ha scritta — è intitolata a un’impronta del cookie e non lo contiene mai, scade in trenta secondi e sparisce quando il cookie viene ritirato.

Lettura, giudizio e scrittura di quell’annotazione avvengono sotto un unico blocco. Non è pignoleria: senza, due richieste che arrivano nello stesso microsecondo possono entrambe concludere che l’annotazione è loro da scrivere, e la raffica si divide di nuovo. Misurato su tre richieste lanciate insieme: prima della correzione, tre sessioni distinte; dopo, una sola, otto volte su otto.

La mappa dei contatti, rotta in tre modi indipendenti

La pagina dei contatti può mostrare una mappa. Non si vedeva, e dietro c’erano tre guasti diversi che si coprivano a vicenda — uno di quei casi in cui sistemi il primo e il sintomo non cambia di una virgola.

Il primo: OpenStreetMap ha cambiato l’indirizzo che il suo pannello «Condividi» consegna. Prima finiva in /export/embed.html, adesso in /export/embed. Il modulo conosceva solo la vecchia grafia, quindi l’unico posto da cui a un bibliotecario viene detto di copiare produceva esattamente l’unica cosa che il modulo rifiutava — con un messaggio d’errore che indicava un indirizzo che il sito non consegna più. Ora accetta entrambe le grafie, perché OpenStreetMap serve entrambe e chi ha già una mappa salvata ha la vecchia.

Insieme sono usciti altri due difetti nello stesso punto. Il pezzo di codice che si incolla arriva con i caratteri speciali codificati, e codificarli una seconda volta in uscita trasformava &layer=mapnik in un parametro chiamato amp;layer: ogni argomento dopo il primo veniva scartato in silenzio. E il riconoscimento del fornitore avveniva per prefisso, quindi accettava anche indirizzi che al percorso giusto aggiungevano qualcosa dopo.

Il secondo guasto è più interessante perché è un errore di ragionamento, non di codice. La mappa resta nascosta finché il visitatore non acconsente, e il gestore dei consensi si caricava solo se il banner dei cookie era acceso. Con il banner spento il gestore non c’era affatto: la mappa non poteva essere mostrata in nessun modo, il pulsante del segnaposto che prometteva «gestisci le preferenze cookie» chiamava una funzione inesistente e non faceva nulla, e non c’era nemmeno l’icona fluttuante da cui riaprire il pannello. «Nessun banner» veniva trattato come «nessun modo di acconsentire». Ora significa ciò che dice: nessun banner all’arrivo, ma se un contenuto richiede il consenso il gestore c’è, l’icona c’è, e chi vuole vedere la mappa ha un modo per chiederlo. E un comando che non può funzionare non viene più mostrato affatto.

La correzione che nessuno avrebbe mai notato

Il terzo guasto è quello che mi ha fatto più impressione, perché non aveva sintomi.

La politica di sicurezza dei contenuti — l’elenco di ciò che una pagina può caricare — era una riga fissa dentro public/.htaccess. Poi è diventata una politica generata dall’applicazione, per ogni risposta e con un gettone monouso. Ma .htaccess è nell’elenco dei file che l’aggiornamento preserva, e a ragione: contiene le regole dell’amministratore. Così la vecchia riga è sopravvissuta a ogni aggiornamento, e quando il server web e l’applicazione dicono cose diverse, il browser obbedisce al server.

È venuto fuori come una mappa di Google rifiutata da una politica che nominava soltanto openstreetmap.org, cioè un elenco di fornitori di un’altra epoca. Ma quella è la metà visibile. La metà silenziosa è che la stessa riga permetteva gli script in linea senza gettone: ogni installazione aggiornata oltre quel cambiamento stava eseguendo la politica debole, quella che la modifica era servita a sostituire, e nel pannello di amministrazione non c’era nulla che lo dicesse. L’aggiornamento ora rimuove quella singola direttiva, tiene prima una copia del file, e lascia intatto tutto il resto.

Le correzioni che non hanno sintomi sono le più difficili da trovare e le più facili da rimandare. Questa era in produzione da mesi e l’ho scoperta inseguendo una mappa.

Il pannello della privacy, riorganizzato per argomento

La scheda delle impostazioni sulla privacy mescolava tre cose. Un pulsante chiamato «Salva Privacy Policy» salvava la pagina della privacy, la pagina dei cookie, l’interruttore che accende il banner, due collegamenti e la visibilità delle categorie — mentre i testi di quello stesso banner stavano in un secondo modulo con un secondo pulsante. Niente, nella pagina, lo diceva. Chi accendeva il banner e ne riscriveva le parole doveva premere due pulsanti diversi per tenere entrambe le cose, senza sapere quale fosse quale.

I moduli restano due, ma la linea di divisione adesso è l’argomento e non l’accidente storico di quale punto d’ingresso esistesse prima: da una parte le pagine che il visitatore legge, ciascuna con la sua anteprima; dall’altra il banner dei cookie — se compare, quali categorie offre, i collegamenti del pannello e tutto ciò che dice — salvato come una cosa sola da un pulsante solo.

Una nota per chi amministra: accendere o spegnere il banner e scegliere le categorie è ora riservato agli amministratori, come già era per le sue parole. Governa ciò che a ogni visitatore viene chiesto di acconsentire, e mi è sembrato coerente. Se nella vostra biblioteca ha senso che lo faccia anche il personale, ditemelo: è una riga.

Due cose storte che si vedevano

Chiudo con le due uniche correzioni di questa versione che un occhio poteva cogliere.

La prima arriva da una biblioteca vera: nella barra dei filtri del catalogo l’elenco degli autori sembrava fermarsi a metà alfabeto. Non si fermava — scorreva — ma non c’era alcun segno che lo dicesse, e un elenco tagliato netto senza indizi si legge come un elenco finito. Ora sfuma dove viene tagliato, e il segno si ricalcola su ogni percorso che cambia l’elenco: apertura del pannello, filtri sul telefono, ridisegno dopo una ricerca.

La seconda: nelle pagine dell’emeroteca il blocco che elenca gli articoli portava un contenitore di larghezza proprio dentro una pagina che ne aveva già uno, e finiva più stretto di tutto ciò che gli stava intorno. Ora condivide il margine della pagina.

Come si aggiorna

Dal pannello di amministrazione, come sempre: Amministrazione → Aggiornamenti. Chi preferisce fare a mano trova il pacchetto verificato sulla pagina dei rilasci del progetto, con la sua impronta e la distinta dei componenti.

Una raccomandazione che vale in particolare per questa versione: se la vostra installazione è stata aggiornata più volte nel tempo, la correzione della politica di sicurezza agisce su public/.htaccess. Ne tiene una copia prima di toccarlo, ma se avete regole personalizzate lì dentro, dategli un’occhiata dopo l’aggiornamento — non perché mi aspetti problemi, ma perché è il file che è vostro e non mio.