Come ti distruggo il sito web con una fattura elettronica

A partire da quest’anno, finalmente, è stata introdotto l’utilizzo della fatturazione elettronica verso tutti. Avendo lavorato allo sviluppo e l’implementazione di tutte le soluzioni software necessarie per un mio cliente (che gestisce uno studio di commercialisti), ho potuto vedere come molte aziende sono andate in panico per quella che è in realtà una novità bella, utile ed ecologica.

Ovviamente il formato delle fatture elettroniche è documentato, aperto e standard, per consentire a tutti quanti di creare software che permetta di generare fatture elettroniche, nonché visualizzare e importare quelle prodotte da altri. Esistono anche diversi siti web che forniscono un servizio di visualizzatore online per fatture elettroniche.

Una caratteristica interessante della fattura elettronica è il fatto che il formato consente l’inserimento di allegati, tramite l’uso di specifici tag XML e la codifica in base64 del documento allegato. Molti gestionali usano questa possibilità per inserire una rappresentazione in PDF dentro alla fattura elettronica XML. Si tratta della vecchia fattura “cartacea” digitale, più semplice da leggere ma senza valore legale.

Questo si traduce, dentro al file XML, in un codice simile a questo:

<Allegati>
    <NomeAttachment>documento.pdf</NomeAttachment>
    <Attachment>
    JVBERi0xLjcKJeLjz9MNCjIgMCBvYmoKPDwvQ291bnQgMSAvS2lkcyBbMSAwIFJdIC9UeXBlIC9QYWdl
    cyA+PgplbmRvYmoKCjUgMCBvYmoKPDwvTGVuZ3RoIDQgL1JlYWRkbGVQYWdlQmFja2dyb3VuZENvbnRl
    bnRTdHJlYW0gPDw+PiA+PnN0cmVhbQpxClEKCmVuZHN0cmVhbQplbmRvYmoKCjQgMCBvYmoKPDwvUHJv
    Y1NldCBbL1BERiAvVGV4dF0gPj4KZW5kb2JqCgoxIDAgb2JqCjw8L0NvbnRlbnRzIFs1IDAgUl0gL0Ny
    b3BCb3ggWzAgMCA2MTIgNzkyXSAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXSAvUGFyZW50IDIgMCBSIC9S
    ZWFkZGxlUGFwZXJJbmZvIDw8L0NvbG9ySWQgL1doaXRlIC9TdHlsZUlkIC9CbGFuayA+PiAvUmVzb3Vy
    Y2VzIDQgMCBSIC9Sb3RhdGUgMCAvVHlwZSAvUGFnZSA+PgplbmRvYmoKCjMgMCBvYmoKPDwvUGFnZXMg
    MiAwIFIgL1R5cGUgL0NhdGFsb2cgPj4KZW5kb2JqCgo2IDAgb2JqCjw8L0NyZWF0aW9uRGF0ZSAoRDoy
    MDE5MDExOTIzMTIzOCswMScwMCcpIC9Nb2REYXRlIChEOjIwMTkwMTE5MjMxMjM4KzAxJzAwJykgL1By
    b2R1Y2VyIChQREYgRXhwZXJ0IDIuNC4yMSBNYWMpID4+CmVuZG9iagoKNyAwIG9iago8PC9GaWx0ZXIg
    L0ZsYXRlRGVjb2RlIC9JRCBbPGM5NmM5NTBhZGJmZDY1OTE4Y2E0ZTVjNmNhNzVmOGE5PiA8Yzk2Yzk1
    MGFkYmZkNjU5MThjYTRlNWM2Y2E3NWY4YTk+XSAvSW5kZXggWzEgN10gL0luZm8gNiAwIFIgL0xlbmd0
    aCAzNyAvUm9vdCAzIDAgUiAvU2l6ZSA4IC9UeXBlIC9YUmVmIC9XIFsxIDQgNF0gPj5zdHJlYW0KeJxj
    ZGBguAjEDIxALABlME6GiSyDMTxhUkegDCY3EAMAc7sDeQplbmRzdHJlYW0KZW5kb2JqCgoKJSBQREYg
    RXhwZXJ0IDYwOSBNYWMgT1MgRG1nIDhiMTQ2ZWU0NzQyOSsKCnN0YXJ0eHJlZgo1ODIKJSVFT0YK
    </Attachment>
</Allegati>

