auth
auth/memstore.go
Update profiles and add tests. Add tests for profile storage. Make Memstore implement the profilestore interface. Get the groundwork of profiles laid.
| paddy@28 | 1 package auth |
| paddy@28 | 2 |
| paddy@31 | 3 import ( |
| paddy@31 | 4 "sync" |
| paddy@31 | 5 |
| paddy@31 | 6 "secondbit.org/uuid" |
| paddy@31 | 7 ) |
| paddy@28 | 8 |
| paddy@28 | 9 type Memstore struct { |
| paddy@28 | 10 tokens map[string]Token |
| paddy@28 | 11 refreshTokenLookup map[string]string |
| paddy@28 | 12 profileTokenLookup map[string][]string |
| paddy@28 | 13 tokenLock sync.RWMutex |
| paddy@29 | 14 |
| paddy@29 | 15 grants map[string]Grant |
| paddy@29 | 16 grantLock sync.RWMutex |
| paddy@31 | 17 |
| paddy@31 | 18 clients map[string]Client |
| paddy@31 | 19 profileClientLookup map[string][]uuid.ID |
| paddy@31 | 20 clientLock sync.RWMutex |
| paddy@38 | 21 |
| paddy@38 | 22 profiles map[string]Profile |
| paddy@38 | 23 profileLock sync.RWMutex |
| paddy@28 | 24 } |
| paddy@28 | 25 |
| paddy@28 | 26 func NewMemstore() *Memstore { |
| paddy@28 | 27 return &Memstore{ |
| paddy@31 | 28 tokens: map[string]Token{}, |
| paddy@31 | 29 refreshTokenLookup: map[string]string{}, |
| paddy@31 | 30 profileTokenLookup: map[string][]string{}, |
| paddy@31 | 31 grants: map[string]Grant{}, |
| paddy@31 | 32 clients: map[string]Client{}, |
| paddy@31 | 33 profileClientLookup: map[string][]uuid.ID{}, |
| paddy@38 | 34 profiles: map[string]Profile{}, |
| paddy@28 | 35 } |
| paddy@28 | 36 } |
| paddy@28 | 37 |
| paddy@28 | 38 func (m *Memstore) lookupTokenByRefresh(token string) (string, error) { |
| paddy@28 | 39 m.tokenLock.RLock() |
| paddy@28 | 40 defer m.tokenLock.RUnlock() |
| paddy@28 | 41 t, ok := m.refreshTokenLookup[token] |
| paddy@28 | 42 if !ok { |
| paddy@28 | 43 return "", ErrTokenNotFound |
| paddy@28 | 44 } |
| paddy@28 | 45 return t, nil |
| paddy@28 | 46 } |
| paddy@28 | 47 |
| paddy@28 | 48 func (m *Memstore) lookupTokensByProfileID(id string) ([]string, error) { |
| paddy@28 | 49 m.tokenLock.RLock() |
| paddy@28 | 50 defer m.tokenLock.RUnlock() |
| paddy@28 | 51 return m.profileTokenLookup[id], nil |
| paddy@28 | 52 } |
| paddy@31 | 53 |
| paddy@33 | 54 func (m *Memstore) lookupClientsByProfileID(id string) []uuid.ID { |
| paddy@31 | 55 m.clientLock.RLock() |
| paddy@31 | 56 defer m.clientLock.RUnlock() |
| paddy@33 | 57 c, ok := m.profileClientLookup[id] |
| paddy@33 | 58 if !ok { |
| paddy@33 | 59 return []uuid.ID{} |
| paddy@33 | 60 } |
| paddy@33 | 61 return c |
| paddy@31 | 62 } |