auth
auth/grant.go
I'm on a typo roll. ErrInvalidSession, not ErrInvalidSessior. Also, we want comparison, not assignment.
1 package auth
3 import (
4 "errors"
5 "time"
7 "code.secondbit.org/uuid"
8 )
10 var (
11 // ErrNoGrantStore is returned when a Context tries to act on a grantStore without setting one first.
12 ErrNoGrantStore = errors.New("no grantStore was specified for the Context")
13 // ErrGrantNotFound is returned when a Grant is requested but not found in the grantStore.
14 ErrGrantNotFound = errors.New("grant not found in grantStore")
15 // ErrGrantAlreadyExists is returned when a Grant is added to a grantStore, but another Grant with the
16 // same Code already exists in the grantStore.
17 ErrGrantAlreadyExists = errors.New("grant already exists in grantStore")
18 )
20 // Grant represents an authorization grant made by a user to a Client, to
21 // access user data within a defined Scope for a limited amount of time.
22 type Grant struct {
23 Code string
24 Created time.Time
25 ExpiresIn int32
26 ClientID uuid.ID
27 Scope string
28 RedirectURI string
29 State string
30 ProfileID uuid.ID
31 }
33 type grantStore interface {
34 getGrant(code string) (Grant, error)
35 saveGrant(grant Grant) error
36 deleteGrant(code string) error
37 }
39 func (m *memstore) getGrant(code string) (Grant, error) {
40 m.grantLock.RLock()
41 defer m.grantLock.RUnlock()
42 grant, ok := m.grants[code]
43 if !ok {
44 return Grant{}, ErrGrantNotFound
45 }
46 return grant, nil
47 }
49 func (m *memstore) saveGrant(grant Grant) error {
50 m.grantLock.Lock()
51 defer m.grantLock.Unlock()
52 _, ok := m.grants[grant.Code]
53 if ok {
54 return ErrGrantAlreadyExists
55 }
56 m.grants[grant.Code] = grant
57 return nil
58 }
60 func (m *memstore) deleteGrant(code string) error {
61 m.grantLock.Lock()
62 defer m.grantLock.Unlock()
63 _, ok := m.grants[code]
64 if !ok {
65 return ErrGrantNotFound
66 }
67 delete(m.grants, code)
68 return nil
69 }