[SPIP] ~v3.2.5-->v3.2.7
[lhc/web/www.git] / www / squelettes-dist / formulaires / mot_de_passe.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) {
14 return;
15 }
16
17 include_spip('base/abstract_sql');
18
19 function retrouve_auteur($id_auteur, $jeton = '') {
20 if ($id_auteur = intval($id_auteur)) {
21 return sql_fetsel(
22 '*',
23 'spip_auteurs',
24 array('id_auteur=' . intval($id_auteur), "statut<>'5poubelle'", "pass<>''")
25 );
26 } elseif ($jeton) {
27 include_spip('action/inscrire_auteur');
28 if ($auteur = auteur_verifier_jeton($jeton)
29 and $auteur['statut'] <> '5poubelle'
30 and $auteur['pass'] <> ''
31 ) {
32 return $auteur;
33 }
34 }
35
36 return false;
37 }
38
39 // chargement des valeurs par defaut des champs du formulaire
40 /**
41 * Chargement de l'auteur qui peut changer son mot de passe.
42 * Soit un cookie d'oubli fourni par #FORMULAIRE_OUBLI est passe dans l'url par &p=
43 * Soit un id_auteur est passe en parametre #FORMULAIRE_MOT_DE_PASSE{#ID_AUTEUR}
44 * Dans les deux cas on verifie que l'auteur est autorise
45 *
46 * @param int $id_auteur
47 * @return array
48 */
49 function formulaires_mot_de_passe_charger_dist($id_auteur = null, $jeton = null) {
50
51 $valeurs = array();
52 // compatibilite anciens appels du formulaire
53 if (is_null($jeton)) {
54 $jeton = _request('p');
55 }
56 $auteur = retrouve_auteur($id_auteur, $jeton);
57
58 if ($auteur) {
59 $valeurs['id_auteur'] = $id_auteur; // a toutes fins utiles pour le formulaire
60 if ($jeton) {
61 $valeurs['_hidden'] = '<input type="hidden" name="p" value="' . $jeton . '" />';
62 }
63 } else {
64 $valeurs['_hidden'] = _T('pass_erreur_code_inconnu');
65 $valeurs['editable'] = false; // pas de saisie
66 }
67 $valeurs['oubli'] = '';
68 // le champ login n'est pas utilise, mais il est destine aux navigateurs smarts
69 // qui veulent remplir le formulaire avec login/mot de passe
70 // et qui sinon remplissent le champ nobot (autocomplete=off n'est pas une option, certains navigateurs l'ignorant)
71 $valeurs['login'] = '';
72 $valeurs['nobot'] = '';
73
74 return $valeurs;
75 }
76
77 /**
78 * Verification de la saisie du mot de passe.
79 * On verifie qu'un mot de passe est saisi, et que sa longuer est suffisante
80 * Ce serait le lieu pour verifier sa qualite (caracteres speciaux ...)
81 *
82 * @param int $id_auteur
83 */
84 function formulaires_mot_de_passe_verifier_dist($id_auteur = null, $jeton = null) {
85 $erreurs = array();
86 if (!_request('oubli')) {
87 $erreurs['oubli'] = _T('info_obligatoire');
88 } else {
89 if (strlen($p = _request('oubli')) < _PASS_LONGUEUR_MINI) {
90 $erreurs['oubli'] = _T('info_passe_trop_court_car_pluriel', array('nb' => _PASS_LONGUEUR_MINI));
91 } else {
92 if (!is_null($c = _request('oubli_confirm'))) {
93 if (!$c) {
94 $erreurs['oubli_confirm'] = _T('info_obligatoire');
95 } elseif ($c !== $p) {
96 $erreurs['oubli'] = _T('info_passes_identiques');
97 }
98 }
99 }
100 }
101 if (isset($erreurs['oubli'])) {
102 set_request('oubli');
103 set_request('oubli_confirm');
104 }
105
106 if (_request('nobot')) {
107 $erreurs['message_erreur'] = _T('pass_rien_a_faire_ici');
108 }
109 // precaution
110 if (_request('login')) {
111 set_request('login');
112 }
113
114 return $erreurs;
115 }
116
117 /**
118 * Modification du mot de passe d'un auteur.
119 * Utilise le cookie d'oubli fourni en url ou l'argument du formulaire pour identifier l'auteur
120 *
121 * @param int $id_auteur
122 */
123 function formulaires_mot_de_passe_traiter_dist($id_auteur = null, $jeton = null) {
124 $res = array('message_ok' => '');
125 refuser_traiter_formulaire_ajax(); // puisqu'on va loger l'auteur a la volee (c'est bonus)
126
127 // compatibilite anciens appels du formulaire
128 if (is_null($jeton)) {
129 $jeton = _request('p');
130 }
131 $row = retrouve_auteur($id_auteur, $jeton);
132
133 if ($row
134 && ($id_auteur = $row['id_auteur'])
135 && ($oubli = _request('oubli'))
136 ) {
137 include_spip('action/editer_auteur');
138 include_spip('action/inscrire_auteur');
139 if ($err = auteur_modifier($id_auteur, array('pass' => $oubli))) {
140 $res = array('message_erreur' => $err);
141 } else {
142 auteur_effacer_jeton($id_auteur);
143
144 // Par défaut, on rappelle de s'identifier avec son email s'il existe
145 // et qu'il n'est PAS utilisé par quelqu'un d'autre
146 if (
147 $row['email']
148 and !sql_fetsel(
149 'id_auteur',
150 'spip_auteurs',
151 array(
152 '(email='.sql_quote($row['email']).' or login='.sql_quote($row['email']).')',
153 'id_auteur != '.$id_auteur
154 ),
155 '', '', '0,1'
156 )
157 ) {
158 $identifiant = $row['email'];
159 }
160 // Sinon on dit d'utiliser le login
161 else {
162 $identifiant = $row['login'];
163 }
164 $res['message_ok'] = '<b>' . _T('pass_nouveau_enregistre') . '</b>' .
165 '<br />' . _T('pass_rappel_login', array('login' => $identifiant));
166
167 include_spip('inc/auth');
168 $row = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
169 auth_loger($row);
170 }
171 }
172
173 return $res;
174 }