@@ -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,129 @@ 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+ requestedAt1 := time .Now ().UTC ().Round (time .Second ).Add (- (rememberForSession1 - remainingValidTimeSession1 ) * time .Second )
594+ requestedAt2 := time .Now ().UTC ().Round (time .Second ).Add (- (rememberForSession2 - remainingValidTimeSession2 ) * time .Second )
595+ requestedAt3 := time .Now ().UTC ()
596+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
597+ ID : makeID ("fk-login-session" , network , "ec1" ),
598+ Subject : "subject-1" ,
599+ }))
600+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
601+ ID : makeID ("fk-login-session" , network , "ec2" ),
602+ Subject : "subject-1" ,
603+ }))
604+ consentFlow ("subject-1" , "ec1" , "c1" , rememberForSession1 , requestedAt1 , "scope-a" , false )
605+ consentFlow ("subject-1" , "ec2" , "c2" , rememberForSession2 , requestedAt2 , "scope-a" , false )
606+ cr := consentFlow ("subject-1" , "ec1" , "c3" , extendRememberFor , requestedAt3 , "scope-a" , true )
607+
608+ require .NoError (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , int (extendRememberFor )))
609+
610+ crs , err := m .FindSubjectsGrantedConsentRequests (context .Background (), "subject-1" , 100 , 0 )
611+ require .NoError (t , err )
612+ require .EqualValues (t , 2 , len (crs ))
613+ crSession := crs [1 ]
614+ require .EqualValues (t , makeID ("challenge" , network , "c1" ), crSession .ID )
615+ expectedExtendedRememberFor1 := int (rememberForSession1 + extendRememberFor - remainingValidTimeSession1 )
616+ require .InDelta (t , expectedExtendedRememberFor1 , crSession .RememberFor , 1 )
617+ crLatest := crs [0 ]
618+ require .EqualValues (t , makeID ("challenge" , network , "c2" ), crLatest .ID )
619+ expectedExtendedRememberFor2 := int (rememberForSession2 + extendRememberFor - remainingValidTimeSession2 )
620+ require .InDelta (t , expectedExtendedRememberFor2 , crLatest .RememberFor , 1 )
621+ })
622+
623+ t .Run ("case=no previous consent found" , func (t * testing.T ) {
624+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
625+ ID : makeID ("fk-login-session" , network , "ec3" ),
626+ Subject : "subject-1" ,
627+ }))
628+ cr := consentFlow ("subject-1" , "ec3" , "c4" , 300 , time .Now ().UTC (), "scope-a" , true )
629+
630+ require .ErrorIs (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , 1000 ), ErrNoPreviousConsentFound )
631+ })
632+
633+ t .Run ("case=invalid requested scope" , func (t * testing.T ) {
634+ var rememberForSession1 time.Duration = 300
635+ var remainingValidTimeSession1 time.Duration = 100
636+ requestedAt1 := time .Now ().UTC ().Round (time .Second ).Add (- (rememberForSession1 - remainingValidTimeSession1 ) * time .Second )
637+ requestedAt2 := time .Now ().UTC ()
638+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
639+ ID : makeID ("fk-login-session" , network , "ec4" ),
640+ Subject : "subject-2" ,
641+ }))
642+ consentFlow ("subject-2" , "ec4" , "c5" , 300 , requestedAt1 , "scope-a" , false )
643+ cr := consentFlow ("subject-2" , "ec4" , "c6" , 300 , requestedAt2 , "scope-b" , true )
644+
645+ require .NoError (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , 1000 ))
646+
647+ crs , err := m .FindSubjectsGrantedConsentRequests (context .Background (), "subject-2" , 10 , 0 )
648+ require .NoError (t , err )
649+ require .EqualValues (t , 1 , len (crs ))
650+ cr1 := crs [0 ]
651+ require .EqualValues (t , makeID ("challenge" , network , "c5" ), cr1 .ID )
652+ require .EqualValues (t , 300 , cr1 .RememberFor )
653+ })
654+
655+ t .Run ("case=initial consent request expired" , func (t * testing.T ) {
656+ var rememberForSession1 time.Duration = 300
657+ var remainingValidTimeSession1 time.Duration = 0
658+ requestedAtExpired := time .Now ().UTC ().Round (time .Second ).Add (- (rememberForSession1 - remainingValidTimeSession1 ) * time .Second )
659+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
660+ ID : makeID ("fk-login-session" , network , "ec5" ),
661+ Subject : "subject-3" ,
662+ }))
663+ consentFlow ("subject-3" , "ec5" , "c7" , 300 , requestedAtExpired , "scope-a" , false )
664+ time .Sleep (time .Second )
665+ cr := consentFlow ("subject-3" , "ec5" , "c8" , 300 , time .Now ().UTC (), "scope-a" , true )
666+
667+ require .NoError (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , 1000 ))
668+
669+ _ , err := m .FindSubjectsGrantedConsentRequests (context .Background (), "subject-3" , 100 , 0 )
670+ require .Error (t , err , ErrNoPreviousConsentFound )
671+ })
672+ })
673+
551674 t .Run ("case=revoke-auth-request" , func (t * testing.T ) {
552675 require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
553676 ID : makeID ("rev-session" , network , "-1" ),
0 commit comments