erreur thunmbail4
[aidenligne_francais_universite.git] / ecrire / balise / formulaire_inscription.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2007 *
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; #securite
14
15 include_spip('base/abstract_sql');
16
17 // Balise independante du contexte
18
19 // http://doc.spip.org/@balise_FORMULAIRE_INSCRIPTION
20 function balise_FORMULAIRE_INSCRIPTION ($p) {
21
22 return calculer_balise_dynamique($p, 'FORMULAIRE_INSCRIPTION', array());
23 }
24
25 // args[0] peut valoir "redac" ou "forum"
26 // args[1] indique la rubrique eventuelle de proposition
27 // args[2] indique le focus eventuel
28 // [(#FORMULAIRE_INSCRIPTION{nom_inscription, #ID_RUBRIQUE})]
29
30 // http://doc.spip.org/@balise_FORMULAIRE_INSCRIPTION_stat
31 function balise_FORMULAIRE_INSCRIPTION_stat($args, $filtres) {
32 list($mode, $id, $focus) = $args;
33 //initialiser_mode_inscription
34 if(!$mode) $mode = $GLOBALS['meta']['accepter_inscriptions'] == 'oui' ? 'redac' : '';
35 if (!test_mode_inscription($mode))
36 return '';
37 else return array($mode, $focus, $id);
38 }
39
40 // Si inscriptions pas autorisees, retourner une chaine d'avertissement
41 // Sinon inclusion du squelette
42 // Si pas de mon ou pas de mail valide, premier appel rien d'autre a faire
43 // Autrement 2e appel, envoyer un mail et le squelette ne produira pas de
44 // formulaire.
45
46 // http://doc.spip.org/@balise_FORMULAIRE_INSCRIPTION_dyn
47 function balise_FORMULAIRE_INSCRIPTION_dyn($mode, $focus, $id=0) {
48
49 if (!test_mode_inscription($mode)) return _T('pass_rien_a_faire_ici');
50
51 $nom = _request('nom_inscription');
52 $mail = _request('mail_inscription');
53 $commentaire = ($mode=='redac') ? _T('pass_espace_prive_bla') : _T('pass_forum_bla');
54
55 if ($mail) {
56 include_spip('inc/filtres'); // pour email_valide
57 $commentaire = message_inscription($mail, $nom, $mode, $id);
58 if (is_array($commentaire)) {
59 if (function_exists('envoyer_inscription'))
60 $f = 'envoyer_inscription';
61 else
62 $f = 'envoyer_inscription_dist';
63 $commentaire = $f($commentaire, $nom, $mode, $id);
64 }
65 }
66
67 $message = $commentaire ? '' : _T('form_forum_identifiant_mail');
68
69 // #ENV*{message} doit etre non vide lorsque tout s'est bien passé
70 // #ENV*{commentaire} doit etre non vide pour afficher le formulaire
71 // et il indique si on s'inscrit a l'espace public ou prive
72 // ou donne un message d'erreur aux appels suivants si pb
73
74 return array("formulaires/inscription", $GLOBALS['delais'],
75 array('focus' => $focus,
76 'message' => $message,
77 'mode' => $mode,
78 'commentaire' => $commentaire,
79 'nom_inscription' => _request('nom_inscription'),
80 'mail_inscription' => _request('mail_inscription'),
81 'self' => str_replace('&amp;','&',(self()))));
82 }
83
84 // http://doc.spip.org/@test_mode_inscription
85 function test_mode_inscription($mode) {
86
87 return (($mode == 'redac' AND $GLOBALS['meta']['accepter_inscriptions'] == 'oui')
88 OR ($mode == 'forum'
89 AND ($GLOBALS['meta']['accepter_visiteurs'] == 'oui'
90 OR $GLOBALS['meta']['forums_publics'] == 'abo')));
91 }
92
93 // fonction qu'on peut redefinir pour filtrer les adresses mail et les noms,
94 // et donner des infos supplémentaires
95 // Std: controler que le nom (qui sert a calculer le login) est plausible
96 // et que l'adresse est valide (et on la normalise)
97 // Retour: une chaine message d'erreur
98 // ou un tableau avec au minimum email, nom, mode (redac / forum)
99
100 // http://doc.spip.org/@test_inscription_dist
101 function test_inscription_dist($mode, $mail, $nom, $id=0) {
102
103 include_spip('inc/filtres');
104 $nom = trim(corriger_caracteres($nom));
105 if (!$nom || strlen($nom) > 64)
106 return _T('ecrire:info_login_trop_court');
107 if (!$r = email_valide($mail)) return _T('info_email_invalide');
108 return array('email' => $r, 'nom' => $nom, 'bio' => $mode);
109 }
110
111 // cree un nouvel utilisateur et renvoie un message d'impossibilite
112 // ou le tableau representant la ligne SQL le decrivant.
113
114 // http://doc.spip.org/@message_inscription
115 function message_inscription($mail, $nom, $mode, $id=0) {
116
117 if (function_exists('test_inscription'))
118 $f = 'test_inscription';
119 else
120 $f = 'test_inscription_dist';
121 $declaration = $f($mode, $mail, $nom, $id);
122
123 if (is_string($declaration))
124 return $declaration;
125
126 $row = spip_query("SELECT statut, id_auteur, login, email FROM spip_auteurs WHERE email=" . _q($declaration['email']));
127 $row = spip_fetch_array($row);
128
129 if (!$row)
130 // il n'existe pas, creer les identifiants
131 return inscription_nouveau($declaration);
132 if (($row['statut'] == '5poubelle') AND !$declaration['pass'])
133 // irrecuperable
134 return _T('form_forum_access_refuse');
135
136 if (($row['statut'] != 'nouveau') AND !$declaration['pass'])
137 // deja inscrit
138 return _T('form_forum_email_deja_enregistre');
139
140 // existant mais encore muet, ou ressucite: renvoyer les infos
141 $row['pass'] = creer_pass_pour_auteur($row['id_auteur']);
142 return $row;
143 }
144
145 // On enregistre le demandeur comme 'nouveau', en memorisant le statut final
146 // provisoirement dans le champ Bio, afin de ne pas visualiser les inactifs
147 // A sa premiere connexion il obtiendra son statut final (auth->activer())
148
149 // http://doc.spip.org/@inscription_nouveau
150 function inscription_nouveau($declaration)
151 {
152 if (!isset($declaration['login']))
153 $declaration['login'] = test_login($declaration['nom'], $declaration['email']);
154
155 $declaration['statut'] = 'nouveau';
156
157 $n = spip_abstract_insert('spip_auteurs', ('(' .join(',',array_keys($declaration)).')'), ("(" .join(", ",array_map('_q', $declaration)) .")"));
158
159 $declaration['id_auteur'] = $n;
160
161 $declaration['pass'] = creer_pass_pour_auteur($declaration['id_auteur']);
162 return $declaration;
163 }
164
165 // envoyer identifiants par mail
166 // fonction redefinissable qui doit retourner false si tout est ok
167 // ou une chaine non vide expliquant pourquoi le mail n'a pas ete envoye
168
169 // http://doc.spip.org/@envoyer_inscription_dist
170 function envoyer_inscription_dist($ids, $nom, $mode, $id) {
171 include_spip('inc/mail');
172 $nom_site_spip = nettoyer_titre_email($GLOBALS['meta']["nom_site"]);
173 $adresse_site = $GLOBALS['meta']["adresse_site"];
174
175 $message = _T('form_forum_message_auto')."\n\n"
176 . _T('form_forum_bonjour', array('nom'=>$nom))."\n\n"
177 . _T((($mode == 'forum') ?
178 'form_forum_voici1' :
179 'form_forum_voici2'),
180 array('nom_site_spip' => $nom_site_spip,
181 'adresse_site' => $adresse_site . '/',
182 'adresse_login' => $adresse_site .'/'. _DIR_RESTREINT_ABS))
183 . "\n\n- "._T('form_forum_login')." " . $ids['login']
184 . "\n- ". _T('form_forum_pass'). " " . $ids['pass'] . "\n\n";
185
186 if (envoyer_mail($ids['email'],
187 "[$nom_site_spip] "._T('form_forum_identifiants'),
188 $message))
189 return false;
190 else
191 return _T('form_forum_probleme_mail');
192 }
193
194 // http://doc.spip.org/@test_login
195 function test_login($nom, $mail) {
196 include_spip('inc/charsets');
197 $nom = strtolower(translitteration($nom));
198 $login_base = ereg_replace("[^a-zA-Z0-9_]", "_", $nom);
199
200 // il faut eviter que le login soit vraiment trop court
201 if (strlen($login_base) < 3) {
202 $mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
203 $login_base = ereg_replace("[^a-zA-Z0-9]", "_", $nom);
204 }
205 if (strlen($login_base) < 3)
206 $login_base = 'user';
207
208 // eviter aussi qu'il soit trop long (essayer d'attraper le prenom)
209 if (strlen($login_base) > 10) {
210 $login_base = preg_replace("/^(.{4,}(_.{1,7})?)_.*/",
211 '\1', $login_base);
212 $login_base = substr($login_base, 0,13);
213 }
214
215 $login = $login_base;
216
217 for ($i = 1; ; $i++) {
218 $n = spip_num_rows(spip_query("SELECT id_auteur FROM spip_auteurs WHERE login='$login' LIMIT 1"));
219 if (!$n) return $login;
220 $login = $login_base.$i;
221 }
222 }
223
224 // http://doc.spip.org/@creer_pass_pour_auteur
225 function creer_pass_pour_auteur($id_auteur) {
226 include_spip('inc/acces');
227 $pass = creer_pass_aleatoire(8, $id_auteur);
228 $mdpass = md5($pass);
229 $htpass = generer_htpass($pass);
230 spip_query("UPDATE spip_auteurs SET pass='$mdpass', htpass='$htpass' WHERE id_auteur = ".intval($id_auteur));
231 ecrire_acces();
232
233 return $pass;
234 }
235
236 ?>