~juju-qa/ubuntu/yakkety/juju/2.0-rc3-again

« back to all changes in this revision

Viewing changes to src/launchpad.net/goose/testservices/identityservice/users.go

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2013-04-24 22:34:47 UTC
  • Revision ID: package-import@ubuntu.com-20130424223447-f0qdji7ubnyo0s71
Tags: upstream-1.10.0.1
ImportĀ upstreamĀ versionĀ 1.10.0.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 {
 
16
        for id, tenantName := range u.tenants {
 
17
                if tenant == tenantName {
 
18
                        return id
 
19
                }
 
20
        }
 
21
        u.nextTenantId++
 
22
        id := strconv.Itoa(u.nextTenantId)
 
23
        u.tenants[id] = tenant
 
24
        return id
 
25
}
 
26
 
 
27
func (u *Users) AddUser(user, secret, tenant string) *UserInfo {
 
28
        tenantId := u.addTenant(tenant)
 
29
        u.nextUserId++
 
30
        userInfo := &UserInfo{secret: secret, Id: strconv.Itoa(u.nextUserId), TenantId: tenantId}
 
31
        u.users[user] = *userInfo
 
32
        userInfo, _ = u.authenticate(user, secret)
 
33
        return userInfo
 
34
}
 
35
 
 
36
func (u *Users) FindUser(token string) (*UserInfo, error) {
 
37
        for _, userInfo := range u.users {
 
38
                if userInfo.Token == token {
 
39
                        return &userInfo, nil
 
40
                }
 
41
        }
 
42
        return nil, fmt.Errorf("No user with token %v exists", token)
 
43
}
 
44
 
 
45
const (
 
46
        notAuthorized = "The request you have made requires authentication."
 
47
        invalidUser   = "Invalid user / password"
 
48
)
 
49
 
 
50
func (u *Users) authenticate(username, password string) (*UserInfo, string) {
 
51
        userInfo, ok := u.users[username]
 
52
        if !ok {
 
53
                return nil, notAuthorized
 
54
        }
 
55
        if userInfo.secret != password {
 
56
                return nil, invalidUser
 
57
        }
 
58
        if userInfo.Token == "" {
 
59
                userInfo.Token = randomHexToken()
 
60
                u.users[username] = userInfo
 
61
        }
 
62
        return &userInfo, ""
 
63
}