summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobby <[email protected]>2025-12-22 13:46:50 +0530
committerBobby <[email protected]>2025-12-22 13:46:50 +0530
commit32ee8047eba06c9f1c7575b66fc0f9195657ac04 (patch)
treeed781e7b05aeba0b5db78e69918edd6a0928c9e1
parentf17d9142781eb1a659ea53311d9225b244ad209c (diff)
downloadlain-32ee8047eba06c9f1c7575b66fc0f9195657ac04.tar.xz
lain-32ee8047eba06c9f1c7575b66fc0f9195657ac04.zip
auth engine, basic login working
-rw-r--r--controllers/auth.go53
-rw-r--r--controllers/login.go17
-rw-r--r--controllers/mail.go1
-rw-r--r--models/preferences.go2
-rw-r--r--repository/preferences.go35
-rw-r--r--router/auth.go3
-rw-r--r--router/mail.go19
-rw-r--r--session/functions.go36
-rw-r--r--types/auth.go6
9 files changed, 154 insertions, 18 deletions
diff --git a/controllers/auth.go b/controllers/auth.go
new file mode 100644
index 0000000..3351058
--- /dev/null
+++ b/controllers/auth.go
@@ -0,0 +1,53 @@
+package controllers
+
+import (
+ "lain/config"
+ "lain/repository"
+ "lain/session"
+ "lain/types"
+ "lain/utils/crypto"
+ "lain/utils/meta"
+ "lain/utils/shortcuts"
+
+ "github.com/gofiber/fiber/v2"
+)
+
+func LoginPage(context *fiber.Ctx) error {
+ meta.SetPageTitle(context, "Login")
+
+ return shortcuts.Render(context, "auth/login", fiber.Map{
+ "AllowedDomains": config.Server.AllowedDomains,
+ })
+}
+
+func Login(context *fiber.Ctx) error {
+ var formData types.LoginForm
+ if err := context.BodyParser(&formData); err != nil {
+ return BadRequest(context, err)
+ }
+
+ encryptedPassword, err := crypto.Encrypt(formData.Password)
+ if err != nil {
+ return InternalServerError(context, err)
+ }
+ formData.Password = encryptedPassword
+
+ preferences, err := repository.GetPreferences(formData)
+ if err != nil {
+ return InternalServerError(context, err)
+ }
+
+ if err = session.CreateSession(context, preferences.Email); err != nil {
+ return InternalServerError(context, err)
+ }
+
+ return shortcuts.Redirect(context, "mail.inbox")
+}
+
+func Logout(context *fiber.Ctx) error {
+ if err := session.DestroySession(context); err != nil {
+ return InternalServerError(context, err)
+ }
+
+ return shortcuts.Redirect(context, "auth.login")
+}
diff --git a/controllers/login.go b/controllers/login.go
deleted file mode 100644
index 2690538..0000000
--- a/controllers/login.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package controllers
-
-import (
- "lain/config"
- "lain/utils/meta"
- "lain/utils/shortcuts"
-
- "github.com/gofiber/fiber/v2"
-)
-
-func LoginPage(context *fiber.Ctx) error {
- meta.SetPageTitle(context, "Login")
-
- return shortcuts.Render(context, "auth/login", fiber.Map{
- "AllowedDomains": config.Server.AllowedDomains,
- })
-}
diff --git a/controllers/mail.go b/controllers/mail.go
new file mode 100644
index 0000000..2d32936
--- /dev/null
+++ b/controllers/mail.go
@@ -0,0 +1 @@
+package controllers
diff --git a/models/preferences.go b/models/preferences.go
index 0d1624f..2dcdffc 100644
--- a/models/preferences.go
+++ b/models/preferences.go
@@ -59,7 +59,7 @@ type Preferences struct {
QuoteOriginalMessage types.EmailReplyOption `gorm:"type:varchar(50);default:'Place my reply below the original message'"`
MessageForwarding types.MessageForwardingOption `gorm:"type:varchar(50);default:'Inline'"`
HTMLFontFamily types.EmailHTMLFontFamilyOption `gorm:"type:varchar(50);default:'Verdana'"`
- HTMLFontSize types.EmailHTMLFontSizeOption `gorm:"default:'10'"`
+ HTMLFontSize types.EmailHTMLFontSizeOption `gorm:"default:10"`
EnableEmoticons bool `gorm:"default:true"`
AttachmentNames types.EmailAttachementNameStyleOption `gorm:"type:varchar(30);default:'RFC 2047/2231 (Outlook)'"`
diff --git a/repository/preferences.go b/repository/preferences.go
new file mode 100644
index 0000000..1109a86
--- /dev/null
+++ b/repository/preferences.go
@@ -0,0 +1,35 @@
+package repository
+
+import (
+ "lain/database"
+ "lain/models"
+ "lain/types"
+
+ "gorm.io/gorm"
+)
+
+func GetPreferences(formData types.LoginForm) (*models.Preferences, error) {
+ var preferences models.Preferences
+
+ if err := database.DB.Where("email = ?", formData.Email).First(&preferences).Error; err != nil {
+ if err == gorm.ErrRecordNotFound {
+ return CreateDefaultPreferences(formData)
+ }
+ return nil, err
+ }
+
+ return &preferences, nil
+}
+
+func CreateDefaultPreferences(formData types.LoginForm) (*models.Preferences, error) {
+ preferences := models.Preferences{
+ Email: formData.Email,
+ Authorization: formData.Password,
+ }
+
+ if err := database.DB.Create(&preferences).Error; err != nil {
+ return nil, err
+ }
+
+ return &preferences, nil
+}
diff --git a/router/auth.go b/router/auth.go
index 8c13e37..728e985 100644
--- a/router/auth.go
+++ b/router/auth.go
@@ -10,4 +10,7 @@ func init() {
urls.SetNamespace("auth")
urls.Path(types.GET, "/login", controllers.LoginPage, "login")
+ urls.Path(types.GET, "/logout", controllers.Logout, "logout")
+
+ urls.Path(types.POST, "/login", controllers.Login, "login.submit")
}
diff --git a/router/mail.go b/router/mail.go
new file mode 100644
index 0000000..8584f05
--- /dev/null
+++ b/router/mail.go
@@ -0,0 +1,19 @@
+package router
+
+import (
+ "lain/session"
+ "lain/types"
+ "lain/utils/auth"
+ "lain/utils/urls"
+
+ "github.com/gofiber/fiber/v2"
+)
+
+func init() {
+ urls.SetNamespace("mail")
+
+ urls.Path(types.GET, "/inbox", auth.RequireAuthentication(func(c *fiber.Ctx) error {
+ email, _ := session.GetSessionEmail(c)
+ return c.SendString("Inbox for " + email)
+ }), "inbox")
+}
diff --git a/session/functions.go b/session/functions.go
new file mode 100644
index 0000000..589091f
--- /dev/null
+++ b/session/functions.go
@@ -0,0 +1,36 @@
+package session
+
+import "github.com/gofiber/fiber/v2"
+
+func CreateSession(context *fiber.Ctx, email string) error {
+ sess, err := Store.Get(context)
+ if err != nil {
+ return err
+ }
+
+ sess.Set("email", email)
+ return sess.Save()
+}
+
+func DestroySession(context *fiber.Ctx) error {
+ sess, err := Store.Get(context)
+ if err != nil {
+ return err
+ }
+
+ return sess.Destroy()
+}
+
+func GetSessionEmail(context *fiber.Ctx) (string, error) {
+ sess, err := Store.Get(context)
+ if err != nil {
+ return "", err
+ }
+
+ email := sess.Get("email")
+ if emailStr, ok := email.(string); ok {
+ return emailStr, nil
+ }
+
+ return "", nil
+}
diff --git a/types/auth.go b/types/auth.go
new file mode 100644
index 0000000..d22f8d9
--- /dev/null
+++ b/types/auth.go
@@ -0,0 +1,6 @@
+package types
+
+type LoginForm struct {
+ Email string `json:"email" form:"email"`
+ Password string `json:"password" form:"password"`
+}