auth

Paddy 2014-09-07 Parent:043906283c65 Child:0b86c2d3ec75

38:1f7b44b130a0 Go to Latest

auth/profile.go

Update profiles and add tests. Add tests for profile storage. Make Memstore implement the profilestore interface. Get the groundwork of profiles laid.

History
paddy@27 1 package auth
paddy@27 2
paddy@27 3 import (
paddy@38 4 "errors"
paddy@27 5 "time"
paddy@27 6
paddy@27 7 "secondbit.org/uuid"
paddy@27 8 )
paddy@27 9
paddy@38 10 var (
paddy@38 11 ErrProfileAlreadyExists = errors.New("profile already exists in ProfileStore")
paddy@38 12 ErrProfileNotFound = errors.New("profile not found in ProfileStore")
paddy@38 13 )
paddy@38 14
paddy@27 15 type Profile struct {
paddy@38 16 ID uuid.ID
paddy@38 17 Name string
paddy@38 18 Passphrase string
paddy@38 19 Iterations int64
paddy@38 20 Salt string
paddy@38 21 PassphraseScheme int
paddy@38 22 Compromised bool
paddy@38 23 LockedUntil time.Time
paddy@38 24 PassphraseReset string
paddy@38 25 PassphraseResetCreated time.Time
paddy@38 26 Created time.Time
paddy@38 27 LastSeen time.Time
paddy@38 28 }
paddy@38 29
paddy@38 30 func (p *Profile) ApplyChange(change ProfileChange) {
paddy@38 31 if change.Name != nil {
paddy@38 32 p.Name = *change.Name
paddy@38 33 }
paddy@38 34 if change.Passphrase != nil {
paddy@38 35 p.Passphrase = *change.Passphrase
paddy@38 36 }
paddy@38 37 if change.Iterations != nil {
paddy@38 38 p.Iterations = *change.Iterations
paddy@38 39 }
paddy@38 40 if change.Salt != nil {
paddy@38 41 p.Salt = *change.Salt
paddy@38 42 }
paddy@38 43 if change.PassphraseScheme != nil {
paddy@38 44 p.PassphraseScheme = *change.PassphraseScheme
paddy@38 45 }
paddy@38 46 if change.Compromised != nil {
paddy@38 47 p.Compromised = *change.Compromised
paddy@38 48 }
paddy@38 49 if change.LockedUntil != nil {
paddy@38 50 p.LockedUntil = *change.LockedUntil
paddy@38 51 }
paddy@38 52 if change.PassphraseReset != nil {
paddy@38 53 p.PassphraseReset = *change.PassphraseReset
paddy@38 54 }
paddy@38 55 if change.PassphraseResetCreated != nil {
paddy@38 56 p.PassphraseResetCreated = *change.PassphraseResetCreated
paddy@38 57 }
paddy@38 58 if change.LastSeen != nil {
paddy@38 59 p.LastSeen = *change.LastSeen
paddy@38 60 }
paddy@38 61 }
paddy@38 62
paddy@38 63 type ProfileChange struct {
paddy@38 64 Name *string
paddy@38 65 Passphrase *string
paddy@38 66 Iterations *int64
paddy@38 67 Salt *string
paddy@38 68 PassphraseScheme *int
paddy@38 69 Compromised *bool
paddy@38 70 LockedUntil *time.Time
paddy@38 71 PassphraseReset *string
paddy@38 72 PassphraseResetCreated *time.Time
paddy@38 73 LastSeen *time.Time
paddy@38 74 }
paddy@38 75
paddy@38 76 func (c ProfileChange) Validate() error {
paddy@38 77 return nil
paddy@27 78 }
paddy@27 79
paddy@27 80 type Login struct {
paddy@27 81 Type string
paddy@27 82 Value string
paddy@27 83 ProfileID uuid.ID
paddy@27 84 Created time.Time
paddy@27 85 LastUsed time.Time
paddy@27 86 }
paddy@27 87
paddy@27 88 type ProfileStore interface {
paddy@27 89 GetProfileByID(id uuid.ID) (Profile, error)
paddy@38 90 GetProfileByLogin(login Login) (Profile, error)
paddy@38 91 SaveProfile(profile Profile) error
paddy@38 92 UpdateProfile(id uuid.ID, change ProfileChange) error
paddy@27 93 DeleteProfile(id uuid.ID) error
paddy@38 94 }
paddy@27 95
paddy@38 96 func (m *Memstore) GetProfileByID(id uuid.ID) (Profile, error) {
paddy@38 97 m.profileLock.RLock()
paddy@38 98 defer m.profileLock.RUnlock()
paddy@38 99 p, ok := m.profiles[id.String()]
paddy@38 100 if !ok {
paddy@38 101 return Profile{}, ErrProfileNotFound
paddy@38 102 }
paddy@38 103 return p, nil
paddy@27 104 }
paddy@38 105
paddy@38 106 func (m *Memstore) GetProfileByLogin(login Login) (Profile, error) {
paddy@38 107 return Profile{}, nil
paddy@38 108 }
paddy@38 109
paddy@38 110 func (m *Memstore) SaveProfile(profile Profile) error {
paddy@38 111 m.profileLock.Lock()
paddy@38 112 defer m.profileLock.Unlock()
paddy@38 113 _, ok := m.profiles[profile.ID.String()]
paddy@38 114 if ok {
paddy@38 115 return ErrProfileAlreadyExists
paddy@38 116 }
paddy@38 117 m.profiles[profile.ID.String()] = profile
paddy@38 118 return nil
paddy@38 119 }
paddy@38 120
paddy@38 121 func (m *Memstore) UpdateProfile(id uuid.ID, change ProfileChange) error {
paddy@38 122 m.profileLock.Lock()
paddy@38 123 defer m.profileLock.Unlock()
paddy@38 124 p, ok := m.profiles[id.String()]
paddy@38 125 if !ok {
paddy@38 126 return ErrProfileNotFound
paddy@38 127 }
paddy@38 128 p.ApplyChange(change)
paddy@38 129 m.profiles[id.String()] = p
paddy@38 130 return nil
paddy@38 131 }
paddy@38 132
paddy@38 133 func (m *Memstore) DeleteProfile(id uuid.ID) error {
paddy@38 134 m.profileLock.Lock()
paddy@38 135 defer m.profileLock.Unlock()
paddy@38 136 _, ok := m.profiles[id.String()]
paddy@38 137 if !ok {
paddy@38 138 return ErrProfileNotFound
paddy@38 139 }
paddy@38 140 delete(m.profiles, id.String())
paddy@38 141 return nil
paddy@38 142 }