2010.
[platal.git] / modules / platal.php
index 8146055..32258b9 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  Copyright (C) 2003-2010 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -38,25 +38,24 @@ class PlatalModule extends PLModule
     function handlers()
     {
         return array(
-            'index'       => $this->make_hook('index',     AUTH_PUBLIC),
-            'cacert.pem'  => $this->make_hook('cacert',    AUTH_PUBLIC),
-            'changelog'   => $this->make_hook('changelog', AUTH_PUBLIC),
+            'index'             => $this->make_hook('index',     AUTH_PUBLIC),
+            'cacert.pem'        => $this->make_hook('cacert',    AUTH_PUBLIC),
+            'changelog'         => $this->make_hook('changelog', AUTH_PUBLIC),
 
             // Preferences thingies
-            'prefs'       => $this->make_hook('prefs',     AUTH_COOKIE),
-            'prefs/rss'   => $this->make_hook('prefs_rss', AUTH_COOKIE),
-            'prefs/webredirect'
-                          => $this->make_hook('webredir',  AUTH_MDP),
-            'prefs/skin'  => $this->make_hook('skin',      AUTH_COOKIE),
+            'prefs'             => $this->make_hook('prefs',     AUTH_COOKIE),
+            'prefs/rss'         => $this->make_hook('prefs_rss', AUTH_COOKIE),
+            'prefs/webredirect' => $this->make_hook('webredir',  AUTH_MDP),
+            'prefs/skin'        => $this->make_hook('skin',      AUTH_COOKIE),
 
             // password related thingies
-            'password'      => $this->make_hook('password',  AUTH_MDP),
-            'tmpPWD'        => $this->make_hook('tmpPWD',    AUTH_PUBLIC),
-            'password/smtp' => $this->make_hook('smtppass',  AUTH_MDP),
-            'recovery'      => $this->make_hook('recovery',  AUTH_PUBLIC),
-            'exit'          => $this->make_hook('exit', AUTH_PUBLIC),
-            'review'        => $this->make_hook('review', AUTH_PUBLIC),
-            'deconnexion.php' => $this->make_hook('exit', AUTH_PUBLIC),
+            'password'          => $this->make_hook('password',  AUTH_MDP),
+            'tmpPWD'            => $this->make_hook('tmpPWD',    AUTH_PUBLIC),
+            'password/smtp'     => $this->make_hook('smtppass',  AUTH_MDP),
+            'recovery'          => $this->make_hook('recovery',  AUTH_PUBLIC),
+            'exit'              => $this->make_hook('exit',      AUTH_PUBLIC),
+            'review'            => $this->make_hook('review',    AUTH_PUBLIC),
+            'deconnexion.php'   => $this->make_hook('exit',      AUTH_PUBLIC),
         );
     }
 
