| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- <?php
- require_once dirname(__FILE__) . '/' . 'Lib.php';
- Lib::loadClass('V');
- Lib::loadClass('User');
- /**
- * SESSION timeout.
- *
- * @use $_SESSION['USER_SESSION_EXPIRE'] = 1800;// TODO: read from DB - ADMIN_USERS in authorize user or default value 30 min
- * @use $_SESSION['USER_SESSION_LAST_ACTIVITY'] = ;
- *
- */
- class S {
- public static function init() {
- @session_start();// PHP Notice: A session had already been started - ignoring session_start()
- $ses_keys = array();
- $ses_keys[] = 'DEBUG';
- $ses_keys[] = 'USER_PROFILE';
- $ses_keys[] = 'CURRENT_MENU';
- $ses_keys[] = 'LAST_MENU';
- $ses_keys[] = 'LAST1_MENU';
- $ses_keys[] = 'THIS';
- $ses_keys[] = 'LAST_FUNCTION';
- $ses_keys[] = 'LAST1_FUNCTION';
- $ses_keys[] = 'CURRENT_FUNCTION';
- $ses_keys[] = 'USER_SESSION_LAST_ACTIVITY';
- $ses_keys[] = 'USER_SESSION_EXPIRE';
- foreach ($ses_keys as $k) {
- if (!isset($_SESSION[$k])) $_SESSION[$k] = null;
- }
- self::timeoutFetch();
- }
- public static function get($key) {
- $null = null;
- return (isset($_SESSION[$key]))? $_SESSION[$key] : $null;
- }
- /**
- * TODO: ustalic czas trwania sesji np. wg. stanowiska
- */
- public static function timeoutFetch() {
- if (empty($_SESSION['USER_SESSION_EXPIRE']) || $_SESSION['USER_SESSION_EXPIRE'] <= 0) {
- $_SESSION['USER_SESSION_EXPIRE'] = ini_get('session.gc_maxlifetime');//1800 - 3min
- }
- if (empty($_SESSION['USER_SESSION_LAST_ACTIVITY'])) {
- $_SESSION['USER_SESSION_LAST_ACTIVITY'] = time();
- }
- }
- /**
- * Check if user is logged in, and how much time not clicked.
- */
- public static function timeoutCheck() {
- if (!User::logged()) {// if not logged in dont check timeout
- return false;
- }
- $time = time();
- $last_activity = V::get('USER_SESSION_LAST_ACTIVITY', 0, $_SESSION, 'int');
- if ($last_activity <= 0) {// error last activity not set
- return false;
- }
- $ses_expire = V::get('USER_SESSION_EXPIRE', 0, $_SESSION, 'int');
- if (!$ses_expire) {// error expire not set
- return false;
- }
- if ($time - $last_activity > $ses_expire) {
- // last request was more than 30 minates ago
- self::destroy();
- return false;
- } else {
- return true;
- }
- }
- public static function destroy() {
- session_destroy();// destroy session data in storage
- session_unset();// unset $_SESSION variable for the runtime
- }
- public static function timeout_update() {// TODO: legacy
- self::timeoutUpdate();
- }
- public static function timeoutUpdate($force = false) {
- if ($force) {
- $_SESSION['USER_SESSION_LAST_ACTIVITY'] = time();
- return true;
- }
- else if (self::timeoutCheck()) {
- $_SESSION['USER_SESSION_LAST_ACTIVITY'] = time();
- return true;
- }
- return false;
- }
- public static function timeoutGet() {
- if (self::timeoutCheck()) {
- $ret = $_SESSION['USER_SESSION_EXPIRE'] - (time() - $_SESSION['USER_SESSION_LAST_ACTIVITY']);
- } else {
- $ret = 'expired';
- }
- return $ret;
- }
- public static function show_session_timer() {
- echo '<code id="'."session-timer".'" style="padding:2px 5px;font-weight:normal;color:red;" title="Czas sesji">'."".'</code>';
- }
- public static function timeout_update_js() {
- self::printTimeoutUpdateJs();
- }
- public static function printTimeoutUpdateJs() {
- if (!User::logged()) {
- return;
- }
- UI::inlineJS( __FILE__ . ".sessionTimer.js", [
- 'BASE_URL' => Request::getPathUri(),
- 'USER_SESSION_EXPIRE' => V::get('USER_SESSION_EXPIRE', 0, $_SESSION, 'int'),
- 'SESSION_TIMER_URL' => "session-expire.php?task=getTimer",
- 'SESSION_AUTH_STATUS_URL' => "session-expire.php?task=getAuthStatus",
- 'USER_LOGIN' => User::getLogin(),
- ] );
- }
- static function printLogoutJs() {
- UI::inlineJS( __FILE__ . ".expiredSessionTimer.js", [
- 'BASE_URL' => Request::getPathUri(),
- ] );
- }
- static function getAuthStatus() {
- if (!self::timeoutCheck()) return [ 'status' => "expired" ];
- $currentTime = time();
- return [
- 'type' => "logged_in",
- 'login' => User::getLogin(),
- 'expire' => $_SESSION['USER_SESSION_EXPIRE'] - ($currentTime - $_SESSION['USER_SESSION_LAST_ACTIVITY']),
- 'time' => $currentTime,
- ];
- }
- static function saveUserMessage($className, $message) {
- return self::_userMessage('set', $className, $message);
- }
- static function getUserMessage() {
- return self::_userMessage('get');
- }
- static function _userMessage($action, $className = '', $message = '') {
- static $_msg = null;
- switch ($action) {
- case 'set': $_msg = [ $className, $message ]; return;
- case 'get': $ret = ($_msg) ? [ $_msg[0], $_msg[1] ] : null; $_msg = null; return $ret;
- }
- }
- }
|