@@ -636,8 +636,13 @@ func FindUserByID(tx *storage.Connection, id uuid.UUID) (*User, error) {
636636// lock will only be acquired if there's no other lock. In case there is a
637637// lock, a IsNotFound(err) error will be returned.
638638//
639- // Second value returned is either *models.RefreshToken or *models.TODO .
639+ // Second value returned is either *models.RefreshToken or *crypto.RefreshToken .
640640func FindUserWithRefreshToken (tx * storage.Connection , dbEncryption conf.DatabaseEncryptionConfiguration , token string , forUpdate bool ) (* User , any , * Session , error ) {
641+ if len (token ) < 12 {
642+ // not a valid refresh token so don't bother looking it up in the database
643+ return nil , nil , nil , SessionNotFoundError {}
644+ }
645+
641646 if len (token ) == 12 {
642647 return findUserWithLegacyRefreshToken (tx , token , forUpdate )
643648 }
@@ -648,11 +653,11 @@ func FindUserWithRefreshToken(tx *storage.Connection, dbEncryption conf.Database
648653func findUserWithRefreshToken (tx * storage.Connection , dbEncryption conf.DatabaseEncryptionConfiguration , token string , forUpdate bool ) (* User , * crypto.RefreshToken , * Session , error ) {
649654 refreshToken , err := crypto .ParseRefreshToken (token )
650655 if err != nil {
651- return nil , nil , nil , err
656+ // refresh token is not valid
657+ return nil , nil , nil , SessionNotFoundError {}
652658 }
653659
654- // first find the session to check the token's signature
655- session , err := FindSessionByID (tx , refreshToken .SessionID , false )
660+ session , err := FindSessionByID (tx , refreshToken .SessionID , forUpdate )
656661 if err != nil {
657662 return nil , nil , nil , err
658663 }
@@ -663,28 +668,28 @@ func findUserWithRefreshToken(tx *storage.Connection, dbEncryption conf.Database
663668 return nil , nil , nil , SessionNotFoundError {}
664669 }
665670
666- key , _ , err := session .GetRefreshTokenHmacKey (dbEncryption )
671+ key , shouldReEncrypt , err := session .GetRefreshTokenHmacKey (dbEncryption )
667672 if err != nil {
668673 return nil , nil , nil , err
669674 }
670675
671676 if ! refreshToken .CheckSignature (key ) {
672- // TODO: return SessionNotFound, log informational
673- return nil , nil , nil , fmt .Errorf ("refresh token for session %s with counter %v has invalid signature" , session .ID .String (), refreshToken .Counter )
674- }
675-
676- user , err := FindUserByID (tx , session .UserID )
677- if err != nil {
678- return nil , nil , nil , err
677+ // refresh token signature is not valid for this session
678+ return nil , nil , nil , SessionNotFoundError {}
679679 }
680680
681- if forUpdate {
682- session , err = FindSessionByID (tx , refreshToken . SessionID , forUpdate )
681+ if shouldReEncrypt && forUpdate {
682+ err := session . ReEncryptRefreshTokenHmacKey (tx , dbEncryption )
683683 if err != nil {
684684 return nil , nil , nil , err
685685 }
686686 }
687687
688+ user , err := FindUserByID (tx , session .UserID )
689+ if err != nil {
690+ return nil , nil , nil , err
691+ }
692+
688693 return user , refreshToken , session , nil
689694}
690695
0 commit comments