Release plat/al core v1.1.13
[platal.git] / classes / plsession.php
index 5f69aa3..fd374ed 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  Copyright (C) 2003-2011 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -26,6 +26,8 @@
 define('AUTH_SUID',   -1);
 define('AUTH_PUBLIC', 0);
 define('AUTH_COOKIE', 5);
+define('AUTH_PASSWD', 10);
+// Backwards compatibility: AUTH_MDP must be an alias for AUTH_PASSWD.
 define('AUTH_MDP',    10);
 
 
@@ -52,7 +54,7 @@ abstract class PlSession
 
     /** Build the session structure with system fields.
      */
-    private function fillSession()
+    protected function fillSession()
     {
         S::bootstrap('user', null);
         S::bootstrap('auth', AUTH_PUBLIC);
@@ -103,7 +105,6 @@ abstract class PlSession
      */
     public function start($level)
     {
-        $backup = S::i($level);
         if ($this->checkAuth($level)) {
             return true;
         }
@@ -160,6 +161,23 @@ abstract class PlSession
      */
     abstract protected function startSessionAs($user, $level);
 
+    /** Authenticate the request for the given (method, payload) pair.
+     *
+     * Implementations are expected to provide strong authentication. It is
+     * suggested to use an HMAC-based scheme, where the signature validates the
+     * method, url, and payload (to avoid replay of the signature against other
+     * methods), and the timestamp (to avoid replay in time).
+     *
+     * @param method method of the request (GET, POST, PUT, DELETE)
+     * @param resource URL path of the resource (eg. "/api/user")
+     * @param payload binary payload sent with the request (before decoding)
+     * @return a valid PlUser object if authentication is successfull, or null.
+     */
+    public function apiAuth($method, $resource, $payload)
+    {
+        return null;  // Default implementation does nothing
+    }
+
     /** Check authentication with the given token.
      *
      * Token authentication is a light-weight authentication based on a user-specific token.
@@ -190,8 +208,7 @@ abstract class PlSession
         if (S::suid()) {
             return false;
         }
-        $backup   = $_SESSION;
-        $_SESSION = array();
+        $backup = S::changeSession(array());
         $this->fillSession();
         S::set('suid', $backup);
         if (!$this->startSessionAs($user, AUTH_SUID)) {
@@ -212,7 +229,7 @@ abstract class PlSession
         if (!S::suid()) {
             return false;
         }
-        $_SESSION = $_SESSION['suid'];
+        S::changeSession(S::v('suid'));
         return true;
     }
 
@@ -228,5 +245,5 @@ abstract class PlSession
     abstract public function sureLevel();
 }
 
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
 ?>