@@ -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