Questo esempio può sembrare artificiale, ma in realtà la rappresentazione in base64 scritta qui sopra contiene un vero file PDF, con una sola pagina bianca completamente vuota in formato Letter. Naturalmente un documento con del testo occuperebbe più spazio.

Come potete notare, viene anche indicato il nome del file allegato.

I visualizzatori online

Perché vi ho spiegato tutti questi dettagli sugli allegati alle fatture elettroniche? È presto detto: mi era stato chiesto di cercare un visualizzatore che potesse mostrare agevolmente gli allegati. Tra i primi che ho trovato ce n’erano due:

Provando entrambi i servizi con una fattura contenente allegati, ho potuto verificare che tutti e due i siti (scritti in PHP) funzionavano nello stesso modo:

  1. L’utente carica un file XML
  2. Il sito lo riceve e ne crea una copia in una directory temporanea
  3. Il sito controlla la presenza di eventuali allegati, se presenti estrae anch’essi con il nome originale
  4. All’utente viene permesso di visualizzare graficamente il contenuto della fattura, con i link agli eventuali allegati

Nel caso in cui leggere il punto 3 non vi abbia fatti trasalire, sentendo un forte brivido corrervi lungo la schiena, posso dirvi che mi auguro non lavoriate nell’industria dello sviluppo software. Se invece lo fate, vi chiedo di rileggerlo un paio di volte.

La vulnerabilità

Permettere ad un utente di caricare dei file non è di per sé pericoloso, posto che vengano prese le misure di sicurezza necessarie. Tuttavia i siti analizzati effettuavano dei controlli sulla fattura XML ma non sugli allegati. Questo significa che era possibile creare una fattura (vera o finta, non ha importanza) con allegato un file con estensione PHP, il linguaggio più comunemente usato per programmare siti web.

I siti stessi estraevano i file PHP dagli allegati e li copiavano nella rispettiva directory temporanea, fornendone poi l’URL all’utente. Al malintenzionato di turno sarebbe bastato quindi inserire del codice malevolo per poi effettuare vari tipi di operazioni.

Per fare un test rivelatore ma innocuo, ho creato una fattura la cui sezione degli allegati è la seguente:

<Allegati>
    <NomeAttachment>wowowowo.php</NomeAttachment>
    <Attachment>PD9waHAgcGhwaW5mbygpOw==</Attachment>
</Allegati>

Potete visualizzare il documento completo cliccando qui. Il contenuto codificato corrisponde al seguente programma:

<?php phpinfo();

Si tratta di uno script inerte, che non arreca nessun tipo di danno al server sul quale viene eseguito, ma mostra soltanto le informazioni sulla versione del software installato. Perciò consente in modo semplice di verificare se il codice PHP gira correttamente.

Entrambi i siti summenzionati hanno accettato senza problemi la mia fattura emessa da Paperino a Zio Paperone, estraendo l’allegato in PHP e fornendone l’URL. Dagli screenshot potete vedere chiaramente che il codice veniva eseguito:

In realtà, pur avendo eseguito un codice assolutamente innocuo e privo di conseguenze, se io fossi stato un malintenzionato avrei potenzialmente potuto fare molto peggio. Per esempio, un attaccante avrebbe potuto decidere di caricare un file manager in PHP come questo su uno dei siti e usarlo per:

  1. Modificare il visualizzatore di fatture affinché salvasse una copia di ogni file caricato
  2. Alterare la pagina di login, in modo che le credenziali inserite dagli utenti finissero nelle mani sbagliate
  3. Creare pagine in una posizione qualsiasi del sito e usarle per una campagna di phishing
  4. Cancellare completamente tutto il sito web

No, non sto esagerando.

Conclusione

Quando si sviluppa del software, specialmente le applicazioni web esposte all’utilizzo indiscriminato di migliaia di utenti, prestare la massima attenzione alla sicurezza è assolutamente imprescindibile. In questo caso sussisteva un rischio per i dati caricati dagli utenti, nonché per i contenuti stessi del sito web che avrebbero potuto essere alterati o eliminati.

Il rischio dato dalla possibilità di upload di file da parte degli utenti si può eliminare in diversi modi:

  • Inserendo una whitelist di estensioni consentite (ad esempio PDF, JPG)
  • Disattivando l’esecuzione degli script nella directory di destinazione degli upload, in tal caso visitare un file PHP avrebbe mostrato il codice senza eseguirlo
  • Nel caso degli allegati di fatture, optando per non estrarli e ripresentarli all’utente tramite data URL (non tutti i formati sono consentiti, ma quelli ai file PDF sì)

