Merge branch 'origin/main' into session-management

Conflict resolutions:
- models/migrations/v1_26/v328.go: kept origin/main's TokenPermissions
  migration; moved AddUserSessionTable to v1_27/v332.go (1.26.0 closed
  at migration 330; 1.27 starts at 331).
- models/migrations/migrations.go: registered session migration as 332
  using v1_27.AddUserSessionTable.
- tests/integration/api_admin_test.go: adopted new DecodeJSON return
  style; cron count is 30 (added cleanup_user_sessions task).

Co-Authored-By: Claude (Opus 4.7) <noreply@anthropic.com>
This commit is contained in:
silverwind
2026-05-08 08:48:32 +02:00
co-authored by Claude
1841 changed files with 83555 additions and 29241 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin edit user")}}
{{template "admin/layout_head" (dict "pageClass" "admin edit user")}}
<div class="admin-setting-content">
<h4 class="ui top attached header">
{{ctx.Locale.Tr "admin.users.edit_account"}}
+1 -1
View File
@@ -1,4 +1,4 @@
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin user")}}
{{template "admin/layout_head" (dict "pageClass" "admin user")}}
<div class="admin-setting-content">
<h4 class="ui top attached header">
{{ctx.Locale.Tr "admin.users.user_manage_panel"}} ({{ctx.Locale.Tr "admin.total" .Total}})
+1 -1
View File
@@ -1,4 +1,4 @@
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin new user")}}
{{template "admin/layout_head" (dict "pageClass" "admin new user")}}
<div class="admin-setting-content">
<h4 class="ui top attached header">
{{ctx.Locale.Tr "admin.users.new_account"}}
+1 -1
View File
@@ -1,4 +1,4 @@
{{template "admin/layout_head" (dict "ctxData" . "pageClass" "admin view user")}}
{{template "admin/layout_head" (dict "pageClass" "admin view user")}}
<div class="admin-setting-content">
<div class="admin-responsive-columns">
+14 -14
View File
@@ -1,10 +1,10 @@
<div class="flex-list">
<div class="flex-item">
<div class="flex-item-leading">
<div class="flex-divided-list items-with-main">
<div class="item">
<div class="item-leading">
{{ctx.AvatarUtils.Avatar .User 48}}
</div>
<div class="flex-item-main">
<div class="flex-item-title">
<div class="item-main">
<div class="item-title">
{{template "shared/user/name" .User}}
{{if .User.IsAdmin}}
<span class="ui basic label">{{ctx.Locale.Tr "admin.users.admin"}}</span>
@@ -13,34 +13,34 @@
<span class="ui basic label">{{ctx.Locale.Tr "admin.users.bot"}}</span>
{{end}}
</div>
<div class="flex-item-body">
<div class="item-body">
<b>{{ctx.Locale.Tr "admin.users.auth_source"}}:</b>
{{Iif (eq .LoginSource.ID 0) (ctx.Locale.Tr "admin.users.local") .LoginSource.Name}}
</div>
<div class="flex-item-body">
<div class="item-body">
<b>{{ctx.Locale.Tr "admin.users.activated"}}:</b>
{{svg (Iif .User.IsActive "octicon-check" "octicon-x")}}
</div>
<div class="flex-item-body">
<div class="item-body">
<b>{{ctx.Locale.Tr "admin.users.prohibit_login"}}:</b>
{{svg (Iif .User.ProhibitLogin "octicon-check" "octicon-x")}}
</div>
<div class="flex-item-body">
<div class="item-body">
<b>{{ctx.Locale.Tr "admin.users.restricted"}}:</b>
{{svg (Iif .User.IsRestricted "octicon-check" "octicon-x")}}
</div>
<div class="flex-item-body">
<div class="item-body">
<b>{{ctx.Locale.Tr "settings.visibility"}}:</b>
{{if .User.Visibility.IsPublic}}{{ctx.Locale.Tr "settings.visibility.public"}}{{end}}
{{if .User.Visibility.IsLimited}}{{ctx.Locale.Tr "settings.visibility.limited"}}{{end}}
{{if .User.Visibility.IsPrivate}}{{ctx.Locale.Tr "settings.visibility.private"}}{{end}}
</div>
<div class="flex-item-body">
<div class="item-body">
<b>{{ctx.Locale.Tr "admin.users.2fa"}}:</b>
{{svg (Iif .TwoFactorEnabled "octicon-check" "octicon-x")}}
</div>
{{if .User.Language}}
<div class="flex-item-body">
<div class="item-body">
<span class="flex-text-inline">
<b>{{ctx.Locale.Tr "settings.language"}}:</b>
{{range .AllLangs}}{{if eq $.User.Language .Lang}}{{.Name}}{{end}}{{end}}
@@ -48,12 +48,12 @@
</div>
{{end}}
{{if .User.Location}}
<div class="flex-item-body">
<div class="item-body">
<span class="flex-text-inline">{{svg "octicon-location"}}{{.User.Location}}</span>
</div>
{{end}}
{{if .User.Website}}
<div class="flex-item-body">
<div class="item-body">
<span class="flex-text-inline">
{{svg "octicon-link"}}
<a target="_blank" href="{{.User.Website}}">{{.User.Website}}</a>
+3 -3
View File
@@ -1,7 +1,7 @@
<div class="flex-list">
<div class="flex-divided-list items-with-main">
{{range .Emails}}
<div class="flex-item">
<div class="flex-item-main">
<div class="item">
<div class="item-main">
<div class="flex-text-block">
<a href="mailto:{{.Email}}">{{.Email}}</a>
{{if .IsPrimary}}