Close #646: Update destination address of validation mail when losing the bestalias
[platal.git] / modules / register / register.inc.php
CommitLineData
0337d704 1<?php
2/***************************************************************************
5ddeb07c 3 * Copyright (C) 2003-2007 Polytechnique.org *
0337d704 4 * http://opensource.polytechnique.org/ *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the Free Software *
18 * Foundation, Inc., *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
21
22require_once 'xorg.misc.inc.php';
23
24// {{{ function user_cmp
25
26function user_cmp($prenom, $nom, $_prenom, $_nom)
27{
28 $_nom = strtoupper(replace_accent($_nom));
29 $_prenom = strtoupper(replace_accent($_prenom));
30 $nom = strtoupper(replace_accent($nom));
31 $prenom = strtoupper(replace_accent($prenom));
32
33 $is_ok = strtoupper($_prenom) == strtoupper($prenom);
34
35 $tokens = preg_split("/[ \-']/", $nom, -1, PREG_SPLIT_NO_EMPTY);
36 $maxlen = 0;
37
38 foreach ($tokens as $str) {
39 $is_ok &= strpos($_nom, $str)!==false;
40 $maxlen = max($maxlen, strlen($str));
41 }
42
43 return $is_ok && ($maxlen > 2 || $maxlen == strlen($_nom));
44}
45
46// }}}
0337d704 47// {{{ function check_mat
48
0be07aa6 49function check_mat($promo, $mat, $nom, $prenom, &$ourmat, &$ourid, &$watch)
0337d704 50{
0337d704 51 if (!preg_match('/^[0-9][0-9][0-9][0-9][0-9][0-9]$/', $mat)) {
52 return "Le matricule doit comporter 6 chiffres.";
53 }
54
55 $year = intval(substr($mat, 0, 3));
56 $rang = intval(substr($mat, 3, 3));
57 if ($year > 200) { $year /= 10; };
58 if ($year < 96) {
59 return "ton matricule est incorrect";
60 } else {
61 $ourmat = sprintf('%04u%04u', 1900+$year, $rang);
62 }
63
08cce2ff 64 $res = XDB::query(
0be07aa6 65 'SELECT user_id, promo, perms IN ("admin","user"), nom, prenom, FIND_IN_SET(\'watch\', u.flags)
0337d704 66 FROM auth_user_md5
67 WHERE matricule={?} and deces = 0', $ourmat);
0be07aa6 68 list ($uid, $_promo, $_already, $_nom, $_prenom, $watch) = $res->fetchOneRow();
a7de4ef7 69 if ($_already) { return "tu es déjà inscrit ou ton matricule est incorrect !"; }
0337d704 70 if ($_promo != $promo) { return "erreur de matricule"; }
71
72 if (!user_cmp($prenom, $nom, $_prenom, $_nom)) {
a7de4ef7 73 return "erreur dans l'identification. Réessaie, il y a une erreur quelque part !";
0337d704 74 }
75
76 $ourid = $uid;
77 return true;
78}
79
80// }}}
81// {{{ function check_old_mat
82
0be07aa6 83function check_old_mat($promo, $mat, $nom, $prenom, &$ourmat, &$ourid, &$watch)
0337d704 84{
08cce2ff 85 $res = XDB::iterRow(
0be07aa6 86 'SELECT user_id, nom, prenom, matricule, FIND_IN_SET(\'watch\', flags)
0337d704 87 FROM auth_user_md5
88 WHERE promo={?} AND deces=0 AND perms="pending"', $promo);
0be07aa6 89 while (list($_uid, $_nom, $_prenom, $_mat, $watch) = $res->next()) {
0337d704 90 if (user_cmp($prenom, $nom, $_prenom, $_nom)) {
91 $ourid = $_uid;
92 $ourmat = $_mat;
93 return true;
94 }
95 }
96
08cce2ff 97 $res = XDB::iterRow(
0be07aa6 98 'SELECT user_id, nom, prenom, matricule, alias, FIND_IN_SET(\'watch\', u.flags)
0337d704 99 FROM auth_user_md5 AS u
100 INNER JOIN aliases AS a ON (u.user_id = a.id and FIND_IN_SET("bestalias", a.flags))
101 WHERE promo={?} AND deces=0 AND perms IN ("user","admin")', $promo);
0be07aa6 102 while (list($_uid, $_nom, $_prenom, $_mat, $alias, $watch) = $res->next()) {
0337d704 103 if (user_cmp($prenom, $nom, $_prenom, $_nom)) {
104 $ourid = $_uid;
105 $ourmat = $_mat;
a7de4ef7 106 return "Tu es vraisemblablement déjà inscrit !";
0337d704 107 }
108 }
a7de4ef7 109 return "erreur: vérifie que tu as bien orthographié ton nom !";
0337d704 110}
111
112// }}}
113// {{{ function check_new_user
114
115function check_new_user(&$sub)
116{
0337d704 117 extract($sub);
118
119 $prenom = preg_replace("/[ \t]+/", ' ', trim($prenom));
eb8e3f3c 120 $prenom = preg_replace("/--+/", '-', $prenom);
121 $prenom = preg_replace("/''+/", '\'', $prenom);
0337d704 122 $prenom = make_firstname_case($prenom);
123
124 $nom = preg_replace("/[ \t]+/", ' ', trim($nom));
eb8e3f3c 125 $nom = preg_replace("/--+/", '-', $nom);
126 $nom = preg_replace("/''+/", '\'', $nom);
0337d704 127 $nom = strtoupper(replace_accent($nom));
128
129 if ($promo >= 1996) {
0be07aa6 130 $res = check_mat($promo, $mat, $nom, $prenom, $ourmat, $ourid, $watch);
0337d704 131 } else {
0be07aa6 132 $res = check_old_mat($promo, $mat, $nom, $prenom, $ourmat, $ourid, $watch);
0337d704 133 }
134 if ($res !== true) { return $res; }
135
136 $sub['nom'] = $nom;
137 $sub['prenom'] = $prenom;
138 $sub['ourmat'] = $ourmat;
139 $sub['uid'] = $ourid;
0be07aa6 140 $sub['watch'] = $watch;
0337d704 141
142 return true;
143}
144
145// }}}
146// {{{ function create_aliases
147
148function create_aliases (&$sub)
149{
0337d704 150 extract ($sub);
151
a11b5424 152 require_once "xorg.misc.inc.php";
0337d704 153 $mailorg = make_username($prenom, $nom);
154 $mailorg2 = $mailorg.sprintf(".%02u", ($promo%100));
155 $forlife = make_forlife($prenom, $nom, $promo);
156
08cce2ff 157 $res = XDB::query('SELECT COUNT(*) FROM aliases WHERE alias={?}', $forlife);
0337d704 158 if ($res->fetchOneCell() > 0) {
159 return "Tu as un homonyme dans ta promo, il faut traiter ce cas manuellement.<br />".
a7de4ef7 160 "envoie un mail à <a href=\"mailto:support@polytechnique.org\">support@polytechnique.org</a> en expliquant ta situation.";
0337d704 161 }
162
08cce2ff 163 $res = XDB::query('SELECT id, type, expire FROM aliases WHERE alias={?}', $mailorg);
0337d704 164
165 if ( $res->numRows() ) {
166
167 list($h_id, $h_type, $expire) = $res->fetchOneRow();
0337d704 168
169 if ( $h_type != 'homonyme' and empty($expire) ) {
08cce2ff 170 XDB::execute('UPDATE aliases SET expire=ADDDATE(NOW(),INTERVAL 1 MONTH) WHERE alias={?}', $mailorg);
171 XDB::execute('REPLACE INTO homonymes (homonyme_id,user_id) VALUES ({?},{?})', $h_id, $h_id);
172 XDB::execute('REPLACE INTO homonymes (homonyme_id,user_id) VALUES ({?},{?})', $h_id, $uid);
173 $res = XDB::query("SELECT alias FROM aliases WHERE id={?} AND expire IS NULL", $h_id);
0337d704 174 $als = $res->fetchColumn();
175
1e33266a 176 $mailer = new PlMailer();
0337d704 177 $mailer->setFrom('"Support Polytechnique.org" <support@polytechnique.org>');
178 $mailer->addTo("$mailorg@polytechnique.org");
179 $mailer->setSubject("perte de ton alias $mailorg dans un mois !");
180 $mailer->addCc('"Support Polytechnique.org" <support@polytechnique.org>');
181 $msg =
e945001b 182 "Bonjour,\n\n".
183
184 "Un homonyme vient de s'inscrire. La politique de Polytechnique.org est de fournir des\n".
185 "adresses mail devinables, nous ne pouvons donc pas conserver ton alias '$mailorg' qui\n".
a7de4ef7 186 "correspond maintenant à deux personnes.\n\n".
e945001b 187
a7de4ef7 188 "Tu gardes tout de même l'usage de cet alias pour un mois encore à compter de ce jour.\n\n".
e945001b 189
a7de4ef7 190 "Lorsque cet alias sera désactivé, l'adresse $mailorg@polytechnique.org renverra vers un \n".
191 "robot qui indiquera qu'il y a plusieurs personnes portant le même nom ;\n".
192 "cela évite que l'un des homonymes reçoive des courriels destinés à l'autre.\n\n".
e945001b 193
194 "Pour te connecter au site, tu pourras utiliser comme identifiant n'importe lequel de tes\n".
195 "autres alias :\n".
0337d704 196 " ".join(', ', $als)."\n";
a7de4ef7 197 "Commence dès aujourd'hui à communiquer à tes correspondants la nouvelle adresse que tu comptes utiliser !\n\n".
e945001b 198
a7de4ef7 199 "En nous excusant pour le désagrément occasionné,\n".
e945001b 200 "Cordialement,\n\n".
201
0337d704 202 "-- \n".
a7de4ef7 203 "L'équipe de Polytechnique.org\n".
204 "\"Le portail des élèves & anciens élèves de l'X\"";
0337d704 205 $mailer->SetTxtBody(wordwrap($msg,72));
206 $mailer->send();
207 }
208
209 $sub['forlife'] = $forlife;
210 $sub['bestalias'] = $mailorg2;
211 $sub['mailorg2'] = null;
212 } else {
213 $sub['forlife'] = $forlife;
214 $sub['bestalias'] = $mailorg;
215 $sub['mailorg2'] = $mailorg2;
216 }
217
218 return true;
219}
220
221// }}}
222// {{{ function finish_ins
223
224function finish_ins($sub_state)
225{
226 global $globals;
227 extract($sub_state);
46bde4d1 228 require_once('secure_hash.inc.php');
0337d704 229
230 $pass = rand_pass();
46bde4d1 231 $pass_encrypted = hash_encrypt($pass_clair);
0337d704 232 $hash = rand_url_id(12);
233
08cce2ff 234 XDB::execute('UPDATE auth_user_md5 SET last_known_email={?} WHERE matricule = {?}', $email, $mat);
0337d704 235
08cce2ff 236 XDB::execute(
0337d704 237 "REPLACE INTO register_pending (uid, forlife, bestalias, mailorg2, password, email, date, relance, naissance, hash)
238 VALUES ({?}, {?}, {?}, {?}, {?}, {?}, NOW(), 0, {?}, {?})",
46bde4d1 239 $uid, $forlife, $bestalias, $mailorg2, $pass_encrypted, $email, $naissance, $hash);
0337d704 240
1e33266a 241 $mymail = new PlMailer('register/inscrire.mail.tpl');
0337d704 242 $mymail->assign('mailorg', $bestalias);
243 $mymail->assign('lemail', $email);
244 $mymail->assign('pass', $pass);
245 $mymail->assign('baseurl', $globals->baseurl);
246 $mymail->assign('hash', $hash);
247 $mymail->assign('subj', $bestalias."@polytechnique.org");
248 $mymail->send();
249}
250
251// }}}
a7de4ef7 252// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
0337d704 253?>