Première solution Choisir le même mot de passe pour tout le monde et l'afficher en grand sur la page d'acceuil du site ! Cette approche ne se distingue plus beaucoup d'un site public ;-)

Pour la petite histoire, un organisation (je reste volontairement vague) possèdant un intranet a choisi comme mot de passe, chut, secret car c'est secret ;-) Son intranet permet à chaque employé de; remplir ses feuilles de présences, obtenir sa fiche de paie, ... et changer son mot de passe s'il le désire (ce que ne font qu'une infime partie des employés).

J'espère ne pas être le seul à trouver cette approche cavalière même si je suis conscient qu'énormément de gens ne s'en inquiètent pas. Bref, je ne veux pas que le mot de passe initial soit le même pour tout le monde. Next !

Deuxième solution J'affiche les logins de chacun (genre prénomNom) et lors de la première connection, je demande de cliquer sur "J'ai oublié mon mot de passe", ensuite de fournir un email et j'envoie le mot de passe.

Pour moi c'est le plus simple. Il me suffit de loguer les envois de mot de passe et ça roule. Sauf que je n'évite pas le vol d'un compte [1]. Next !

Solution retenue La solution que je retiens et qui est sans doute un peu plus complexe me permet d'éviter (je crois) ce vol de compte.

Je demande à chaque utilisateur de m'envoyer un mail avec son login et je lui retourne son mot de passe.

La différence avec la solution deux c'est que je reçois un mail de l'utilisateur et je peux (un peu) contrôler ce mail [2]. Je suis bien conscient que je ne résoud pas le problème de vol d'un compte car il est toujours possible de me leurer lors de la demande de compte ... mais cela devient un peu plus difficile.

On peut, par exemple, créer une adresse mail de la forme prenomNom@example.org chez n'importe qui (Gmail ou autre) et je croirai que c'est effectivement l'adresse du gars. Mais dans ce cas, je lui enverrai parfois des mails qui resteront sans réponse et dans le cadre qui nous occupe, ce sera détecté un jour.

On peut aussi modifier ses entêtes de mails et bidouiller à ce niveau mais ça se voit donc ... je ne m'en inquiète pas trop.

Un peu de technique maintenant (Marie-No, passe ton chemin)

Je n'ai évidement pas envie de répondre à la main à chacun, il faut que ce soit automatique. J'écris dont une petite règle procmail qui prendra en charge le mail et générera la réponse adéquate. La règle procmail se résume à ça;

:0 c:
* ^Subject:.*\[WAZUP\].*
| /home/pit/.procmail/sendmailscript 

... et je demande aux utilisateurs de m'envoyer un mail ayant comme sujet [WAZUP] login.

Pour ceux qui sont intéressé, voici le script;

#!/usr/bin/perl
use strict;
use warnings;
 
my $line;
my $login;
my $from;
my @passwords;
 
my $data_file = "/home/pit/.procmail/listing-login-password.txt";
my $log_file = "/home/pit/.procmail/log-mail";
 
# Je cherche les champs From et Subject dans le mail 
# et je récupère le login et le mail. 
while ( <> ) {
	my @junk;
 
	$line = $_;
	if ( $line =~ /^From:.*/ ) {
		@junk = split(/:/,$line);
		$from = $junk[1];
		chomp($from);
	}
	if ( $line =~ /^Subject:.*/ ) {
		@junk = split(/]/,$line);
		$login = $junk[1];
		$login =~ s/ //g;
		chomp($login);
	}
}
if ( !defined($login) ) { die "Can't find login"; }
 
 
# Je récupère (peut-être) le password correspondant au login
open(DAT, $data_file)
	or die "Can't open file $data_file: $!
";
my @raw_data = <DAT>;
@passwords = grep { /.*($login).*/i } @raw_data;
my $password = $passwords[0];
 
# J'ouvre le fichier de log pour plus tard
open(LOG,">>$log_file") || die("Cannot Open File");
 
# Je teste le résultat
if ( !defined($password) ) { 
	# NOT FOUND
	# Il reste à envoyer un mail d'ERREUR au gars ... 
	open(SENDMAIL, "|/usr/lib/sendmail -oi -t -odq")
		or die "Can't fork for sendmail: $!
";
	print SENDMAIL <<"EOF";
// Un p'tit mail d'erreur
EOF
	close(SENDMAIL) or warn "sendmail didn't close nicely";
	print LOG  localtime() . " - ERREUR - $from - $login
";
} else {
	# FOUND
	# Il reste à envoyer un mail au gars ... 
	open(SENDMAIL, "|/usr/lib/sendmail -oi -t -odq")
		or die "Can't fork for sendmail: $!
";
	print SENDMAIL <<"EOF";
// Un p'tit mail avec le password
EOF
	close(SENDMAIL) or warn "sendmail didn't close nicely";
	chomp($password);
	print LOG  localtime() . " - $from - $password
";
}
close DAT;
close LOG;

J'ai deux soucis.

Le premier problème qui se pose et auquel je m'attendais c'est que je demande aux utilisateurs de m'envoyer un mail avec comme sujet quelque chose qui matche "[WAZUP] login" et je reçois

  1. (wazup) login
  2. (WA ZUPP)
  3. Bonjour
  4. [wazup] login1 login2
  5. ...

No comment, je m'y attend et j'envoie "à la main" si j'ai le temps. Je me demande quand même si la contrainte est trop grande ou bien la méthode mauvaise mais pour rappel, Google groups et moult autres mailing list font pareils. Il suffit de lire cette FAQ Google ou celle-ci .

Le second problème est inattendu et m'incombe. Les accents dans les logins sont transformés.

Lorsque le login contient des accents, par exemple Cédric, procmail reçoit =?iso-8859-1?Q?C=E9ric?= et mon script aussi et donc ça bugge. L'utilisateur reçoit un mail d'erreur ce qui est dommage.

Si quelqu'un a une idée, je suis preneur.

Voilà voilà, tout ça pour dire que mon mot de passe c'est; secret, mais chut, ne le dites pas.

Notes

[1] Si tu connais un login, tu fournis un email genre mailinator et tu obtiens un mot de passe. Si tu choisis le login du vieux pellot qui ne viendra sans doute jamais sur le site, c'est bon !

[2] Mailinator par exemple ne permet pas l'envoi de mail juste la réception