package api import ( "lishwist/db" "lishwist/templates" "log" "golang.org/x/crypto/bcrypt" ) type LoginProps struct { GeneralError string `json:",omitempty"` SuccessfulRegistration bool `json:",omitempty"` Username templates.InputProps Password templates.InputProps } func NewLoginProps(username, password string) *LoginProps { return &LoginProps{ Username: templates.InputProps{ Name: "username", Required: true, Value: username, }, Password: templates.InputProps{ Name: "password", Type: "password", Required: true, Value: password, }, } } func (p *LoginProps) Validate() (valid bool) { valid = true if !p.Username.Validate() { valid = false } if !p.Password.Validate() { valid = false } return } func Login(username, password string) *LoginProps { props := NewLoginProps(username, password) valid := props.Validate() props.Password.Value = "" if !valid { log.Printf("Invalid props: %#v\n", props) return props } user, err := db.GetUserByName(username) if err != nil { log.Printf("Failed to fetch user: %s\n", err) props.GeneralError = "Username or password invalid" return props } if user == nil { log.Printf("User not found by name: %q\n", username) props.GeneralError = "Username or password invalid" return props } passHash, err := user.GetPassHash() if err != nil { log.Println("Failed to get password hash: " + err.Error()) props.GeneralError = "Something went wrong. Error code: Momo" return props } err = bcrypt.CompareHashAndPassword(passHash, []byte(password)) if err != nil { log.Println("Username or password invalid: " + err.Error()) props.GeneralError = "Username or password invalid" return props } return nil }