@@ -309,7 +309,7 @@ func TestHelperNID(t1ClientManager client.Manager, t1ValidNID Manager, t2Invalid
309309 }
310310}
311311
312- func ManagerTests (m Manager , clientManager client.Manager , fositeManager x.FositeStorer , network string , parallel bool ) func (t * testing.T ) {
312+ func ManagerTests (m Manager , clientManager client.Manager , fositeManager x.FositeStorer , scopeStrategy fosite. ScopeStrategy , network string , parallel bool ) func (t * testing.T ) {
313313 lr := make (map [string ]* LoginRequest )
314314
315315 return func (t * testing.T ) {
@@ -548,6 +548,145 @@ func ManagerTests(m Manager, clientManager client.Manager, fositeManager x.Fosit
548548 }
549549 })
550550
551+ t .Run ("case=extend consent request" , func (t * testing.T ) {
552+ cl := & client.Client {LegacyClientID : "client-1" }
553+ _ = clientManager .CreateClient (context .Background (), cl )
554+ consentFlow := func (subject , sessionId , challenge string , rememberFor time.Duration , requestedAt time.Time , requestedScope string , skip bool ) * OAuth2ConsentRequest {
555+ require .NoError (t , m .CreateLoginRequest (context .Background (), & LoginRequest {
556+ ID : makeID ("challenge" , network , challenge ),
557+ SessionID : sqlxx .NullString (makeID ("fk-login-session" , network , sessionId )),
558+ Client : cl ,
559+ Subject : subject ,
560+ Verifier : uuid .New ().String (),
561+ RequestedAt : requestedAt ,
562+ RequestedScope : []string {requestedScope },
563+ }))
564+
565+ require .NoError (t , m .CreateConsentRequest (context .Background (), & OAuth2ConsentRequest {
566+ ID : makeID ("challenge" , network , challenge ),
567+ Client : cl ,
568+ Subject : subject ,
569+ LoginSessionID : sqlxx .NullString (makeID ("fk-login-session" , network , sessionId )),
570+ LoginChallenge : sqlxx .NullString (makeID ("challenge" , network , challenge )),
571+ Skip : skip ,
572+ Verifier : uuid .New ().String (),
573+ CSRF : "csrf1" ,
574+ }))
575+ cr , err := m .HandleConsentRequest (context .Background (), & AcceptOAuth2ConsentRequest {
576+ ID : makeID ("challenge" , network , challenge ),
577+ Remember : true ,
578+ RememberFor : int (rememberFor ),
579+ WasHandled : true ,
580+ HandledAt : sqlxx .NullTime (time .Now ().UTC ()),
581+ GrantedScope : []string {"scope-a" },
582+ })
583+ require .NoError (t , err )
584+ return cr
585+ }
586+
587+ t .Run ("case=extend session related and latest consent expiry times" , func (t * testing.T ) {
588+ var rememberForSession1 time.Duration = 300
589+ var remainingValidTimeSession1 time.Duration = 100
590+ var rememberForSession2 time.Duration = 300
591+ var remainingValidTimeSession2 time.Duration = 150
592+ var extendRememberFor time.Duration = 1000
593+ challenge1 := "c1"
594+ challenge2 := "c2"
595+ challenge3 := "c3"
596+ requestedAt1 := time .Now ().UTC ().Round (time .Second ).Add (- (rememberForSession1 - remainingValidTimeSession1 ) * time .Second )
597+ requestedAt2 := time .Now ().UTC ().Round (time .Second ).Add (- (rememberForSession2 - remainingValidTimeSession2 ) * time .Second )
598+ requestedAt3 := time .Now ().UTC ()
599+ session1 := "s1"
600+ session2 := "s2"
601+ subject := "subject-1"
602+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
603+ ID : makeID ("fk-login-session" , network , session1 ),
604+ Subject : subject ,
605+ }))
606+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
607+ ID : makeID ("fk-login-session" , network , session2 ),
608+ Subject : subject ,
609+ }))
610+ consentFlow (subject , session1 , challenge1 , rememberForSession1 , requestedAt1 , "scope-a" , false )
611+ consentFlow (subject , session2 , challenge2 , rememberForSession2 , requestedAt2 , "scope-a" , false )
612+ cr := consentFlow (subject , session1 , challenge3 , extendRememberFor , requestedAt3 , "scope-a" , true )
613+
614+ require .NoError (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , int (extendRememberFor )))
615+
616+ crs , err := m .FindSubjectsGrantedConsentRequests (context .Background (), subject , 100 , 0 )
617+ require .NoError (t , err )
618+ require .EqualValues (t , 2 , len (crs ))
619+ crSession := crs [1 ]
620+ require .EqualValues (t , makeID ("challenge" , network , challenge1 ), crSession .ID )
621+ expectedExtendedRememberFor1 := int (rememberForSession1 + extendRememberFor - remainingValidTimeSession1 )
622+ require .InDelta (t , expectedExtendedRememberFor1 , crSession .RememberFor , 1 )
623+ crLatest := crs [0 ]
624+ require .EqualValues (t , makeID ("challenge" , network , challenge2 ), crLatest .ID )
625+ expectedExtendedRememberFor2 := int (rememberForSession2 + extendRememberFor - remainingValidTimeSession2 )
626+ require .InDelta (t , expectedExtendedRememberFor2 , crLatest .RememberFor , 1 )
627+ })
628+
629+ t .Run ("case=no previous consent found" , func (t * testing.T ) {
630+ session := uuid .New ().String ()
631+ subject := "subject-1"
632+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
633+ ID : makeID ("fk-login-session" , network , session ),
634+ Subject : subject ,
635+ }))
636+ cr := consentFlow (subject , session , uuid .New ().String (), 300 , time .Now ().UTC (), "scope-a" , true )
637+
638+ require .ErrorIs (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , 1000 ), ErrNoPreviousConsentFound )
639+ })
640+
641+ t .Run ("case=invalid requested scope" , func (t * testing.T ) {
642+ subject := uuid .New ().String ()
643+ challenge1 := uuid .New ().String ()
644+ challenge2 := uuid .New ().String ()
645+ var rememberForSession1 time.Duration = 300
646+ var remainingValidTimeSession1 time.Duration = 100
647+ requestedAt1 := time .Now ().UTC ().Round (time .Second ).Add (- (rememberForSession1 - remainingValidTimeSession1 ) * time .Second )
648+ requestedAt2 := time .Now ().UTC ()
649+ session1 := uuid .New ().String ()
650+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
651+ ID : makeID ("fk-login-session" , network , session1 ),
652+ Subject : subject ,
653+ }))
654+ consentFlow (subject , session1 , challenge1 , 300 , requestedAt1 , "scope-a" , false )
655+ cr := consentFlow (subject , session1 , challenge2 , 300 , requestedAt2 , "scope-b" , true )
656+
657+ require .NoError (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , 1000 ))
658+
659+ crs , err := m .FindSubjectsGrantedConsentRequests (context .Background (), subject , 10 , 0 )
660+ require .NoError (t , err )
661+ require .EqualValues (t , 1 , len (crs ))
662+ cr1 := crs [0 ]
663+ require .EqualValues (t , makeID ("challenge" , network , challenge1 ), cr1 .ID )
664+ require .EqualValues (t , 300 , cr1 .RememberFor )
665+ })
666+
667+ t .Run ("case=initial consent request expired" , func (t * testing.T ) {
668+ subject := uuid .New ().String ()
669+ challenge1 := uuid .New ().String ()
670+ challenge2 := uuid .New ().String ()
671+ var rememberForSession1 time.Duration = 300
672+ var remainingValidTimeSession1 time.Duration = 0
673+ requestedAtExpired := time .Now ().UTC ().Round (time .Second ).Add (- (rememberForSession1 - remainingValidTimeSession1 ) * time .Second )
674+ session1 := uuid .New ().String ()
675+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
676+ ID : makeID ("fk-login-session" , network , session1 ),
677+ Subject : subject ,
678+ }))
679+ consentFlow (subject , session1 , challenge1 , 300 , requestedAtExpired , "scope-a" , false )
680+ time .Sleep (time .Second )
681+ cr := consentFlow (subject , session1 , challenge2 , 300 , time .Now ().UTC (), "scope-a" , true )
682+
683+ require .NoError (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , 1000 ))
684+
685+ _ , err := m .FindSubjectsGrantedConsentRequests (context .Background (), subject , 100 , 0 )
686+ require .Error (t , err , ErrNoPreviousConsentFound )
687+ })
688+ })
689+
551690 t .Run ("case=revoke-auth-request" , func (t * testing.T ) {
552691 require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
553692 ID : makeID ("rev-session" , network , "-1" ),
0 commit comments