Ovviamente i gestori di entrambi i siti web sono stati preventimente informati del problema ed è stato dato loro modo di correggerlo prima che questo articolo venisse pubblicato. L’autore di AmministrazioniComunali.it ha risposto con estrema prontezza comunicandomi di aver chiuso la falla.

Da quanto ho potuto vedere, tutti e due i siti hanno optato per la whitelist, che è un’ottima soluzione.

Come considerazione finale, aggiungo che prima di scrivere questo post ho verificato che anche Ser.Val. ha risolto la falla segnalata, anche se non avevo ricevuto risposta. Risulta degno di nota il fatto che sul loro server la pagina di informazioni mostrava la presenza di PHP versione 5.6, che è quantomeno bizzarro. Come avevo già avuto modo di commentare su Facebook, PHP 5.6 è una versione fuori supporto dal 31 dicembre 2018 e sarebbe bene migrare prontamente ad una versione più recente, nello specifico PHP 7.2 o 7.3.

Come già scrivevo in questo post di due mesi fa, è bene che chi opera in questo settore prenda sul serio l’importanza della sicurezza informatica. Eventualmente facendo anche analizzare la propria infrastruttura software da un consulente esterno.

Cronologia della responsible disclosure

  • 11 gennaio 2019: scorgo la presenza di una potenziale vulnerabilità
  • 13 gennaio 2019: notifico i gestori dei due siti web coinvolti
  • 14 gennaio 2019: AmministrazioniComunali.it risponde confermando di aver risolto il problema
  • 16 gennaio 2019: mi accorgo che anche Ser.Val. ha modificato il sito, senza però rispondere
  • 20 gennaio 2019: pubblico questo articolo
  • 22 gennaio 2019: Ser.Val. risponde confermando di aver risolto il problema ed effettuato una verifica interna per verificare eventuali data breach, ai sensi del GDPR

Aggiornamento del 22 gennaio 2019: Ser.Val. ha risposto alla mia segnalazione dopo la pubblicazione di questo post, ringraziandomi e descrivendo le contromisure che hanno adottato. Il contenuto del post è stato modificato per tenere conto di questa risposta.

Dissuadere gli utenti di Internet Explorer tramite uno script

Per lungo tempo Internet Explorer è stato in modo assoluto ed incontrastato il browser più utilizzato al mondo. Questo è dipeso principalmente da strategie di preinstallazione aggressive (e blocco della disinstallazione), ma forse non sarebbe un gran problema se Internet Explorer funzionasse decentemente.

Vi spiego che intendo per decentemente: un browser dovrebbe supportare, al momento del rilascio, tutte le tecnologie web già divenute standard de iure e anche magari qualcuna di quelle standard de facto (ma questo è opzionale). Ci sarebbero poi da fare anche molti discorsi sulla sicurezza ma tralasciamo. Internet Explorer è noto per non supportare granché delle migliori tecnologie CSS. Con Javascript sembra andare un po’ meglio solo perché gli autori di Jquery e librerie simili fanno davvero i miracoli per far funzionare tutto, in realtà non è tutto oro quello che luccica. Addirittura bisogna inserire un meta tag nelle pagine per far comportare Internet Explorer (a partire dalla versione otto) in modo un po’ più normale, altrimenti fa apposta a comportarsi male.

Questo cosa implica? Si arriva all’ironica regola che ho inventato e deciso di chiamare del 3+3:

Se ci vogliono 3 giorni per creare e far funzionare qualcosa in un browser standard, ci vogliono 3 mesi per far funzionare la stessa cosa con Internet Explorer.

Sembra una battutina, però è vero, e i problemi sono ancora peggiori.

La situazione attuale

Prima vi parlavo delle date di rilascio e dovremmo fare un altro piccolo approfondimento su questo. Di seguito riporto le date di rilascio ufficiali per le varie versioni di IE:

  • versione 6 – 2001
  • versione 7 – 2006
  • versione 8 – 2009
  • versione 9 – 2011

Secondo Microsoft il 10% delle persone usa Internet Explorer nella versione 6, che è uscita 10 anni fa. Anche se al tempo fosse stato il browser migliore della categoria, ora è comunque un suicidio navigare con quella roba. Figuratevi sviluppare siti che funzionino lì. Lo stato delle cose è grave: si stima che il 40% delle persone usi Windows XP che ha come ultima versione disponibile la 8, vecchia di 2 anni (ma in realtà anche di più).

