Modification du mot de passe dans le webmail Roundcube
Un article de Wiki SOS-ADMIN.
Introduction
Une fonctionnalité manquant à la pluspart des Webmail est la possibilité que l'utilisateur puisse directement y changer son mot de passe, sans devoir passer par une interface tierce, qui nécessite parfois des codes d'accès différents et une certaine habitude pour prendre en main sa manipulation.
Cet article a pour but de rajouter un onglet "Mot de passe" dans l'interface du Webmail Roundcube.
Le code fournit ici suppose le mot de passe stocké dans une DB Mysql. Mais bien sur, rien ne vous empêche de l'adapter à votre propre architecture (appel à l'API d'OVH, par exemple, pour les utilisateurs en mutualisé).
Ce patch repose sur la version courante, la v0.1-rc1 et est utilisable librement, à vos risques et périls.
Cet article a été originellement sur le blog de Julien Wadin
Fichiers à modifier
Note : les lignes précédes d'un - indiquent ce qu'il faut enlever, celles d'un + ce qu'il faut ajouter.
Note: aux alentours de la ligne 342 du fichier
@@ -342,6 +342,9 @@
{
include_once('program/steps/settings/func.inc');
+ if ($_action=='passwd' || $_action=='save-passwd')
+ include('program/steps/settings/passwd.inc');
+
if ($_action=='save-identity')
include('program/steps/settings/save_identity.inc');
@@ -268,8 +268,9 @@ // register UI objects $OUTPUT->add_handlers(array( 'userprefs' => 'rcmail_user_prefs_form', - 'itentitieslist' => 'rcmail_identities_list' + 'itentitieslist' => 'rcmail_identities_list', + 'userpasswd' => 'rcmail_passwd_form' ));
@@ -261,7 +261,7 @@
case 'settings':
- this.enable_command('preferences', 'identities', 'save', 'folders', true);
+ this.enable_command('preferences', 'identities', 'save', 'folders', 'passwd', true);
if (this.env.action=='identities' || this.env.action=='edit-identity' || this.env.action=='add-identity')
this.enable_command('edit', 'add', 'delete', true);
@@ -272,6 +272,18 @@
if (this.env.action=='folders')
this.enable_command('subscribe', 'unsubscribe', 'create-folder', 'rename-folder', 'delete-folder', true);
+ if (this.env.action=='passwd' || this.env.action=='save-passwd') {
+ 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();
+
+ this.enable_command('save-passwd', true);
+ }
+
if (this.gui_objects.identitieslist)
{
this.identity_list = new rcube_list_widget(this.gui_objects.identitieslist, {multiselect:false, draggable:false, keyboard:false});
@@ -932,6 +944,27 @@
this.delete_folder(props);
break;
+ case 'passwd':
+ this.goto_url('passwd');
+ break;
+
+ 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;
}
return obj ? false : true;
Note: Il est probable que vous deviez adapter la fonction rcmail_save_passwd pour qu'elle soit conforme à votre système. Dans ce cas ci, les mots de passes sont stockés dans une DB mysql, en md5. Il est évident que l'utilisateur MySQL utilisé par Roundcube doit avoir les droits adéquats sur la table qui est modifiée.
@@ -0,0 +1,100 @@
+<?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: Julien Wadin (julien@wadin.be) |
+ -----------------------------------------------------------------------
+
+
+*/
+
+function rcmail_save_passwd($curpassword, $newpassword){
+ global $DB, $CONFIG, $OUTPUT;
+
+ $DB->query('select password from postfix.mailbox where username=\''.$_SESSION['username'].'\'');
+ $row = $DB->fetch_assoc();
+ $actualCryptedPassword = md5($curpassword);
+
+ if ($actualCryptedPassword != $row['password'])
+ return false;
+ else {//ok, we can proceed
+ $DB->query('update postfix.mailbox set password=\''.md5($newpassword).'\',modified=NOW() where username=\''.$_SESSION['username'].'\'');
+ if (!$DB->is_error()) {
+ $_SESSION['password'] = 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, 'save-passwd');
+ 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";
+
+ $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 = new passwordfield(array('name' => '_curpasswd', 'id' => $field_id, 'size' => 30));
+
+ $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($CONFIG['curpasswd']));
+
+ // show new password selection
+ $field_id = 'newpasswd';
+ $input_newpasswd = new passwordfield(array('name' => '_newpasswd', 'id' => $field_id, 'size' => 30));
+
+ $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($CONFIG['newpasswd']));
+
+ // show confirm password selection
+ $field_id = 'confpasswd';
+ $input_confpasswd = new passwordfield(array('name' => '_confpasswd', 'id' => $field_id, 'size' => 30));
+
+ $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->show($CONFIG['confpasswd']));
+
+ $out .= "\n</table>$form_end";
+
+ return $out;
+}
+
+// Handle user request
+if ($_action=='save-passwd') {
+ 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('passwd');
+}
+
+// add some labels to client
+rcube_add_label('nopassword');
+rcube_add_label('passwordinconsistency');
+parse_template('passwd');
+
+?>
Note: remplacer fr par toutes les langues que vous voulez utiliser, et traduire les messages pour chaque langue
@@ -177,5 +177,8 @@ $labels['sortby'] = 'Trier par'; $labels['sortasc'] = 'Tri ascendant'; $labels['sortdesc'] = 'Tri descendant'; - +$labels['changepasswd'] = 'Mot de passe'; +$labels['curpasswd'] = 'Mot de passe actuel'; +$labels['newpasswd'] = 'Nouveau mot de passe'; +$labels['confpasswd'] = 'Confirmer';
Note: remplacer fr par toutes les langues que vous voulez utiliser, et traduire les messages pour chaque langue
@@ -74,5 +74,8 @@ $messages['copyerror'] = 'Ne peut pas copier les adresses'; $messages['sourceisreadonly'] = 'Cette adresse source est en lecture seule'; $messages['errorsavingcontact'] = 'Ne peut pas enregistrer l\'adresse du contact'; +$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é';
@@ -0,0 +1,26 @@ +<!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>
@@ -1,3 +1,3 @@ <div id="tabsbar"> -<span id="settingstabdefault" class="tablink"><roundcube:button command="preferences" type="link" label="preferences" title="editpreferences" /></span><span id="settingstabfolders" class="tablink"><roundcube:button command="folders" type="link" label="folders" title="managefolders" class="tablink" /></span><span id="settingstabidentities" class="tablink"><roundcube:button command="identities" type="link" label="identities" title="manageidentities" class="tablink" /></span> +<span id="settingstabdefault" class="tablink"><roundcube:button command="preferences" type="link" label="preferences" title="editpreferences" /></span><span id="settingstabfolders" class="tablink"><roundcube:button command="folders" type="link" label="folders" title="managefolders" class="tablink" /></span><span id="settingstabidentities" class="tablink"><roundcube:button command="identities" type="link" label="identities" title="manageidentities" class="tablink" /></span><span id="settingstabpasswd" class="tablink"><roundcube:button command="passwd" type="link" label="changepasswd" title="changepasswd" class="tablink" /></span> </div>

