Roundcube: come permettere agli utenti di cambiare le loro password

Se vi è mai capitato di gestire un server di posta, sono certo che avete investito del tempo ad esaminare Squirrelmail o Horde per permettere ai vostri utenti di accedere alle loro caselle di posta via browser. Entrambe questi prodotti sono oramai stabili e molto maturi, ma la mancanza di un tema accattivante out-of-the-box comincia a farsi sentire nei nostri giorni del web x.0.

Roundcube è un software open source alternativo, non ancora maturo come quelli citati prima, rilasciato sotto licenza GPL che ha una bellissima skin predefinita. Purtroppo, manca ancora di una importantissima caratteristica: la possibilità di far cambiare le password agli utenti in maniera autonoma. Ma è il vostro giorno fortunato: ho scritto una piccola patch per poterlo fare con Roundcube 0.1 (stable).

Il mio codice è basato su quello di polinoma reperibile qui. Basta applicare la patch (questa guida spiega come fare) scaricabile in fondo a questo articolo o seguire le istruzioni di seguito elencate. In ogni caso, bisogna anche modificare manualmente il file program\steps\settings\save_prefs.inc per segnalare a Roundcube come salvare la password nel database.

Passo 1. Modificare program\steps\settings\save_prefs.inc
Vicino la linea 27, c’è un blocco di codice che dichiara un array. Inizia con “$a_user_prefs = array(“. Aggiungi, subito dopo “‘prefer_html’ => isset($_POST[‘_prefer_html’]) ? TRUE : FALSE,“, il codice

[code lang=”php” gutter=”true”]
// Password MOD
‘password’ => isset($_POST[‘_password’]) ? TRUE : FALSE,
// End Password MOD[/code]

Adesso cercate “foreach ((array)$CONFIG[‘dont_override’] as $p)” vicino la linea 39, per aggiungere il blocco che gestirà il salvataggio sul database.

[code lang=”php” gutter=”true”]
// Password MOD
if (isset($_POST[‘_password’]))
{
$tmpEncPass = YourEncryptionFunctionHERE($_POST[‘_password’], "");

mysql_query("UPDATE CCC.TableWithPasswordHERE SET password = ‘".$tmpEncPass."’ WHERE username = ‘".$_SESSION[‘username’]."’")
or die(mysql_error());

$_SESSION[‘password’] = encrypt_passwd($_POST[‘_password’]);
}
// End Password MOD[/code]

Se il vostro database non contiene le password in chiaro, ma degli hash, inserite al posto di YourEncryptionFunctionHERE il nome della funzione che utilizzate per crittare le password. Se per esempio state memorizzando hash MD5 delle password e la funzione che utilizzate si chiama md5, metterete quella al posto di YourEncryptionFunctionHERE. Non dimenticate inoltre di cambiare la query in mysql_query per adeguarla alla struttura del vostro database.

Passo 2. Modificare program\steps\settings\func.inc
Vicino la linea 200, cercate “$out .= “\n</table>$form_end”;“. Prima di questa linea, aggiungete:
[code lang=”php” gutter=”true”]
// Password MOD
$field_id = ‘rcmfd_password’;
$input_password = new textfield(array(‘name’ => ‘_password’, ‘id’ => $field_id, ‘size’ => 20));
$out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s (empty = unchanged)</td></tr>\n",
$field_id,
rep_specialchars_output(rcube_label(‘password’)),
$input_password->show();
// End Password MOD[/code]

Se avete eseguito correttamente le mie istruzioni, dovrebbe funzionare (si spera!). Come sempre, se avete problemi, postate pure un commento e vedrò quel che posso fare per aiutarvi.

Patch per Roundcube 0.1 (Stable)