auth
auth/config.go
Implement postgres version of the tokenStore. Create a postgres implementation for the tokenStore. Note that because pq doesn't support Postgres' array types (see https://github.com/lib/pq/issues/49), we couldn't just store the token.Scopes field as a Postgres array of varchars, which would have been the ideal. Instead, we need a many-to-many table that maps tokens to scopes. This meant we needed a special tokenScope type for our database mapping, and we needed to complicate the token storage/retrieval functions a little bit. It's kind of ugly, I'm not a huge fan of it, and I'd much rather be using the Postgres array types, but... well, here we are. We also added the postgres tokenStore to our slice of tokenStores to test when the correct environment variables are present. We wrote initialization SQL for the tables required by the postgres tokenStore. Also, added a helper script for emptying the test database, because I got tired of doing it by hand. We should be doing that in an automated fashion in the tests themselves, but that would mean extending the *Store interfaces.
| paddy@96 | 1 package auth |
| paddy@96 | 2 |
| paddy@96 | 3 import ( |
| paddy@96 | 4 "errors" |
| paddy@96 | 5 "html/template" |
| paddy@101 | 6 "log" |
| paddy@96 | 7 ) |
| paddy@96 | 8 |
| paddy@96 | 9 var ( |
| paddy@96 | 10 // ErrInvalidLoginURI is returned when a Context is instantiated with a Config object that specifies a LoginURI that can't be parsed as a URL. |
| paddy@96 | 11 ErrInvalidLoginURI = errors.New("invalid login URI") |
| paddy@102 | 12 // ErrConfigNotInitialized is returned when a Context is instantiated with a Config object that hasn't had its Init function called. |
| paddy@102 | 13 ErrConfigNotInitialized = errors.New("config not initialized") |
| paddy@96 | 14 ) |
| paddy@96 | 15 |
| paddy@96 | 16 // Config holds the configuration values necessary to run a server. A Config |
| paddy@96 | 17 // instance is the only way to instantiate a Context variable. |
| paddy@96 | 18 type Config struct { |
| paddy@96 | 19 ClientStore clientStore |
| paddy@96 | 20 AuthCodeStore authorizationCodeStore |
| paddy@96 | 21 ProfileStore profileStore |
| paddy@96 | 22 TokenStore tokenStore |
| paddy@96 | 23 SessionStore sessionStore |
| paddy@134 | 24 ScopeStore scopeStore |
| paddy@96 | 25 Template *template.Template |
| paddy@96 | 26 LoginURI string |
| paddy@96 | 27 iterations int |
| paddy@132 | 28 secureCookie bool |
| paddy@96 | 29 } |
| paddy@101 | 30 |
| paddy@102 | 31 // Init is a function that preps the Config object to be used for Context creation, setting variables |
| paddy@102 | 32 // that are determined at the beginning of program execution. |
| paddy@101 | 33 func (c *Config) Init() error { |
| paddy@101 | 34 scheme, ok := passphraseSchemes[CurPassphraseScheme] |
| paddy@101 | 35 if !ok { |
| paddy@101 | 36 return ErrInvalidPassphraseScheme |
| paddy@101 | 37 } |
| paddy@101 | 38 var err error |
| paddy@101 | 39 c.iterations, err = scheme.calculateIterations() |
| paddy@101 | 40 if err != nil { |
| paddy@101 | 41 return err |
| paddy@101 | 42 } |
| paddy@101 | 43 log.Printf("Generating passphrases with %d iterations...\n", c.iterations) |
| paddy@101 | 44 return nil |
| paddy@101 | 45 } |