Displays a warning to admins when an Auth-GroupeX request is denied
authorVincent Zanotti <vincent.zanotti@m4x.org>
Mon, 15 Jun 2009 18:33:32 +0000 (20:33 +0200)
committerVincent Zanotti <vincent.zanotti@m4x.org>
Mon, 15 Jun 2009 18:33:32 +0000 (20:33 +0200)
based on the value of the return url.
Also fixes a logging issue.

Signed-off-by: Vincent Zanotti <vincent.zanotti@m4x.org>
modules/auth.php

index 1af3072..424361c 100644 (file)
@@ -140,34 +140,39 @@ class AuthModule extends PLModule
             $gpex_url .= "&PHPSESSID=" . $_GET["session"];
         }
 
-        /* a-t-on besoin d'ajouter le http:// ? */
+        // Normalize the return URL.
         if (!preg_match("/^(http|https):\/\/.*/",$gpex_url)) {
             $gpex_url = "http://$gpex_url";
         }
         $gpex_challenge = $_GET["challenge"];
 
-        // mise à jour de l'heure et de la machine de dernier login sauf quand on est en suid
+        // Update the last login information (unless the user is in SUID).
         $uid = S::i('uid');
         if (!isset($_SESSION['suid'])) {
             global $platal;
-            S::logger(uid)->log('connexion_auth_ext', $platal->path);
+            S::logger($uid)->log('connexion_auth_ext', $platal->path);
         }
 
-        /* on parcourt les entrees de groupes_auth */
+        // Iterate over the auth token to find which one did sign the request.
         $res = XDB::iterRow('SELECT privkey, name, datafields, returnurls FROM groupesx_auth');
-
         while (list($privkey,$name,$datafields,$returnurls) = $res->next()) {
             if (md5($gpex_challenge.$privkey) == $gpex_pass) {
                 $returnurls = trim($returnurls);
+                // We check that the return url matches a per-key regexp to prevent
+                // replay attacks (more exactly to force replay attacks to redirect
+                // the user to the real GroupeX website, which defeats the attack).
                 if (empty($returnurls) || @preg_match($returnurls, $gpex_url)) {
                     $returl = $gpex_url . gpex_make_params($gpex_challenge, $privkey, $datafields, $charset);
                     http_redirect($returl);
+                } else if (S::admin()) {
+                    $page->kill("La requête d'authentification a échouée (url de retour invalide).");
                 }
             }
         }
 
-        /* si on n'a pas trouvé, on renvoit sur x.org */
-        http_redirect('https://www.polytechnique.org/');
+        // Otherwise (if no valid request was found, or if the return URL is not
+        // acceptable), the user is redirected back to our homepage.
+        pl_redirect('/');
     }
 
     function handler_admin_authgroupesx(&$page, $action = 'list', $id = null)