1package idp
2
3import (
4 "context"
5 "errors"
6 "fmt"
7
8 dexstorage "github.com/dexidp/dex/storage"
9)
10
11func (p *IDP) RefreshTokenCount(ctx context.Context, userID string) (int, error) {
12 sessions, err := p.dex.GetOfflineSessions(ctx, userID, ConnectorID)
13 if errors.Is(err, dexstorage.ErrNotFound) {
14 return 0, nil
15 }
16 if err != nil {
17 return 0, fmt.Errorf("idp: read offline sessions: %w", err)
18 }
19 now := p.verifier.deps.now()
20 live := 0
21 for _, ref := range sessions.Refresh {
22 if now.After(ref.CreatedAt.Add(RefreshAbsoluteLifetime)) || now.After(ref.LastUsed.Add(RefreshIdleLifetime)) {
23 continue
24 }
25 _, err := p.dex.GetRefresh(ctx, ref.ID)
26 if errors.Is(err, dexstorage.ErrNotFound) {
27 continue
28 }
29 if err != nil {
30 return 0, fmt.Errorf("idp: read refresh token: %w", err)
31 }
32 live++
33 }
34 return live, nil
35}