Raw
 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}