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

Last change on this file since 96779 was 96779, checked in by guillaume.wauquier@…, 5 years ago

Passage du plugin en version SPIP 3.1

File size: 11.5 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("spip_auteurs",
195                                                        "email=" . sql_quote($email)) > 0) and ($id_auteur != ($id_auteur_ancien = sql_getfetsel('id_auteur',
196                                                        'spip_auteurs', "email=" . sql_quote($email))))
197                                ) {
198                                        $erreurs['email'] = _T('erreur_email_deja_existant');
199                                }
200                        }
201                }
202        }
203
204        if (preg_match(",^\s*javascript,i", _request('url_site'))) {
205                $erreurs['url_site'] = _T('info_url_site_pas_conforme');
206        }
207
208        $erreurs['message_erreur'] = '';
209
210        if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) {
211                $erreurs['new_login'] = $err;
212                $erreurs['message_erreur'] .= $err;
213        } else {
214                // pass trop court ou confirmation non identique
215                if ($p = _request('new_pass')) {
216                        if ($p != _request('new_pass2')) {
217                                $erreurs['new_pass'] = _T('info_passes_identiques');
218                                $erreurs['message_erreur'] .= _T('info_passes_identiques');
219                        }
220                        elseif ($err = motpassecomplexe_verifier_pass(_request('new_pass'))){     // PLUGIN MOTPASSECOMPLEXE
221                                $erreurs['new_pass'] = $err;
222                                $erreurs['message_erreur'] .= $err;
223                        }
224                        elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) {
225                                $erreurs['new_pass'] = $err;
226                                $erreurs['message_erreur'] .= $err;
227                        }
228                }
229        }
230
231        if (!$erreurs['message_erreur']) {
232                unset($erreurs['message_erreur']);
233        }
234
235        return $erreurs;
236}
237
238
239/**
240 * Traitements du formulaire d'édition d'un auteur
241 *
242 * En plus de l'enregistrement normal des infos de l'auteur, la fonction
243 * traite ces cas spécifiques :
244 *
245 * - Envoie lorsqu'un rédacteur n'a pas forcément l'autorisation changer
246 *   seul son adresse email, un email à la nouvelle adresse indiquée
247 *   pour vérifier l'email saisi, avec un lien dans le mai sur l'action
248 *   'confirmer_email' qui acceptera alors le nouvel email.
249 *
250 * - Crée aussi une éventuelle laision indiquée dans $associer_objet avec
251 *   cet auteur.
252 *
253 * @see formulaires_editer_objet_traiter()
254 *
255 * @param int|string $id_auteur
256 *     Identifiant de l'auteur. 'new' pour une nouvel auteur.
257 * @param string $retour
258 *     URL de redirection après le traitement
259 * @param string $associer_objet
260 *     Éventuel 'objet|x' indiquant de lier le mot créé à cet objet,
261 *     tel que 'article|3'
262 * @param string $config_fonc
263 *     Nom de la fonction ajoutant des configurations particulières au formulaire
264 * @param array $row
265 *     Valeurs de la ligne SQL de l'auteur, si connu
266 * @param string $hidden
267 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
268 * @return array
269 *     Retour des traitements
270 **/
271function formulaires_editer_auteur_traiter_dist(
272        $id_auteur = 'new',
273        $retour = '',
274        $associer_objet = '',
275        $config_fonc = 'auteurs_edit_config',
276        $row = array(),
277        $hidden = ''
278) {
279        if (_request('saisie_webmestre') or _request('webmestre')) {
280                set_request('webmestre', _request('webmestre') ? _request('webmestre') : 'non');
281        }
282        $retour = parametre_url($retour, 'email_confirm', '');
283
284        set_request('email',
285                email_valide(_request('email'))); // eviter d'enregistrer les cas qui sont acceptés par email_valide dans le verifier :
286        // "Marie@toto.com  " ou encore "Marie Toto <Marie@toto.com>"
287
288        include_spip('inc/autoriser');
289        if (!autoriser('modifier', 'auteur', $id_auteur, null, array('email' => '?'))) {
290                $email_nouveau = _request('email');
291                set_request('email'); // vider la saisie car l'auteur n'a pas le droit de modifier cet email
292                // mais si c'est son propre profil on lui envoie un email à l'adresse qu'il a indique
293                // pour qu'il confirme qu'il possede bien cette adresse
294                // son clic sur l'url du message permettre de confirmer le changement
295                // et de revenir sur son profil
296                if ($GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
297                        and $email_nouveau != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)))
298                ) {
299                        $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
300                        $texte = _T('form_auteur_mail_confirmation',
301                                array(
302                                        'url' => generer_action_auteur('confirmer_email', $email_nouveau, parametre_url($retour, 'email_modif', 'ok'))
303                                ));
304                        $envoyer_mail($email_nouveau, _T('form_auteur_confirmation'), $texte);
305                        set_request('email_confirm', $email_nouveau);
306                        if ($email_ancien) {
307                                $envoyer_mail($email_ancien, _T('form_auteur_confirmation'),
308                                        _T('form_auteur_envoi_mail_confirmation', array('email' => $email_nouveau)));
309                        }
310                        $retour = parametre_url($retour, 'email_confirm', $email_nouveau);
311                }
312        }
313
314        $res = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
315
316        // Un lien auteur a prendre en compte ?
317        if ($associer_objet and $id_auteur = $res['id_auteur']) {
318                $objet = '';
319                if (intval($associer_objet)) {
320                        $objet = 'article';
321                        $id_objet = intval($associer_objet);
322                } elseif (preg_match(',^\w+\|[0-9]+$,', $associer_objet)) {
323                        list($objet, $id_objet) = explode('|', $associer_objet);
324                }
325                if ($objet and $id_objet and autoriser('modifier', $objet, $id_objet)) {
326                        include_spip('action/editer_auteur');
327                        auteur_associer($id_auteur, array($objet => $id_objet));
328                        if (isset($res['redirect'])) {
329                                $res['redirect'] = parametre_url($res['redirect'], "id_lien_ajoute", $id_auteur, '&');
330                        }
331                }
332        }
333
334        return $res;
335}
Note: See TracBrowser for help on using the repository browser.