@@ -631,7 +631,7 @@ async function registerSessionAwareAuthStrategy(strapi, log) {
631631 return decoded ;
632632 }
633633
634- // Check for active sessions
634+ // Check for active sessions first
635635 const activeSessions = await strapi . documents ( SESSION_UID ) . findMany ( {
636636 filters : {
637637 user : { documentId : userDocId } ,
@@ -645,48 +645,55 @@ async function registerSessionAwareAuthStrategy(strapi, log) {
645645 return decoded ;
646646 }
647647
648- // No active session found - check if ANY sessions exist (including inactive)
649- const allSessions = await strapi . documents ( SESSION_UID ) . findMany ( {
650- filters : { user : { documentId : userDocId } } ,
648+ // No active session - check for inactive sessions
649+ const inactiveSessions = await strapi . documents ( SESSION_UID ) . findMany ( {
650+ filters : {
651+ user : { documentId : userDocId } ,
652+ isActive : false ,
653+ } ,
651654 limit : 5 ,
652- fields : [ 'isActive' , 'lastActive' ] ,
655+ fields : [ 'documentId' , 'terminatedManually' , 'lastActive' ] ,
656+ sort : [ { lastActive : 'desc' } ] ,
653657 } ) ;
654658
655- const totalSessions = allSessions ?. length || 0 ;
656- const hasInactiveSessions = allSessions ?. some ( s => s . isActive === false ) ;
657-
658- // DECISION LOGIC:
659- // 1. User has inactive sessions = explicitly logged out → ALWAYS BLOCK
660- // 2. No sessions exist at all = session never created (bug/race condition) → ALLOW
661- // 3. strictMode controls whether missing sessions block or just warn
662-
663- if ( hasInactiveSessions ) {
664- // User was explicitly logged out → ALWAYS BLOCK (this is intentional!)
665- strapi . log . info (
666- `[magic-sessionmanager] [JWT-BLOCKED] User ${ userDocId . substring ( 0 , 8 ) } ... was logged out (${ totalSessions } inactive sessions)`
667- ) ;
668- return null ; // Block - user was explicitly logged out
669- }
670-
671- // No sessions exist at all - session was never created (bug/race condition)
672- if ( totalSessions === 0 ) {
673- if ( strictMode ) {
674- // Strict mode: Block even if no sessions (could be security risk)
659+ if ( inactiveSessions && inactiveSessions . length > 0 ) {
660+ // Check if ANY session was manually terminated
661+ const manuallyTerminated = inactiveSessions . find ( s => s . terminatedManually === true ) ;
662+
663+ if ( manuallyTerminated ) {
664+ // User was explicitly logged out → BLOCK
675665 strapi . log . info (
676- `[magic-sessionmanager] [JWT-BLOCKED] No sessions exist for user ${ userDocId . substring ( 0 , 8 ) } ... (strictMode enabled) `
666+ `[magic-sessionmanager] [JWT-BLOCKED] User ${ userDocId . substring ( 0 , 8 ) } ... was manually logged out `
677667 ) ;
678668 return null ;
679669 }
680- // Non-strict mode: Allow through but warn
681- strapi . log . warn (
682- `[magic-sessionmanager] [JWT-WARN] No session found for user ${ userDocId . substring ( 0 , 8 ) } ... (allowing - session may not have been created)`
670+
671+ // Session was deactivated by timeout → REACTIVATE most recent one
672+ const sessionToReactivate = inactiveSessions [ 0 ] ;
673+ await strapi . documents ( SESSION_UID ) . update ( {
674+ documentId : sessionToReactivate . documentId ,
675+ data : {
676+ isActive : true ,
677+ lastActive : new Date ( ) ,
678+ } ,
679+ } ) ;
680+ strapi . log . info (
681+ `[magic-sessionmanager] [JWT-REACTIVATED] Session reactivated for user ${ userDocId . substring ( 0 , 8 ) } ...`
683682 ) ;
684683 return decoded ;
685684 }
686685
687- // Edge case: sessions exist but none are active or inactive (shouldn't happen)
686+ // No sessions exist at all - session was never created (bug/race condition)
687+ if ( strictMode ) {
688+ strapi . log . info (
689+ `[magic-sessionmanager] [JWT-BLOCKED] No sessions exist for user ${ userDocId . substring ( 0 , 8 ) } ... (strictMode)`
690+ ) ;
691+ return null ;
692+ }
693+
694+ // Non-strict mode: Allow through but warn
688695 strapi . log . warn (
689- `[magic-sessionmanager] [JWT-ALLOW] Unexpected session state for user ${ userDocId . substring ( 0 , 8 ) } ... (allowing)`
696+ `[magic-sessionmanager] [JWT-WARN] No session for user ${ userDocId . substring ( 0 , 8 ) } ... (allowing)`
690697 ) ;
691698 return decoded ;
692699
0 commit comments