auth
2014-07-18
auth/storage_test.go
Start rewriting the repo. This code originally was a carbon copy of https://github.com/RangelReale/osin, but I am methodically stripping out the extensible nature of it for a simpler interface, while simultaneously bringing the style into line with the Ducky style.
| paddy@0 | 1 package oauth2 |
| paddy@0 | 2 |
| paddy@0 | 3 import ( |
| paddy@0 | 4 "errors" |
| paddy@0 | 5 "strconv" |
| paddy@0 | 6 "time" |
| paddy@0 | 7 ) |
| paddy@0 | 8 |
| paddy@0 | 9 type TestingStorage struct { |
| paddy@0 | 10 clients map[string]*Client |
| paddy@0 | 11 authorize map[string]*AuthorizeData |
| paddy@0 | 12 access map[string]*AccessData |
| paddy@0 | 13 refresh map[string]string |
| paddy@0 | 14 } |
| paddy@0 | 15 |
| paddy@0 | 16 func NewTestingStorage() *TestingStorage { |
| paddy@0 | 17 r := &TestingStorage{ |
| paddy@0 | 18 clients: make(map[string]*Client), |
| paddy@0 | 19 authorize: make(map[string]*AuthorizeData), |
| paddy@0 | 20 access: make(map[string]*AccessData), |
| paddy@0 | 21 refresh: make(map[string]string), |
| paddy@0 | 22 } |
| paddy@0 | 23 |
| paddy@0 | 24 r.clients["1234"] = &Client{ |
| paddy@0 | 25 Id: "1234", |
| paddy@0 | 26 Secret: "aabbccdd", |
| paddy@0 | 27 RedirectUri: "http://localhost:14000/appauth", |
| paddy@0 | 28 } |
| paddy@0 | 29 |
| paddy@0 | 30 r.authorize["9999"] = &AuthorizeData{ |
| paddy@0 | 31 Client: r.clients["1234"], |
| paddy@0 | 32 Code: "9999", |
| paddy@0 | 33 ExpiresIn: 3600, |
| paddy@0 | 34 CreatedAt: time.Now(), |
| paddy@0 | 35 RedirectUri: "http://localhost:14000/appauth", |
| paddy@0 | 36 } |
| paddy@0 | 37 |
| paddy@0 | 38 r.access["9999"] = &AccessData{ |
| paddy@0 | 39 Client: r.clients["1234"], |
| paddy@0 | 40 AuthorizeData: r.authorize["9999"], |
| paddy@0 | 41 AccessToken: "9999", |
| paddy@0 | 42 ExpiresIn: 3600, |
| paddy@0 | 43 CreatedAt: time.Now(), |
| paddy@0 | 44 } |
| paddy@0 | 45 |
| paddy@0 | 46 r.access["r9999"] = &AccessData{ |
| paddy@0 | 47 Client: r.clients["1234"], |
| paddy@0 | 48 AuthorizeData: r.authorize["9999"], |
| paddy@0 | 49 AccessData: r.access["9999"], |
| paddy@0 | 50 AccessToken: "9999", |
| paddy@0 | 51 RefreshToken: "r9999", |
| paddy@0 | 52 ExpiresIn: 3600, |
| paddy@0 | 53 CreatedAt: time.Now(), |
| paddy@0 | 54 } |
| paddy@0 | 55 |
| paddy@0 | 56 r.refresh["r9999"] = "9999" |
| paddy@0 | 57 |
| paddy@0 | 58 return r |
| paddy@0 | 59 } |
| paddy@0 | 60 |
| paddy@0 | 61 func (s *TestingStorage) GetClient(id string) (*Client, error) { |
| paddy@0 | 62 if c, ok := s.clients[id]; ok { |
| paddy@0 | 63 return c, nil |
| paddy@0 | 64 } |
| paddy@0 | 65 return nil, errors.New("Client not found") |
| paddy@0 | 66 } |
| paddy@0 | 67 |
| paddy@0 | 68 func (s *TestingStorage) SetClient(id string, client *Client) error { |
| paddy@0 | 69 s.clients[id] = client |
| paddy@0 | 70 return nil |
| paddy@0 | 71 } |
| paddy@0 | 72 |
| paddy@0 | 73 func (s *TestingStorage) SaveAuthorize(data *AuthorizeData) error { |
| paddy@0 | 74 s.authorize[data.Code] = data |
| paddy@0 | 75 return nil |
| paddy@0 | 76 } |
| paddy@0 | 77 |
| paddy@0 | 78 func (s *TestingStorage) LoadAuthorize(code string) (*AuthorizeData, error) { |
| paddy@0 | 79 if d, ok := s.authorize[code]; ok { |
| paddy@0 | 80 return d, nil |
| paddy@0 | 81 } |
| paddy@0 | 82 return nil, errors.New("Authorize not found") |
| paddy@0 | 83 } |
| paddy@0 | 84 |
| paddy@0 | 85 func (s *TestingStorage) RemoveAuthorize(code string) error { |
| paddy@0 | 86 delete(s.authorize, code) |
| paddy@0 | 87 return nil |
| paddy@0 | 88 } |
| paddy@0 | 89 |
| paddy@0 | 90 func (s *TestingStorage) SaveAccess(data *AccessData) error { |
| paddy@0 | 91 s.access[data.AccessToken] = data |
| paddy@0 | 92 if data.RefreshToken != "" { |
| paddy@0 | 93 s.refresh[data.RefreshToken] = data.AccessToken |
| paddy@0 | 94 } |
| paddy@0 | 95 return nil |
| paddy@0 | 96 } |
| paddy@0 | 97 |
| paddy@0 | 98 func (s *TestingStorage) LoadAccess(code string) (*AccessData, error) { |
| paddy@0 | 99 if d, ok := s.access[code]; ok { |
| paddy@0 | 100 return d, nil |
| paddy@0 | 101 } |
| paddy@0 | 102 return nil, errors.New("Access not found") |
| paddy@0 | 103 } |
| paddy@0 | 104 |
| paddy@0 | 105 func (s *TestingStorage) RemoveAccess(code string) error { |
| paddy@0 | 106 delete(s.access, code) |
| paddy@0 | 107 return nil |
| paddy@0 | 108 } |
| paddy@0 | 109 |
| paddy@0 | 110 func (s *TestingStorage) LoadRefresh(code string) (*AccessData, error) { |
| paddy@0 | 111 if d, ok := s.refresh[code]; ok { |
| paddy@0 | 112 return s.LoadAccess(d) |
| paddy@0 | 113 } |
| paddy@0 | 114 return nil, errors.New("Refresh not found") |
| paddy@0 | 115 } |
| paddy@0 | 116 |
| paddy@0 | 117 func (s *TestingStorage) RemoveRefresh(code string) error { |
| paddy@0 | 118 delete(s.refresh, code) |
| paddy@0 | 119 return nil |
| paddy@0 | 120 } |
| paddy@0 | 121 |
| paddy@0 | 122 // Predictable testing token generation |
| paddy@0 | 123 |
| paddy@0 | 124 type TestingAuthorizeTokenGen struct { |
| paddy@0 | 125 counter int64 |
| paddy@0 | 126 } |
| paddy@0 | 127 |
| paddy@0 | 128 func (a *TestingAuthorizeTokenGen) GenerateAuthorizeToken(data *AuthorizeData) (ret string, err error) { |
| paddy@0 | 129 a.counter++ |
| paddy@0 | 130 return strconv.FormatInt(a.counter, 10), nil |
| paddy@0 | 131 } |
| paddy@0 | 132 |
| paddy@0 | 133 type TestingAccessTokenGen struct { |
| paddy@0 | 134 acounter int64 |
| paddy@0 | 135 rcounter int64 |
| paddy@0 | 136 } |
| paddy@0 | 137 |
| paddy@0 | 138 func (a *TestingAccessTokenGen) GenerateAccessToken(data *AccessData, generaterefresh bool) (accesstoken string, refreshtoken string, err error) { |
| paddy@0 | 139 a.acounter++ |
| paddy@0 | 140 accesstoken = strconv.FormatInt(a.acounter, 10) |
| paddy@0 | 141 |
| paddy@0 | 142 if generaterefresh { |
| paddy@0 | 143 a.rcounter++ |
| paddy@0 | 144 refreshtoken = "r" + strconv.FormatInt(a.rcounter, 10) |
| paddy@0 | 145 } |
| paddy@0 | 146 return |
| paddy@0 | 147 } |