73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
|
package controllers
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"net/http"
|
||
|
|
||
|
"git.1248.nz/1248/Otfe/misc/cookie"
|
||
|
"git.1248.nz/1248/Otfe/misc/helpers"
|
||
|
"git.1248.nz/1248/Otfe/misc/rand"
|
||
|
"git.1248.nz/1248/Otfe/models"
|
||
|
)
|
||
|
|
||
|
//Session controllers
|
||
|
type Session struct{}
|
||
|
|
||
|
type pageData struct {
|
||
|
Title string
|
||
|
Err string
|
||
|
User models.User
|
||
|
}
|
||
|
|
||
|
//New login form
|
||
|
func (s *Session) New(w http.ResponseWriter, r *http.Request) {
|
||
|
var err error
|
||
|
data := pageData{Title: "Login"}
|
||
|
data.Err, err = cookie.Read(r, "error")
|
||
|
if err == nil {
|
||
|
cookie.Delete(w, "error")
|
||
|
}
|
||
|
t(w, data, "/static/login.gtpl")
|
||
|
}
|
||
|
|
||
|
//Create a new session
|
||
|
func (s *Session) Create(w http.ResponseWriter, r *http.Request) {
|
||
|
r.ParseForm()
|
||
|
//Get email and password and check they are not empty
|
||
|
email := r.Form.Get("email")
|
||
|
password := r.Form.Get("password")
|
||
|
|
||
|
//Check if user exists
|
||
|
var user models.User
|
||
|
|
||
|
//Check password is correct
|
||
|
if user.Read("email", email) == nil &&
|
||
|
helpers.CheckPasswordHash(password, user.Password) == nil {
|
||
|
id, _ := rand.B64String(32)
|
||
|
sess := models.Session{ID: id, UserID: user.ID}
|
||
|
sess.Create()
|
||
|
cookie.Create(w, "session", sess.ID)
|
||
|
http.Redirect(w, r, "/", http.StatusFound)
|
||
|
} else {
|
||
|
loginFail(w, r, errors.New("Email or password incorrect"))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Delete session
|
||
|
func (s *Session) Delete(w http.ResponseWriter, r *http.Request) {
|
||
|
id, err := cookie.Read(r, "session")
|
||
|
//Check user is logged in
|
||
|
if err == nil {
|
||
|
cookie.Delete(w, "session")
|
||
|
var session models.Session
|
||
|
session.Delete(id)
|
||
|
http.Redirect(w, r, "/", http.StatusFound)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func loginFail(w http.ResponseWriter, r *http.Request, err error) {
|
||
|
cookie.Create(w, "error", err.Error())
|
||
|
http.Redirect(w, r, "/login", http.StatusFound)
|
||
|
}
|