È la stessa azienda di Redmond che incoraggia le persone ad aggiornare subito il browser, il problema è che lo fa invitando a usare Internet Explorer 8 oppure 9. Se vi state chiedendo che male ci sia, leggete l’articolo Internet Explorer 9 e il supporto ai web standard per rendervi conto che seppur uscito nel 2011 è parecchio indietro rispetto a qualsiasi altro browser che rispetta veramente gli standard (per citarne alcuni Firefox, Safari, Chrome, Opera…).

Tra uno o due anni saremo punto e a capo: molti utenti che usano Internet Explorer e rimangono indietro, con gli sviluppatori web che si strappano i capelli cercando di fare siti web funzionanti.

Lo script dissuasore

Per fortuna, se gestite dei siti web e come me volete evitare di diventare pazzi, dovendo avere anche a disposizione una macchina Windows per fare test esotici e sperare che le cose funzionino, potete offrire ai vostri utenti un’alternativa migliore.

Basandomi sul vecchio script di Explorer Destroyer, nella versione modificata da Xavier, ho ritoccato e sistemato un popup che avvisa gli utenti di Internet Explorer che è consigliabile passare a Firefox, fornendo utili motivazioni, e l’ho racchiuso in uno script PHP di facile utilizzo per chi realizza siti web. Questo non impedisce ai navigatori con IE di vedere il sito (basta cliccare un link e l’avviso sparisce).

Perché Firefox? In realtà si poteva decidere di consigliare alle persone di usare un browser che supporti gli standard (che in parole meno gentili vuol dire “qualsiasi altro browser”), però secondo me è bene consigliare Firefox per almeno 3 motivi:

  • è ragionevolmente diffuso e multipiattaforma, così l’utente può riconoscerlo e usarlo altrove
  • è software libero
  • dando un’indicazione generica (“installa qualcos’altro…”) senza fornire alternative è poco efficace perché molto probabilmente chi usa Explorer non ne conosce e non ha voglia di cercarne una

Il procedimento di installazione e configurazione sul proprio sito richiede 5 minuti, e una volta finito chi naviga con IE riceverà una volta al giorno (oppure ogni tot di giorni a vostra scelta) questo messaggio:

Messaggio visualizzato da Internet Explorer 6

La scelta che ho voluto fare è quella di iniettare il codice nella pagina solo se ad un primo controllo fatto via PHP l’utente usa Internet Explorer. Questo vuol dire che l’HTML non viene “sporcato” se chi naviga usa altri browser, e quindi le pagine sono anche lievemente più veloci da scaricare e visualizzare.

Come installarlo

Come detto prima, lo script richiede:

  • la presenza di PHP
  • l’accesso FTP all’hosting
  • il poter individuare (o generare con PHP) una stringa contenente il giusto tag <body> da passare alla funzione

Per prima cosa avrete bisogno di scaricare l’archivio contenente lo script e un riassunto di queste istruzioni. Potete fare il download da qui e poi dovete caricare la cartella IE nella radice del vostro hosting.

A questo punto la serie di cose da fare è abbastanza semplice.

Se volete, cambiate il valore var daysToSleep = 0; nel codice per impostare quanti giorni di “riposo” deve attraversare l’avviso prima di ricomparire nuovamente.

  • 0 significa che verrà mostrato una volta al giorno
  • -1 significa che verrà mostrato su ogni singola pagina, sempre

Quindi bisogna modificare il file “header” o equivalente del proprio CMS (di solito va fatto nel tema che si utilizza), e inserire al posto del tag <body> il codice seguente, opportunamente adattato:

<?php
// inserisce il semplice tag body per Firefox, il check per Explorer
require(getenv("DOCUMENT_ROOT").'/IE/IEcode.php');
printbody( <ARG> );
>

Al posto di <ARG> bisogna inserire la stringa del body (un esempio potrebbe essere <body class='prova'>) secondo le convenzioni del linguaggio PHP. Se si vuole inserire un semplice tag senza attributi si può anche lasciare la funzione senza argomento (non una stringa vuota “”).

