diff options
| author | Bobby <[email protected]> | 2025-12-22 13:46:50 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2025-12-22 13:46:50 +0530 |
| commit | 32ee8047eba06c9f1c7575b66fc0f9195657ac04 (patch) | |
| tree | ed781e7b05aeba0b5db78e69918edd6a0928c9e1 | |
| parent | f17d9142781eb1a659ea53311d9225b244ad209c (diff) | |
| download | lain-32ee8047eba06c9f1c7575b66fc0f9195657ac04.tar.xz lain-32ee8047eba06c9f1c7575b66fc0f9195657ac04.zip | |
auth engine, basic login working
| -rw-r--r-- | controllers/auth.go | 53 | ||||
| -rw-r--r-- | controllers/login.go | 17 | ||||
| -rw-r--r-- | controllers/mail.go | 1 | ||||
| -rw-r--r-- | models/preferences.go | 2 | ||||
| -rw-r--r-- | repository/preferences.go | 35 | ||||
| -rw-r--r-- | router/auth.go | 3 | ||||
| -rw-r--r-- | router/mail.go | 19 | ||||
| -rw-r--r-- | session/functions.go | 36 | ||||
| -rw-r--r-- | types/auth.go | 6 |
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"` +} |
