@@ -294,7 +294,7 @@ func TestHelperNID(t1ClientManager client.Manager, t1ValidNID Manager, t2Invalid
294294 }
295295}
296296
297- func ManagerTests (m Manager , clientManager client.Manager , fositeManager x.FositeStorer , network string , parallel bool ) func (t * testing.T ) {
297+ func ManagerTests (m Manager , clientManager client.Manager , fositeManager x.FositeStorer , scopeStrategy fosite. ScopeStrategy , network string , parallel bool ) func (t * testing.T ) {
298298 lr := make (map [string ]* LoginRequest )
299299
300300 return func (t * testing.T ) {
@@ -534,6 +534,129 @@ func ManagerTests(m Manager, clientManager client.Manager, fositeManager x.Fosit
534534 }
535535 })
536536
537+ t .Run ("case=extend consent request" , func (t * testing.T ) {
538+ cl := & client.Client {LegacyClientID : "client-1" }
539+ _ = clientManager .CreateClient (context .Background (), cl )
540+ consentFlow := func (subject , sessionId , challenge string , rememberFor time.Duration , requestedAt time.Time , requestedScope string , skip bool ) * OAuth2ConsentRequest {
541+ require .NoError (t , m .CreateLoginRequest (context .Background (), & LoginRequest {
542+ ID : makeID ("challenge" , network , challenge ),
543+ SessionID : sqlxx .NullString (makeID ("fk-login-session" , network , sessionId )),
544+ Client : cl ,
545+ Subject : subject ,
546+ Verifier : uuid .New ().String (),
547+ RequestedAt : requestedAt ,
548+ RequestedScope : []string {requestedScope },
549+ }))
550+
551+ require .NoError (t , m .CreateConsentRequest (context .Background (), & OAuth2ConsentRequest {
552+ ID : makeID ("challenge" , network , challenge ),
553+ Client : cl ,
554+ Subject : subject ,
555+ LoginSessionID : sqlxx .NullString (makeID ("fk-login-session" , network , sessionId )),
556+ LoginChallenge : sqlxx .NullString (makeID ("challenge" , network , challenge )),
557+ Skip : skip ,
558+ Verifier : uuid .New ().String (),
559+ CSRF : "csrf1" ,
560+ }))
561+ cr , err := m .HandleConsentRequest (context .Background (), & AcceptOAuth2ConsentRequest {
562+ ID : makeID ("challenge" , network , challenge ),
563+ Remember : true ,
564+ RememberFor : int (rememberFor ),
565+ WasHandled : true ,
566+ HandledAt : sqlxx .NullTime (time .Now ().UTC ()),
567+ GrantedScope : []string {"scope-a" },
568+ })
569+ require .NoError (t , err )
570+ return cr
571+ }
572+
573+ t .Run ("case=extend session related and latest consent expiry times" , func (t * testing.T ) {
574+ var rememberForSession1 time.Duration = 300
575+ var remainingValidTimeSession1 time.Duration = 100
576+ var rememberForSession2 time.Duration = 300
577+ var remainingValidTimeSession2 time.Duration = 150
578+ var extendRememberFor time.Duration = 1000
579+ requestedAt1 := time .Now ().UTC ().Round (time .Second ).Add (- (rememberForSession1 - remainingValidTimeSession1 ) * time .Second )
580+ requestedAt2 := time .Now ().UTC ().Round (time .Second ).Add (- (rememberForSession2 - remainingValidTimeSession2 ) * time .Second )
581+ requestedAt3 := time .Now ().UTC ()
582+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
583+ ID : makeID ("fk-login-session" , network , "ec1" ),
584+ Subject : "subject-1" ,
585+ }))
586+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
587+ ID : makeID ("fk-login-session" , network , "ec2" ),
588+ Subject : "subject-1" ,
589+ }))
590+ consentFlow ("subject-1" , "ec1" , "c1" , rememberForSession1 , requestedAt1 , "scope-a" , false )
591+ consentFlow ("subject-1" , "ec2" , "c2" , rememberForSession2 , requestedAt2 , "scope-a" , false )
592+ cr := consentFlow ("subject-1" , "ec1" , "c3" , extendRememberFor , requestedAt3 , "scope-a" , true )
593+
594+ require .NoError (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , int (extendRememberFor )))
595+
596+ crs , err := m .FindSubjectsGrantedConsentRequests (context .Background (), "subject-1" , 100 , 0 )
597+ require .NoError (t , err )
598+ require .EqualValues (t , 2 , len (crs ))
599+ crSession := crs [1 ]
600+ require .EqualValues (t , makeID ("challenge" , network , "c1" ), crSession .ID )
601+ expectedExtendedRememberFor1 := int (rememberForSession1 + extendRememberFor - remainingValidTimeSession1 )
602+ require .InDelta (t , expectedExtendedRememberFor1 , crSession .RememberFor , 1 )
603+ crLatest := crs [0 ]
604+ require .EqualValues (t , makeID ("challenge" , network , "c2" ), crLatest .ID )
605+ expectedExtendedRememberFor2 := int (rememberForSession2 + extendRememberFor - remainingValidTimeSession2 )
606+ require .InDelta (t , expectedExtendedRememberFor2 , crLatest .RememberFor , 1 )
607+ })
608+
609+ t .Run ("case=no previous consent found" , func (t * testing.T ) {
610+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
611+ ID : makeID ("fk-login-session" , network , "ec3" ),
612+ Subject : "subject-1" ,
613+ }))
614+ cr := consentFlow ("subject-1" , "ec3" , "c4" , 300 , time .Now ().UTC (), "scope-a" , true )
615+
616+ require .ErrorIs (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , 1000 ), ErrNoPreviousConsentFound )
617+ })
618+
619+ t .Run ("case=invalid requested scope" , func (t * testing.T ) {
620+ var rememberForSession1 time.Duration = 300
621+ var remainingValidTimeSession1 time.Duration = 100
622+ requestedAt1 := time .Now ().UTC ().Round (time .Second ).Add (- (rememberForSession1 - remainingValidTimeSession1 ) * time .Second )
623+ requestedAt2 := time .Now ().UTC ()
624+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
625+ ID : makeID ("fk-login-session" , network , "ec4" ),
626+ Subject : "subject-2" ,
627+ }))
628+ consentFlow ("subject-2" , "ec4" , "c5" , 300 , requestedAt1 , "scope-a" , false )
629+ cr := consentFlow ("subject-2" , "ec4" , "c6" , 300 , requestedAt2 , "scope-b" , true )
630+
631+ require .NoError (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , 1000 ))
632+
633+ crs , err := m .FindSubjectsGrantedConsentRequests (context .Background (), "subject-2" , 10 , 0 )
634+ require .NoError (t , err )
635+ require .EqualValues (t , 1 , len (crs ))
636+ cr1 := crs [0 ]
637+ require .EqualValues (t , makeID ("challenge" , network , "c5" ), cr1 .ID )
638+ require .EqualValues (t , 300 , cr1 .RememberFor )
639+ })
640+
641+ t .Run ("case=initial consent request expired" , func (t * testing.T ) {
642+ var rememberForSession1 time.Duration = 300
643+ var remainingValidTimeSession1 time.Duration = 0
644+ requestedAtExpired := time .Now ().UTC ().Round (time .Second ).Add (- (rememberForSession1 - remainingValidTimeSession1 ) * time .Second )
645+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
646+ ID : makeID ("fk-login-session" , network , "ec5" ),
647+ Subject : "subject-3" ,
648+ }))
649+ consentFlow ("subject-3" , "ec5" , "c7" , 300 , requestedAtExpired , "scope-a" , false )
650+ time .Sleep (time .Second )
651+ cr := consentFlow ("subject-3" , "ec5" , "c8" , 300 , time .Now ().UTC (), "scope-a" , true )
652+
653+ require .NoError (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , 1000 ))
654+
655+ _ , err := m .FindSubjectsGrantedConsentRequests (context .Background (), "subject-3" , 100 , 0 )
656+ require .Error (t , err , ErrNoPreviousConsentFound )
657+ })
658+ })
659+
537660 t .Run ("case=revoke-auth-request" , func (t * testing.T ) {
538661 require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
539662 ID : makeID ("rev-session" , network , "-1" ),
0 commit comments