diff --git a/formulaires/mot_de_passe.php b/formulaires/mot_de_passe.php
new file mode 100644
index 0000000..ff5048c
--- /dev/null
+++ b/formulaires/mot_de_passe.php
@@ -0,0 +1,173 @@
+'5poubelle'", "pass<>''")
+ );
+ } elseif ($jeton) {
+ include_spip('action/inscrire_auteur');
+ if ($auteur = auteur_verifier_jeton($jeton)
+ and $auteur['statut'] <> '5poubelle'
+ ) {
+ return $auteur;
+ }
+ }
+
+ return false;
+}
+
+// chargement des valeurs par defaut des champs du formulaire
+/**
+ * Chargement de l'auteur qui peut changer son mot de passe.
+ * Soit un cookie d'oubli fourni par #FORMULAIRE_OUBLI est passe dans l'url par &p=
+ * Soit un id_auteur est passe en parametre #FORMULAIRE_MOT_DE_PASSE{#ID_AUTEUR}
+ * Dans les deux cas on verifie que l'auteur est autorise
+ *
+ * @param int $id_auteur
+ * @return array
+ */
+function formulaires_mot_de_passe_charger_dist($id_auteur = null, $jeton = null) {
+
+ $valeurs = array();
+ // compatibilite anciens appels du formulaire
+ if (is_null($jeton)) {
+ $jeton = _request('p');
+ }
+ $auteur = retrouve_auteur($id_auteur, $jeton);
+
+ if ($auteur) {
+ $valeurs['id_auteur'] = $id_auteur; // a toutes fins utiles pour le formulaire
+ if ($jeton) {
+ $valeurs['_hidden'] = '';
+ }
+ } else {
+ $valeurs['_hidden'] = _T('pass_erreur_code_inconnu');
+ $valeurs['editable'] = false; // pas de saisie
+ }
+ $valeurs['oubli'] = '';
+ // le champ login n'est pas utilise, mais il est destine aux navigateurs smarts
+ // qui veulent remplir le formulaire avec login/mot de passe
+ // et qui sinon remplissent le champ nobot (autocomplete=off n'est pas une option, certains navigateurs l'ignorant)
+ $valeurs['login'] = '';
+ $valeurs['nobot'] = '';
+
+ return $valeurs;
+}
+
+/**
+ * Verification de la saisie du mot de passe.
+ * On verifie qu'un mot de passe est saisi, et que sa longuer est suffisante
+ * Ce serait le lieu pour verifier sa qualite (caracteres speciaux ...)
+ *
+ * @param int $id_auteur
+ */
+function formulaires_mot_de_passe_verifier_dist($id_auteur = null, $jeton = null) {
+ $erreurs = array();
+ if (!_request('oubli')) {
+ $erreurs['oubli'] = _T('info_obligatoire');
+ } else {
+ if (strlen($p = _request('oubli')) < _PASS_LONGUEUR_MINI) {
+ $erreurs['oubli'] = _T('info_passe_trop_court_car_pluriel', array('nb' => _PASS_LONGUEUR_MINI));
+ } else {
+ if (!is_null($c = _request('oubli_confirm'))) {
+ if (!$c) {
+ $erreurs['oubli_confirm'] = _T('info_obligatoire');
+ } elseif ($c !== $p) {
+ $erreurs['oubli'] = _T('info_passes_identiques');
+ }
+ }
+ }
+ }
+ if (isset($erreurs['oubli'])) {
+ set_request('oubli');
+ set_request('oubli_confirm');
+ }
+
+ if (_request('nobot')) {
+ $erreurs['message_erreur'] = _T('pass_rien_a_faire_ici');
+ }
+ // precaution
+ if (_request('login')) {
+ set_request('login');
+ }
+
+ return $erreurs;
+}
+
+/**
+ * Modification du mot de passe d'un auteur.
+ * Utilise le cookie d'oubli fourni en url ou l'argument du formulaire pour identifier l'auteur
+ *
+ * @param int $id_auteur
+ */
+function formulaires_mot_de_passe_traiter_dist($id_auteur = null, $jeton = null) {
+ $res = array('message_ok' => '');
+ refuser_traiter_formulaire_ajax(); // puisqu'on va loger l'auteur a la volee (c'est bonus)
+
+ // compatibilite anciens appels du formulaire
+ if (is_null($jeton)) {
+ $jeton = _request('p');
+ }
+ $row = retrouve_auteur($id_auteur, $jeton);
+
+ if ($row
+ && ($id_auteur = $row['id_auteur'])
+ && ($oubli = _request('oubli'))
+ ) {
+ include_spip('action/editer_auteur');
+ include_spip('action/inscrire_auteur');
+ if ($err = auteur_modifier($id_auteur, array('pass' => $oubli))) {
+ $res = array('message_erreur' => $err);
+ } else {
+ auteur_effacer_jeton($id_auteur);
+
+ // Par défaut, on rappelle de s'identifier avec son email s'il existe
+ // et qu'il n'est PAS utilisé par quelqu'un d'autre
+ if (
+ $row['email']
+ and !sql_fetsel(
+ 'id_auteur',
+ 'spip_auteurs',
+ array(
+ '(email='.sql_quote($row['email']).' or login='.sql_quote($row['email']).')',
+ 'id_auteur != '.$id_auteur
+ ),
+ '', '', '0,1'
+ )
+ ) {
+ $identifiant = $row['email'];
+ }
+ // Sinon on dit d'utiliser le login
+ else {
+ $identifiant = $row['login'];
+ }
+ $res['message_ok'] = '' . _T('pass_nouveau_enregistre') . '' .
+ '
' . _T('pass_rappel_login', array('login' => $identifiant));
+
+ include_spip('inc/auth');
+ $row = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
+ auth_loger($row);
+ }
+ }
+
+ return $res;
+}