Session.php 4.0 KB

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