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';