storage/memory: add password resource
This commit is contained in:
parent
8012e56446
commit
ae3b5ef6e9
1 changed files with 90 additions and 16 deletions
|
@ -2,7 +2,7 @@
|
||||||
package memory
|
package memory
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/coreos/dex/storage"
|
||||||
|
@ -15,6 +15,7 @@ func New() storage.Storage {
|
||||||
authCodes: make(map[string]storage.AuthCode),
|
authCodes: make(map[string]storage.AuthCode),
|
||||||
refreshTokens: make(map[string]storage.RefreshToken),
|
refreshTokens: make(map[string]storage.RefreshToken),
|
||||||
authReqs: make(map[string]storage.AuthRequest),
|
authReqs: make(map[string]storage.AuthRequest),
|
||||||
|
passwords: make(map[string]storage.Password),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +38,7 @@ type memStorage struct {
|
||||||
authCodes map[string]storage.AuthCode
|
authCodes map[string]storage.AuthCode
|
||||||
refreshTokens map[string]storage.RefreshToken
|
refreshTokens map[string]storage.RefreshToken
|
||||||
authReqs map[string]storage.AuthRequest
|
authReqs map[string]storage.AuthRequest
|
||||||
|
passwords map[string]storage.Password
|
||||||
|
|
||||||
keys storage.Keys
|
keys storage.Keys
|
||||||
}
|
}
|
||||||
|
@ -47,28 +49,73 @@ func (s *memStorage) tx(f func()) {
|
||||||
f()
|
f()
|
||||||
}
|
}
|
||||||
|
|
||||||
var errAlreadyExists = errors.New("already exists")
|
|
||||||
|
|
||||||
func (s *memStorage) Close() error { return nil }
|
func (s *memStorage) Close() error { return nil }
|
||||||
|
|
||||||
func (s *memStorage) CreateClient(c storage.Client) error {
|
func (s *memStorage) CreateClient(c storage.Client) (err error) {
|
||||||
s.tx(func() { s.clients[c.ID] = c })
|
s.tx(func() {
|
||||||
return nil
|
if _, ok := s.clients[c.ID]; ok {
|
||||||
|
err = storage.ErrAlreadyExists
|
||||||
|
} else {
|
||||||
|
s.clients[c.ID] = c
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *memStorage) CreateAuthCode(c storage.AuthCode) error {
|
func (s *memStorage) CreateAuthCode(c storage.AuthCode) (err error) {
|
||||||
s.tx(func() { s.authCodes[c.ID] = c })
|
s.tx(func() {
|
||||||
return nil
|
if _, ok := s.authCodes[c.ID]; ok {
|
||||||
|
err = storage.ErrAlreadyExists
|
||||||
|
} else {
|
||||||
|
s.authCodes[c.ID] = c
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *memStorage) CreateRefresh(r storage.RefreshToken) error {
|
func (s *memStorage) CreateRefresh(r storage.RefreshToken) (err error) {
|
||||||
s.tx(func() { s.refreshTokens[r.RefreshToken] = r })
|
s.tx(func() {
|
||||||
return nil
|
if _, ok := s.refreshTokens[r.RefreshToken]; ok {
|
||||||
|
err = storage.ErrAlreadyExists
|
||||||
|
} else {
|
||||||
|
s.refreshTokens[r.RefreshToken] = r
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *memStorage) CreateAuthRequest(a storage.AuthRequest) error {
|
func (s *memStorage) CreateAuthRequest(a storage.AuthRequest) (err error) {
|
||||||
s.tx(func() { s.authReqs[a.ID] = a })
|
s.tx(func() {
|
||||||
return nil
|
if _, ok := s.authReqs[a.ID]; ok {
|
||||||
|
err = storage.ErrAlreadyExists
|
||||||
|
} else {
|
||||||
|
s.authReqs[a.ID] = a
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *memStorage) CreatePassword(p storage.Password) (err error) {
|
||||||
|
p.Email = strings.ToLower(p.Email)
|
||||||
|
s.tx(func() {
|
||||||
|
if _, ok := s.passwords[p.Email]; ok {
|
||||||
|
err = storage.ErrAlreadyExists
|
||||||
|
} else {
|
||||||
|
s.passwords[p.Email] = p
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *memStorage) GetPassword(email string) (p storage.Password, err error) {
|
||||||
|
email = strings.ToLower(email)
|
||||||
|
s.tx(func() {
|
||||||
|
var ok bool
|
||||||
|
if p, ok = s.passwords[email]; !ok {
|
||||||
|
err = storage.ErrNotFound
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *memStorage) GetClient(id string) (client storage.Client, err error) {
|
func (s *memStorage) GetClient(id string) (client storage.Client, err error) {
|
||||||
|
@ -126,6 +173,18 @@ func (s *memStorage) ListRefreshTokens() (tokens []storage.RefreshToken, err err
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *memStorage) DeletePassword(email string) (err error) {
|
||||||
|
email = strings.ToLower(email)
|
||||||
|
s.tx(func() {
|
||||||
|
if _, ok := s.passwords[email]; !ok {
|
||||||
|
err = storage.ErrNotFound
|
||||||
|
return
|
||||||
|
}
|
||||||
|
delete(s.passwords, email)
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (s *memStorage) DeleteClient(id string) (err error) {
|
func (s *memStorage) DeleteClient(id string) (err error) {
|
||||||
s.tx(func() {
|
s.tx(func() {
|
||||||
if _, ok := s.clients[id]; !ok {
|
if _, ok := s.clients[id]; !ok {
|
||||||
|
@ -235,9 +294,24 @@ func (s *memStorage) UpdateAuthRequest(id string, updater func(old storage.AuthR
|
||||||
err = storage.ErrNotFound
|
err = storage.ErrNotFound
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if req, err := updater(req); err == nil {
|
if req, err = updater(req); err == nil {
|
||||||
s.authReqs[id] = req
|
s.authReqs[id] = req
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *memStorage) UpdatePassword(email string, updater func(p storage.Password) (storage.Password, error)) (err error) {
|
||||||
|
email = strings.ToLower(email)
|
||||||
|
s.tx(func() {
|
||||||
|
req, ok := s.passwords[email]
|
||||||
|
if !ok {
|
||||||
|
err = storage.ErrNotFound
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if req, err = updater(req); err == nil {
|
||||||
|
s.passwords[email] = req
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
Reference in a new issue