[SPIP] ~v3.2.3-->v3.2.4
[lhc/web/www.git] / www / prive / formulaires / editer_auteur.php
1 <?php
2
3 /**
4 * Gestion du formulaire de d'édition de rubrique
5 *
6 * @package SPIP\Core\Auteurs\Formulaires
7 **/
8
9 if (!defined('_ECRIRE_INC_VERSION')) {
10 return;
11 }
12
13 include_spip('inc/actions');
14 include_spip('inc/editer');
15 include_spip('inc/filtres_ecrire'); // si on utilise le formulaire dans le public
16 include_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 **/
39 function 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 */
77 function 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 */
97 function 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 **/
146 function 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
157 $oblis = array('nom');
158 // si on veut renvoyer des identifiants il faut un email et un login
159 if (_request('reset_password')) {
160 $oblis[] = 'email';
161 $oblis[] = 'new_login';
162 }
163 // mais il reste obligatoire si on a rien trouve
164 $erreurs = formulaires_editer_objet_verifier('auteur', $id_auteur, $oblis);
165 if (isset($erreurs['new_login'])) {
166 $erreurs['login'] = $erreurs['new_login'];
167 unset($erreurs['new_login']);
168 }
169
170 $auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
171 $auth_methode = ($auth_methode ? $auth_methode : 'spip');
172 include_spip('inc/auth');
173
174 if (!nom_acceptable(_request('nom'))) {
175 $erreurs['nom'] = _T('info_nom_pas_conforme');
176 }
177
178 if ($email = _request('email')) {
179 include_spip('inc/filtres');
180 include_spip('inc/autoriser');
181 // un redacteur qui modifie son email n'a pas le droit de le vider si il y en avait un
182 if (!autoriser('modifier', 'auteur', $id_auteur, null, array('email' => '?'))
183 and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
184 and !strlen(trim($email))
185 and $email != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)))
186 ) {
187 $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
188 } else {
189 if (!email_valide($email)) {
190 $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
191 }
192 }
193 # Ne pas autoriser d'avoir deux auteurs avec le même email
194 # cette fonctionalité nécessite que la base soit clean à l'activation : pas de
195 # doublon sur la requête select email,count(*) from spip_auteurs group by email ;
196 if (defined('_INTERDIRE_AUTEUR_MEME_EMAIL')) {
197 #Nouvel auteur
198 if (intval($id_auteur) == 0) {
199 #Un auteur existe deja avec cette adresse ?
200 if (sql_countsel('spip_auteurs', 'email=' . sql_quote($email)) > 0) {
201 $erreurs['email'] = _T('erreur_email_deja_existant');
202 }
203 } else {
204 #Un auteur existe deja avec cette adresse ? et n'est pas le user courant.
205 if ((sql_countsel(
206 'spip_auteurs',
207 'email=' . sql_quote($email)
208 ) > 0) and ($id_auteur != ($id_auteur_ancien = sql_getfetsel(
209 'id_auteur',
210 'spip_auteurs',
211 'email=' . sql_quote($email)
212 )))) {
213 $erreurs['email'] = _T('erreur_email_deja_existant');
214 }
215 }
216 }
217 }
218
219 // quand c'est un auteur existant on fait le reset password ici
220 if (!count($erreurs) and _request('reset_password') and intval($id_auteur)) {
221 $erreurs = auteur_reset_password($id_auteur, $erreurs);
222 return $erreurs;
223 }
224
225 // corriger un cas si frequent : www.example.org sans le http:// qui precede
226 if ($url = _request('url_site') and !tester_url_absolue($url)) {
227 if (strpos($url, ':') === false and strncasecmp($url, 'www.', 4) === 0) {
228 $url = 'http://' . $url;
229 set_request('url_site', $url);
230 }
231 }
232 // traiter les liens implicites avant de tester l'url
233 include_spip('inc/lien');
234 if ($url = calculer_url(_request('url_site')) and !tester_url_absolue($url)) {
235 $erreurs['url_site'] = _T('info_url_site_pas_conforme');
236 }
237
238 $erreurs['message_erreur'] = '';
239
240 if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) {
241 $erreurs['new_login'] = $err;
242 $erreurs['message_erreur'] .= $err;
243 } else {
244 // pass trop court ou confirmation non identique
245 if ($p = _request('new_pass')) {
246 if ($p != _request('new_pass2')) {
247 $erreurs['new_pass'] = _T('info_passes_identiques');
248 $erreurs['message_erreur'] .= _T('info_passes_identiques');
249 } elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) {
250 $erreurs['new_pass'] = $err;
251 $erreurs['message_erreur'] .= $err;
252 }
253 }
254 }
255
256 if (!$erreurs['message_erreur']) {
257 unset($erreurs['message_erreur']);
258 }
259
260 return $erreurs;
261 }
262
263
264 /**
265 * Traitements du formulaire d'édition d'un auteur
266 *
267 * En plus de l'enregistrement normal des infos de l'auteur, la fonction
268 * traite ces cas spécifiques :
269 *
270 * - Envoie lorsqu'un rédacteur n'a pas forcément l'autorisation changer
271 * seul son adresse email, un email à la nouvelle adresse indiquée
272 * pour vérifier l'email saisi, avec un lien dans le mai sur l'action
273 * 'confirmer_email' qui acceptera alors le nouvel email.
274 *
275 * - Crée aussi une éventuelle laision indiquée dans $associer_objet avec
276 * cet auteur.
277 *
278 * @see formulaires_editer_objet_traiter()
279 *
280 * @param int|string $id_auteur
281 * Identifiant de l'auteur. 'new' pour une nouvel auteur.
282 * @param string $retour
283 * URL de redirection après le traitement
284 * @param string $associer_objet
285 * Éventuel 'objet|x' indiquant de lier le mot créé à cet objet,
286 * tel que 'article|3'
287 * @param string $config_fonc
288 * Nom de la fonction ajoutant des configurations particulières au formulaire
289 * @param array $row
290 * Valeurs de la ligne SQL de l'auteur, si connu
291 * @param string $hidden
292 * Contenu HTML ajouté en même temps que les champs cachés du formulaire.
293 * @return array
294 * Retour des traitements
295 **/
296 function formulaires_editer_auteur_traiter_dist(
297 $id_auteur = 'new',
298 $retour = '',
299 $associer_objet = '',
300 $config_fonc = 'auteurs_edit_config',
301 $row = array(),
302 $hidden = ''
303 ) {
304 if (_request('saisie_webmestre') or _request('webmestre')) {
305 set_request('webmestre', _request('webmestre') ? _request('webmestre') : 'non');
306 }
307 $retour = parametre_url($retour, 'email_confirm', '');
308
309 set_request(
310 'email',
311 email_valide(_request('email'))
312 ); // eviter d'enregistrer les cas qui sont acceptés par email_valide dans le verifier :
313 // "Marie@toto.com " ou encore "Marie Toto <Marie@toto.com>"
314
315 include_spip('inc/autoriser');
316 if (!autoriser('modifier', 'auteur', $id_auteur, null, array('email' => '?'))) {
317 $email_nouveau = _request('email');
318 set_request('email'); // vider la saisie car l'auteur n'a pas le droit de modifier cet email
319 // mais si c'est son propre profil on lui envoie un email à l'adresse qu'il a indique
320 // pour qu'il confirme qu'il possede bien cette adresse
321 // son clic sur l'url du message permettre de confirmer le changement
322 // et de revenir sur son profil
323 if ($GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
324 and $email_nouveau !=
325 ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)))
326 ) {
327 $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
328 $texte = _T(
329 'form_auteur_mail_confirmation',
330 array(
331 'url' => generer_action_auteur(
332 'confirmer_email',
333 $email_nouveau,
334 parametre_url($retour, 'email_modif', 'ok')
335 )
336 )
337 );
338 $envoyer_mail($email_nouveau, _T('form_auteur_confirmation'), $texte);
339 set_request('email_confirm', $email_nouveau);
340 if ($email_ancien) {
341 $envoyer_mail($email_ancien, _T('form_auteur_confirmation'),
342 _T('form_auteur_envoi_mail_confirmation', array('email' => $email_nouveau)));
343 }
344 $retour = parametre_url($retour, 'email_confirm', $email_nouveau);
345 }
346 }
347
348 $res = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
349
350 if (_request('reset_password') and !intval($id_auteur) and intval($res['id_auteur'])) {
351 $erreurs = array();
352 $erreurs = auteur_reset_password($res['id_auteur'], $erreurs);
353 if (isset($erreurs['message_ok'])) {
354 if (!isset($res['message_ok'])) $res['message_ok'] = '';
355 $res['message_ok'] = trim($res['message_ok'] . ' ' . $erreurs['message_ok']);
356 }
357 if (isset($erreurs['message_erreur']) and $erreurs['message_erreur']) {
358 if (!isset($res['message_erreur'])) $res['message_erreur'] = '';
359 $res['message_erreur'] = trim($res['message_erreur'] . ' ' . $erreurs['message_erreur']);
360 }
361 }
362
363 // Un lien auteur a prendre en compte ?
364 if ($associer_objet and $id_auteur = $res['id_auteur']) {
365 $objet = '';
366 if (intval($associer_objet)) {
367 $objet = 'article';
368 $id_objet = intval($associer_objet);
369 } elseif (preg_match(',^\w+\|[0-9]+$,', $associer_objet)) {
370 list($objet, $id_objet) = explode('|', $associer_objet);
371 }
372 if ($objet and $id_objet and autoriser('modifier', $objet, $id_objet)) {
373 include_spip('action/editer_auteur');
374 auteur_associer($id_auteur, array($objet => $id_objet));
375 if (isset($res['redirect'])) {
376 $res['redirect'] = parametre_url($res['redirect'], 'id_lien_ajoute', $id_auteur, '&');
377 }
378 }
379 }
380
381 return $res;
382 }
383
384
385 function auteur_reset_password($id_auteur, $erreurs = array()) {
386 $auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
387 $config = auteurs_edit_config($auteur);
388
389 if ($config['edit_pass']) {
390 if ($email = auteur_regenerer_identifiants($id_auteur)) {
391 $erreurs['message_ok'] = _T('message_nouveaux_identifiants_ok', array('email' => $email));
392 $erreurs['message_erreur'] = '';
393 } elseif ($email === false) {
394 $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec_envoi');
395 } else {
396 $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
397 }
398 } else {
399 $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
400 }
401
402 return $erreurs;
403 }
404
405 /**
406 * Renvoyer des identifiants
407 * @param int $id_auteur
408 * @param bool $notifier
409 * @param array $contexte
410 * @return string
411 */
412 function auteur_regenerer_identifiants($id_auteur, $notifier=true, $contexte = array()) {
413 if ($id_auteur){
414 $set = array();
415 include_spip('inc/access');
416 $set['pass'] = creer_pass_aleatoire();
417
418 include_spip('action/editer_auteur');
419 auteur_modifier($id_auteur,$set);
420
421 $row = sql_fetsel('*','spip_auteurs','id_auteur='.intval($id_auteur));
422 include_spip('inc/filtres');
423 if ($notifier
424 and $row['email']
425 and email_valide($row['email'])
426 and trouver_fond($fond = 'modeles/mail_nouveaux_identifiants')){
427 // envoyer l'email avec login/pass
428 $c = array(
429 'id_auteur' => $id_auteur,
430 'nom' => $row['nom'],
431 'mode' => $row['statut'],
432 'email' => $row['email'],
433 'pass' => $set['pass'],
434 );
435 // on merge avec les champs fournit en appel, qui sont passes au modele de notification donc
436 $contexte = array_merge($contexte, $c);
437 // si pas de langue explicitement demandee, prendre celle de l'auteur si on la connait, ou a defaut celle du site
438 // plutot que celle de l'admin qui vient de cliquer sur le bouton
439 if (!isset($contexte['lang']) or !$contexte['lang']) {
440 if (isset($row['lang']) and $row['lang']) {
441 $contexte['lang'] = $row['lang'];
442 }
443 else {
444 $contexte['lang'] = $GLOBALS['meta']['langue_site'];
445 }
446 }
447 lang_select($contexte['lang']);
448 $message = recuperer_fond($fond, $contexte);
449 include_spip("inc/notifications");
450 notifications_envoyer_mails($row['email'],$message);
451 lang_select();
452
453 return $row['email'];
454 }
455
456 return false;
457
458 }
459
460 return '';
461 }