package user import ( "encoding/base64" "errors" "fmt" "math/rand" ) type UserClient interface { register(username, password, email string) (bool, error) login(username, password string, requiredMailValidation bool) (bool, error) getMailValidationToken(email string, forceRecreate bool,) (string, error) } type UserClientMemory struct { users map[string]string } var u *UserClientMemory func GetUserMemmoryClient() *UserClientMemory { if u == nil { uc := UserClientMemory{} uc.users = make(map[string]string) uc.users["admin"]="password" u = &uc } return u } func (uc *UserClientMemory) register(username, password, email string) (bool, error) { if _, ok := uc.users[username]; ok { return false, errors.New("Username already used") } uc.users[username] = password return true, nil } func (uc UserClientMemory) login(username, password string, requiredMailValidation bool) (bool, error) { if requiredMailValidation == true { return false, errors.New("In memmory User Client cant validate email addresses") } if val, ok := uc.users[username]; ok { fmt.Println("Login for valide user") if val == password { return true, nil } } else { fmt.Printf("User %v not found", username) } return false, nil } func (uc UserClientMemory) getMailValidationToken(email string, forceRecreate bool) (string, error) { token := randomString(35) token = fmt.Sprintf("%v/%v", base64.StdEncoding.EncodeToString([]byte(email)), token) return token, nil } func randomString(n int) string { var letters = []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") b := make([]byte, n) for i := range b { b[i] = letters[rand.Intn(len(letters))] } return string(b) }