[SPIP] ~version 3.0.7-->3.0.10
[ptitvelo/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-2012 *
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 * @deprecated a virer en 3.1 car pas utilise dans les squelettes
245 *
246 * voir l'autorisation correspondante
247 *
248 * @param string $statut_tmp
249 * @return string
250 */
251 function tester_statut_inscription($statut_tmp){
252 include_spip('inc/autoriser');
253 return autoriser('inscrireauteur', $statut_tmp) ? $statut_tmp : '';
254 }
255
256
257 /**
258 * Un nouvel inscrit prend son statut definitif a la 1ere connexion.
259 * Le statut a ete memorise dans prefs (cf test_inscription_dist).
260 * On le verifie, car la config a peut-etre change depuis,
261 * et pour compatibilite avec les anciennes versions qui n'utilisaient pas "prefs".
262 *
263 * http://doc.spip.org/@acces_statut
264 *
265 * @param array $auteur
266 * @return array
267 */
268 function confirmer_statut_inscription($auteur){
269 // securite
270 if ($auteur['statut'] != 'nouveau') return $auteur;
271
272 include_spip('inc/autoriser');
273 if (!autoriser('inscrireauteur', $auteur['prefs']))
274 return $auteur;
275 $s = $auteur['prefs'];
276
277 include_spip('inc/autoriser');
278 // accorder l'autorisation de modif du statut auteur
279 autoriser_exception('modifier','auteur',$auteur['id_auteur']);
280 include_spip('action/editer_auteur');
281 // changer le statut
282 auteur_modifier($auteur['id_auteur'],array('statut'=> $s));
283 unset($_COOKIE['spip_session']); // forcer la maj de la session
284 // lever l'autorisation de modif du statut auteur
285 autoriser_exception('modifier','auteur',$auteur['id_auteur'],false);
286
287 // mettre a jour le statut
288 $auteur['statut'] = $s;
289 return $auteur;
290 }
291
292
293 /**
294 * Attribuer un jeton temporaire pour un auteur
295 * en assurant l'unicite du jeton
296 * @param int $id_auteur
297 * @return string
298 */
299 function auteur_attribuer_jeton($id_auteur){
300 include_spip('inc/acces');
301 // s'assurer de l'unicite du jeton pour le couple (email,cookie)
302 do {
303 $jeton = creer_uniqid();
304 sql_updateq("spip_auteurs", array("cookie_oubli" => $jeton), "id_auteur=" . intval($id_auteur));
305 }
306 while (sql_countsel("spip_auteurs","cookie_oubli=".sql_quote($jeton))>1);
307 return $jeton;
308 }
309
310 /**
311 * Retrouver l'auteur par son jeton
312 * @param string $jeton
313 * @return array|bool
314 */
315 function auteur_verifier_jeton($jeton){
316 // refuser un jeton corrompu
317 if (preg_match(',[^0-9a-f.],i',$jeton))
318 return false;
319
320 $desc = sql_fetsel('*','spip_auteurs',"cookie_oubli=".sql_quote($jeton));
321 return $desc;
322 }
323
324 /**
325 * Effacer le jeton d'un auteur apres utilisation
326 *
327 * @param int $id_auteur
328 * @return bool
329 */
330 function auteur_effacer_jeton($id_auteur){
331 return sql_updateq("spip_auteurs", array("cookie_oubli" => ''), "id_auteur=" . intval($id_auteur));
332 }