120 lines
2.9 KiB
Go
120 lines
2.9 KiB
Go
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 {
|
|
Navbar templates.NavCollapse
|
|
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{
|
|
Navbar: templates.NavCollapse{
|
|
Links: []templates.Link{{Href: "/", Name: "Home"}},
|
|
User: &templates.User{Name: 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!")
|
|
}
|