canape/users/handlers.go
2016-04-30 21:32:54 +02:00

161 lines
3.3 KiB
Go

package users
import (
"fmt"
"net/http"
"github.com/gorilla/Schema"
"github.com/kr/pretty"
"gitlab.quimbo.fr/odwrtw/canape-sql/auth"
"gitlab.quimbo.fr/odwrtw/canape-sql/config"
"gitlab.quimbo.fr/odwrtw/canape-sql/web"
)
// LoginHandler login user
func LoginHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
if r.Method == "GET" {
return e.Rends(w, r, "users/login")
}
type loginForm struct {
Username string
Password string
}
err := r.ParseForm()
if err != nil {
return err
}
form := new(loginForm)
decoder := schema.NewDecoder()
err = decoder.Decode(form, r.PostForm)
if err != nil {
return err
}
err = e.Auth.Login(w, r, form.Username, form.Password)
if err != nil {
if err == auth.ErrInvalidPassword || err == ErrUnknownUser {
web.SetData(r, "FormErrors", "Error invalid user or password")
return e.Rends(w, r, "users/login")
}
return err
}
path, err := auth.GetPostLoginRedirect(e.Auth, w, r)
if err != nil {
return err
}
if path != "" {
http.Redirect(w, r, path, http.StatusTemporaryRedirect)
return nil
}
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return nil
}
// LogoutHandler just logout
func LogoutHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
e.Auth.Logout(w, r)
route := e.GetLoginRouteGetter()()
http.Redirect(w, r, route, http.StatusTemporaryRedirect)
return nil
}
// DetailsHandler show user details
func DetailsHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
v := auth.GetCurrentUser(r)
user, ok := v.(*User)
if !ok {
return fmt.Errorf("invalid user type")
}
var polochonConfig config.UserPolochon
err := user.GetConfig("polochon", &polochonConfig)
if err != nil {
return err
}
web.SetData(r, "user", user)
web.SetData(r, "polochon", polochonConfig)
return e.Rends(w, r, "users/details")
}
// EditHandler allow editing user info and configuration
func EditHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
v := auth.GetCurrentUser(r)
user, ok := v.(*User)
if !ok {
return fmt.Errorf("invalid user type")
}
var polochonConfig config.UserPolochon
err := user.GetConfig("polochon", &polochonConfig)
if err != nil {
return err
}
if r.Method == "GET" {
web.SetData(r, "user", user)
web.SetData(r, "polochon", polochonConfig)
return e.Rends(w, r, "users/edit")
}
type editForm struct {
PolochonURL string
PolochonToken string
Password string
PasswordVerify string
}
err = r.ParseForm()
if err != nil {
return err
}
form := new(editForm)
decoder := schema.NewDecoder()
err = decoder.Decode(form, r.PostForm)
if err != nil {
return err
}
polochonConfig.URL = form.PolochonURL
polochonConfig.Token = form.PolochonToken
err = user.SetConfig("polochon", polochonConfig)
if err != nil {
return err
}
if form.Password != "" || form.PasswordVerify != "" {
if form.Password != form.PasswordVerify {
// TODO: manage form error
}
user.Hash, err = e.Auth.GenHash(form.Password)
if err != nil {
return err
}
}
err = user.Update(e.Database)
if err != nil {
pretty.Println(err)
return err
}
err = e.Auth.RegenSecret(user, w, r)
if err != nil {
return err
}
url, err := e.GetURL("users.details")
if err != nil {
return err
}
http.Redirect(w, r, url, http.StatusTemporaryRedirect)
return nil
}