@@ -64,7 +63,7 @@ class PlatalModule extends PLModule
     {
         // Include X-XRDS-Location response-header for Yadis discovery
         global $globals;
-        header('X-XRDS-Location: ' . $globals->baseurl . '/openid/idp_xrds');
+        header('X-XRDS-Location: ' . $globals->baseurl . '/openid/xrds');
 
         // Redirect to the suitable page
         if (S::logged()) {
@@ -76,14 +75,8 @@ class PlatalModule extends PLModule
 
     function handler_cacert(&$page)
     {
-        $data = file_get_contents("/etc/ssl/xorgCA/cacert.pem","r");
-        header("Pragma:");
-        header("Set-Cookie:");
-        header("Cache-Control:");
-        header("Expires:");
-        header("Content-Type: application/x-x509-ca-cert");
-        header("Content-Length: ".strlen($data));
-        echo $data;
+        pl_cached_content_headers("application/x-x509-ca-cert");
+        readfile("/etc/ssl/xorgCA/cacert.pem");
         exit;
     }
 
@@ -300,64 +293,64 @@ class PlatalModule extends PLModule
 
         $mailorg = strtok(Env::v('login'), '@');
 
-        // XXX: recovery requires usage of profile data.
-        $res = XDB::query(
-                "SELECT  user_id, naissance
-                   FROM  auth_user_md5 AS u
-             INNER JOIN  aliases       AS a ON (u.user_id=a.id AND type != 'homonyme')
-                  WHERE  a.alias={?} AND u.perms IN ('admin','user') AND u.deces=0", $mailorg);
-        list($uid, $naissance) = $res->fetchOneRow();
-
-        if ($naissance == $birth) {
-            $res = XDB::query("SELECT  COUNT(*)
-                                 FROM  emails
-                                WHERE  uid = {?} AND flags != 'panne' AND flags != 'filter'", $uid);
-            $count = intval($res->fetchOneCell());
-            if ($count == 0) {
-                $page->assign('no_addr', true);
-                return;
-            }
+        $profile = Profile::get(Env::t('login'));
+        if (is_null($profile) || $profile->birthdate != $birth) {
+            $page->trigError('Les informations que tu as rentrées ne permettent pas de récupérer ton mot de passe.<br />'.
+                        'Si tu as un homonyme, utilise prenom.nom.promo comme login');
+            return;
+        }
 
-            $page->assign('ok', true);
+        $user = $profile->owner();
+        if ($user->state != 'active') {
+            $page->trigError('Ton compte n\'est pas activé.');
+            return;
+        }
+
+        $res = XDB::query("SELECT  COUNT(*)
+                             FROM  emails
+                            WHERE  uid = {?} AND flags != 'panne' AND flags != 'filter'", $user->id());
+        $count = intval($res->fetchOneCell());
+        if ($count == 0) {
+            $page->assign('no_addr', true);
+            return;
+        }
 
-            $url   = rand_url_id();
-            XDB::execute('INSERT INTO  perte_pass (certificat,uid,created)
-                               VALUES  ({?},{?},NOW())', $url, $uid);
-            $res   = XDB::query('SELECT  email
+        $page->assign('ok', true);
+
+        $url   = rand_url_id();
+        XDB::execute('INSERT INTO  perte_pass (certificat,uid,created)
+                           VALUES  ({?},{?},NOW())', $url, $user->id());
+        $res   = XDB::query('SELECT  email
+                               FROM  emails
+                              WHERE  uid = {?} AND email = {?}',
+                            $user->id(), Post::v('email'));
+        if ($res->numRows()) {
+            $mails = $res->fetchOneCell();
+        } else {
+            $res   = XDB::query("SELECT  email
                                    FROM  emails
-                                  WHERE  uid = {?} AND email = {?}',
-                                $uid, Post::v('email'));
-            if ($res->numRows()) {
-                $mails = $res->fetchOneCell();
-            } else {
-                $res   = XDB::query('SELECT  email
-                                       FROM  emails
-                                      WHERE  uid = {?} AND NOT FIND_IN_SET("filter", flags)', $uid);
-                $mails = implode(', ', $res->fetchColumn());
-            }
-            $mymail = new PlMailer();
-            $mymail->setFrom('"Gestion des mots de passe" <support+password@' . $globals->mail->domain . '>');
-            $mymail->addTo($mails);
-            $mymail->setSubject('Ton certificat d\'authentification');
-            $mymail->setTxtBody("Visite la page suivante qui expire dans six heures :
+                                  WHERE  uid = {?} AND NOT FIND_IN_SET('filter', flags)", $user->id());
+            $mails = implode(', ', $res->fetchColumn());
+        }
+        $mymail = new PlMailer();
+        $mymail->setFrom('"Gestion des mots de passe" <support+password@' . $globals->mail->domain . '>');
+        $mymail->addTo($mails);
+        $mymail->setSubject("Ton certificat d'authentification");
+        $mymail->setTxtBody("Visite la page suivante qui expire dans six heures :
 {$globals->baseurl}/tmpPWD/$url
 
 Si 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.
 
 --
 Polytechnique.org
-\"Le portail des élèves & anciens élèves de l'Ecole polytechnique\"
+\"Le portail des élèves & anciens élèves de l'École polytechnique\"
 
 Email envoyé à ".Env::v('login') . (Post::has('email') ? "
 Adresse de secours : " . Post::v('email') : ""));
-            $mymail->send();
+        $mymail->send();
 
-            // on cree un objet logger et on log l'evenement
-            S::logger(uid)->log('recovery', $mails);
-        } else {
-            $page->trigError('Les informations que tu as rentrées ne permettent pas de récupérer ton mot de passe.<br />'.
-                        'Si tu as un homonyme, utilise prenom.nom.promo comme login');
-        }
+        // on cree un objet logger et on log l'evenement
+        S::logger($user->id())->log('recovery', $mails);
     }
 
     function handler_tmpPWD(&$page, $certif = null)
@@ -448,8 +441,10 @@ Adresse de secours : " . Post::v('email') : ""));
             Platal::session()->killLoginFormCookies();
         }
 
-        S::logger()->log('deconnexion', @$_SERVER['HTTP_REFERER']);
-        Platal::session()->destroy();
+        if (S::logged()) {
+            S::logger()->log('deconnexion', @$_SERVER['HTTP_REFERER']);
+            Platal::session()->destroy();
+        }
 
         if (Get::has('redirect')) {
             http_redirect(rawurldecode(Get::v('redirect')));
@@ -462,7 +457,7 @@ Adresse de secours : " . Post::v('email') : ""));
     {
         // Include X-XRDS-Location response-header for Yadis discovery
         global $globals;
-        header('X-XRDS-Location: ' . $globals->baseurl . '/openid/idp_xrds');
+        header('X-XRDS-Location: ' . $globals->baseurl . '/openid/xrds');
 
         $this->load('review.inc.php');
         $dom = 'Review';