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