Changer son mot de passe dans roundcubemail+postfix+utilisateurs virtuels

closeCet article a été publié il y a 13 ans 5 mois 22 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

Dans la lignée des articles suivant :

Voici maintenant comment « configurer et activer le plugin de changement de mot de passe dans roundcubemail (actuellement v0.4) sur des utilisateurs virtuels (SQL)« . Depuis la 0.4, le plugin est intégré et propre. Pas la peine d’ajouter du code PHP un peu partout.
Notez que le plugin est modulaire et gère des « drivers » pour l’authentification : sql, ldap, poppassd, cyrus/SASL etc.
Allez, let’s go!

Vu que j’avais eu quelques déboires avec les vieilles versions de roundcube, je suis parti sur la dernière release stable du site officiel, pas d’une version packagée Debian.

Toute la doc tient dans un README simpliste, dans vos sources roundcubemail, fichier /plugins/password/README. Mon article applique ceci en expliquant un peu plus…

Je considère que vous partez d’une configuration d’utilisateurs virtuels comme décrite dans mes docs mentionnés en haut de l’article. Sinon il faut adapter et je ne peux pas prédire ce que vous devez écrire :).
Dans vos sources roundcube, renommez/copiez le fichier /plugins/password/config.inc.php.dist en /plugins/password/config.inc.php et modifiez uniquement ce qui suit :

$rcmail_config['password_db_dsn'] = 'mysql://admin:son_pass@localhost/ma_base';
$rcmail_config['password_query'] = 'UPDATE ma_base.users SET password=ENCRYPT(%p) WHERE email=%u LIMIT 1';

Dans password_db_dsn, on indique la base de données des utilisateurs virtuels. Puisque l’outil roundcube bosse sur SA base de données, il faudra bien qu’il aille voir autre part. A vous de voir si vous lui donnez l’accès admin à votre base ou un compte sur mesure capable de faire des UPDATE uniquement sur la table des utilisateurs. Ca ou tous les droits, c’est pas foncièrement différent me direz-vous.
Dans password_query, on indique la requête d’UPDATE. Remarques :

  • Non, pas la peine d’ajouter un « WHERE… AND password = ENCRYPT(%o) » pour soit disant contrôler que l’ancien pass est le bon. D’une part c’est contrôlé au niveau de la session PHP via une fonction « decrypt » (cherchez dans le code) et d’autre part, ENCRYPT ne produit pas nécessairement le même résultat pour un pass donné, l’histoire du ‘salt’, aléatoire lorsqu’on ne le précise pas (amha).
  • On limite à 1 par sécurité et aussi car le plugin gueule s’il n’a pas modifié qu’une ligne. En même temps, il a raison 🙂
  • Je préfère forcer le nom complet « ma_base.users » pour éviter une erreur, si 2 tables avaient le même nom dans les 2 bases, je pense

J’ai passé sous silence ces 2 paramètres déjà OK de base :

$rcmail_config['password_driver'] = 'sql';
$rcmail_config['password_confirm_current'] = true;

Enfin, on active le plugin dans la conf principale, fichier config/main.inc.php :

$rcmail_config['plugins'] = array('password');

Voilà, c’est tout. Rechargez la page des préférences sur roundcube. Tout ceci étant en PHP, c’est dynamique et vous verrez l’onglet de changement de mot de passe, et il devrait fonctionner 🙂

8 comments

  1. Bonjour,

    Juste un message pour te signaler que le lien « Kit de survie Debian « testing » » de ton menu « copinage »…

    Dommage pour nous 🙂

  2. Il existe aussi le package « poppassd » qui est un service pour changer le mot d’un compte, en ignorant le type de base de données sous-jacente.
    Dans config.inc.php:
    $rcmail_config[‘password_driver’] = ‘poppassd’;

    En dehors de « mysql », j’ai le même genre de conf qui tourne chez mon dealer 🙂
    A+

  3. Bonjour,
    J’ai le message « Impossible d’enregistrer le nouveau mot de passe. ». Je ne sais pas quoi faire?
    Merci

  4. baaah, présenté comme ça, c’est un peu court. Je dirais de tester la requête la requête d’UPDATE, de lire les logs dans /var/log etc pour déverminer la chose

  5. Oui c’est, je vais essayé d’être plus claire. J’ai ce message d’erreur quand je tente de mettre a jour mon mdp dans roundcube. Quand je passe la requete ‘UPDATE ma_base.users SET password=ENCRYPT(%p) WHERE email=%u LIMIT 1’ il me dit (a juste titre) qu’il ne connait ni email ni password. En effet ma table user est composé de la façon suivante:
    CREATE TABLE IF NOT EXISTS `users` (
    `user_id` int(10) unsigned NOT NULL auto_increment,
    `username` varchar(128) character set utf8 collate utf8_bin NOT NULL,
    `mail_host` varchar(128) NOT NULL,
    `alias` varchar(128) character set utf8 collate utf8_bin NOT NULL,
    `created` datetime NOT NULL default ‘1000-01-01 00:00:00’,
    `last_login` datetime default NULL,
    `language` varchar(5) default NULL,
    `preferences` text,
    PRIMARY KEY (`user_id`),
    UNIQUE KEY `username` (`username`,`mail_host`),
    KEY `alias_index` (`alias`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

    et je ne trouve pas le champs password… Je pense qu’il prend mon mdp directe sur mon user qmail, non?
    Est ce que j’ai une autre version?

    Merci d’avance.

  6. Ouaip, ça doit être cablé pour dire d’aller chercher le mot de passe autre part. Par exemple le mot de passe de l’OS. Ce serait curieux vu que l’utilité de stocker ses comptes mails en base MySQL est avant tout, je pense, de désolidariser les comptes mails des comptes OS. A voir dans les fichiers de conf du serveur de mails. En procédant par analogie avec « ma conf » qui est décrite avec les liens en début d’articles. Exemple avec postfix : commencer par éplucher les fichiers de conf « virtual mysql machin truc » dans /etc/postfix

  7. Bonjour,

    Je déterre cet article qui m’a bien aidé sauf que, comme Michael, la requête ne s’exécutait pas car les mots de passe sont stockés dans Postfix et non Roundcube. Sachant que ma base Postfix s’appelle « mail ». Ce qui donne :

    $rcmail_config[‘password_db_dsn’] = ‘mysql://user:pw@localhost/mail’;
    $rcmail_config[‘password_query’] = ‘UPDATE `mailbox` SET `password` = %c, modified=now() WHERE `username` = %u LIMIT 1’;

    Pascal

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.