S.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <?php
  2. require_once dirname(__FILE__) . '/' . 'Lib.php';
  3. Lib::loadClass('V');
  4. Lib::loadClass('User');
  5. /**
  6. * SESSION timeout.
  7. *
  8. * @use $_SESSION['USER_SESSION_EXPIRE'] = 1800;// TODO: read from DB - ADMIN_USERS in authorize user or default value 30 min
  9. * @use $_SESSION['USER_SESSION_LAST_ACTIVITY'] = ;
  10. *
  11. */
  12. class S {
  13. public static function init() {
  14. @session_start();// PHP Notice: A session had already been started - ignoring session_start()
  15. $ses_keys = array();
  16. $ses_keys[] = 'DEBUG';
  17. $ses_keys[] = 'USER_PROFILE';
  18. $ses_keys[] = 'CURRENT_MENU';
  19. $ses_keys[] = 'LAST_MENU';
  20. $ses_keys[] = 'LAST1_MENU';
  21. $ses_keys[] = 'THIS';
  22. $ses_keys[] = 'LAST_FUNCTION';
  23. $ses_keys[] = 'LAST1_FUNCTION';
  24. $ses_keys[] = 'CURRENT_FUNCTION';
  25. $ses_keys[] = 'USER_SESSION_LAST_ACTIVITY';
  26. $ses_keys[] = 'USER_SESSION_EXPIRE';
  27. foreach ($ses_keys as $k) {
  28. if (!isset($_SESSION[$k])) $_SESSION[$k] = null;
  29. }
  30. self::timeoutFetch();
  31. }
  32. public static function get($key) {
  33. $null = null;
  34. return (isset($_SESSION[$key]))? $_SESSION[$key] : $null;
  35. }
  36. /**
  37. * TODO: ustalic czas trwania sesji np. wg. stanowiska
  38. */
  39. public static function timeoutFetch() {
  40. if (empty($_SESSION['USER_SESSION_EXPIRE']) || $_SESSION['USER_SESSION_EXPIRE'] <= 0) {
  41. $_SESSION['USER_SESSION_EXPIRE'] = ini_get('session.gc_maxlifetime');//1800 - 3min
  42. }
  43. if (empty($_SESSION['USER_SESSION_LAST_ACTIVITY'])) {
  44. $_SESSION['USER_SESSION_LAST_ACTIVITY'] = time();
  45. }
  46. }
  47. /**
  48. * Check if user is logged in, and how much time not clicked.
  49. */
  50. public static function timeoutCheck() {
  51. if (!User::logged()) {// if not logged in dont check timeout
  52. return false;
  53. }
  54. $time = time();
  55. $last_activity = V::get('USER_SESSION_LAST_ACTIVITY', 0, $_SESSION, 'int');
  56. if ($last_activity <= 0) {// error last activity not set
  57. return false;
  58. }
  59. $ses_expire = V::get('USER_SESSION_EXPIRE', 0, $_SESSION, 'int');
  60. if (!$ses_expire) {// error expire not set
  61. return false;
  62. }
  63. if ($time - $last_activity > $ses_expire) {
  64. // last request was more than 30 minates ago
  65. self::destroy();
  66. return false;
  67. } else {
  68. return true;
  69. }
  70. }
  71. public static function destroy() {
  72. session_destroy();// destroy session data in storage
  73. session_unset();// unset $_SESSION variable for the runtime
  74. }
  75. public static function timeout_update() {// TODO: legacy
  76. self::timeoutUpdate();
  77. }
  78. public static function timeoutUpdate($force = false) {
  79. if ($force) {
  80. $_SESSION['USER_SESSION_LAST_ACTIVITY'] = time();
  81. return true;
  82. }
  83. else if (self::timeoutCheck()) {
  84. $_SESSION['USER_SESSION_LAST_ACTIVITY'] = time();
  85. return true;
  86. }
  87. return false;
  88. }
  89. public static function timeout_get() {// TOOD: legacy
  90. return self::timeoutGet();
  91. }
  92. public static function timeoutGet() {
  93. if (self::timeoutCheck()) {
  94. $ret = $_SESSION['USER_SESSION_EXPIRE'] - (time() - $_SESSION['USER_SESSION_LAST_ACTIVITY']);
  95. } else {
  96. $ret = 'expired';
  97. }
  98. return $ret;
  99. }
  100. public static function show_session_timer() {
  101. echo '<code id="'."session-timer".'" style="padding:0 5px;font-weight:bold;color:red;" title="Czas sesji">'."".'</code>';
  102. }
  103. public static function timeout_update_js() {
  104. self::printTimeoutUpdateJs();
  105. }
  106. public static function printTimeoutUpdateJs() {
  107. if (!User::logged()) {
  108. return;
  109. }
  110. ?>
  111. <script type="text/javascript">
  112. var _sesTimerEl=null;
  113. var _sesExpireTimer='<?php echo $_SESSION['USER_SESSION_EXPIRE']; ?>';
  114. var _sesExpireCheck=false;
  115. function sesExpireTimeoutUpdate(){
  116. //console.log('sesExpireTimeoutUpdate: ' + _sesExpireTimer);
  117. if(!_sesTimerEl) return;
  118. if(_sesExpireTimer>=0){
  119. var min = Math.floor(_sesExpireTimer / 60);
  120. var sek = _sesExpireTimer % 60;
  121. if (sek < 10) { sek = '0' + sek; }
  122. _sesTimerEl.innerHTML='' + min + ':' + sek + '';
  123. window.setTimeout('sesExpireTimeoutUpdate()', 1000);
  124. }else{
  125. _sesTimerEl.innerHTML='expired!';
  126. window.setTimeout('sesExpireTimeoutUpdate()', 1000);
  127. }
  128. _sesExpireTimer-=1;
  129. }
  130. var sessionTimeoutStop = false;
  131. var sessionTimeoutCheckFreq = 5;
  132. var sessionTimeoutCheck = sessionTimeoutCheckFreq;
  133. function sesAjaxTimerCheck(){
  134. if (sessionTimeoutStop) return;
  135. jQuery.get('session-expire.php'
  136. , {task: 'getTimer'}
  137. , function(data){
  138. if (sessionTimeoutStop) return;
  139. if (data==='expired' || data === '0' || data === '401: Unauthorized') {
  140. _sesExpireTimer=-1;// logout
  141. var exprModal=document.getElementById('session-timer-modal');
  142. if (!exprModal) {
  143. var modalHtml = '<div id="session-timer-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="session-timer-modal-label" aria-hidden="true">' +
  144. ' <div class="modal-dialog">' +
  145. ' <div class="modal-content">' +
  146. ' <div class="modal-header">' +
  147. ' <h3 id="session-timer-modal-label">Zostałeś wylogowany</h3>' +
  148. ' </div>' +
  149. ' <div class="modal-footer">' +
  150. ' <a href="index.php" class="btn btn-primary">Zaloguj</a>' +
  151. ' </div>' +
  152. ' </div>' +
  153. ' </div>' +
  154. '</div>';
  155. exprModal = jQuery(modalHtml).appendTo('body');
  156. }
  157. jQuery('#session-timer-modal').modal({show: true, keyboard: false, backdrop: 'static'});
  158. } else {
  159. //console.log('session time = '+data);
  160. _sesExpireTimer=data;
  161. }
  162. }
  163. );
  164. if (sessionTimeoutStop) return;
  165. if(_sesExpireTimer>=0){
  166. window.setTimeout('sesAjaxTimerCheck()', sessionTimeoutCheckFreq * 1000);
  167. _sesExpireCheck=false;
  168. }else{
  169. // last chance
  170. // if (_sesExpireCheck) {
  171. // alert('Your current Session is over.');
  172. // } else {
  173. // window.setTimeout('sesAjaxTimerCheck()', sessionTimeoutCheckFreq * 1000);
  174. // _sesExpireCheck=true;
  175. // }
  176. }
  177. }
  178. jQuery(document).ready(function(){
  179. _sesTimerEl=document.getElementById('session-timer');
  180. if(_sesTimerEl){
  181. _sesTimerEl.innerHTML='...';
  182. sesExpireTimeoutUpdate();
  183. }
  184. sesAjaxTimerCheck();
  185. });
  186. function stopTimer(){
  187. //console.log('stopTimer()...');
  188. sessionTimeoutStop = true;
  189. return true;
  190. }
  191. </script>
  192. <?php
  193. }
  194. }