Release plat/al core v1.1.13
[platal.git] / classes / s.php
index bcb8975..e741e8a 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   *
@@ -49,10 +49,29 @@ class S
         return (string)S::v($key, $default);
     }
 
+    public static function b($key, $default = false)
+    {
+        return (bool)S::v($key, $default);
+    }
+
     public static function i($key, $default = 0)
     {
-        $i = S::v($key, $default);
-        return is_numeric($i) ? intval($i) : $default;
+        $i = to_integer(S::v($key, $default));
+        return $i === false ? $default : $i;
+    }
+
+    public static function t($key, $default = '')
+    {
+        return trim(S::s($key, $default));
+    }
+
+    public static function blank($key, $strict = false)
+    {
+        if (!S::has($key)) {
+            return true;
+        }
+        $var = $strict ? S::s($key) : S::t($key);
+        return empty($var);
     }
 
     public static function l(array $keys)
@@ -60,33 +79,91 @@ class S
         return array_map(array('S', 'v'), $keys);
     }
 
-    public static function set($key, &$value)
+    public static function set($key, $value)
     {
         $_SESSION[$key] =& $value;
     }
 
-    public static function bootstrap($key, &$value)
+    public static function bootstrap($key, $value)
     {
         if (!S::has($key)) {
             S::set($key, $value);
         }
     }
 
-    public static function has_perms()
+    public static function logger($uid = null)
     {
-        global $session;
-        return $session->checkPerms(PERMS_ADMIN);
+        $uid = S::i('uid', $uid);
+        if (!S::has('log') || !S::v('log')->isValid($uid)) {
+            global $platal;
+            if (S::has('suid')) {
+                $suid = S::v('suid');
+                S::set('log', $platal->buildLogger(S::i('uid', $uid), $suid['uid']));
+            } else if (S::has('uid') || $uid) {
+                S::set('log', $platal->buildLogger(S::i('uid', $uid)));
+            } else {
+                S::set('log', PlLogger::dummy($uid));
+            }
+        }
+        return S::v('log');
+    }
+
+    /** User object storage and accessor. The user object (an instance of the
+     * local subclass of PlUser) is currently stored as a S class variable, and
+     * not as a session variable, so as to avoid bloating the global on-disk
+     * session.
+     * TODO: When all the codebase will use S::user() as the only source for
+     * user ids, fullname/displayname, and forlife/bestalias, S::$user should
+     * move into the php session (and data it helds should be removed from
+     * the php session). */
+    private static $user = null;
+    public static function &user($forceFetch = false)
+    {
+        if (($forceFetch || self::$user == null) && class_exists('User')) {
+            if (S::has('user') && S::v('user') instanceof User) {
+                self::$user = S::v('user');
+            } else {
+                self::$user = User::getSilentWithValues(S::i('uid'), $_SESSION);
+            }
+        }
+        return self::$user;
+    }
+
+    public static function changeSession(array $newSession)
+    {
+        $oldSession = $_SESSION;
+        $_SESSION = $newSession;
+        self::$user = null;
+        return $oldSession;
     }
 
     public static function logged()
     {
-        return S::v('auth', AUTH_PUBLIC) > AUTH_PUBLIC;
+        return S::i('auth', AUTH_PUBLIC) >= Platal::session()->loggedLevel();
     }
 
     public static function identified()
     {
-        global $session;
-        return S::v('auth', AUTH_PUBLIC) >= $session->sureLevel();
+        return S::i('auth', AUTH_PUBLIC) >= Platal::session()->sureLevel();
+    }
+
+    public static function admin()
+    {
+        return Platal::session()->checkPerms(PERMS_ADMIN);
+    }
+
+    public static function suid($field = null, $default = null)
+    {
+        if (is_null($field)) {
+            return !S::blank('suid');
+        } else {
+            $suid = S::v('suid', array());
+            if (!empty($suid) && isset($suid[$field])) {
+                return $suid[$field];
+            } else {
+                return $default;
+            }
+        }
     }
 
     // Anti-XSRF protections.
@@ -102,11 +179,17 @@ class S
         }
     }
 
+    public static function hasAuthToken()
+    {
+        return !S::blank('token');
+    }
+
     public static function rssActivated()
     {
+        // XXX: Deprecated, to be replaced by S::hasToken()
         return S::has('core_rss_hash') && S::v('core_rss_hash');
     }
 }
 
-// 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:
 ?>