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 }