Salvate le modifiche è tutto, potete provare con qualsiasi browser cambiando il vostro user-agent per vedere se funziona (se non usate IE vedrete male il banner, questo ve lo spiego nel paragrafo seguente). Chi usa Windows può fare la prova direttamente da Internet Explorer senza che sia necessario modificare la configurazione del browser.

Personalizzare il codice e il problema della PNG

Con un minimo di conoscenza di HTML troverete facilmente dove mettere le mani in fondo al file PHP per cambiare il testo della casella gialla. Fate attenzione però se volete cambiare il banner di Firefox con uno degli altri forniti da Mozilla. Vi ricordo infatti che le versioni più vecchie di Internet Explorer non hanno supporto alle PNG trasparenti, e ci sono innumerevoli discussioni e hack riguardo alla risoluzione di questo problema. Personalmente, dato che il banner è una sola immagine, ho optato per quella del filter.

Il codice del banner di Firefox, rispetto alla versione originaria di Mozilla, è il seguente:


<a href='http://www.mozilla.org/firefox?WT.mc_id=aff_en11&WT.mc_ev=click'>
<img src='http://www.mozilla.org/contribute/buttons/120x240bubble_b.png' alt='Firefox Download Button' border='0'
style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true', src='http://www.mozilla.org/contribute/buttons/120x240bubble_b.png'); padding-top: 240px;" />
</a>

Se volete sostituire il pulsante, dovete cambiare solo l’url dell’immagine (che è presente 2 volte come potete notare) e il padding-top dev’essere uguale all’altezza della stessa, perché così Explorer nasconde l’immagine e la ricarica sopra con AlphaImageLoader. Per questo qualsiasi browser normale vi farebbe vedere l’immagine scostata verticalmente. Be’, alla fine l’importante è che funzioni su IE!

Conclusione

La strada verso un web fatto di standard aperti, affermati e condivisi è estremamente importante. Il browser è il software che usiamo tutti i giorni, perciò risulta fondamentale che questo visualizzi le pagine web in un modo corretto e moderno. Nel nostro piccolo possiamo fare qualcosa per far conoscere alle persone un software libero che funziona molto meglio di Internet Explorer e quindi da un leggero contributo a evitare i mal di testa.

Se usate lo script sul vostro sito mi farebbe piacere ricevere un commento per saperlo e se lo ritenere interessante diffondete la notizia.

Rimuovere i risultati di ricerca corrotti in bbPress

Come già sapete, il sito dei matematici che amministro usa bbPress come piattaforma per il forum. È un gran bel CMS ottimo per le funzioni essenziali, però c’è un bug relativo ai risultati della ricerca. La pagina fornisce i messaggi divisi in due categorie, “recenti” e “rilevanti”, però il problema sorge quando bbPress decide che un messaggio recente debba essere anche rilevante.

Il risultato ottenuto è un link (nella parte dei messaggi rilevanti) completamente corrotto, senza descrizione e duplicato del corrispondente sopra: qualcosa di simile a http://giovani.mathesisvicenza.it/forum/topic.php#post-.

Notate i messaggi 5 e 3

Chiaramente questo link duplicato male non è nulla di utile e risulta anche scomodo: una persona infatti potrebbe tentare di cliccarci sopra e non arrivare da nessuna parte. Per ovviare a questo problema ho provato a pensare a come poter distinguere facilmente gli elementi corrotti da quelli giusti. Sono giunto ad alcune conclusioni:

  • non si può discriminare direttamente l’url, in quanto viene direttamente stampato da una funzione di bbPress, non è salvato nell’array
  • un articolo malformato non ha un contenuto, viene visto come vuoto
  • ogni articolo sano deve avere un contenuto, altrimenti la ricerca non avrebbe restituito nulla

Alla luce di ciò, la cosa migliore mi è sembrata quella di fare una prima scansione dei messaggi rilevanti ed eliminare tutti quelli senza testo. Il codice seguente va inserito nel file search.php del tema da correggere e va prima della riga <?php if ( $relevant ) : ?>:

<?php
foreach ( $relevant as $elementKey => $bb_post ) {
if(!($bb_post->post_text)) unset($relevant[$elementKey]);
}
?>

A questo punto la ricerca lavora alla perfezione e senza doppioni. Se volete, provate pure quella dei Giovani Matematici di Vicenza.

RSS validi e robusti in bbPress

