gopkg.in/goose.v2@v2.0.1/testservices/identityservice/users.go (about) 1 package identityservice 2 3 import ( 4 "fmt" 5 "strconv" 6 ) 7 8 type Users struct { 9 nextUserId int 10 nextTenantId int 11 users map[string]UserInfo 12 tenants map[string]string 13 } 14 15 func (u *Users) addTenant(tenant string) (string, string) { 16 if tenant == "" { 17 return "", "" 18 } 19 for id, tenantName := range u.tenants { 20 if tenant == tenantName { 21 return id, tenantName 22 } 23 } 24 u.nextTenantId++ 25 id := strconv.Itoa(u.nextTenantId) 26 u.tenants[id] = tenant 27 return id, tenant 28 } 29 30 func (u *Users) AddUser(user, secret, tenant, authDomain string) *UserInfo { 31 tenantId, tenantName := u.addTenant(tenant) 32 u.nextUserId++ 33 userInfo := &UserInfo{ 34 secret: secret, 35 Id: strconv.Itoa(u.nextUserId), 36 TenantId: tenantId, 37 TenantName: tenantName, 38 authDomain: authDomain, 39 } 40 u.users[user] = *userInfo 41 userInfo, _ = u.authenticate(user, secret, authDomain) 42 return userInfo 43 } 44 45 func (u *Users) FindUser(token string) (*UserInfo, error) { 46 for _, userInfo := range u.users { 47 if userInfo.Token == token { 48 return &userInfo, nil 49 } 50 } 51 return nil, fmt.Errorf("No user with token %v exists", token) 52 } 53 54 // ClearToken removes the token associated with the given user so that 55 // any further uses of that token will be unauthorized. 56 func (u *Users) ClearToken(user string) error { 57 ui, ok := u.users[user] 58 if !ok { 59 return fmt.Errorf("user %q does not exist", user) 60 } 61 ui.Token = "" 62 u.users[user] = ui 63 return nil 64 } 65 66 const ( 67 notAuthorized = "The request you have made requires authentication." 68 invalidUser = "Invalid user / password" 69 ) 70 71 func (u *Users) authenticate(username, password, domain string) (*UserInfo, string) { 72 userInfo, ok := u.users[username] 73 if !ok { 74 return nil, notAuthorized 75 } 76 if domain != "" && domain != userInfo.authDomain { 77 return nil, invalidUser 78 } 79 if userInfo.secret != password { 80 return nil, invalidUser 81 } 82 if userInfo.Token == "" { 83 userInfo.Token = randomHexToken() 84 u.users[username] = userInfo 85 } 86 return &userInfo, "" 87 }