[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / action / inscrire_auteur.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
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')) return;
14
15
16 /**
17 * Inscrire un nouvel auteur sur la base de son nom et son email
18 * L'email est utilise pour reperer si il existe deja ou non
19 * => identifiant par defaut
20 *
21 * @param string $statut
22 * @param string $mail_complet
23 * @param string $nom
24 * @param array $options
25 * login : login precalcule
26 * id : id_rubrique fournit en second arg de #FORMULAIRE_INSCRIPTION
27 * from : email de l'envoyeur pour l'envoi du mail d'inscription
28 * force_nouveau : forcer le statut nouveau sur l'auteur inscrit, meme si il existait deja en base
29 * modele_mail : squelette de mail a utiliser
30 * @return array|string
31 */
32 function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = array()){
33 if (!is_array($options))
34 $options = array('id'=>$options);
35
36 if (function_exists('test_inscription'))
37 $f = 'test_inscription';
38 else $f = 'test_inscription_dist';
39 $desc = $f($statut, $mail_complet, $nom, $options);
40
41 // erreur ?
42 if (!is_array($desc))
43 return _T($desc);
44
45 include_spip('base/abstract_sql');
46 $res = sql_select("statut, id_auteur, login, email", "spip_auteurs", "email=" . sql_quote($desc['email']));
47 // erreur ?
48 if (!$res)
49 return _T('titre_probleme_technique');
50
51 $row = sql_fetch($res);
52 sql_free($res);
53 if ($row){
54 if (isset($options['force_nouveau']) AND $options['force_nouveau']==true){
55 $desc['id_auteur'] = $row['id_auteur'];
56 $desc = inscription_nouveau($desc);
57 }
58 else
59 $desc = $row;
60 }
61 else
62 // s'il n'existe pas deja, creer les identifiants
63 $desc = inscription_nouveau($desc);
64
65 // erreur ?
66 if (!is_array($desc))
67 return $desc;
68
69
70 // generer le mot de passe (ou le refaire si compte inutilise)
71 $desc['pass'] = creer_pass_pour_auteur($desc['id_auteur']);
72
73 // attribuer un jeton pour confirmation par clic sur un lien
74 $desc['jeton'] = auteur_attribuer_jeton($desc['id_auteur']);
75
76 // charger de suite cette fonction, pour ses utilitaires
77 $envoyer_inscription = charger_fonction("envoyer_inscription","");
78 list($sujet,$msg,$from,$head) = $envoyer_inscription($desc, $nom, $statut, $options);
79
80 $notifications = charger_fonction('notifications', 'inc');
81 notifications_envoyer_mails($mail_complet, $msg, $sujet, $from, $head);
82
83 // Notifications
84 $notifications('inscription', $desc['id_auteur'],
85 array('nom' => $desc['nom'], 'email' => $desc['email'])
86 );
87
88 return $desc;
89 }
90
91
92 /**
93 * fonction qu'on peut redefinir pour filtrer les adresses mail et les noms,
94 * et donner des infos supplementaires
95 * Std: controler que le nom (qui sert a calculer le login) est plausible
96 * et que l'adresse est valide. On les normalise au passage (trim etc).
97 * Retour:
98 * - si ok un tableau avec au minimum email, nom, mode (redac / forum)
99 * - si ko une chaine de langue servant d'argument a _T expliquant le refus
100 *
101 * http://doc.spip.org/@test_inscription_dist
102 *
103 * @param string $statut
104 * @param string $mail
105 * @param string $nom
106 * @param string $options
107 * @return array|string
108 */
109 function test_inscription_dist($statut, $mail, $nom, $options) {
110 include_spip('inc/filtres');
111 if (!$r = email_valide($mail)) return 'info_email_invalide';
112 $nom = trim(corriger_caracteres($nom));
113 $res = array('email' => $r, 'nom' => $nom, 'prefs' => $statut);
114 if (isset($options['login'])) {
115 $login = trim(corriger_caracteres($options['login']));
116 if((strlen ($login) >= _LOGIN_TROP_COURT) AND (strlen($nom) <= 64))
117 $res['login'] = $login;
118 }
119 if(!isset($res['login']) AND ((strlen ($nom) < _LOGIN_TROP_COURT) OR (strlen($nom) > 64)))
120 return 'ecrire:info_login_trop_court';
121 return $res;
122 }
123
124
125 /**
126 * On enregistre le demandeur comme 'nouveau', en memorisant le statut final
127 * provisoirement dans le champ prefs, afin de ne pas visualiser les inactifs
128 * A sa premiere connexion il obtiendra son statut final.
129 *
130 * http://doc.spip.org/@inscription_nouveau
131 *
132 * @param array $desc
133 * @return mixed|string
134 */
135 function inscription_nouveau($desc)
136 {
137 if (!isset($desc['login']) OR !strlen($desc['login']))
138 $desc['login'] = test_login($desc['nom'], $desc['email']);
139
140 $desc['statut'] = 'nouveau';
141 include_spip('action/editer_auteur');
142 if (isset($desc['id_auteur']))
143 $id_auteur = $desc['id_auteur'];
144 else
145 $id_auteur = auteur_inserer();
146
147 if (!$id_auteur) return _T('titre_probleme_technique');
148
149 include_spip('inc/autoriser');
150 // lever l'autorisation pour pouvoir modifier le statut
151 autoriser_exception('modifier','auteur',$id_auteur);
152 auteur_modifier($id_auteur, $desc);
153 autoriser_exception('modifier','auteur',$id_auteur,false);
154
155 $desc['id_auteur'] = $id_auteur;
156
157 return $desc;
158 }
159
160
161 /**
162 * http://doc.spip.org/@test_login
163 *
164 * @param string $nom
165 * @param string $mail
166 * @return string
167 */
168 function test_login($nom, $mail) {
169 include_spip('inc/charsets');
170 $nom = strtolower(translitteration($nom));
171 $login_base = preg_replace("/[^\w\d_]/", "_", $nom);
172
173 // il faut eviter que le login soit vraiment trop court
174 if (strlen($login_base) < 3) {
175 $mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
176 $login_base = preg_replace("/[^\w\d]/", "_", $mail);
177 }
178 if (strlen($login_base) < 3)
179 $login_base = 'user';
180
181 $login = $login_base;
182
183 for ($i = 1; ; $i++) {
184 if (!sql_countsel('spip_auteurs', "login='$login'"))
185 return $login;
186 $login = $login_base.$i;
187 }
188 return $login;
189 }
190
191
192 /**
193 * construction du mail envoyant les identifiants
194 * fonction redefinissable qui doit retourner un tableau
195 * dont les elements seront les arguments de inc_envoyer_mail
196 *
197 * http://doc.spip.org/@envoyer_inscription_dist
198 *
199 * @param array $desc
200 * @param string $nom
201 * @param string $mode
202 * @param array $options
203 * @return array
204 */
205 function envoyer_inscription_dist($desc, $nom, $mode, $options=array()) {
206
207 $contexte = array_merge($desc,$options);
208 $contexte['nom'] = $nom;
209 $contexte['mode'] = $mode;
210 $contexte['url_confirm'] = generer_url_action('confirmer_inscription','',true,true);
211 $contexte['url_confirm'] = parametre_url($contexte['url_confirm'],'email',$desc['email']);
212 $contexte['url_confirm'] = parametre_url($contexte['url_confirm'],'jeton',$desc['jeton']);
213
214 $modele_mail = 'modeles/mail_inscription';
215 if (isset($options['modele_mail']) and $options['modele_mail']){
216 $modele_mail = $options['modele_mail'];
217 }
218 $message = recuperer_fond($modele_mail, $contexte);
219 $from = (isset($options['from']) ? $options['from'] : null);
220 $head = null;
221 return array("", $message,$from,$head);
222 }
223
224
225 /**
226 * Creer un mot de passe initial aleatoire
227 *
228 * http://doc.spip.org/@creer_pass_pour_auteur
229 *
230 * @param int $id_auteur
231 * @return string
232 */
233 function creer_pass_pour_auteur($id_auteur) {
234 include_spip('inc/acces');
235 $pass = creer_pass_aleatoire(8, $id_auteur);
236 include_spip('action/editer_auteur');
237 auteur_instituer($id_auteur, array('pass'=>$pass));
238 return $pass;
239 }
240
241 /**
242 * Determine le statut d'inscription :
243 * si $statut_tmp fourni, verifie qu'il est autorise
244 * sinon determine le meilleur statut possible et le renvoie
245 *
246 * @param string $statut_tmp
247 * @param int $id
248 * @return string
249 */
250 function tester_statut_inscription($statut_tmp, $id){
251 include_spip('inc/autoriser');
252 if ($statut_tmp)
253 return autoriser('inscrireauteur', $statut_tmp, $id) ? $statut_tmp : '';
254 elseif (
255 autoriser('inscrireauteur', $statut_tmp = "1comite", $id)
256 OR autoriser('inscrireauteur', $statut_tmp = "6forum", $id))
257 return $statut_tmp;
258
259 return '';
260 }
261
262
263 /**
264 * Un nouvel inscrit prend son statut definitif a la 1ere connexion.
265 * Le statut a ete memorise dans prefs (cf test_inscription_dist).
266 * On le verifie, car la config a peut-etre change depuis,
267 * et pour compatibilite avec les anciennes versions qui n'utilisaient pas "prefs".
268 *
269 * http://doc.spip.org/@acces_statut
270 *
271 * @param array $auteur
272 * @return array
273 */
274 function confirmer_statut_inscription($auteur){
275 // securite
276 if ($auteur['statut'] != 'nouveau') return $auteur;
277
278 include_spip('inc/autoriser');
279 if (!autoriser('inscrireauteur', $auteur['prefs']))
280 return $auteur;
281 $s = $auteur['prefs'];
282
283 include_spip('inc/autoriser');
284 // accorder l'autorisation de modif du statut auteur
285 autoriser_exception('modifier','auteur',$auteur['id_auteur']);
286 include_spip('action/editer_auteur');
287 // changer le statut
288 auteur_modifier($auteur['id_auteur'],array('statut'=> $s));
289 unset($_COOKIE['spip_session']); // forcer la maj de la session
290 // lever l'autorisation de modif du statut auteur
291 autoriser_exception('modifier','auteur',$auteur['id_auteur'],false);
292
293 // mettre a jour le statut
294 $auteur['statut'] = $s;
295 return $auteur;
296 }
297
298
299 /**
300 * Attribuer un jeton temporaire pour un auteur
301 * en assurant l'unicite du jeton
302 * @param int $id_auteur
303 * @return string
304 */
305 function auteur_attribuer_jeton($id_auteur){
306 include_spip('inc/acces');
307 // s'assurer de l'unicite du jeton pour le couple (email,cookie)
308 do {
309 $jeton = creer_uniqid();
310 sql_updateq("spip_auteurs", array("cookie_oubli" => $jeton), "id_auteur=" . intval($id_auteur));
311 }
312 while (sql_countsel("spip_auteurs","cookie_oubli=".sql_quote($jeton))>1);
313 return $jeton;
314 }
315
316 /**
317 * Retrouver l'auteur par son jeton
318 * @param string $jeton
319 * @return array|bool
320 */
321 function auteur_verifier_jeton($jeton){
322 // refuser un jeton corrompu
323 if (preg_match(',[^0-9a-f.],i',$jeton))
324 return false;
325
326 $desc = sql_fetsel('*','spip_auteurs',"cookie_oubli=".sql_quote($jeton, $serveur, 'string'));
327 return $desc;
328 }
329
330 /**
331 * Effacer le jeton d'un auteur apres utilisation
332 *
333 * @param int $id_auteur
334 * @return bool
335 */
336 function auteur_effacer_jeton($id_auteur){
337 return sql_updateq("spip_auteurs", array("cookie_oubli" => ''), "id_auteur=" . intval($id_auteur));
338 }