Skip to content

Commit 4157a3d

Browse files
committed
fix: forzatura scadenza session_token per gestire l'interruzione di sessione senza logout
1 parent aeeae9c commit 4157a3d

1 file changed

Lines changed: 53 additions & 8 deletions

File tree

src/AuthOSM.php

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -143,15 +143,35 @@ public function attempt($username, $password, $force = false)
143143

144144
// Verifica se l'utente è già connesso (ha un token di sessione attivo)
145145
if (!empty($user['session_token'])) {
146-
$status = 'already_logged_in';
147-
$this->current_status = $status;
146+
// Verifica se ci sono operazioni recenti per l'utente (sessione attiva)
147+
$session_timeout = 10; // minuti
148+
149+
$recent_operations = $database->fetchArray('SELECT COUNT(*) as count FROM zz_operations
150+
WHERE id_utente = :user_id
151+
AND DATE_ADD(created_at, INTERVAL :timeout MINUTE) >= NOW()', [
152+
':user_id' => $user['id'],
153+
':timeout' => $session_timeout,
154+
]);
155+
156+
// Se ci sono operazioni recenti, la sessione è ancora attiva -> blocca il login
157+
if (!empty($recent_operations) && $recent_operations[0]['count'] > 0) {
158+
$status = 'already_logged_in';
159+
$this->current_status = $status;
148160

149-
// Log del tentativo
150-
$log['stato'] = self::getStatus()[$status]['code'];
151-
$log['user_agent'] = Filter::getPurifier()->purify($_SERVER['HTTP_USER_AGENT']);
152-
$database->insert('zz_logs', $log);
161+
// Log del tentativo
162+
$log['stato'] = self::getStatus()[$status]['code'];
163+
$log['user_agent'] = Filter::getPurifier()->purify($_SERVER['HTTP_USER_AGENT']);
164+
$database->insert('zz_logs', $log);
153165

154-
return false;
166+
return false;
167+
}
168+
169+
// Se non ci sono operazioni recenti, la sessione è scaduta -> resetta il token e permetti il login
170+
$database->update('zz_users', [
171+
'session_token' => null,
172+
], [
173+
'id' => $user['id'],
174+
]);
155175
}
156176

157177
if (!empty($user['enabled'])) {
@@ -1208,7 +1228,32 @@ protected function checkSessionToken()
12081228
return true;
12091229
}
12101230

1211-
// Se c'è un token nel DB ma non in sessione, invalida la sessione
1231+
// Verifica se il token è scaduto controllando le operazioni recenti
1232+
$session_timeout = 100;
1233+
$database = database();
1234+
1235+
$recent_operations = $database->fetchArray('SELECT COUNT(*) as count FROM zz_operations
1236+
WHERE id_utente = :user_id
1237+
AND DATE_ADD(created_at, INTERVAL :timeout MINUTE) >= NOW()', [
1238+
':user_id' => $this->user->id,
1239+
':timeout' => $session_timeout,
1240+
]);
1241+
1242+
// Se non ci sono operazioni recenti, il token è scaduto -> resetta il token
1243+
if (empty($recent_operations) || $recent_operations[0]['count'] == 0) {
1244+
$database->update('zz_users', [
1245+
'session_token' => null,
1246+
], [
1247+
'id' => $this->user->id,
1248+
]);
1249+
1250+
// Pulisci l'oggetto utente per forzare il logout
1251+
$this->user = null;
1252+
1253+
return false;
1254+
}
1255+
1256+
// Se c'è un token nel DB ma non in sessione, la sessione PHP è scaduta o invalida
12121257
if (empty($_SESSION['auth_token'])) {
12131258
return false;
12141259
}

0 commit comments

Comments
 (0)