source: spip-zone/_plugins_/motpassecomplexe/trunk/formulaires/editer_auteur.php @ 108447

Last change on this file since 108447 was 108447, checked in by erational@…, 3 years ago

Version SPIP 3.2: on met à jour les surcharges avec les évolutions du core
TODO: dans la fonction generer mot de passe il faudrait tenir compte des constraintes imposées par le plugin

File size: 13.8 KB
Line 
1<?php
2
3/**
4 * Gestion du formulaire de d'édition de rubrique
5 *
6 * @package SPIP\Core\Auteurs\Formulaires
7 **/
8
9if (!defined('_ECRIRE_INC_VERSION')) {
10        return;
11}
12
13include_spip('inc/actions');
14include_spip('inc/editer');
15include_spip('inc/filtres_ecrire'); // si on utilise le formulaire dans le public
16include_spip('inc/autoriser');
17
18/**
19 * Chargement du formulaire d'édition d'un auteur
20 *
21 * @see formulaires_editer_objet_charger()
22 *
23 * @param int|string $id_auteur
24 *     Identifiant de l'auteur. 'new' pour une nouvel auteur.
25 * @param string $retour
26 *     URL de redirection après le traitement
27 * @param string $associer_objet
28 *     Éventuel 'objet|x' indiquant de lier le mot créé à cet objet,
29 *     tel que 'article|3'
30 * @param string $config_fonc
31 *     Nom de la fonction ajoutant des configurations particulières au formulaire
32 * @param array $row
33 *     Valeurs de la ligne SQL de l'auteur, si connu
34 * @param string $hidden
35 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
36 * @return array
37 *     Environnement du formulaire
38 **/
39function formulaires_editer_auteur_charger_dist(
40        $id_auteur = 'new',
41        $retour = '',
42        $associer_objet = '',
43        $config_fonc = 'auteurs_edit_config',
44        $row = array(),
45        $hidden = ''
46) {
47        $valeurs = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
48        $valeurs['new_login'] = $valeurs['login'];
49
50        if (!autoriser('modifier', 'auteur', intval($id_auteur))) {
51                $valeurs['editable'] = '';
52        }
53
54        return $valeurs;
55}
56
57/**
58 * Identifier le formulaire en faisant abstraction des paramètres qui
59 * ne représentent pas l'objet édité
60 *
61 * @param int|string $id_auteur
62 *     Identifiant de l'auteur. 'new' pour une nouvel auteur.
63 * @param string $retour
64 *     URL de redirection après le traitement
65 * @param string $associer_objet
66 *     Éventuel 'objet|x' indiquant de lier le mot créé à cet objet,
67 *     tel que 'article|3'
68 * @param string $config_fonc
69 *     Nom de la fonction ajoutant des configurations particulières au formulaire
70 * @param array $row
71 *     Valeurs de la ligne SQL de l'auteur, si connu
72 * @param string $hidden
73 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
74 * @return string
75 *     Hash du formulaire
76 */
77function formulaires_editer_auteur_identifier_dist(
78        $id_auteur = 'new',
79        $retour = '',
80        $associer_objet = '',
81        $config_fonc = 'auteurs_edit_config',
82        $row = array(),
83        $hidden = ''
84) {
85        return serialize(array(intval($id_auteur), $associer_objet));
86}
87
88
89/**
90 * Choix par défaut des options de présentation
91 *
92 * @param array $row
93 *     Valeurs de la ligne SQL d'un auteur, si connu
94 * return array
95 *     Configuration pour le formulaire
96 */
97function auteurs_edit_config($row) {
98        global $spip_lang;
99
100        $config = $GLOBALS['meta'];
101        $config['lignes'] = 8;
102        $config['langue'] = $spip_lang;
103
104        // pour instituer_auteur
105        $config['auteur'] = $row;
106
107        //$config['restreint'] = ($row['statut'] == 'publie');
108        $auth_methode = $row['source'];
109        include_spip('inc/auth');
110        $config['edit_login'] =
111                (auth_autoriser_modifier_login($auth_methode)
112                        and autoriser('modifier', 'auteur', $row['id_auteur'], null, array('email' => true)));
113        $config['edit_pass'] =
114                (auth_autoriser_modifier_pass($auth_methode)
115                        and autoriser('modifier', 'auteur', $row['id_auteur']));
116
117        return $config;
118}
119
120/**
121 * Vérifications du formulaire d'édition d'un auteur
122 *
123 * Vérifie en plus des vérifications prévues :
124 * - qu'un rédacteur ne peut pas supprimer son adresse mail,
125 * - que le mot de passe choisi n'est pas trop court et identique à sa
126 *   deuxième saisie
127 *
128 * @see formulaires_editer_objet_verifier()
129 *
130 * @param int|string $id_auteur
131 *     Identifiant de l'auteur. 'new' pour une nouvel auteur.
132 * @param string $retour
133 *     URL de redirection après le traitement
134 * @param string $associer_objet
135 *     Éventuel 'objet|x' indiquant de lier le mot créé à cet objet,
136 *     tel que 'article|3'
137 * @param string $config_fonc
138 *     Nom de la fonction ajoutant des configurations particulières au formulaire
139 * @param array $row
140 *     Valeurs de la ligne SQL de l'auteur, si connu
141 * @param string $hidden
142 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
143 * @return array
144 *     Erreurs des saisies
145 **/
146function formulaires_editer_auteur_verifier_dist(
147        $id_auteur = 'new',
148        $retour = '',
149        $associer_objet = '',
150        $config_fonc = 'auteurs_edit_config',
151        $row = array(),
152        $hidden = ''
153) {
154        // auto-renseigner le nom si il n'existe pas, sans couper
155        titre_automatique('nom', array('email', 'login'), 255);
156        // mais il reste obligatoire si on a rien trouve
157        $erreurs = formulaires_editer_objet_verifier('auteur', $id_auteur, array('nom'));
158
159        $auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
160        $auth_methode = ($auth_methode ? $auth_methode : 'spip');
161        include_spip('inc/auth');
162        include_spip("motpassecomplexe_fonctions");   // PLUGIN MOTPASSECOMPLEXE
163        if (!nom_acceptable(_request('nom'))) {
164                $erreurs['nom'] = _T('info_nom_pas_conforme');
165        }
166
167        if ($email = _request('email')) {
168                include_spip('inc/filtres');
169                include_spip('inc/autoriser');
170                // un redacteur qui modifie son email n'a pas le droit de le vider si il y en avait un
171                if (!autoriser('modifier', 'auteur', $id_auteur, null, array('email' => '?'))
172                        and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
173                        and !strlen(trim($email))
174                        and $email != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)))
175                ) {
176                        $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
177                } else {
178                        if (!email_valide($email)) {
179                                $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
180                        }
181                }
182                # Ne pas autoriser d'avoir deux auteurs avec le même email
183                # cette fonctionalité nécessite que la base soit clean à l'activation : pas de
184                # doublon sur la requête select email,count(*) from spip_auteurs group by email ;
185                if (defined('_INTERDIRE_AUTEUR_MEME_EMAIL')) {
186                        #Nouvel auteur
187                        if (intval($id_auteur) == 0) {
188                                #Un auteur existe deja avec cette adresse ?
189                        if (sql_countsel('spip_auteurs', 'email=' . sql_quote($email)) > 0) {
190                                        $erreurs['email'] = _T('erreur_email_deja_existant');
191                                }
192                        } else {
193                                #Un auteur existe deja avec cette adresse ? et n'est pas le user courant.
194                                if ((sql_countsel(
195                                        'spip_auteurs',
196                                        'email=' . sql_quote($email)
197                                ) > 0) and ($id_auteur != ($id_auteur_ancien = sql_getfetsel(
198                                        'id_auteur',
199                                        'spip_auteurs',
200                                        'email=' . sql_quote($email)
201                                )))) {
202                                        $erreurs['email'] = _T('erreur_email_deja_existant');
203                                }
204                        }
205                }
206        }
207
208        if (!count($erreurs) and _request('reset_password')) {
209                $auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
210                $config = auteurs_edit_config($auteur);
211                if ($config['edit_pass']) {
212                        if ($email = auteur_regenerer_identifiants($id_auteur)) {
213                                $erreurs['message_ok'] = _T('message_nouveaux_identifiants_ok', array('email' => $email));
214                                $erreurs['message_erreur'] = '';
215                        } elseif ($email === false) {
216                                $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec_envoi');
217                        } else {
218                                $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec_creation');
219                        }
220                } else {
221                        $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec_creation');
222                }
223                return $erreurs;
224        }
225
226        // corriger un cas si frequent : www.example.org sans le http:// qui precede
227        if ($url = _request('url_site') and !tester_url_absolue($url)) {
228                if (strpos($url, ':') === false and strncasecmp($url, 'www.', 4) === 0) {
229                        $url = 'http://' . $url;
230                        set_request('url_site', $url);
231                }
232        }
233        // traiter les liens implicites avant de tester l'url
234        include_spip('inc/lien');
235        if ($url = calculer_url(_request('url_site')) and !tester_url_absolue($url)) {
236                $erreurs['url_site'] = _T('info_url_site_pas_conforme');
237        }
238
239        $erreurs['message_erreur'] = '';
240
241        if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) {
242                $erreurs['new_login'] = $err;
243                $erreurs['message_erreur'] .= $err;
244        } else {
245                // pass trop court ou confirmation non identique
246                if ($p = _request('new_pass')) {
247                        if ($p != _request('new_pass2')) {
248                                $erreurs['new_pass'] = _T('info_passes_identiques');
249                                $erreurs['message_erreur'] .= _T('info_passes_identiques');
250                        } elseif ($err = motpassecomplexe_verifier_pass(_request('new_pass'))){     // PLUGIN MOTPASSECOMPLEXE
251                                $erreurs['new_pass'] = $err;
252                                $erreurs['message_erreur'] .= $err;
253                        } elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) {
254                                $erreurs['new_pass'] = $err;
255                                $erreurs['message_erreur'] .= $err;
256                        }
257                }
258        }
259
260        if (!$erreurs['message_erreur']) {
261                unset($erreurs['message_erreur']);
262        }
263
264        return $erreurs;
265}
266
267
268/**
269 * Traitements du formulaire d'édition d'un auteur
270 *
271 * En plus de l'enregistrement normal des infos de l'auteur, la fonction
272 * traite ces cas spécifiques :
273 *
274 * - Envoie lorsqu'un rédacteur n'a pas forcément l'autorisation changer
275 *   seul son adresse email, un email à la nouvelle adresse indiquée
276 *   pour vérifier l'email saisi, avec un lien dans le mai sur l'action
277 *   'confirmer_email' qui acceptera alors le nouvel email.
278 *
279 * - Crée aussi une éventuelle laision indiquée dans $associer_objet avec
280 *   cet auteur.
281 *
282 * @see formulaires_editer_objet_traiter()
283 *
284 * @param int|string $id_auteur
285 *     Identifiant de l'auteur. 'new' pour une nouvel auteur.
286 * @param string $retour
287 *     URL de redirection après le traitement
288 * @param string $associer_objet
289 *     Éventuel 'objet|x' indiquant de lier le mot créé à cet objet,
290 *     tel que 'article|3'
291 * @param string $config_fonc
292 *     Nom de la fonction ajoutant des configurations particulières au formulaire
293 * @param array $row
294 *     Valeurs de la ligne SQL de l'auteur, si connu
295 * @param string $hidden
296 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
297 * @return array
298 *     Retour des traitements
299 **/
300function formulaires_editer_auteur_traiter_dist(
301        $id_auteur = 'new',
302        $retour = '',
303        $associer_objet = '',
304        $config_fonc = 'auteurs_edit_config',
305        $row = array(),
306        $hidden = ''
307) {
308        if (_request('saisie_webmestre') or _request('webmestre')) {
309                set_request('webmestre', _request('webmestre') ? _request('webmestre') : 'non');
310        }
311        $retour = parametre_url($retour, 'email_confirm', '');
312
313        set_request(
314                'email',
315                email_valide(_request('email'))
316        ); // eviter d'enregistrer les cas qui sont acceptés par email_valide dans le verifier :
317        // "Marie@toto.com  " ou encore "Marie Toto <Marie@toto.com>"
318
319        include_spip('inc/autoriser');
320        if (!autoriser('modifier', 'auteur', $id_auteur, null, array('email' => '?'))) {
321                $email_nouveau = _request('email');
322                set_request('email'); // vider la saisie car l'auteur n'a pas le droit de modifier cet email
323                // mais si c'est son propre profil on lui envoie un email à l'adresse qu'il a indique
324                // pour qu'il confirme qu'il possede bien cette adresse
325                // son clic sur l'url du message permettre de confirmer le changement
326                // et de revenir sur son profil
327                if ($GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
328                        and $email_nouveau !=
329                                ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)))
330                ) {
331                        $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
332                        $texte = _T(
333                                'form_auteur_mail_confirmation',
334                                array(
335                                        'url' => generer_action_auteur(
336                                                'confirmer_email',
337                                                $email_nouveau,
338                                                parametre_url($retour, 'email_modif', 'ok')
339                                        )
340                                )
341                        );
342                        $envoyer_mail($email_nouveau, _T('form_auteur_confirmation'), $texte);
343                        set_request('email_confirm', $email_nouveau);
344                        if ($email_ancien) {
345                                $envoyer_mail($email_ancien, _T('form_auteur_confirmation'),
346                                        _T('form_auteur_envoi_mail_confirmation', array('email' => $email_nouveau)));
347                        }
348                        $retour = parametre_url($retour, 'email_confirm', $email_nouveau);
349                }
350        }
351
352        $res = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
353
354        // Un lien auteur a prendre en compte ?
355        if ($associer_objet and $id_auteur = $res['id_auteur']) {
356                $objet = '';
357                if (intval($associer_objet)) {
358                        $objet = 'article';
359                        $id_objet = intval($associer_objet);
360                } elseif (preg_match(',^\w+\|[0-9]+$,', $associer_objet)) {
361                        list($objet, $id_objet) = explode('|', $associer_objet);
362                }
363                if ($objet and $id_objet and autoriser('modifier', $objet, $id_objet)) {
364                        include_spip('action/editer_auteur');
365                        auteur_associer($id_auteur, array($objet => $id_objet));
366                        if (isset($res['redirect'])) {
367                                $res['redirect'] = parametre_url($res['redirect'], 'id_lien_ajoute', $id_auteur, '&');
368                        }
369                }
370        }
371
372        return $res;
373}
374
375
376/**
377 * Renvoyer des identifiants
378 * @param int $id_auteur
379 * @param bool $notifier
380 * @param array $contexte
381 * @return string
382 */
383function auteur_regenerer_identifiants($id_auteur, $notifier=true, $contexte = array()) {
384        if ($id_auteur){
385                $set = array();
386                include_spip('inc/access');
387                $set['pass'] = creer_pass_aleatoire();
388
389                include_spip('action/editer_auteur');
390                auteur_modifier($id_auteur,$set);
391
392                $row = sql_fetsel('*','spip_auteurs','id_auteur='.intval($id_auteur));
393                include_spip('inc/filtres');
394                if ($notifier
395                        and $row['email']
396                        and email_valide($row['email'])
397                  and trouver_fond($fond = 'modeles/mail_nouveaux_identifiants')){
398                        // envoyer l'email avec login/pass
399                        $c = array(
400                                'id_auteur' => $id_auteur,
401                                'nom' => $row['nom'],
402                                'mode' => $row['statut'],
403                                'email' => $row['email'],
404                                'pass' => $set['pass'],
405                        );
406                        // on merge avec les champs fournit en appel, qui sont passes au modele de notification donc
407                        $contexte = array_merge($contexte, $c);
408                        $message = recuperer_fond($fond, $contexte);
409                        include_spip("inc/notifications");
410                        notifications_envoyer_mails($row['email'],$message);
411
412                        return $row['email'];
413                }
414
415                return false;
416
417        }
418
419        return '';
420}
Note: See TracBrowser for help on using the repository browser.