46 global $dolibarr_main_db_type, $dolibarr_main_db_host;
47 global $dolibarr_main_db_user, $dolibarr_main_db_pass, $dolibarr_main_db_name, $dolibarr_main_db_port;
49 global $dolibarr_session_db_type, $dolibarr_session_db_host;
50 global $dolibarr_session_db_user, $dolibarr_session_db_pass, $dolibarr_session_db_name, $dolibarr_session_db_port;
52 if (empty($dolibarr_session_db_type)) {
53 $dolibarr_session_db_type = $dolibarr_main_db_type;
55 if (empty($dolibarr_session_db_host)) {
56 $dolibarr_session_db_host = $dolibarr_main_db_host;
58 if (empty($dolibarr_session_db_user)) {
59 $dolibarr_session_db_user = $dolibarr_main_db_user;
61 if (empty($dolibarr_session_db_pass)) {
62 $dolibarr_session_db_pass = $dolibarr_main_db_pass;
64 if (empty($dolibarr_session_db_name)) {
65 $dolibarr_session_db_name = $dolibarr_main_db_name;
67 if (empty($dolibarr_session_db_port)) {
68 $dolibarr_session_db_port = $dolibarr_main_db_port;
71 $dbsession =
getDoliDBInstance($dolibarr_session_db_type, $dolibarr_session_db_host, $dolibarr_session_db_user, $dolibarr_session_db_pass, $dolibarr_session_db_name, (
int) $dolibarr_session_db_port);
85 global $sessionlastvalueread;
86 global $sessionidfound;
88 $sql =
"SELECT session_id, session_variable, last_accessed FROM ".MAIN_DB_PREFIX.
"session";
89 $sql .=
" WHERE session_id = '".$dbsession->escape($sess_id).
"'";
92 $resql = $dbsession->query($sql);
93 $num_rows = $dbsession->num_rows($resql);
96 $sessionlastvalueread =
'';
101 $obj = $dbsession->fetch_object($resql);
108 $max_lifetime = min(3600 * 24, (
int) ini_get(
'session.gc_maxlifetime'));
109 if ($max_lifetime > 0 && $dbsession->jdate($obj->last_accessed) < (
dol_now() - $max_lifetime)) {
112 $delete_query =
"DELETE FROM ".MAIN_DB_PREFIX.
"session";
113 $delete_query .=
" WHERE session_id = '".$dbsession->escape($sess_id).
"'";
114 $dbsession->query($delete_query);
116 $sessionlastvalueread =
'';
117 $sessionidfound =
'';
122 $sessionlastvalueread = $obj->session_variable;
123 $sessionidfound = $obj->session_id;
124 return $obj->session_variable;
137 global $dbsession, $user;
138 global $sessionlastvalueread;
139 global $sessionidfound;
146 if ($sessionlastvalueread != $val) {
149 if (empty($sessionidfound)) {
151 $insert_query =
"INSERT INTO ".MAIN_DB_PREFIX.
"session";
152 $insert_query .=
"(session_id, session_variable, date_creation, last_accessed, fk_user, remote_ip, user_agent)";
153 $insert_query .=
" VALUES ('".$dbsession->escape($sess_id).
"', '".$dbsession->escape($val).
"', '".$dbsession->idate($time_stamp).
"', '".$dbsession->idate($time_stamp).
"', 0, '".$dbsession->escape(
getUserRemoteIP()).
"', '".$dbsession->escape(substr($_SERVER[
'HTTP_USER_AGENT'] ??
'', 0, 255)).
"')";
155 $result = $dbsession->query($insert_query);
157 dol_print_error($dbsession);
161 if ($sessionidfound != $sess_id) {
163 dol_print_error($dbsession,
'Oops sess_id received in dolSessionWrite differs from the cache value $sessionidfound. How can this happen ?');
185 $update_query =
"UPDATE ".MAIN_DB_PREFIX.
"session";
186 $update_query .=
" SET session_variable = '".$dbsession->escape($val).
"',";
187 $update_query .=
" last_accessed = '".$dbsession->idate($time_stamp).
"',";
188 $update_query .=
" fk_user = ".(int) (!empty($user->id) ? $user->id : 0).
",";
189 $update_query .=
" remote_ip = '".$dbsession->escape(
getUserRemoteIP()).
"',";
190 $update_query .=
" user_agent = '".$dbsession->escape($_SERVER[
'HTTP_USER_AGENT'] ??
'').
"'";
191 $update_query .=
" WHERE session_id = '".$dbsession->escape($sess_id).
"'";
193 $result = $dbsession->query($update_query);
195 dol_print_error($dbsession);
207 if ((
int) ini_get(
'session.gc_probability') == 0) {
208 $gc_divisor = max(1, (
int) ini_get(
'session.gc_divisor'));
209 if (mt_rand(1, $gc_divisor) == 1) {
210 $max_lifetime = min(3600 * 24, max(
getDolGlobalInt(
'MAIN_SESSION_TIMEOUT'), (
int) ini_get(
'session.gc_maxlifetime')));
247 $delete_query =
"DELETE FROM ".MAIN_DB_PREFIX.
"session";
248 $delete_query .=
" WHERE session_id = '".$dbsession->escape($sess_id).
"'";
249 $dbsession->query($delete_query);
267 $delete_query =
"DELETE FROM ".MAIN_DB_PREFIX.
"session";
268 $delete_query .=
" WHERE last_accessed < '".$dbsession->idate($time_stamp - $max_lifetime).
"'";
270 $resql = $dbsession->query($delete_query);
274 dol_syslog(
"dolSessionGC failed to purge expired sessions: ".$dbsession->lasterror(), LOG_WARNING);
297 $fk_user = (int) $fk_user;
298 $keepcount = (int) $keepcount;
299 if ($fk_user <= 0 || $keepcount <= 0) {
304 $sql =
"SELECT session_id FROM ".MAIN_DB_PREFIX.
"session";
305 $sql .=
" WHERE fk_user = ".((int) $fk_user);
306 $sql .=
" AND session_id <> '".$dbsession->escape($currentsessionid).
"'";
307 $sql .=
" ORDER BY last_accessed DESC, session_id DESC";
309 $resql = $dbsession->query($sql);
311 dol_syslog(
"dolSessionsLimitForUser failed to list sessions: ".$dbsession->lasterror(), LOG_WARNING);
315 $idstodelete = array();
317 while ($obj = $dbsession->fetch_object($resql)) {
319 if ($rank >= $keepcount) {
320 $idstodelete[] = $obj->session_id;
324 if (empty($idstodelete)) {
328 $sqldel =
"DELETE FROM ".MAIN_DB_PREFIX.
"session WHERE session_id IN (";
330 foreach ($idstodelete as $idtodelete) {
331 $sqldel .= ($i > 0 ?
", " :
"").
"'".$dbsession->escape($idtodelete).
"'";
336 $resqldel = $dbsession->query($sqldel);
338 dol_syslog(
"dolSessionsLimitForUser failed to purge sessions: ".$dbsession->lasterror(), LOG_WARNING);
342 dol_syslog(
"dolSessionsLimitForUser evicted ".count($idstodelete).
" session(s) for fk_user=".$fk_user.
" to enforce a limit of ".$keepcount, LOG_NOTICE);
344 return count($idstodelete);
348session_set_save_handler(
"dolSessionOpen",
"dolSessionClose",
"dolSessionRead",
"dolSessionWrite",
"dolSessionDestroy",
"dolSessionGC");
359 $arrayofsessions = [];
360 $sql =
"SELECT s.session_id, s.session_variable, s.fk_user, s.date_creation, s.last_accessed, s.remote_ip, s.user_agent";
362 $sql .=
" FROM ".MAIN_DB_PREFIX.
"session as s";
363 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u ON u.rowid=s.fk_user";
364 $sql .=
" LIMIT 500";
365 $resql = $dbsession->query($sql);
366 while ($resql && $obj = $dbsession->fetch_object($resql)) {
367 $arrayofsessions[$obj->session_id] = [
368 "login" => (string) $obj->login,
369 "age" =>
dol_now() - (int) $dbsession->jdate($obj->date_creation),
370 "creation" => $dbsession->idate($obj->date_creation),
371 "modification" => $dbsession->idate($obj->last_accessed),
372 "remote_ip" => $obj->remote_ip,
373 "user_agent" => $obj->user_agent,
378 return $arrayofsessions;
dol_now($mode='gmt')
Return date for now.
getDoliDBInstance($type, $host, $user, $pass, $name, $port, $forcenew=false)
Return a DoliDB instance (database handler).
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getUserRemoteIP($trusted=0)
Return the real IP of remote user.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dolSessionOpen($save_path, $session_name)
The session open handler called by PHP whenever a session is initialized.
dolSessionWrite($sess_id, $val)
This function is called when a session is initialized with a session_start( ) call,...
dolSessionDestroy($sess_id)
This is called whenever the session_destroy() function call is made.
dolSessionsLimitForUser($fk_user, $keepcount, $currentsessionid)
Enforce a maximum number of concurrent database sessions for a given user.
dolListSessions()
List sessions in db.
dolSessionClose()
This function is executed on shutdown of the session.
dolSessionGC($max_lifetime)
This function is called on a session's start up with the probability specified in session....
dolSessionRead($sess_id)
This function is called whenever a session_start() call is made and reads the session variables.