🎨 Add a 'remember me' checkbox when logging in to save a session for 30 days (#14964)

This commit is contained in:
Tomer Shvueli 2025-06-04 03:35:31 -04:00 committed by GitHub
parent dae6158860
commit aa35dd827b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 30 additions and 1 deletions

View file

@ -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"
}
}

View file

@ -184,6 +184,10 @@
<img id="captchaImg" style="top: 1px;position: absolute;height: 26px;right: 1px;cursor: pointer">
<input id="captcha" class="b3-text-field" placeholder="{{.l3}}">
</div>
<div style="width: 240px; margin: 8px auto; text-align: left;">
<input type="checkbox" id="rememberMe" style="margin-right: 8px;">
<label for="rememberMe" style="color: var(--b3-theme-on-surface); font-size: 14px;">{{.l10}}</label>
</div>
<button class="b3-button" onclick="submitAuth()">{{.l1}}</button>
<div class="ft__on-surface">
{{.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()

View file

@ -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())

View file

@ -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,