diff --git a/phpgwapi/inc/class.sessions_php4.inc.php b/phpgwapi/inc/class.sessions_php4.inc.php index ba2e53b86a..237118529b 100644 --- a/phpgwapi/inc/class.sessions_php4.inc.php +++ b/phpgwapi/inc/class.sessions_php4.inc.php @@ -181,16 +181,17 @@ ) * $sign; } - /*! - @function list_sessions - @abstract get list of normal / non-anonymous sessions - @note The data form the session-files get cached in the app_session phpgwapi/php4_session_cache - @author ralfbecker - */ + /** + * get list of normal / non-anonymous sessions (works only for session.handler = files!, but that's the default) + * + * The data from the session-files get cached in the app_session phpgwapi/php4_session_cache + * + * @author RalfBecker-AT-outdoor-training.de + */ function list_sessions($start,$order,$sort,$all_no_sort = False) { //echo "
session_php4::list_sessions($start,'$order','$sort',$all)
\n"; - //$session_cache = $this->appsession('php4_session_cache','phpgwapi'); + $session_cache = $this->appsession('php4_session_cache','phpgwapi'); $values = array(); $maxmatchs = $GLOBALS['egw_info']['user']['preferences']['common']['maxmatchs']; @@ -199,19 +200,25 @@ { return $values; } - while ($file = readdir($dir)) + while (($file = readdir($dir))) { if (substr($file,0,5) != 'sess_' || $session_cache[$file] === false) { continue; } + if (isset($session_cache[$file]) && !$session_cache[$file]) // session is marked as not to list (not ours or anonymous) + { + continue; + } if (isset($session_cache[$file])) // use copy from cache { - if (!$all_no_sort) // we need the up-to-date data --> unset and reread it + $session = $session_cache[$file]; + + if (!$all_no_sort || // we need the up-to-date data --> unset and reread it + $session['session_dla'] <= (time() - $GLOBALS['egw_info']['server']['sessions_timeout'])) // cached dla is timeout { unset($session_cache[$file]); } - $session = $session_cache[$file]; } if (!isset($session_cache[$file])) // not in cache, read and cache it { @@ -234,16 +241,25 @@ $session = unserialize(substr($session,1+strlen(EGW_SESSION_VAR))); unset($session['app_sessions']); // not needed, saves memory $session_cache[$file] = $session; - } - if($session['session_flags'] == 'A' || !$session['session_id'] || - $session['session_install_id'] != $GLOBALS['egw_info']['server']['install_id']) - { - $session_cache[$file] = false; // dont try reading it again - continue; // no anonymous sessions or other domains or installations + + if($session['session_flags'] == 'A' || !$session['session_id'] || + $session['session_install_id'] != $GLOBALS['egw_info']['server']['install_id']) + { + $session_cache[$file] = false; // dont try reading it again + continue; // no anonymous sessions or other domains or installations + } + // check for and terminate sessions which are timed out ==> destroy them + // this should be not necessary if php is configured right, but I'm sick of the questions on the list + if ($session['session_dla'] <= (time() - $GLOBALS['egw_info']['server']['sessions_timeout'])) + { + //echo "session $session[session_id] is timed out !!!"; print_r($session); echo ""; - - $session['php_session_file'] = $path . '/' . $file; $values[$session['session_id']] = $session; } closedir($dir); @@ -272,11 +288,11 @@ return $values; } - /*! - @function total - @abstract get number of normal / non-anonymous sessions - @author ralfbecker - */ + /** + * get number of normal / non-anonymous sessions + * + * @author RalfBecker-AT-outdoor-training.de + */ function total() { return count($this->list_sessions(0,'','',True));