(tx *storage.Connection, dbEncryption conf.DatabaseEncryptionConfiguration, token string, forUpdate bool)
| 651 | } |
| 652 | |
| 653 | func findUserWithRefreshToken(tx *storage.Connection, dbEncryption conf.DatabaseEncryptionConfiguration, token string, forUpdate bool) (*User, *crypto.RefreshToken, *Session, error) { |
| 654 | refreshToken, err := crypto.ParseRefreshToken(token) |
| 655 | if err != nil { |
| 656 | // refresh token is not valid |
| 657 | return nil, nil, nil, SessionNotFoundError{} |
| 658 | } |
| 659 | |
| 660 | session, err := FindSessionByID(tx, refreshToken.SessionID, forUpdate) |
| 661 | if err != nil { |
| 662 | return nil, nil, nil, err |
| 663 | } |
| 664 | |
| 665 | if session.RefreshTokenHmacKey == nil || session.RefreshTokenCounter == nil { |
| 666 | // if the session is not set up to support these encoded refresh tokens it's as if it doesn't exist |
| 667 | // meaning someone is hand-crafting tokens for uuids that exist |
| 668 | return nil, nil, nil, SessionNotFoundError{} |
| 669 | } |
| 670 | |
| 671 | key, shouldReEncrypt, err := session.GetRefreshTokenHmacKey(dbEncryption) |
| 672 | if err != nil { |
| 673 | return nil, nil, nil, err |
| 674 | } |
| 675 | |
| 676 | if !refreshToken.CheckSignature(key) { |
| 677 | // refresh token signature is not valid for this session |
| 678 | return nil, nil, nil, SessionNotFoundError{} |
| 679 | } |
| 680 | |
| 681 | if shouldReEncrypt && forUpdate { |
| 682 | err := session.ReEncryptRefreshTokenHmacKey(tx, dbEncryption) |
| 683 | if err != nil { |
| 684 | return nil, nil, nil, err |
| 685 | } |
| 686 | } |
| 687 | |
| 688 | user, err := FindUserByID(tx, session.UserID) |
| 689 | if err != nil { |
| 690 | return nil, nil, nil, err |
| 691 | } |
| 692 | |
| 693 | return user, refreshToken, session, nil |
| 694 | } |
| 695 | |
| 696 | func findUserWithLegacyRefreshToken(tx *storage.Connection, token string, forUpdate bool) (*User, any, *Session, error) { |
| 697 | refreshToken := &RefreshToken{} |
no test coverage detected