package routing import ( "log" "net/http" lishwist "lishwist/core" "lishwist/http/api" "lishwist/http/response" "lishwist/http/templates" "github.com/Teajey/rsvp" ) type AccountProps struct { CurrentUsername string GeneralError string `json:",omitempty"` PasswordFromAdmin bool `json:",omitempty"` Password templates.InputProps ConfirmPassword templates.InputProps } func (p *AccountProps) Validate() (valid bool) { valid = true if p.Password.Value != p.ConfirmPassword.Value { p.ConfirmPassword.Error = "Passwords didn't match" valid = false } if !p.Password.Validate() { valid = false } if !p.ConfirmPassword.Validate() { valid = false } return } func NewAccountProps(username string, passwordFromAdmin bool, passwordVal, confirmPassVal string) *AccountProps { return &AccountProps{ CurrentUsername: username, PasswordFromAdmin: passwordFromAdmin, Password: templates.InputProps{ Type: "password", Name: "new_password", Required: true, MinLength: 5, Value: passwordVal, }, ConfirmPassword: templates.InputProps{ Type: "password", Name: "confirm_password", Required: true, Value: confirmPassVal, }, } } func Account(app *lishwist.Session, session *response.Session, h http.Header, r *http.Request) rsvp.Response { user := app.User() props := NewAccountProps(user.Name, user.PasswordFromAdmin, "", "") flash := session.FlashGet() flashProps, _ := flash.(*AccountProps) if flashProps != nil { props.GeneralError = flashProps.GeneralError props.ConfirmPassword.Error = flashProps.ConfirmPassword.Error } return response.Data("account.gotmpl", props) } func AccountPost(app *lishwist.Session, session *response.Session, h http.Header, r *http.Request) rsvp.Response { user := app.User() err := r.ParseForm() if err != nil { return response.Error(http.StatusBadRequest, "Failed to parse form") } intent := r.Form.Get("intent") if intent != "set_password" { return response.Error(http.StatusBadRequest, "Invalid intent %q", intent) } newPassword := r.Form.Get("new_password") confirmPassword := r.Form.Get("confirm_password") props := NewAccountProps(user.Name, user.PasswordFromAdmin, newPassword, confirmPassword) valid := props.Validate() props.Password.Value = "" props.ConfirmPassword.Value = "" if !valid { log.Printf("Invalid account props: %#v\n", props) session.FlashSet(&props) return rsvp.SeeOther("/account", props) } err = user.SetPassword(newPassword) if err != nil { props.GeneralError = "Something went wrong." log.Printf("Set password failed: %s\n", err) session.FlashSet(&props) return rsvp.SeeOther("/account", props) } session.RemoveValue("sessionKey") session.FlashSet(&api.LoginProps{SuccessfulSetPassword: true}) return rsvp.SeeOther("/", "Set password successful!") }