Archived
Template
1
0
This repository has been archived on 2023-12-20. You can view files and clone it, but cannot push or open issues or pull requests.
Files
golang-base-project/routes/login.go
2022-01-29 10:21:05 +01:00

108 lines
2.7 KiB
Go

package routes
import (
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"github.com/uberswe/golang-base-project/middleware"
"github.com/uberswe/golang-base-project/models"
"github.com/uberswe/golang-base-project/ulid"
"golang.org/x/crypto/bcrypt"
"log"
"net/http"
"time"
)
// Login renders the HTML of the login page
func (controller Controller) Login(c *gin.Context) {
pd := controller.DefaultPageData(c)
pd.Title = pd.Trans("Login")
c.HTML(http.StatusOK, "login.html", pd)
}
// LoginPost handles login requests and returns the appropriate HTML and messages
func (controller Controller) LoginPost(c *gin.Context) {
pd := controller.DefaultPageData(c)
loginError := pd.Trans("Could not login, please make sure that you have typed in the correct email and password. If you have forgotten your password, please click the forgot password link below.")
pd.Title = pd.Trans("Login")
email := c.PostForm("email")
user := models.User{Email: email}
res := controller.db.Where(&user).First(&user)
if res.Error != nil {
pd.Messages = append(pd.Messages, Message{
Type: "error",
Content: loginError,
})
log.Println(res.Error)
c.HTML(http.StatusInternalServerError, "login.html", pd)
return
}
if res.RowsAffected == 0 {
pd.Messages = append(pd.Messages, Message{
Type: "error",
Content: loginError,
})
c.HTML(http.StatusBadRequest, "login.html", pd)
return
}
if user.ActivatedAt == nil {
pd.Messages = append(pd.Messages, Message{
Type: "error",
Content: pd.Trans("Account is not activated yet."),
})
c.HTML(http.StatusBadRequest, "login.html", pd)
return
}
password := c.PostForm("password")
err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))
if err != nil {
pd.Messages = append(pd.Messages, Message{
Type: "error",
Content: loginError,
})
c.HTML(http.StatusBadRequest, "login.html", pd)
return
}
// Generate a ulid for the current session
sessionIdentifier := ulid.Generate()
ses := models.Session{
Identifier: sessionIdentifier,
}
// Session is valid for 1 hour
ses.ExpiresAt = time.Now().Add(time.Hour)
ses.UserID = user.ID
res = controller.db.Save(&ses)
if res.Error != nil {
pd.Messages = append(pd.Messages, Message{
Type: "error",
Content: loginError,
})
log.Println(res.Error)
c.HTML(http.StatusInternalServerError, "login.html", pd)
return
}
session := sessions.Default(c)
session.Set(middleware.SessionIDKey, sessionIdentifier)
err = session.Save()
if err != nil {
pd.Messages = append(pd.Messages, Message{
Type: "error",
Content: loginError,
})
log.Println(err)
c.HTML(http.StatusInternalServerError, "login.html", pd)
return
}
c.Redirect(http.StatusTemporaryRedirect, "/admin")
}