From aa35dd827b6842422bc38ffea89ae9981451e6d8 Mon Sep 17 00:00:00 2001 From: Tomer Shvueli Date: Wed, 4 Jun 2025 03:35:31 -0400 Subject: [PATCH] :art: Add a 'remember me' checkbox when logging in to save a session for 30 days (#14964) --- app/appearance/langs/en_US.json | 3 ++- app/stage/auth.html | 6 ++++++ kernel/model/session.go | 21 +++++++++++++++++++++ kernel/server/serve.go | 1 + 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json index b5f8867e0..fc87a2cc0 100644 --- a/app/appearance/langs/en_US.json +++ b/app/appearance/langs/en_US.json @@ -1596,6 +1596,7 @@ "253": "Compressing file [%s], please wait...", "254": "[Region ID] Incorrect Region ID, please refer to the S3 service provider's documentation to configure the Region ID", "255": "The target site has enabled hotlink protection, so it is not possible to download [%d] resources", - "256": "The specified path [%s] has a parent workspace path [%s]" + "256": "The specified path [%s] has a parent workspace path [%s]", + "257": "Remember me for 30 days" } } diff --git a/app/stage/auth.html b/app/stage/auth.html index d653825ab..a286a4ec7 100644 --- a/app/stage/auth.html +++ b/app/stage/auth.html @@ -184,6 +184,10 @@ +
+ + +
{{.l2}} @@ -475,6 +479,7 @@ const submitAuth = () => { const inputElement = document.getElementById('authCode') const captchaElement = document.getElementById('captcha') + const rememberMeElement = document.getElementById('rememberMe') let code = inputElement.value.trim(); if ("" === code) { showMessage({{.l9}}) @@ -489,6 +494,7 @@ body: JSON.stringify({ authCode: code, captcha: captchaElement.value, + rememberMe: rememberMeElement.checked }), }).then((response) => { return response.json() diff --git a/kernel/model/session.go b/kernel/model/session.go index fc8e8c64a..8b3ee4f55 100644 --- a/kernel/model/session.go +++ b/kernel/model/session.go @@ -31,6 +31,7 @@ import ( "github.com/gorilla/websocket" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/util" + ginSessions "github.com/gin-contrib/sessions" "github.com/steambap/captcha" ) @@ -121,6 +122,26 @@ func LoginAuth(c *gin.Context) { workspaceSession.AccessAuthCode = authCode util.WrongAuthCount = 0 workspaceSession.Captcha = gulu.Rand.String(7) + + // Handle remember me preference + if rememberMe, ok := arg["rememberMe"].(bool); ok && rememberMe { + // Set session cookie to expire in 30 days + ginSessions.Default(c).Options(ginSessions.Options{ + Path: "/", + Secure: util.SSL, + MaxAge: 30 * 24 * 60 * 60, // 30 days in seconds + HttpOnly: true, + }) + } else { + // Default session expiration (browser session) + ginSessions.Default(c).Options(ginSessions.Options{ + Path: "/", + Secure: util.SSL, + MaxAge: 0, // Session cookie + HttpOnly: true, + }) + } + logging.LogInfof("auth success [ip=%s]", util.GetRemoteAddr(c.Request)) if err := session.Save(c); err != nil { logging.LogErrorf("save session failed: " + err.Error()) diff --git a/kernel/server/serve.go b/kernel/server/serve.go index 2df02a117..dea0ed7fc 100644 --- a/kernel/server/serve.go +++ b/kernel/server/serve.go @@ -452,6 +452,7 @@ func serveAuthPage(c *gin.Context) { "l7": template.HTML(model.Conf.Language(184)), "l8": model.Conf.Language(95), "l9": model.Conf.Language(83), + "l10": model.Conf.Language(257), "appearanceMode": model.Conf.Appearance.Mode, "appearanceModeOS": model.Conf.Appearance.ModeOS, "workspace": util.WorkspaceName,