Fix the edition of event subscription for non member
[platal.git] / modules / platal.php
CommitLineData
e59506eb 1<?php
2/***************************************************************************
5ddeb07c 3 * Copyright (C) 2003-2007 Polytechnique.org *
e59506eb 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
5de0b7e1 22function bugize($list)
23{
24 $list = split(',', $list);
25 $ans = array();
26
27 foreach ($list as $bug) {
28 $clean = str_replace('#', '', $bug);
29 $ans[] = "<a href='http://trackers.polytechnique.org/task/$clean'>$bug</a>";
30 }
31
32 return join(',', $ans);
33}
34
35
e59506eb 36class PlatalModule extends PLModule
37{
38 function handlers()
39 {
40 return array(
c9178c75 41 'index' => $this->make_hook('index', AUTH_PUBLIC),
ddb64990 42 'cacert.pem' => $this->make_hook('cacert', AUTH_PUBLIC),
5de0b7e1 43 'changelog' => $this->make_hook('changelog', AUTH_PUBLIC),
44
4da0b8d7 45 // Preferences thingies
bee33d93 46 'prefs' => $this->make_hook('prefs', AUTH_COOKIE),
47 'prefs/rss' => $this->make_hook('prefs_rss', AUTH_COOKIE),
bce2f8eb 48 'prefs/webredirect'
bee33d93 49 => $this->make_hook('webredir', AUTH_MDP),
50 'prefs/skin' => $this->make_hook('skin', AUTH_COOKIE),
4da0b8d7 51
52 // password related thingies
1a5da857 53 'password' => $this->make_hook('password', AUTH_MDP),
54 'tmpPWD' => $this->make_hook('tmpPWD', AUTH_PUBLIC),
55 'password/smtp' => $this->make_hook('smtppass', AUTH_MDP),
8858cfc1 56 'recovery' => $this->make_hook('recovery', AUTH_PUBLIC),
5de0b7e1 57 'exit' => $this->make_hook('exit', AUTH_PUBLIC),
ddb64990 58 'review' => $this->make_hook('review', AUTH_PUBLIC),
58abb43b 59 'deconnexion.php' => $this->make_hook('exit', AUTH_PUBLIC),
e59506eb 60 );
61 }
62
c9178c75 63 function handler_index(&$page)
64 {
cab08090 65 if (S::logged()) {
8b00e0e0 66 pl_redirect('events');
ddb64990
FB
67 } else if (!@$GLOBALS['IS_XNET_SITE']) {
68 pl_redirect('review');
c9178c75 69 }
c9178c75 70 }
71
5de0b7e1 72 function handler_cacert(&$page)
73 {
ca877168 74 $data = file_get_contents("/etc/ssl/xorgCA/cacert.pem","r");
75 header("Pragma:");
dc41059a 76 header("Set-Cookie:");
77 header("Cache-Control:");
78 header("Expires:");
79 header("Content-Type: application/x-x509-ca-cert");
ca877168 80 header("Content-Length: ".strlen($data));
5de0b7e1 81 echo $data;
82 exit;
83 }
84
85 function handler_changelog(&$page)
86 {
8b1f8e12 87 $page->changeTpl('platal/changeLog.tpl');
5de0b7e1 88
493b6abe 89 $clog = pl_entities(file_get_contents(dirname(__FILE__).'/../ChangeLog'));
d39eceb9 90 $clog = preg_replace('/=+\s*/', '</pre><hr /><pre>', $clog);
4e95f720 91 // url catch only (not all wiki syntax)
92 $clog = preg_replace(array(
93 '/((?:https?|ftp):\/\/(?:\.*,*[\w@~%$£µ&i#\-+=_\/\?;])*)/ui',
94 '/(\s|^)www\.((?:\.*,*[\w@~%$£µ&i#\-+=_\/\?;])*)/iu',
95 '/(?:mailto:)?([a-z0-9.\-+_]+@([\-.+_]?[a-z0-9])+)/i'),
96 array(
97 '<a href="\\0">\\0</a>',
98 '\\1<a href="http://www.\\2">www.\\2</a>',
99 '<a href="mailto:\\0">\\0</a>'),
100 $clog);
5de0b7e1 101 $clog = preg_replace('!(#[0-9]+(,[0-9]+)*)!e', 'bugize("\1")', $clog);
9408f155 102 $clog = preg_replace('!vim:.*$!', '', $clog);
02722b9d 103 $clog = preg_replace("!(<hr />(\\s|\n)*)?<pre>(\s|\n)*</pre>((\\s|\n)*<hr />)?!m", "", "<pre>$clog</pre>");
5de0b7e1 104 $page->assign('ChangeLog', $clog);
105 }
106
7927d719 107 function __set_rss_state($state)
108 {
7927d719 109 if ($state) {
110 $_SESSION['core_rss_hash'] = rand_url_id(16);
08cce2ff 111 XDB::execute('UPDATE auth_user_quick
7927d719 112 SET core_rss_hash={?} WHERE user_id={?}',
cab08090 113 S::v('core_rss_hash'), S::v('uid'));
7927d719 114 } else {
08cce2ff 115 XDB::execute('UPDATE auth_user_quick
7927d719 116 SET core_rss_hash="" WHERE user_id={?}',
cab08090 117 S::v('uid'));
118 S::kill('core_rss_hash');
7927d719 119 }
120 }
121
e59506eb 122 function handler_prefs(&$page)
123 {
8b1f8e12 124 $page->changeTpl('platal/preferences.tpl');
a7de4ef7 125 $page->assign('xorg_title','Polytechnique.org - Mes préférences');
e59506eb 126
bee33d93 127 if (Post::has('mail_fmt')) {
5e2307dc 128 $fmt = Post::v('mail_fmt');
e59506eb 129 if ($fmt != 'texte') $fmt = 'html';
08cce2ff 130 XDB::execute("UPDATE auth_user_quick
e59506eb 131 SET core_mail_fmt = '$fmt'
132 WHERE user_id = {?}",
cab08090 133 S::v('uid'));
e59506eb 134 $_SESSION['mail_fmt'] = $fmt;
e59506eb 135 }
136
bee33d93 137 if (Post::has('rss')) {
5e2307dc 138 $this->__set_rss_state(Post::b('rss'));
e59506eb 139 }
e59506eb 140 }
9bae6004 141
bce2f8eb 142 function handler_webredir(&$page)
143 {
8b1f8e12 144 $page->changeTpl('platal/webredirect.tpl');
bce2f8eb 145
146 $page->assign('xorg_title','Polytechnique.org - Redirection de page WEB');
147
cab08090 148 $log =& S::v('log');
5e2307dc 149 $url = Env::v('url');
bce2f8eb 150
5e2307dc 151 if (Env::v('submit') == 'Valider' and Env::has('url')) {
08cce2ff 152 XDB::execute('UPDATE auth_user_quick
bce2f8eb 153 SET redirecturl = {?} WHERE user_id = {?}',
cab08090 154 $url, S::v('uid'));
5e2307dc 155 $log->log('carva_add', 'http://'.Env::v('url'));
a7de4ef7 156 $page->trig("Redirection activée vers <a href='http://$url'>$url</a>");
5e2307dc 157 } elseif (Env::v('submit') == "Supprimer") {
08cce2ff 158 XDB::execute("UPDATE auth_user_quick
bce2f8eb 159 SET redirecturl = ''
160 WHERE user_id = {?}",
cab08090 161 S::v('uid'));
bce2f8eb 162 $log->log("carva_del", $url);
163 Post::kill('url');
a7de4ef7 164 $page->trig('Redirection supprimée');
bce2f8eb 165 }
166
08cce2ff 167 $res = XDB::query('SELECT redirecturl
bce2f8eb 168 FROM auth_user_quick
169 WHERE user_id = {?}',
cab08090 170 S::v('uid'));
bce2f8eb 171 $page->assign('carva', $res->fetchOneCell());
bce2f8eb 172 }
173
4da0b8d7 174 function handler_prefs_rss(&$page)
7927d719 175 {
8b1f8e12 176 $page->changeTpl('platal/filrss.tpl');
7927d719 177
5e2307dc 178 $page->assign('goback', Env::v('referer', 'login'));
7927d719 179
5e2307dc 180 if (Env::v('act_rss') == 'Activer') {
7927d719 181 $this->__set_rss_state(true);
a7de4ef7 182 $page->trig("Ton Fil RSS est activé.");
7927d719 183 }
7927d719 184 }
185
7c77c3ee 186 function handler_password(&$page)
187 {
7c77c3ee 188 if (Post::has('response2')) {
189 require_once 'secure_hash.inc.php';
190
5e2307dc 191 $_SESSION['password'] = $password = Post::v('response2');
7c77c3ee 192
eaf30d86 193 XDB::execute('UPDATE auth_user_md5
9ffe0e77 194 SET password={?}
195 WHERE user_id={?}', $password,
196 S::v('uid'));
7c77c3ee 197
cab08090 198 $log =& S::v('log');
7c77c3ee 199 $log->log('passwd', '');
200
5e2307dc 201 if (Cookie::v('ORGaccess')) {
7c77c3ee 202 setcookie('ORGaccess', hash_encrypt($password), (time()+25920000), '/', '' ,0);
203 }
204
8b1f8e12 205 $page->changeTpl('platal/motdepasse.success.tpl');
7c77c3ee 206 $page->run();
207 }
208
8b1f8e12 209 $page->changeTpl('platal/motdepasse.tpl');
c99ef281 210 $page->addJsLink('motdepasse.js');
7c77c3ee 211 $page->assign('xorg_title','Polytechnique.org - Mon mot de passe');
7c77c3ee 212 }
213
1a5da857 214 function handler_smtppass(&$page)
215 {
8b1f8e12 216 $page->changeTpl('platal/acces_smtp.tpl');
1a5da857 217 $page->assign('xorg_title','Polytechnique.org - Acces SMTP/NNTP');
eaf30d86 218
41e3c724 219 require_once 'wiki.inc.php';
a7de4ef7 220 wiki_require_page('Xorg.SMTPSécurisé');
221 wiki_require_page('Xorg.NNTPSécurisé');
1a5da857 222
cab08090 223 $uid = S::v('uid');
5e2307dc 224 $pass = Env::v('smtppass1');
cab08090 225 $log = S::v('log');
1a5da857 226
eaf30d86
PH
227 if (Env::v('op') == "Valider" && strlen($pass) >= 6
228 && Env::v('smtppass1') == Env::v('smtppass2'))
1a5da857 229 {
08cce2ff 230 XDB::execute('UPDATE auth_user_md5 SET smtppass = {?}
1a5da857 231 WHERE user_id = {?}', $pass, $uid);
a7de4ef7 232 $page->trig('Mot de passe enregistré');
1a5da857 233 $log->log("passwd_ssl");
5e2307dc 234 } elseif (Env::v('op') == "Supprimer") {
08cce2ff 235 XDB::execute('UPDATE auth_user_md5 SET smtppass = ""
1a5da857 236 WHERE user_id = {?}', $uid);
a7de4ef7 237 $page->trig('Compte SMTP et NNTP supprimé');
1a5da857 238 $log->log("passwd_del");
239 }
240
eaf30d86 241 $res = XDB::query("SELECT IF(smtppass != '', 'actif', '')
1a5da857 242 FROM auth_user_md5
243 WHERE user_id = {?}", $uid);
244 $page->assign('actif', $res->fetchOneCell());
1a5da857 245 }
246
8858cfc1 247 function handler_recovery(&$page)
248 {
249 global $globals;
250
8b1f8e12 251 $page->changeTpl('platal/recovery.tpl');
8858cfc1 252
253 if (!Env::has('login') || !Env::has('birth')) {
fd8f77de 254 return;
8858cfc1 255 }
256
5e2307dc 257 if (!ereg('[0-3][0-9][0-1][0-9][1][9]([0-9]{2})', Env::v('birth'))) {
a7de4ef7 258 $page->trig('Date de naissance incorrecte ou incohérente');
c9110c6c 259 return;
8858cfc1 260 }
c9110c6c 261
262 $birth = sprintf('%s-%s-%s',
5e2307dc 263 substr(Env::v('birth'), 4, 4),
264 substr(Env::v('birth'), 2, 2),
265 substr(Env::v('birth'), 0, 2));
8858cfc1 266
5e2307dc 267 $mailorg = strtok(Env::v('login'), '@');
8858cfc1 268
a7de4ef7 269 // paragraphe rajouté : si la date de naissance dans la base n'existe pas, on l'update
270 // avec celle fournie ici en espérant que c'est la bonne
8858cfc1 271
08cce2ff 272 $res = XDB::query(
8858cfc1 273 "SELECT user_id, naissance
274 FROM auth_user_md5 AS u
3a5c1551 275 INNER JOIN aliases AS a ON (u.user_id=a.id AND type != 'homonyme')
8858cfc1 276 WHERE a.alias={?} AND u.perms IN ('admin','user') AND u.deces=0", $mailorg);
277 list($uid, $naissance) = $res->fetchOneRow();
278
279 if ($naissance == $birth) {
8c28edc9 280 $res = XDB::query("SELECT COUNT(*)
281 FROM emails
282 WHERE uid = {?} AND flags != 'panne' AND flags != 'filter'", $uid);
283 $count = intval($res->fetchOneCell());
284 if ($count == 0) {
285 $page->assign('no_addr', true);
286 return;
287 }
288
8858cfc1 289 $page->assign('ok', true);
290
eaf30d86
PH
291 $url = rand_url_id();
292 XDB::execute('INSERT INTO perte_pass (certificat,uid,created)
a4d5829b 293 VALUES ({?},{?},NOW())', $url, $uid);
294 $res = XDB::query('SELECT email
295 FROM emails
296 WHERE uid = {?} AND email = {?}',
297 $uid, Post::v('email'));
298 if ($res->numRows()) {
299 $mails = $res->fetchOneCell();
300 } else {
301 $res = XDB::query('SELECT email
302 FROM emails
303 WHERE uid = {?} AND NOT FIND_IN_SET("filter", flags)', $uid);
304 $mails = implode(', ', $res->fetchColumn());
305 }
1e33266a 306 $mymail = new PlMailer();
1d55fe45 307 $mymail->setFrom('"Gestion des mots de passe" <support+password@' . $globals->mail->domain . '>');
8858cfc1 308 $mymail->addTo($mails);
309 $mymail->setSubject('Ton certificat d\'authentification');
310 $mymail->setTxtBody("Visite la page suivante qui expire dans six heures :
311{$globals->baseurl}/tmpPWD/$url
312
e887e90d 313Si en cliquant dessus tu n'y arrives pas, copie intégralement l'adresse dans la barre de ton navigateur. Si tu n'as pas utilisé ce lien dans six heures, tu peux tout simplement recommencer cette procédure.
8858cfc1 314
eaf30d86 315--
8858cfc1 316Polytechnique.org
a7de4ef7 317\"Le portail des élèves & anciens élèves de l'Ecole polytechnique\"
8858cfc1 318
a7de4ef7 319Mail envoyé à ".Env::v('login') . (Post::has('email') ? "
a4d5829b 320Adresse de secours : " . Post::v('email') : ""));
8858cfc1 321 $mymail->send();
322
323 // on cree un objet logger et on log l'evenement
c4271d38 324 $logger = $_SESSION['log'] = new CoreLogger($uid);
a4d5829b 325 $logger->log('recovery', $mails);
8858cfc1 326 } else {
a7de4ef7 327 $page->trig('Les informations que tu as rentrées ne permettent pas de récupérer ton mot de passe.<br />'.
3a5c1551 328 'Si tu as un homonyme, utilise prenom.nom.promo comme login');
8858cfc1 329 }
8858cfc1 330 }
331
6c49d0af 332 function handler_tmpPWD(&$page, $certif = null)
333 {
08cce2ff 334 XDB::execute('DELETE FROM perte_pass
6c49d0af 335 WHERE DATE_SUB(NOW(), INTERVAL 380 MINUTE) > created');
336
08cce2ff 337 $res = XDB::query('SELECT uid FROM perte_pass WHERE certificat={?}', $certif);
6c49d0af 338 $ligne = $res->fetchOneAssoc();
339 if (!$ligne) {
8b1f8e12 340 $page->changeTpl('platal/index.tpl');
6c49d0af 341 $page->kill("Cette adresse n'existe pas ou n'existe plus sur le serveur.");
342 }
343
344 $uid = $ligne["uid"];
345 if (Post::has('response2')) {
5e2307dc 346 $password = Post::v('response2');
c4271d38 347 $logger = new CoreLogger($uid);
08cce2ff 348 XDB::query('UPDATE auth_user_md5 SET password={?}
6c49d0af 349 WHERE user_id={?} AND perms IN("admin","user")',
350 $password, $uid);
08cce2ff 351 XDB::query('DELETE FROM perte_pass WHERE certificat={?}', $certif);
6c49d0af 352 $logger->log("passwd","");
8b1f8e12 353 $page->changeTpl('platal/tmpPWD.success.tpl');
6c49d0af 354 } else {
8b1f8e12 355 $page->changeTpl('platal/motdepasse.tpl');
c99ef281 356 $page->addJsLink('motdepasse.js');
6c49d0af 357 }
6c49d0af 358 }
359
9bae6004 360 function handler_skin(&$page)
361 {
362 global $globals;
363
8b1f8e12 364 $page->changeTpl('platal/skins.tpl');
9bae6004 365 $page->assign('xorg_title','Polytechnique.org - Skins');
366
a7de4ef7 367 if (Env::has('newskin')) { // formulaire soumis, traitons les données envoyées
08cce2ff 368 XDB::execute('UPDATE auth_user_quick
63528107 369 SET skin={?} WHERE user_id={?}',
5e2307dc 370 Env::i('newskin'), S::v('uid'));
92e6a287 371 S::kill('skin');
9bae6004 372 set_skin();
373 }
374
92e6a287 375 $res = XDB::query('SELECT id FROM skins WHERE skin_tpl={?}', S::v('skin'));
376 $page->assign('skin_id', $res->fetchOneCell());
377
9bae6004 378 $sql = "SELECT s.*,auteur,count(*) AS nb
379 FROM skins AS s
380 LEFT JOIN auth_user_quick AS a ON s.id=a.skin
381 WHERE skin_tpl != '' AND ext != ''
382 GROUP BY id ORDER BY s.date DESC";
a3afa47c 383 $page->assign('skins', XDB::iterator($sql));
9bae6004 384 }
4da0b8d7 385
5de0b7e1 386 function handler_exit(&$page, $level = null)
387 {
cab08090 388 if (S::has('suid')) {
e74411f7 389 $a4l = S::v('forlife');
390 $suid = S::v('suid');
391 $log = S::v('log');
392 $log->log("suid_stop", S::v('forlife') . " by " . $suid['forlife']);
393 $_SESSION = $suid;
394 S::kill('suid');
395 pl_redirect('admin/user/' . $a4l);
5de0b7e1 396 }
397
398 if ($level == 'forget' || $level == 'forgetall') {
399 setcookie('ORGaccess', '', time() - 3600, '/', '', 0);
400 Cookie::kill('ORGaccess');
401 if (isset($_SESSION['log']))
402 $_SESSION['log']->log("cookie_off");
403 }
404
405 if ($level == 'forgetuid' || $level == 'forgetall') {
406 setcookie('ORGuid', '', time() - 3600, '/', '', 0);
407 Cookie::kill('ORGuid');
408 setcookie('ORGdomain', '', time() - 3600, '/', '', 0);
409 Cookie::kill('ORGdomain');
410 }
411
412 if (isset($_SESSION['log'])) {
413 $ref = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
414 $_SESSION['log']->log('deconnexion',$ref);
415 }
416
417 XorgSession::destroy();
418
419 if (Get::has('redirect')) {
5e2307dc 420 http_redirect(rawurldecode(Get::v('redirect')));
5de0b7e1 421 } else {
8b1f8e12 422 $page->changeTpl('platal/exit.tpl');
5de0b7e1 423 }
5de0b7e1 424 }
ddb64990
FB
425
426 function handler_review(&$page, $action = null, $mode = null)
427 {
428 require_once 'wiki.inc.php';
429 require_once dirname(__FILE__) . '/platal/review.inc.php';
430 $dir = wiki_work_dir();
431 $dom = 'Review';
432 if (@$GLOBALS['IS_XNET_SITE']) {
433 $dom .= 'Xnet';
434 }
435 if (!is_dir($dir)) {
436 $page->kill("Impossible de trouver le wiki");
437 }
438 if (!file_exists($dir . '/' . $dom . '.Admin')) {
439 $page->kill("Impossible de trouver la page d'administration");
440 }
441 $conf = preg_grep('/^text=/', explode("\n", file_get_contents($dir . '/' . $dom . '.Admin')));
442 $conf = preg_split('/(text\=|\%0a)/', array_shift($conf), -1, PREG_SPLIT_NO_EMPTY);
443 $wiz = new PlWizard('Tour d\'horizon', 'core/plwizard.tpl', true);
444 foreach ($conf as $line) {
445 $list = preg_split('/\s*[*|]\s*/', $line, -1, PREG_SPLIT_NO_EMPTY);
446 $wiz->addPage('ReviewPage', $list[0], $list[1]);
447 }
448 $wiz->apply($page, 'review', $action, $mode);
449 }
e59506eb 450}
451
a7de4ef7 452// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
e59506eb 453?>