func ResetPassword(c *cli.Context) { if len(c.Args()) != 1 { cli.ShowCommandHelp(c, c.Command.Name) os.Exit(1) } name := c.Args()[0] conf, err := loadConfig(c.String("config")) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } logger, err := newLogger(conf) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } pool, err := newPool(conf, logger) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } user, err := data.SelectUserByName(pool, name) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } password, err := genRandPassword() if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } update := &data.User{} SetPassword(update, password) err = data.UpdateUser(pool, user.ID.Value, update) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } fmt.Println("User:"******"Password:", password) }
func BenchmarkDataGetUserByName(b *testing.B) { pool := newConnPool(b) user := newUser() _, err := data.CreateUser(pool, user) if err != nil { b.Fatal(err) } b.ResetTimer() for i := 0; i < b.N; i++ { _, err := data.SelectUserByName(pool, user.Name.Value) if err != nil { b.Fatal(err) } } }
func TestDataUsersLifeCycle(t *testing.T) { pool := newConnPool(t) input := &data.User{ Name: data.NewString("test"), Email: data.NewString("*****@*****.**"), PasswordDigest: data.NewBytes([]byte("digest")), PasswordSalt: data.NewBytes([]byte("salt")), } userID, err := data.CreateUser(pool, input) if err != nil { t.Fatal(err) } user, err := data.SelectUserByName(pool, input.Name.Value) if err != nil { t.Fatal(err) } if user.ID.Value != userID { t.Errorf("Expected %v, got %v", userID, user.ID) } if user.Name != input.Name { t.Errorf("Expected %v, got %v", input.Name, user.Name) } if user.Email != input.Email { t.Errorf("Expected %v, got %v", input.Email, user.Email) } if bytes.Compare(user.PasswordDigest.Value, input.PasswordDigest.Value) != 0 { t.Errorf("Expected user (%v) and input (%v) PasswordDigest to match, but they did not", user.PasswordDigest, input.PasswordDigest) } if bytes.Compare(user.PasswordSalt.Value, input.PasswordSalt.Value) != 0 { t.Errorf("Expected user (%v), and input (%v) PasswordSalt to match, but they did not", user.PasswordSalt, input.PasswordSalt) } user, err = data.SelectUserByEmail(pool, input.Email.Value) if err != nil { t.Fatal(err) } if user.ID.Value != userID { t.Errorf("Expected %v, got %v", userID, user.ID) } if user.Name != input.Name { t.Errorf("Expected %v, got %v", input.Name, user.Name) } if user.Email != input.Email { t.Errorf("Expected %v, got %v", input.Email, user.Email) } if bytes.Compare(user.PasswordDigest.Value, input.PasswordDigest.Value) != 0 { t.Errorf("Expected user (%v) and input (%v) PasswordDigest to match, but they did not", user.PasswordDigest, input.PasswordDigest) } if bytes.Compare(user.PasswordSalt.Value, input.PasswordSalt.Value) != 0 { t.Errorf("Expected user (%v), and input (%v) PasswordSalt to match, but they did not", user.PasswordSalt, input.PasswordSalt) } user, err = data.SelectUserByPK(pool, userID) if err != nil { t.Fatal(err) } if user.ID.Value != userID { t.Errorf("Expected %v, got %v", userID, user.ID) } if user.Name != input.Name { t.Errorf("Expected %v, got %v", input.Name, user.Name) } if user.Email != input.Email { t.Errorf("Expected %v, got %v", input.Email, user.Email) } if bytes.Compare(user.PasswordDigest.Value, input.PasswordDigest.Value) != 0 { t.Errorf("Expected user (%v) and input (%v) PasswordDigest to match, but they did not", user.PasswordDigest, input.PasswordDigest) } if bytes.Compare(user.PasswordSalt.Value, input.PasswordSalt.Value) != 0 { t.Errorf("Expected user (%v), and input (%v) PasswordSalt to match, but they did not", user.PasswordSalt, input.PasswordSalt) } }
func CreateSessionHandler(w http.ResponseWriter, req *http.Request, env *environment) { var credentials struct { Name string `json:"name"` Password string `json:"password"` } decoder := json.NewDecoder(req.Body) if err := decoder.Decode(&credentials); err != nil { w.WriteHeader(422) fmt.Fprintf(w, "Error decoding request: %v", err) return } if credentials.Name == "" { w.WriteHeader(422) fmt.Fprintln(w, `Request must include the attribute "name"`) return } if credentials.Password == "" { w.WriteHeader(422) fmt.Fprintln(w, `Request must include the attribute "password"`) return } user, err := data.SelectUserByName(env.pool, credentials.Name) if err != nil { w.WriteHeader(422) fmt.Fprintln(w, "Bad user name or password") return } if !IsPassword(user, credentials.Password) { w.WriteHeader(422) fmt.Fprintln(w, "Bad user name or password") return } sessionID, err := genSessionID() if err != nil { http.Error(w, "Internal server error", http.StatusInternalServerError) return } err = data.InsertSession(env.pool, &data.Session{ ID: data.NewBytes(sessionID), UserID: user.ID, }, ) if err != nil { http.Error(w, "Internal server error", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) var response struct { Name string `json:"name"` SessionID string `json:"sessionID"` } response.Name = credentials.Name response.SessionID = hex.EncodeToString(sessionID) encoder := json.NewEncoder(w) encoder.Encode(response) }