Carnet Wiki

Formulaire pour changer de mot de passe

Demande (cf discuter.spip)

Comment faire pour que des « visiteurs » connecté puissent changer leur mot de passer ? (je dis biens des visiteurs, qui n’ont pas accès à l’espace privé)

Réponse

Le formulaire #FORMULAIRE_MOT_DE_PASSE permet à l’auteur connecté de changer son mot de passe lorsqu’il a authentifié son adresse email (cf spip.net)

Autre réponse

Comme les visiteurs n’ont pas accès au privé, il faut leur proposer dans les squelettes publics un formulaire de changement de mot de passe. Et attention : le formulaire pour changer le mot de passe doit être distinct de celui qui permet de changer l’email. (cf #4262)

Voici un exemple de code implémentant un nouvau formulaire, appelable par la balise #FORMULAIRE_CHANGER_MOTDEPASSE.

Fichier formulaires/changer_motdepasse.html

Ce fichier utilise la balise #SAISIE, donc il faudra activer le plugin saisies https://plugins.spip.net/saisies.html.
Il est facile toutefois de remplacer le recours à ces balises par de simples champs HTML input.

<a name="#FORM-#ENV{id_auteur,nouveau}"></a>
<div class="formulaire_spip formulaire_editer formulaire_#FORM formulaire_#FORM-#ENV{id_auteur,nouveau}"
  style='margin-top:1em'>
  [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
  [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur}) <:info_recommencer:></p>]
  [(#ENV{editable})
  <form method='post' action='#ENV{action}'><div>
    [(#REM) declarer les hidden qui declencheront le service du formulaire 
    parametre : url d'action ]
    #ACTION_FORMULAIRE

    <input type='hidden' name='id_auteur' value='#ENV{id_auteur}' />
    [<input type='hidden' name='redirect' value='(#ENV**{redirect})' />]

    <h3>Changer votre mot de passe</h3>

    <div class='row' id='row_password'>
      <div class='col-md-6'>
        #SET{really_avoid_autocomplete,readonly="readonly" onfocus="this.removeAttribute('readonly');"}
        [(#SAISIE{input,new_pass,
          label=<:entree_nouveau_passe:>,
          type=password,
          class=password,
          attributs=#GET{really_avoid_autocomplete},
          autocomplete=off})]
      </div>
      <div class='col-md-6'>
        [(#SAISIE{input,new_pass2,
          label=<:info_confirmer_passe:>,
          type=password,
          class=password,
          attributs=#GET{really_avoid_autocomplete},
          autocomplete=off})]
      </div>
    </div>

    [(#REM) ici normalement ajouter les saisies supplementaires : extra et autre, a cet endroit
    NON on en veut pas ! Car on veut maîtriser la mise en page.
    <!-- e x t r a -->
    ]
    <p class='boutons'><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p>
  </div></form>
  ][(#REM) fin editable]
</div>

Fichier formulaires/changer_motdepasse.php

<?php
if (!defined('_ECRIRE_INC_VERSION')) return;

include_spip('formulaires/editer_auteur');

/**
 * @param string $id_auteur     
 * @param string $retour
 * @return array                $valeurs
 *
 */
function formulaires_changer_motdepasse_charger_dist($id_auteur='', $retour='') {
  include_spip('inc/session');
  if (!$id_auteur) {
    $id_auteur = session_get('id_auteur');
    if (!$id_auteur) {
      return array();
    }
  }
  $valeurs = formulaires_editer_auteur_charger_dist($id_auteur, $retour, '', 'auteurs_edit_config', array(), '');
  $valeurs['_action'][0] = 'changer_motdepasse';
  if ($id_auteur and (session_get('id_auteur') == $id_auteur) and ($valeurs['statut'] != '5poubelle')) {
    $valeurs['editable'] = true;
  }
  return $valeurs;
}

/**
 * @param string $id_auteur
 * @param string $retour
 * @return array
 */
function formulaires_changer_motdepasse_verifier_dist($id_auteur='', $retour=''): array {
  if (!$id_auteur) {
    $id_auteur = session_get('id_auteur');
    if (!$id_auteur) {
      return array();
    }
  }

  $erreurs = array();
  $new_pass = trim(_request('new_pass'));
  if (strlen($new_pass) < _PASS_LONGUEUR_MINI) {
    $erreurs['new_pass'] = _T('info_passe_trop_court_car_pluriel', array('nb' => _PASS_LONGUEUR_MINI));
  }
  $new_pass2 = trim(_request('new_pass2'));
  if (strlen($new_pass2) < _PASS_LONGUEUR_MINI) {
    $erreurs['new_pass2'] = _T ('info_passe_trop_court_car_pluriel', array('nb' => _PASS_LONGUEUR_MINI));
  }
  if (!count($erreurs) and ($new_pass !== $new_pass2)) {
    $erreurs['new_pass2'] = _T ('info_passes_identiques');
  }
  return $erreurs;
}

/**
 * @param string $id_auteur
 * @param string $retour
 * @return array
 */
function formulaires_changer_motdepasse_traiter_dist($id_auteur='', $retour='') {
  // refuser_traiter_formulaire_ajax(); // décommenter si c'est mieux
  if (!$id_auteur) {
    $id_auteur = session_get('id_auteur');
    if (!$id_auteur) {
      return [];
    }
  }
  $id_auteur = (int) $id_auteur;

  // courcircuiture des pré et postraitements de editer_auteur_traiter, nuisibles ici.
  include_spip('action/editer_auteur');
  $erreur = auteur_modifier($id_auteur);

  $redirect = ['redirect' => $retour];
  if ($erreur) {
    return $redirect + ['message_erreur' => $erreur];
  }
  else {
    return $redirect + ['message_ok' => 'Ok. Votre nouveau mot de passe a bien été enregistré.'];
  }
}
JLuc - Mise à jour :21 January 2025 at 21:17