Session.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. /**
  3. * La classe Session gère la session utilisateur
  4. */
  5. class Minz_Session {
  6. private static $volatile = false;
  7. /**
  8. * For mutual exclusion.
  9. */
  10. private static $locked = false;
  11. public static function lock() {
  12. if (!self::$volatile && !self::$locked && session_start()) {
  13. self::$locked = true;
  14. }
  15. return self::$locked;
  16. }
  17. public static function unlock() {
  18. if (!self::$volatile && session_write_close()) {
  19. self::$locked = false;
  20. }
  21. return self::$locked;
  22. }
  23. /**
  24. * Initialise la session, avec un nom
  25. * Le nom de session est utilisé comme nom pour les cookies et les URLs(i.e. PHPSESSID).
  26. * Il ne doit contenir que des caractères alphanumériques ; il doit être court et descriptif
  27. * If the volatile parameter is true, then no cookie and not session storage are used.
  28. * Volatile is especially useful for API calls without cookie / Web session.
  29. */
  30. public static function init($name, $volatile = false) {
  31. self::$volatile = $volatile;
  32. if (self::$volatile) {
  33. $_SESSION = [];
  34. return;
  35. }
  36. $cookie = session_get_cookie_params();
  37. self::keepCookie($cookie['lifetime']);
  38. // démarre la session
  39. session_name($name);
  40. //When using cookies (default value), session_stars() sends HTTP headers
  41. session_start();
  42. session_write_close();
  43. //Use cookie only the first time the session is started to avoid resending HTTP headers
  44. ini_set('session.use_cookies', '0');
  45. }
  46. /**
  47. * Permet de récupérer une variable de session
  48. * @param $p le paramètre à récupérer
  49. * @return la valeur de la variable de session, false si n'existe pas
  50. */
  51. public static function param($p, $default = false) {
  52. return isset($_SESSION[$p]) ? $_SESSION[$p] : $default;
  53. }
  54. /**
  55. * Permet de créer ou mettre à jour une variable de session
  56. * @param $p le paramètre à créer ou modifier
  57. * @param $v la valeur à attribuer, false pour supprimer
  58. */
  59. public static function _param($p, $v = false) {
  60. if (!self::$volatile && !self::$locked) {
  61. session_start();
  62. }
  63. if ($v === false) {
  64. unset($_SESSION[$p]);
  65. } else {
  66. $_SESSION[$p] = $v;
  67. }
  68. if (!self::$volatile && !self::$locked) {
  69. session_write_close();
  70. }
  71. }
  72. public static function _params($keyValues) {
  73. if (!self::$volatile && !self::$locked) {
  74. session_start();
  75. }
  76. foreach ($keyValues as $k => $v) {
  77. if ($v === false) {
  78. unset($_SESSION[$k]);
  79. } else {
  80. $_SESSION[$k] = $v;
  81. }
  82. }
  83. if (!self::$volatile && !self::$locked) {
  84. session_write_close();
  85. }
  86. }
  87. /**
  88. * Permet d'effacer une session
  89. * @param $force si à false, n'efface pas le paramètre de langue
  90. */
  91. public static function unset_session($force = false) {
  92. $language = self::param('language');
  93. if (!self::$volatile) {
  94. session_destroy();
  95. }
  96. $_SESSION = array();
  97. if (!$force) {
  98. self::_param('language', $language);
  99. Minz_Translate::reset($language);
  100. }
  101. }
  102. public static function getCookieDir() {
  103. // Get the script_name (e.g. /p/i/index.php) and keep only the path.
  104. $cookie_dir = '';
  105. if (!empty($_SERVER['HTTP_X_FORWARDED_PREFIX'])) {
  106. $cookie_dir .= rtrim($_SERVER['HTTP_X_FORWARDED_PREFIX'], '/ ');
  107. }
  108. $cookie_dir .= empty($_SERVER['REQUEST_URI']) ? '/' : $_SERVER['REQUEST_URI'];
  109. if (substr($cookie_dir, -1) !== '/') {
  110. $cookie_dir = dirname($cookie_dir) . '/';
  111. }
  112. return $cookie_dir;
  113. }
  114. /**
  115. * Spécifie la durée de vie des cookies
  116. * @param $l la durée de vie
  117. */
  118. public static function keepCookie($l) {
  119. session_set_cookie_params($l, self::getCookieDir(), '', Minz_Request::isHttps(), true);
  120. }
  121. /**
  122. * Régénère un id de session.
  123. * Utile pour appeler session_set_cookie_params après session_start()
  124. */
  125. public static function regenerateID() {
  126. session_regenerate_id(true);
  127. }
  128. public static function deleteLongTermCookie($name) {
  129. setcookie($name, '', 1, '', '', Minz_Request::isHttps(), true);
  130. }
  131. public static function setLongTermCookie($name, $value, $expire) {
  132. setcookie($name, $value, $expire, '', '', Minz_Request::isHttps(), true);
  133. }
  134. public static function getLongTermCookie($name) {
  135. return isset($_COOKIE[$name]) ? $_COOKIE[$name] : null;
  136. }
  137. }