/
inmemory_token.go
82 lines (65 loc) · 1.81 KB
/
inmemory_token.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package tokens
import (
"context"
"github.com/common-fate/iamzero/pkg/crypto"
"github.com/pkg/errors"
"go.opentelemetry.io/otel/trace"
"go.uber.org/zap"
)
// InMemoryTokenStorer is a token storage backend which stores tokens in memory.
// Should only be used for development and testing.
type InMemoryTokenStorer struct {
log *zap.SugaredLogger
tracer trace.Tracer
tokens []Token
}
// NewInMemoryTokenStorer initialises the in memory token storage
func NewInMemoryTokenStorer(ctx context.Context, log *zap.SugaredLogger, tracer trace.Tracer) *InMemoryTokenStorer {
return &InMemoryTokenStorer{log, tracer, []Token{}}
}
// Create a Token and store it in memory
func (s *InMemoryTokenStorer) Create(ctx context.Context, name string) (*Token, error) {
s.log.Info("creating token")
ID, err := crypto.GenerateRandomToken()
if err != nil {
return nil, errors.Wrap(err, "generating token")
}
token := Token{
ID: ID,
Name: name,
}
s.tokens = append(s.tokens, token)
return &token, nil
}
// removes a token from the slice, preserving the order
func removeToken(slice []Token, i int) []Token {
copy(slice[i:], slice[i+1:])
return slice[:len(slice)-1]
}
// Delete a token
func (s *InMemoryTokenStorer) Delete(ctx context.Context, id string) error {
s.log.Info("deleting token")
for i, t := range s.tokens {
if t.ID == id {
s.tokens = removeToken(s.tokens, i)
return nil
}
}
return nil
}
// Get a token
func (s *InMemoryTokenStorer) Get(ctx context.Context, id string) (*Token, error) {
for _, t := range s.tokens {
if t.ID == id {
return &t, nil
}
}
return nil, nil
}
// List all tokens
func (s *InMemoryTokenStorer) List(ctx context.Context) ([]Token, error) {
s.log.Info("listing tokens")
_, span := s.tracer.Start(ctx, "InMemoryTokenStorer.List")
defer span.End()
return s.tokens, nil
}