Nel mio precedente articolo sulle risorse più utili per bbPress vi avevo preannunciato alcuni problemi con i feed RSS, almeno quelli del tema di default (Kakumei). Credo comunque che molti temi derivati utilizzino il template degli RSS di default, in quanto non c’è poi molto da cambiare.

Questa è la lista dei problemi che ho riscontrato finora e che ho risolto (spero) nel sito che amministro:

  • Il contenuto dei messaggi non viene processato dai plugin. Se ad esempio uso il plugin che mi sostituisce le emoticon digitate con immagini di smilies, nei feed RSS continuo a vedere le emoticon testuali, e così via.
  • Una descrizione del sito lunga o con il carattere di virgoletta doppia “»” (che viene inserito automaticamente da bbPress!) spesso “rompe” l’anteprima del feed in Firefox, mentre ad esempio su Google Reader funziona.
  • Le date vengono tradotte in lingua se si usano dei file di localizzazione, violando il formato RFC-822 e quindi quello RSS.
  • Bisogna assicurarsi che il feed non contenga codice HTML puro, o in alternativa che questo venga opportunamente isolato nei tag CDATA e filtrato (c’è un problema con il carattere di spazio lungo &nbsp; per esempio).
  • Quando si prende il testo del messaggio processato dai plugin si ottiene una doppia codifica (e pure insolita) per il carattere ampersand “&”.

Bando alle ciance, questo è il codice. Dovete aprire la cartella del vostro tema, cercare il file rss2.php e sostituire integralmente il contenuto con questo:


<?php
header( 'Content-Type: text/xml; charset=UTF-8' );
echo '<' . '?xml version="1.0" encoding="UTF-8"?' . '>' . "\n";
bb_generator( 'comment' );

function datefix($buffer) {
	/*
	 * fix della data in modo da tenerla in inglese, rispettando
	 * le specifiche dei feed RSS
	 */
	 return gmdate('D, d M Y H:i:s +0000', $buffer);
}

function callback($buffer)
{
	/*
	 * sistema il codice rimuovendo la doppia codifica di "&" e
	 * rimuove il carattere "&nbsp;" che crea problemi con UTF-8
	 * in questo modo ho il testo del post dopo che i plugin (tipo
	 * le faccine) hanno applicato le loro modifiche html e ritorno
	 * il codice html senza entities ma in forma pura
	 */

	$single = str_replace("&#"."038;", "&", $buffer);
	$spaced = str_replace("&nbsp;", " ", $single);
	return html_entity_decode($spaced);
}

?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><?php echo $title; ?></title>
		<link><?php echo $link; ?></link>
		<description><![CDATA[<?php echo $description; ?>]]></description>
		<language><?php esc_html( bb_option('language') ); ?></language>
		<pubDate><?php echo gmdate('D, d M Y H:i:s +0000'); ?></pubDate>
		<?php bb_generator( 'rss2' ); ?>
		<textInput>
			<title><![CDATA[<?php _e('Search'); ?>]]></title>
			<description><![CDATA[<?php _e('Search all topics from these forums.'); ?>]]></description>
			<name>q</name>
			<link><?php bb_uri('search.php'); ?></link>
		</textInput>
		<atom:link href="<?php echo $link_self; ?>" rel="self" type="application/rss+xml" />

<?php foreach ($posts as $bb_post) : ?>
		<item>
			<title><?php post_author(); ?> <?php _e('on')?> "<?php topic_title( $bb_post->topic_id ); ?>"</title>
			<link><?php post_link(); ?></link>
			<pubDate><?php

			ob_start("datefix");
			bb_post_time('U');
			ob_end_flush();

			?></pubDate>
			<dc:creator><?php post_author(); ?></dc:creator>
			<guid isPermaLink="false"><?php post_id(); ?>@<?php bb_uri(); ?></guid>
			<description><![CDATA[<?php

			ob_start("callback");
			post_text();
			ob_end_flush();

			?>]]></description>
		</item>
<?php endforeach; ?>

	</channel>
</rss>

Potete verificare che il codice generato è correttamente validato sul sito del validatore W3C. Quello del sito dei Giovani Matematici di Vicenza è valido. 😛

Sono contento di aver risolto i problemi del feed (sperando di non averne causati altri) ma soprattutto questo mi ha permesso di imparare qualcosa in più sul formato RSS (che mi ha sempre affascinato ma di cui non ho mai saputo nulla). Fatemi sapere se avete problemi col codice o se volete suggerirmi delle migliorie!

