161 lines
3.3 KiB
Go
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
|
|
}
|