Commit | Line | Data |
---|---|---|
c495c100 P |
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('&','&',(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 | ?> |