|
@@ -1,152 +1,162 @@
|
|
|
<?php
|
|
|
+/* For licensing terms, see /license.txt */
|
|
|
|
|
|
-use Symfony\Component\HttpFoundation\Session\Session;
|
|
|
-use Symfony\Component\HttpFoundation\Session\Storage\PhpBridgeSessionStorage;
|
|
|
+use Chamilo\CoreBundle\Framework\Container;
|
|
|
|
|
|
/**
|
|
|
- * Chamilo session (i.e. the session that maintains the connection open after usr login)
|
|
|
- *
|
|
|
- * Usage:
|
|
|
- *
|
|
|
- *
|
|
|
- * use ChamiloSession as Session;
|
|
|
- *
|
|
|
- * Session::read('name');
|
|
|
- *
|
|
|
- * Or
|
|
|
- *
|
|
|
- * Chamilo::session()->...
|
|
|
- * session()->...
|
|
|
- *
|
|
|
- * @license see /license.txt
|
|
|
- * @author Laurent Opprecht <laurent@opprecht.info> for the Univesity of Geneva
|
|
|
- */
|
|
|
-/**
|
|
|
- * @todo use session symfony component
|
|
|
* @todo replace all $_SESSION calls with this class.
|
|
|
- * @todo remove System\Session class
|
|
|
- * ChamiloSession class definition
|
|
|
*/
|
|
|
-class ChamiloSession extends System\Session
|
|
|
+class ChamiloSession implements \ArrayAccess
|
|
|
{
|
|
|
- const NAME = 'ch_sid';
|
|
|
-
|
|
|
/**
|
|
|
- * Generate new session instance
|
|
|
- * @return ChamiloSession
|
|
|
+ * @param string $variable
|
|
|
+ * @param null $default
|
|
|
+ * @return mixed|null
|
|
|
*/
|
|
|
- static function instance()
|
|
|
+ static function read($variable, $default = null)
|
|
|
{
|
|
|
- static $result = null;
|
|
|
+ $session = Container::getSession();
|
|
|
+ $result = null;
|
|
|
+ if (isset($session)) {
|
|
|
+ $result = $session->get($variable);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check if the value exists in the $_SESSION array
|
|
|
if (empty($result)) {
|
|
|
- $result = new ChamiloSession();
|
|
|
+ return $default;
|
|
|
+ } else {
|
|
|
+ return $result;
|
|
|
}
|
|
|
- return $result;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Returns the session lifetime
|
|
|
- * @return int The session lifetime as defined in the config file, in seconds
|
|
|
+ * @param string $variable
|
|
|
+ * @param mixed $value
|
|
|
*/
|
|
|
- static function session_lifetime()
|
|
|
+ static function write($variable, $value)
|
|
|
{
|
|
|
- global $_configuration;
|
|
|
- return $_configuration['session_lifetime'];
|
|
|
+ //$_SESSION[$variable] = $value;
|
|
|
+ $session = Container::getSession();
|
|
|
+ // Writing the session in 2 instances because
|
|
|
+ $_SESSION[$variable] = $value;
|
|
|
+ $session->set($variable, $value);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * @param string $variable
|
|
|
+ */
|
|
|
+ static function erase($variable)
|
|
|
+ {
|
|
|
+ $variable = (string) $variable;
|
|
|
+ $session = Container::getSession();
|
|
|
+ $session->remove($variable);
|
|
|
+
|
|
|
+ if (isset($GLOBALS[$variable])) {
|
|
|
+ unset($GLOBALS[$variable]);
|
|
|
+ }
|
|
|
+ if (isset($_SESSION[$variable])) {
|
|
|
+ unset($_SESSION[$variable]);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
- * Starts the Chamilo session.
|
|
|
+ * Returns true if session has variable set up, false otherwise.
|
|
|
*
|
|
|
- * The default lifetime for session is set here. It is not possible to have it
|
|
|
- * as a database setting as it is used before the database connection has been made.
|
|
|
- * It is taken from the configuration file, and if it doesn't exist there, it is set
|
|
|
- * to 360000 seconds
|
|
|
+ * @param string $variable
|
|
|
*
|
|
|
- * @author Olivier Brouckaert
|
|
|
- * @param string variable - the variable name to save into the session
|
|
|
- * @return void
|
|
|
+ * @return bool
|
|
|
*/
|
|
|
- static function start($already_installed = true)
|
|
|
+ static function has($variable)
|
|
|
{
|
|
|
- global $_configuration;
|
|
|
-
|
|
|
- /*
|
|
|
- * Prevent Session fixation bug fixes
|
|
|
- * See http://support.chamilo.org/issues/3600
|
|
|
- * http://php.net/manual/en/session.configuration.php
|
|
|
- * @todo use session_set_cookie_params with some custom admin parameters
|
|
|
- */
|
|
|
-
|
|
|
- //session.cookie_lifetime
|
|
|
- //the session ID is only accepted from a cookie
|
|
|
- ini_set('session.use_only_cookies', 1);
|
|
|
-
|
|
|
- //HTTPS only if possible
|
|
|
- //ini_set('session.cookie_secure', 1);
|
|
|
- //session ID in the cookie is only readable by the server
|
|
|
- ini_set('session.cookie_httponly', 1);
|
|
|
-
|
|
|
- //Use entropy file
|
|
|
- //session.entropy_file
|
|
|
- //ini_set('session.entropy_length', 128);
|
|
|
- //Do not include the identifier in the URL, and not to read the URL for
|
|
|
- // identifiers.
|
|
|
- ini_set('session.use_trans_sid', 0);
|
|
|
-
|
|
|
- session_name(self::NAME);
|
|
|
- session_start();
|
|
|
-
|
|
|
- $session = self::instance();
|
|
|
-
|
|
|
- if ($already_installed) {
|
|
|
- if (!isset($session['checkChamiloURL'])) {
|
|
|
- $session['checkChamiloURL'] = api_get_path(WEB_PATH);
|
|
|
- } elseif ($session['checkChamiloURL'] != api_get_path(WEB_PATH)) {
|
|
|
- self::clear();
|
|
|
- }
|
|
|
- }
|
|
|
+ return isset($_SESSION[$variable]);
|
|
|
+ }
|
|
|
|
|
|
- /*if (!$session->has('starttime') && !$session->is_expired()) {
|
|
|
- $session->write('starttime', time());
|
|
|
- }*/
|
|
|
- // If the session time has expired, refresh the starttime value,
|
|
|
- // so we're starting to count down from a later time
|
|
|
- if ( $session->has('starttime') && $session->is_expired()) {
|
|
|
- $session->destroy();
|
|
|
- } else {
|
|
|
- //error_log('Time not expired, extend session for a bit more');
|
|
|
- $session->write('starttime', time());
|
|
|
- }
|
|
|
+ /**
|
|
|
+ * Clear
|
|
|
+ */
|
|
|
+ static function clear()
|
|
|
+ {
|
|
|
+ $session = Container::getSession();
|
|
|
+ $session->clear();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Destroy
|
|
|
+ */
|
|
|
+ static function destroy()
|
|
|
+ {
|
|
|
+ $session = Container::getSession();
|
|
|
+ $session->invalidate();
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * ArrayAccess
|
|
|
+ */
|
|
|
+ public function offsetExists($offset)
|
|
|
+ {
|
|
|
+ return isset($_SESSION[$offset]);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Session start time: that is the last time the user loaded a page (before this time)
|
|
|
- * @return int timestamp
|
|
|
+ * It it exists returns the value stored at the specified offset.
|
|
|
+ * If offset does not exists returns null. Do not trigger a warning.
|
|
|
+ *
|
|
|
+ * @param string $offset
|
|
|
+ * @return any
|
|
|
*/
|
|
|
- function start_time()
|
|
|
+ public function offsetGet($offset)
|
|
|
{
|
|
|
- return self::read('starttime');
|
|
|
+ return self::read($offset);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function offsetSet($offset, $value)
|
|
|
+ {
|
|
|
+ self::write($offset, $value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function offsetUnset($offset)
|
|
|
+ {
|
|
|
+ unset($_SESSION[$offset]);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Session end time: when the session expires. This is made of the last page
|
|
|
- * load time + a number of seconds
|
|
|
- * @return int UNIX timestamp (server's timezone)
|
|
|
+ * @param string $name
|
|
|
*/
|
|
|
- function end_time()
|
|
|
+ public function __unset($name)
|
|
|
{
|
|
|
- $start_time = $this->start_time();
|
|
|
- $lifetime = self::session_lifetime();
|
|
|
- return $start_time + $lifetime;
|
|
|
+ unset($_SESSION[$name]);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Returns whether the session is expired
|
|
|
- * @return bool True if the session is expired, false if it is still valid
|
|
|
+ * @param string $name
|
|
|
+ * @return bool
|
|
|
+ */
|
|
|
+ public function __isset($name)
|
|
|
+ {
|
|
|
+ return self::has($name);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * It it exists returns the value stored at the specified offset.
|
|
|
+ * If offset does not exists returns null. Do not trigger a warning.
|
|
|
+ *
|
|
|
+ * @param string $name
|
|
|
+ *
|
|
|
+ * @return mixed
|
|
|
+ *
|
|
|
+ */
|
|
|
+ function __get($name)
|
|
|
+ {
|
|
|
+ return self::read($name);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param string $name
|
|
|
+ * @param mixed $value
|
|
|
*/
|
|
|
- public function is_expired()
|
|
|
+ function __set($name, $value)
|
|
|
{
|
|
|
- return $this->end_time() < time();
|
|
|
+ self::write($name, $value);
|
|
|
}
|
|
|
}
|