Extension Roundcube Modification du mot de passe email. Roundcube Password Change.
Par Philippe Leroy le samedi, novembre 15 2008, 10:41 - Programmation informatique - Lien permanent
Vous accédez à vos email via Roundcube, votre mot de passe email est dans une DB Mysql. L'extension suivante vous permettra de modifier votre mot de passe directement dans Roundcube, sans passer par une autre application.
Un onglet mot de passe, dans la rubrique Préférences (ou Settings pour la version en anglais) permettra de faire la manipulation.
Cette extension marche pour la version v0.2-beta qui est actuellement la dernière version, il ne fonctionnera pas sur la version précédente.
Fichiers à modifier ou à créer
fichier index.php
Ligne 197
'settings' => array(
'folders' => 'manage_folders.inc',
'create-folder' => 'manage_folders.inc',
'rename-folder' => 'manage_folders.inc',
'delete-folder' => 'manage_folders.inc',
'subscribe' => 'manage_folders.inc',
'unsubscribe' => 'manage_folders.inc',
'add-identity' => 'edit_identity.inc',
'passwd' => 'passwd.inc', //ajout extension mot de passe
'save-passwd' => 'passwd.inc', //ajout extension mot de passe
)
fichier program/js/app.js
Ligne 285, remplacer la ligne apres la ligne case 'settings':
this.enable_command('preferences', 'identities', 'save', 'folders', true);
par la ligne:
this.enable_command('preferences', 'identities', 'save', 'folders', 'passwd', true);//ajout perso
Ligne 297
//ajout extension mot de passe
if (this.env.action=='passwd' || this.env.action=='save-passwd') {
this.enable_command('save-passwd', true);
var input_newpasswd = rcube_find_object('_newpasswd');
var input_confpasswd = rcube_find_object('_confpasswd');
var input_curpasswd = rcube_find_object('_curpasswd');
if (input_newpasswd && input_newpasswd.value=='')
input_curpasswd.focus();
else if (input_confpasswd)
input_curpasswd.focus();
}
//fin ajout
Ligne 678
//ajout extension mot de passe
case 'save-passwd':
var input_curpasswd = rcube_find_object('_curpasswd');
var input_newpasswd = rcube_find_object('_newpasswd');
var input_confpasswd = rcube_find_object('_confpasswd');
if ((input_newpasswd && input_newpasswd.value=='') && (input_confpasswd && input_confpasswd.value=='')) {
alert(this.get_label('nopassword'));
input_newpasswd.value='';
input_confpasswd.value='';
input_curpasswd.focus();
} else if ((input_newpasswd && input_confpasswd) && (input_newpasswd.value != input_confpasswd.value)) {
alert(this.get_label('passwordinconsistency'));
input_newpasswd.value='';
input_confpasswd.value='';
input_curpasswd.focus();
} else
this.gui_objects.editform.submit();
break;
//fin ajout
Ligne 981
//ajout extension mot de passe
case 'passwd':
this.goto_url('passwd');
break;
//fin ajout
Créer le fichier program/steps/settings/passwd.inc
<?php
/*
-----------------------------------------------------------------------
| program/steps/settings/passwd.inc |
| |
| This file is part of the RoundCube Webmail client |
| Copyright (C) 2006, RoundCube Dev. - Switzerland |
| Licensed under the GNU GPL |
| |
| PURPOSE: |
| Change IMAP user password (for SQL-Based email system) |
| |
| |
| |
-----------------------------------------------------------------------
| Author: Philippe Leroy (info@philippe-leroy.fr) |
-----------------------------------------------------------------------
*/
$OUTPUT->set_pagetitle(rcube_label('passwd'));
function rcmail_save_passwd($curpassword, $newpassword){
global $DB, $CONFIG, $OUTPUT ,$RCMAIL;
$emailuser=$_SESSION['username'];
$DB->query('select password from mailserver.view_users where email=\''.$emailuser.'\''); //this SQL query must be adapted to your config
$row = $DB->fetch_assoc();
$actualCryptedPassword = md5($curpassword);
if ($actualCryptedPassword != $row['password'])
return false;
else {//ok, we can proceed
list($mailuser,$maildomain)=split("@", $emailuser);
//this SQL query must be adapted to your config:
$DB->query('update mailserver.virtual_users set password=\''.md5($newpassword).'\' where user=\''.$mailuser.'\' ');
if (!$DB->is_error()) {
$_SESSION['password'] = $RCMAIL->encrypt_passwd($newpassword);//save the new password in the session
return true;
} else
return false;
}
}
function rcmail_passwd_form($attrib)
{
global $DB, $CONFIG, $OUTPUT;
list($form_start, $form_end) = get_form_tags($attrib, 'passwd', array('name' => 'save', 'value' => 'yes' ));//only way I found in order to have only one page for passwd plugin
unset($attrib['form']);
if (!$attrib['id'])
$attrib['id'] = 'rcmSavepassword';
// allow the following attributes to be added to the <table> tag
$attrib_str = create_attrib_string($attrib, array('style', 'class', 'id', 'cellpadding', 'cellspacing', 'border', 'summary'));
// return the complete edit form as table
$out = "$form_start<table" . $attrib_str . ">\n\n";
//list of available columns
$a_show_cols = array('curpasswd' => array('type' => 'text'),
'newpasswd' => array('type' => 'text'),
'confpasswd' => array('type' => 'text'));
// show current password field
$field_id = 'curpasswd';
$input_curpasswd = rcmail_get_edit_field('curpasswd','', array('size' => 30, 'type' => 'password'));
$out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n", $field_id, rep_specialchars_output(rcube_label('curpasswd')), $input_curpasswd);
// show new password selection
$field_id = 'newpasswd';
$input_newpasswd = rcmail_get_edit_field('newpasswd','', array('size' => 30, 'type' => 'password'));
$out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n", $field_id, rep_specialchars_output(rcube_label('newpasswd')), $input_newpasswd);
// show confirm password selection
$field_id = 'confpasswd';
$input_confpasswd = rcmail_get_edit_field('confpasswd', '', array('size' => 30, 'type' => 'password'));
$out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n", $field_id, rep_specialchars_output(rcube_label('confpasswd')), $input_confpasswd);
$out .= "\n</table>$form_end";
return $out;
}
// Handle user request
if ($_POST['save']=='yes')
{
if (!isset($_POST['_newpasswd']) or !isset($_POST['_curpasswd'])) {
$OUTPUT->show_message('errorsaving', 'error');
} else {
if (rcmail_save_passwd(get_input_value('_curpasswd', RCUBE_INPUT_POST), get_input_value('_newpasswd', RCUBE_INPUT_POST)))
$OUTPUT->show_message('passwordmodified', 'confirmation');
else
$OUTPUT->show_message('badpassword', 'error');
}
rcmail_overwrite_action('mail');
} else {
// add some labels to client
rcube_add_label('nopassword');
rcube_add_label('passwordinconsistency');
$OUTPUT->add_handler('userpasswd', 'rcmail_passwd_form');
$OUTPUT->send('passwd');
}
?>
Créer le fichier skins/default/templates/passwd.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title><roundcube:object name="pagetitle" /></title> <roundcube:include file="/includes/links.html" /> <link rel="stylesheet" type="text/css" href="/settings.css" /> </head> <body> <roundcube:include file="/includes/taskbar.html" /> <roundcube:include file="/includes/header.html" /> <roundcube:include file="/includes/settingstabs.html" /> <div id="userprefs-box"> <div id="userprefs-title"><roundcube:label name="changepasswd" /></div> <div style="padding:15px"> <roundcube:object name="userpasswd"> <p><br /><roundcube:button command="save-passwd" type="input" class="button" label="save" /></p> </div> </div> <roundcube:include file="/includes/settingscripts.html" /> </body> </html>
Modifier le fichier skins/default/includes/settingstabs.html
Ajouter avant la balise </div>: <span id="settingstabpasswd" class="tablink"><roundcube:button command="passwd" type="link" label="password" title="password" class="tablink" /></span>
Maintenant il faut traiter l'affichage des mots dans le répertoire localisation, l'opération doit être faite pour toutes les langues que vous souhaitez utiliser. Je n'ai fait que anglais et français:
A la fin de program/localization/fr_FR/labels.inc, ajouter les lignes: $labels['changepasswd'] = 'Mot de passe'; $labels['curpasswd'] = 'Mot de passe actuel'; $labels['newpasswd'] = 'Nouveau mot de passe'; $labels['confpasswd'] = 'Confirmer'; A la fin de program/localization/fr_FR/messages.inc, ajouter les lignes: $messages['nopassword'] = 'Merci de renseigner le nouveau mot de passe'; $messages['passwordinconsistency'] = 'Le nouveau mot de passe et sa confirmation ne correspondent pas'; $messages['badpassword'] = 'Le mot de passe original semble inexact'; $messages['passwordmodified'] = 'Le mot de passe a bien été modifié'; A la fin de program/localization/en_GB/labels.inc et A la fin de program/localization/en_US/labels.inc, ajouter les lignes: $labels['changepasswd'] = 'Password'; $labels['curpasswd'] = 'Actual password'; $labels['newpasswd'] = 'New password'; $labels['confpasswd'] = 'Confirm'; A la fin de program/localization/en_GB/messages.inc et A la fin de program/localization/en_US/messages.inc, ajouter les lignes: $messages['nopassword'] = 'Please fill the new password'; $messages['passwordinconsistency'] = 'Password and confirmation are not the same'; $messages['badpassword'] = 'Wrong original password'; $messages['passwordmodified'] = 'Password has been changed';
Commentaires
il n'ya pas une ligne 267 dans le fichier index.php.
je ne sait pas si j'ai la meme version. (v.0.2beta).
vous pouvez m'aider s'il vous plait?
*(je parle anglais, ne pas francais)
Je m'étais trompé pour la modification du index.php (version 0.2alpha). L'erreur est réparée, c'est bien la version 0.2 beta.
Merci beaucoup,
mais j'ai des autres problems:
Est-ce que je doit changer quelque chose dans la DB Mysql?
Tous ont marche bien mais il ne change pas le mots de passe.
Bonjour et merci beaucoup pour ces éléments.
cependant, une fois tout installé, ça marche, mais à chaque fois que je veux changer un mot de passe j'ai le message suivant :
"Le mot de passe original semble inexact"
Il y a-t-il une manip supplémentaire à faire ?
d'avance merci.
Bonjour,
Je suis passé en 0.2 stable afin d'intégrer le plugin sieve. Je ne parviens pas à faire fonctionner le votre ; en cliquant sur l'onglet Passord, je tombe sur une page blanche.
Avez-vous envisagé de porter votre plugin sur la stable ?
Cordialement.
Merci beaucoup Philippe.
Sur la v0.2.1 (stable, on Debian) tous ont marche bien.
C'est nécessaire seulement un changement à la fin du fichier "program/steps/settings/passwd.inc":
Ce:
rcube_add_label('nopassword');
rcube_add_label('passwordinconsistency');
devenir:
rcube_label('nopassword');
rcube_label('passwordinconsistency');
Evidemment dans le meme fichier tu doit changer les query de la password, dans la select et dans update:
$DB->query('select etc....');
Le user avec de roundcube entre DB, devoir avoir "grant select on..." sur le "query+where", et "update" sur "password".
Excuse mois pour le mon français.
Salut et merci.
Silvano
Hi,
I installed the 0.2 version of RoundCube.
I solved the problem for rcube_label('nopassword');
but I still have the problem with the query.
Where to get the password of the current user?
Which database?
I'm on fastdomain.com
tx