auth

Paddy 2014-09-18 Parent:1f7b44b130a0 Child:0b86c2d3ec75

39:690561c6619a Go to Latest

auth/profile.go

Include client updates and tests. Flesh out updating clients, and include unit tests to ensure that clientstores actually update appropriately. Add TODO comments where functionality is planned but stubbed out.

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 }