Installare i MySQL GUI tools (specialmente MySQL Workbench) in Ubuntu

Ultimamente mi ritrovo a fare una sorta di stage in una ditta di sistemi informativi della zona. L’azienda si occupa di database, e per lavorare mi hanno meso su un server dove ho potuto scegliere di mettere ciò che mi pareva.

Inutile dire che ho installato Ubuntu con una configurazione LAMP, più SSH e le solite cose sul client. Perché Ubuntu? Perché mi ci trovo bene, è la distro che conosco meglio e quindi è più facile per me lavorarci.

A questo punto, dato che si operava in MySQL, abbiamo deciso di verificare la presenza di software adatto allo scopo, ovvero che semplificasse almeno la parte di amministrazione e verifica delle query. Certo, esiste l’ottimo PhpMyAdmin, ma volevamo provare anche il resto.

Essendo venuti a conoscenza dei MySQL GUI Tools (in origine eravamo più interessati a MySQL Workbench, anche se poi l’abbiamo usato pochissimo) abbiamo deciso di installarli per provare.

Dato che in ditta sarei io “l’esperto” di Linux (in realtà ce n’è anche un altro ma viene raramente in sede) è ovviamente toccato a me. Vi posso dire solo una cosa: che agonia! :\

Ho impiegato tre ore abbondanti, e non tanto per i tempi di compilazione, quanto per realizzare come risolvere gli errori. Poi qualcuno mi dovrà spiegare perché nelle varie cartelle dei sorgenti ho dovuto dare il comando make all… Cos’è, make non gli andava bene?

D’accordo, piccoli sfoghi a parte, alla fine ho passato qualche ora a creare un buono script che automatizza tutto. Tale script scarica ed installa automaticamente la versione 5.0r5 di MySQL GUI Tools. È testato per funzionare su una Ubuntu 8.04 nuova di zecca. Naturalmente perché poi si possa usare è ovvio che da qualche parte deve essere installato un server MySQL opportunamente configurato.

Immagino che per farlo funzionare su altre distribuzioni bastino poche modifiche ai comandi, ma non saprei dirvi, sinceramente.

Veniamo al dunque, scaricate lo script da qui e ponetelo sulla Scrivania. ora basta dargli i permessi di esecuzione e farlo partire:

Avvio dello script
Avvio dello script

Ora non resta che aspettare. Può succedere, specie nella parte iniziale, che lo script sembri inchiodato. In realtà non è così, funziona bene. C’è solo da aspettare qualche minuto. L’unica cosa che vi raccomando è di controllare che il download del file dei sorgenti vada a buon fine (che non ci siano interruzioni insomma) perché altrimenti lo script prosegue e fa pasticci (non danneggia nulla, ma può succedere che crei qualche file inutile) e non conclude nulla. 😛

Ricordate inoltre che lo script vi chiederà più di una volta la password del vostro utente, quindi o lo fate partire subito anteponendoci sudo oppure ogni tanto dovete inserirla. Detto ciò, allacciate le cinture di sicurezza e partite.

La fase iniziale, dove viene scaricato l'archivio dei sorgenti
La fase iniziale, dove viene scaricato l’archivio dei sorgenti

Se tutto sarà andato a buon fine (ma anche no, in effetti…) il messaggio conclusivo sarà così:

In pieno stile MySQL, un educato saluto!
In pieno stile MySQL, un educato saluto!

Un indice di corretta esecuzione dello script è la presenza dei quattro pacchetti nella vostra home directory.

A questo punto, in maniera pressoché automatica avete tutto pronto. Non vi resta che appurare la popolazione del menù di Gnome:

Icone dei programmi installati
Icone dei programmi installati

Infine si deve fare un fix a mano. Digitate il seguente comando da terminale:

sudo gedit /usr/local/bin/mysql-workbench

E subito dopo la prima riga inserite quest’altra riga:

export LANG=en_US

Sembra assurdo, ma se non si esporta questa variabile, il tutto non parte su sistemi che non siano in lingua Inglese Americano.

Ora potete cominciare a provare i programmi, sperando che vi siano utili.

È software alpha, un po' limitato
È software alpha, un po’ limitato

Credo di non avere altro da aggiungere. Spero solo di aver reso la vita più semplice agli altri che si devono scontrare con questi strumenti, la cui compilazione sembra essere stata resa astrusa di proposito. 😉

Riferimenti: