canape/src/internal/users/handlers.go
Lucas BEE e2feb3cf8f Set data of user in all pages
Moves data in a separate package
User is now accessible on all pages if logged in
Changes default route for Login
Add default route for /
2016-11-11 16:22:48 +00:00

162 lines
3.4 KiB
Go

package users
import (
"fmt"
"net/http"
"github.com/gorilla/Schema"
"github.com/kr/pretty"
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/auth"
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/config"
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/data"
"gitlab.quimbo.fr/odwrtw/canape-sql/src/internal/web"
)
func LoginGETHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
return e.Rends(w, r, "users/login")
}
func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
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 {
data.SetData(r, "FormErrors", "Error invalid user or password")
return e.Rends(w, r, "users/login")
}
return err
}
e.Log.Debug("logged")
path, err := auth.GetPostLoginRedirect(e.Auth, w, r)
if err != nil {
return err
}
e.Log.Debugf("redirecting to %s", path)
if path != "" {
http.Redirect(w, r, path, http.StatusTemporaryRedirect)
return nil
}
e.Log.Debugf("got no path, redirecting to /")
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)
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return nil
}
// DetailsHandler show user details
func DetailsHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
v := auth.GetCurrentUser(r, e.Log)
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
}
data.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, e.Log)
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" {
data.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
}