auth

Paddy 2014-07-18

0:7a6f64db7246 Go to Latest

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.

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