19 declare(strict_types=1);
76 public static function _getData(
string $a_session_id): string
86 $q =
"SELECT data FROM usr_session WHERE session_id = " .
87 $ilDB->quote($a_session_id,
"text");
89 $rec =
$ilDB->fetchAssoc($set);
90 if (!is_array($rec)) {
95 return (
string) $rec[
"data"];
107 $ilDB = $DIC[
'ilDB'];
109 $query =
'SELECT expires FROM usr_session WHERE session_id = ' .
110 $ilDB->quote($a_session_id,
'text');
113 return (
int) $row->expires;
118 public static function _writeData(
string $a_session_id,
string $a_data):
bool 123 $ilDB = $DIC[
'ilDB'];
125 $ilClientIniFile = $DIC[
'ilClientIniFile'];
127 if (self::isWebAccessWithoutSessionEnabled()) {
134 if (!$a_session_id) {
148 if ($ilClientIniFile->readVariable(
'session',
'save_ip')) {
152 if (self::_exists($a_session_id)) {
169 if (class_exists(
'ilContext')) {
173 $insert_fields = implode(
', ', array_keys($fields));
174 $insert_values = implode(
177 static fn(
string $type, $value):
string =>
$ilDB->quote($value, $type),
178 array_column($fields, 0),
179 array_column($fields, 1)
183 $update_fields = array_filter(
185 static fn(
string $field):
bool => !in_array($field, [
'session_id',
'user_id',
'createtime'],
true),
188 $update_values = implode(
191 static fn(
string $field,
string $type, $value):
string => $field .
' = ' .
$ilDB->quote(
195 array_keys($update_fields),
196 array_column($update_fields, 0),
197 array_column($update_fields, 1)
202 'INSERT INTO usr_session (' . $insert_fields .
') ' 203 .
'VALUES (' . $insert_values .
') ' 204 .
'ON DUPLICATE KEY UPDATE ' . $update_values
208 $type = (
int) $fields[
'type'][1];
211 $fields[
'session_id'][1],
213 $fields[
'createtime'][1],
214 $fields[
'user_id'][1]
219 if (!$DIC->cron()->manager()->isJobActive(
'auth_destroy_expired_sessions')) {
222 if ($random->int(0, 50) === 2) {
224 self::_destroyExpiredSessions();
240 public static function _exists(
string $a_session_id): bool
242 if (!$a_session_id) {
247 $ilDB = $DIC[
'ilDB'];
249 $q =
"SELECT 1 FROM usr_session WHERE session_id = " .
$ilDB->quote($a_session_id,
"text");
252 return $ilDB->numRows($set) > 0;
262 public static function _destroy($a_session_id, ?
int $a_closing_context = null, $a_expired_at = null): bool
266 $ilDB = $DIC[
'ilDB'];
268 if (!$a_closing_context) {
269 $a_closing_context = self::$closing_context;
274 if (!is_array($a_session_id)) {
275 $q =
"DELETE FROM usr_session WHERE session_id = " .
276 $ilDB->quote($a_session_id,
"text");
280 $a_session_id = array_keys($a_session_id);
282 $q =
"DELETE FROM usr_session WHERE " .
283 $ilDB->in(
"session_id", $a_session_id,
false,
"text");
293 if ($DIC->http()->wrapper()->cookie()->has(session_name()) &&
294 $DIC->http()->wrapper()->cookie()->retrieve(
296 $DIC->refinery()->kindlyTo()->string()
297 ) === $a_session_id) {
298 $cookieJar = $DIC->http()->cookieJar()->without(session_name());
299 $cookieJar->renderIntoResponseHeader($DIC->http()->response());
319 $ilDB = $DIC[
'ilDB'];
321 $q =
"DELETE FROM usr_session WHERE user_id = " .
322 $ilDB->quote($a_user_id,
"integer");
336 $ilDB = $DIC[
'ilDB'];
342 $ids[$row[
'session_id']] = (
int) $row[
'expires'];
345 self::_destroy($ids, self::SESSION_CLOSE_EXPIRE,
true);
357 public static function _duplicate(
string $a_session_id): string
361 $ilDB = $DIC[
'ilDB'];
364 $new_session = $a_session_id;
366 $new_session = md5($new_session);
367 $q =
"SELECT * FROM usr_session WHERE " .
368 "session_id = " .
$ilDB->quote($new_session,
"text");
372 $query =
"SELECT * FROM usr_session " .
373 "WHERE session_id = " .
$ilDB->quote($a_session_id,
"text");
377 self::_writeData($new_session, $row->data);
393 public static function getExpireValue(
bool $fixedMode =
false):
int 399 return time() + self::getIdleValue($fixedMode);
404 if (
$ilSetting->get(
'session_handling_type', (
string) self::SESSION_HANDLING_FIXED) === (string) self::SESSION_HANDLING_FIXED) {
405 return time() + self::getIdleValue($fixedMode);
408 if (
$ilSetting->get(
'session_handling_type', (
string) self::SESSION_HANDLING_FIXED) === (string) self::SESSION_HANDLING_LOAD_DEPENDENT) {
411 return time() + $max_idle * 60;
428 $ilClientIniFile = $DIC[
'ilClientIniFile'];
430 if ($fixedMode ||
$ilSetting->get(
'session_handling_type', (
string) self::SESSION_HANDLING_FIXED) === (string) self::SESSION_HANDLING_FIXED) {
432 return (
int) $ilClientIniFile->readVariable(
'session',
'expire');
435 if (
$ilSetting->get(
'session_handling_type', (
string) self::SESSION_HANDLING_FIXED) === (string) self::SESSION_HANDLING_LOAD_DEPENDENT) {
451 return self::getIdleValue(
true);
457 public static function set(
string $a_var, $a_val):
void 459 $_SESSION[$a_var] = $a_val;
465 public static function get(
string $a_var)
467 return $_SESSION[$a_var] ?? null;
470 public static function has($a_var): bool
472 return isset($_SESSION[$a_var]);
478 public static function clear(
string $a_var): void
480 if (isset($_SESSION[$a_var])) {
481 unset($_SESSION[$a_var]);
487 return print_r($_SESSION,
true);
495 self::$closing_context = $a_context;
503 return self::$closing_context;
513 return self::$enable_web_access_without_session;
static enableWebAccessWithoutSession(bool $enable_web_access_without_session)
static _duplicate(string $a_session_id)
Duplicate session.
static _destroyByUserId(int $a_user_id)
Destroy session.
static createRawEntry(string $a_session_id, int $a_session_type, int $a_timestamp, int $a_user_id)
Create raw data entry.
static _getData(string $a_session_id)
Get session data from table.
static usesHTTP()
Uses HTTP aka browser.
const SESSION_CLOSE_INACTIVE
static _exists(string $a_session_id)
Check whether session exists.
static bool $enable_web_access_without_session
const SESSION_CLOSE_LOGIN
static isSessionMainContext()
Context that are not only temporary in a session (e.g.
static lookupExpireTime(string $a_session_id)
Lookup expire time for a specific session.
const SESSION_HANDLING_FIXED
static _destroyExpiredSessions()
Destroy expired sessions.
static aggretateRaw(int $a_now)
Aggregate raw session data (older than given time)
const SESSION_CLOSE_EXPIRE
static closeRawEntry($a_session_id, ?int $a_context=null, $a_expired_at=null)
Close raw data entry.
static destroySession($a_session_id)
Destroy session(s).
get(string $key, Refinery\Transformation $t)
Get passed parameter, if not data passed, get key from http request.
static isWebAccessWithoutSessionEnabled()
const SESSION_CLOSE_LIMIT
const SESSION_CLOSE_PUBLIC
static _destroy($a_session_id, ?int $a_closing_context=null, $a_expired_at=null)
Destroy session.
static array $session_types_controlled
const SESSION_CLOSE_SIMUL
static setClosingContext(int $a_context)
set closing context (for statistics)
Wrapper for generation of random numbers, strings, bytes.
static getIdleValue(bool $fixedMode=false)
Returns the idle time in seconds.
const SESSION_HANDLING_LOAD_DEPENDENT
static getType()
Get context type.
static getClosingContext()
get closing context (for statistics)
static getSessionExpireValue()
Returns the session expiration value.
static clear(string $a_var)
const SESSION_CLOSE_FIRST
static int $closing_context