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  }