Otfe/controllers/session.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)
}