@@ -289,7 +289,9 @@ pub fn get_user_by_token(token: &str) -> Result<User, HttpResponse> {
289289 let token_info = token_info. unwrap ( ) ;
290290 let user = get_user ( token_info. user . as_ref ( ) ) ;
291291
292- if ( !token_info. remember && token_info. created_at + TEMP_TOKEN_EXPIRE_MILLIS < current_time ( ) ) || user. is_none ( ) {
292+ if ( !token_info. remember && token_info. created_at + TEMP_TOKEN_EXPIRE_MILLIS < current_time ( ) )
293+ || user. is_none ( )
294+ {
293295 tokens. remove ( token) ;
294296 cache. 1 = current_time ( ) ;
295297 save_tokens ( & * cache) ?;
@@ -301,3 +303,36 @@ pub fn get_user_by_token(token: &str) -> Result<User, HttpResponse> {
301303
302304 Ok ( user. unwrap ( ) )
303305}
306+
307+ pub fn cleanup_expired_tokens ( ) -> Result < usize , HttpResponse > {
308+ let mut cache = acquire_write_lock ( & TOKENS_CACHE ) ?;
309+ let tokens = cache. 0 . as_mut ( ) . expect ( "Tokens cache not initialized" ) ;
310+
311+ let current_time = current_time ( ) ;
312+ let tokens_to_delete: Vec < ( String , SessionInfo ) > = tokens
313+ . iter ( )
314+ . filter ( |( _, token_info) | {
315+ let user = get_user ( token_info. user . as_ref ( ) ) ;
316+ ( !token_info. remember
317+ && token_info. created_at + TEMP_TOKEN_EXPIRE_MILLIS < current_time)
318+ || user. is_none ( )
319+ } )
320+ . map ( |( token, token_info) | ( token. clone ( ) , token_info. clone ( ) ) )
321+ . collect ( ) ;
322+
323+ let deleted_permanent_count = tokens_to_delete
324+ . iter ( )
325+ . filter ( |( _, token_info) | token_info. remember )
326+ . count ( ) ;
327+
328+ tokens_to_delete. iter ( ) . for_each ( |( token, _) | {
329+ tokens. remove ( token) ;
330+ } ) ;
331+
332+ if deleted_permanent_count > 0 {
333+ cache. 1 = current_time;
334+ save_tokens ( & * cache) ?;
335+ }
336+
337+ Ok ( deleted_permanent_count)
338+ }
0 commit comments