mirror of
https://github.com/abhinavxd/libredesk.git
synced 2025-11-01 20:44:12 +00:00
95 lines
3.2 KiB
Go
95 lines
3.2 KiB
Go
package main
|
|
|
|
import (
|
|
amodels "github.com/abhinavxd/libredesk/internal/auth/models"
|
|
"github.com/abhinavxd/libredesk/internal/envelope"
|
|
realip "github.com/ferluci/fast-realip"
|
|
"github.com/valyala/fasthttp"
|
|
"github.com/zerodha/fastglue"
|
|
)
|
|
|
|
type loginRequest struct {
|
|
Email string `json:"email"`
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
// handleLogin logs in the user and returns the user.
|
|
func handleLogin(r *fastglue.Request) error {
|
|
var (
|
|
app = r.Context.(*App)
|
|
ip = realip.FromRequest(r.RequestCtx)
|
|
loginReq loginRequest
|
|
)
|
|
|
|
// Decode JSON request.
|
|
if err := r.Decode(&loginReq, "json"); err != nil {
|
|
return r.SendErrorEnvelope(fasthttp.StatusBadRequest, app.i18n.Ts("globals.messages.errorParsing", "name", "{globals.terms.request}"), nil, envelope.InputError)
|
|
}
|
|
|
|
if loginReq.Email == "" || loginReq.Password == "" {
|
|
return r.SendErrorEnvelope(fasthttp.StatusBadRequest, app.i18n.T("globals.messages.badRequest"), nil, envelope.InputError)
|
|
}
|
|
|
|
// Verify email and password.
|
|
user, err := app.user.VerifyPassword(loginReq.Email, []byte(loginReq.Password))
|
|
if err != nil {
|
|
return sendErrorEnvelope(r, err)
|
|
}
|
|
|
|
// Check if user is enabled.
|
|
if !user.Enabled {
|
|
return sendErrorEnvelope(r, envelope.NewError(envelope.GeneralError, app.i18n.T("user.accountDisabled"), nil))
|
|
}
|
|
|
|
if err := app.auth.SaveSession(amodels.User{
|
|
ID: user.ID,
|
|
Email: user.Email.String,
|
|
FirstName: user.FirstName,
|
|
LastName: user.LastName,
|
|
}, r); err != nil {
|
|
app.lo.Error("error saving session", "error", err)
|
|
return sendErrorEnvelope(r, envelope.NewError(envelope.GeneralError, app.i18n.Ts("globals.messages.errorSaving", "name", "{globals.terms.session}"), nil))
|
|
}
|
|
// Set CSRF cookie if not already set.
|
|
if err := app.auth.SetCSRFCookie(r); err != nil {
|
|
app.lo.Error("error setting csrf cookie", "error", err)
|
|
return sendErrorEnvelope(r, envelope.NewError(envelope.GeneralError, app.i18n.Ts("globals.messages.errorSaving", "name", "{globals.terms.session}"), nil))
|
|
}
|
|
|
|
// Update last login time.
|
|
if err := app.user.UpdateLastLoginAt(user.ID); err != nil {
|
|
return sendErrorEnvelope(r, err)
|
|
}
|
|
|
|
// Insert activity log.
|
|
if err := app.activityLog.Login(user.ID, user.Email.String, ip); err != nil {
|
|
app.lo.Error("error creating login activity log", "error", err)
|
|
}
|
|
|
|
return r.SendEnvelope(user)
|
|
}
|
|
|
|
// handleLogout logs out the user and redirects to the dashboard.
|
|
func handleLogout(r *fastglue.Request) error {
|
|
var (
|
|
app = r.Context.(*App)
|
|
auser = r.RequestCtx.UserValue("user").(amodels.User)
|
|
ip = realip.FromRequest(r.RequestCtx)
|
|
)
|
|
|
|
// Insert activity log.
|
|
if err := app.activityLog.Logout(auser.ID, auser.Email, ip); err != nil {
|
|
app.lo.Error("error creating logout activity log", "error", err)
|
|
}
|
|
|
|
if err := app.auth.DestroySession(r); err != nil {
|
|
return sendErrorEnvelope(r, envelope.NewError(envelope.GeneralError, app.i18n.Ts("globals.messages.errorDestroying", "name", "{globals.terms.session}"), nil))
|
|
}
|
|
// Add no-cache headers.
|
|
r.RequestCtx.Response.Header.Add("Cache-Control",
|
|
"no-store, no-cache, must-revalidate, post-check=0, pre-check=0")
|
|
r.RequestCtx.Response.Header.Add("Pragma", "no-cache")
|
|
r.RequestCtx.Response.Header.Add("Expires", "-1")
|
|
return r.RedirectURI("/", fasthttp.StatusFound, nil, "")
|
|
}
|