Personal tools
Plone e il mistero della cartella scomparsa

Un giallo per l'estate da leggere sotto l'ombrellone

Jul 09, 2014

Plone e il mistero della cartella scomparsa

Una cartella improvvisamente scomparsa rompe la monotonia di un tranquillo sito Plone. Un'indagine senza quartiere proverà a far luce sul mistero e a riportare la calma

Era una fresca mattina di inizio estate nel distretto di RedTurtle.

Il detective Cecchi stava ancora aspettando che il caffè cominciasse a fare effetto, quando arrivò una richiesta di aiuto disperata da parte di un cliente che lo risvegliò di colpo dal suo torpore mattutino: una cartella era misteriosamente scomparsa.

"Aiuto! è scomparsa una cartella dal nostro sito Plone e non la ritroviamo più, siamo disperati!"

Consapevole della gravità della situazione, il detective si è subito attivato per risolvere il problema.
Come insegnano tanti telefilm americani, in caso di scomparsa le prime ore sono quelle decisive; e più il tempo passa, meno probabilità si hanno di rivedere il proprio caro.
In Plone succede la stessa cosa: se si effettua un'azione sbagliata (come l'eliminazione di una cartella), c'è sempre la possibilità di ritornare indietro con l'undo-form (manage_UndoForm), ma la tempestività è fondamentale. Se passa troppo tempo tra l'incidente e l'intervento correttivo, si rischia che molte (troppe) azioni siano state fatte nel frattempo e l'undo risulta impossibile o impraticabile (poiché si perderebbero tutte le azioni intermedie).

Come prima cosa, il detective ha rivolto al cliente le domande di rito per avere un quadro generale e dettagliato della situazione:

- "Da quanto tempo non avete più notizie della cartella?"
- "Da un paio d'ore, agente"

- "Sapete se la cartella ha avuto contatti con qualche membro della vostra redazione nei momenti precedenti alla scomparsa? Non è che era diventata una cartella scomoda e qualcuno ha deciso di farla sparire?"
- "Guardi, so che il redattore XX ci stava lavorando, ma mi assicura che tra loro i rapporti sono sempre stati ottimi e non avrebbe mai potuto farla fuori".

A questo punto, l'analisi dei log nell'undo-form si è dimostrata obbligatoria, per vedere se era stata registrata l'azione di cancellazione e, nel caso, per poterla invertire.
La Divisione Scientifica si è quindi messa al lavoro; purtroppo, però, non è emerso nulla di rilevante. Sono apparse solamente delle operazioni, anche di eliminazione, in altre sezioni del sito; ma nessuna su quella cartella.

La faccenda si faceva sempre più strana e torbida.

Anche il tentativo di allargare il raggio delle ricerche ai log di sistema (il log delle istanze e gli Z2-log) è risultato vano. Magari qualche incursione dall'esterno o qualche bot malvagio aveva fatto una chiamata particolare che non veniva tracciata nei log normali di Plone; ma nulla anche qui.

Per rassicurare il cliente, il detective Cecchi ha "tamponato" la situazione recuperando la cartella dal backup della sera prima, ma il caso andava risolto lo stesso! Il potenziale serial killer era ancora in giro e non si riusciva a prevedere chi potesse essere la prossima vittima.

L'unica opzione rimasta al nostro detective era quella di ripercorrere gli ultimi momenti di vita della cartella, per trovare qualche indizio sulla sua scomparsa.
Armato di santa pazienza, si è quindi messo ad analizzare una copia del Data.fs per annullare tutte le operazioni fino ad arrivare al momento della sparizione.

Il guaio è che ormai c'erano circa 500 operazioni eseguite dall'ora dell'ultimo avvistamento, e annullarle dal pannello di controllo era un'operazione proibitiva.
Studiando meglio lo strumento, è riuscito a trovare un paio di metodi utili per annullare un certo numero di operazioni:

transactions = portal.undoable_transactions(last_transaction=num, PrincipiaUndoBatchSize=num)
transaction_ids = [x.get('id') for x in transactions]
portal.manage_undo_transactions(transaction_ids)

Partendo da num=500, ogni volta bisognava diminuire il valore di num per annullare sempre meno operazioni e capire a che ora, più o meno, fosse avvenuto il crimine.

Dopo giorni di lunghe analisi (essendoci molte operazioni, ogni tentativo ci metteva anche un paio d'ore ad essere completato), ha finalmente scoperto che il crimine era avvenuto tra le 11:50 e le 11:53 circa, ma il motivo era ancora ignoto.

Il nostro detective era ormai disperato e stava per gettare la spugna, quando un piccolo dettaglio, una discrepanza, attirò la sua attenzione: nella lista delle azioni, a distanza di un paio di minuti l'una dall'altra, in una sezione diversa da quella incriminata, un redattore aveva cancellato un contenuto che aveva lo stesso id della vittima! E l'aveva fatto due volte.

Questo indizio poteva essere la chiave di tutto. E' strano che un contenuto venga cancellato due volte, se non quasi impossibile. La mente del detective si riempì immediatamente di domande.

Come poteva aver fatto il redattore a cancellarlo due volte, se dopo la prima azione non era più presente sul sito?

Non è che, per caso, il redattore aveva due tab del browser aperti sulla stessa pagina, e ha cliccato sull'azione di elimina prima su uno e poi sull'altro, dimenticandosi della prima azione?

Perché Plone dovrebbe permettere di cancellare due volte lo stesso contenuto senza dare nessun errore o avvisare l'utente?

A questo punto l'unica cosa da fare era una prova sul campo - ed effettivamente succedeva proprio così:

Trovato il colpevole!

Creando una cartella aaa e un contenuto sempre con id aaa dentro a /bbb/ccc/ddd, se poi si andava dentro la sezione ddd e si provava a cancellare due volte la pagina contenuta al suo interno (aprendo due tab contemporaneamente), la prima volta veniva cancellato il contenuto desiderato, mentre la seconda volta... veniva cancellata la cartella aaa presente nella root del sito.

Possibile che fosse un bug di Plone? Era ancora a piede libero o magari in versioni successive era stato fissato?

Effettivamente, un test veloce sull'ultima versione disponibile (4.3.3) ha dimostrato che il bug non si presentava più, quindi qualcuno l'aveva già scovato ed arrestato.

Una ricerca nell'history di Products.CMFPlone ha dato la risposta definitiva:

Ora restava soltanto da catturare il colpevole. Gli utenti con Plone 4.3.3 erano al sicuro, ma gli altri no. Il detective, come ultima mossa per assicurare il colpevole alla giustizia, ha quindi creato un prodotto (rer.fix13603) che non fa altro che applicare una piccola patch a PloneTool come fatto su Products.CMFPlone.

Ora che la città era tornata di nuovo sicura, il detective poteva finalmente godersi il meritato riposo. In attesa di un altro crimine da risolvere.

Filed under: ,
comments powered by Disqus