diff --git a/models/auth/user_session.go b/models/auth/user_session.go index 14586760d8..475c812322 100644 --- a/models/auth/user_session.go +++ b/models/auth/user_session.go @@ -6,6 +6,7 @@ package auth import ( "context" "fmt" + "time" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/timeutil" @@ -117,12 +118,12 @@ func UpdateSessionActivity(ctx context.Context, sessionID, currentIP string) err // CleanupExpiredUserSessions removes old session records based on retention policy. // It deletes: -// - Sessions that were logged out more than retentionSeconds ago -// - Abandoned sessions (never logged out) whose last activity is older than maxLifetime + retentionSeconds -func CleanupExpiredUserSessions(ctx context.Context, retentionSeconds, maxLifetime int64) error { +// - Sessions that were logged out more than retention ago +// - Abandoned sessions (never logged out) whose last activity is older than maxLifetime + retention +func CleanupExpiredUserSessions(ctx context.Context, retention, maxLifetime time.Duration) error { now := int64(timeutil.TimeStampNow()) - logoutCutoff := now - retentionSeconds - abandonedCutoff := now - maxLifetime - retentionSeconds + logoutCutoff := now - int64(retention.Seconds()) + abandonedCutoff := now - int64(maxLifetime.Seconds()) - int64(retention.Seconds()) _, err := db.GetEngine(ctx).Where( builder.Or( diff --git a/models/auth/user_session_test.go b/models/auth/user_session_test.go index ba8b648981..755e381cdc 100644 --- a/models/auth/user_session_test.go +++ b/models/auth/user_session_test.go @@ -5,6 +5,7 @@ package auth_test import ( "testing" + "time" auth_model "code.gitea.io/gitea/models/auth" "code.gitea.io/gitea/models/db" @@ -190,9 +191,9 @@ func TestCleanupExpiredUserSessions(t *testing.T) { }) require.NoError(t, err) - retentionSeconds := int64(86400 * 30) // 30 days - maxLifetime := int64(86400) // 1 day - require.NoError(t, auth_model.CleanupExpiredUserSessions(t.Context(), retentionSeconds, maxLifetime)) + retention := 30 * 24 * time.Hour // 30 days + maxLifetime := 24 * time.Hour // 1 day + require.NoError(t, auth_model.CleanupExpiredUserSessions(t.Context(), retention, maxLifetime)) // Active session should still exist _, err = auth_model.GetUserSessionByID(t.Context(), "sess-cleanup-active") @@ -207,10 +208,10 @@ func TestCleanupExpiredUserSessionsAbandoned(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) now := timeutil.TimeStampNow() - retentionSeconds := int64(86400 * 30) // 30 days - maxLifetime := int64(86400) // 1 day + retention := 30 * 24 * time.Hour // 30 days + maxLifetime := 24 * time.Hour // 1 day - cutoff := int64(now) - maxLifetime - retentionSeconds + cutoff := int64(now) - int64(maxLifetime.Seconds()) - int64(retention.Seconds()) // Abandoned session clearly older than cutoff — should be cleaned up. _, err := db.GetEngine(t.Context()).Insert(&auth_model.UserSession{ @@ -239,7 +240,7 @@ func TestCleanupExpiredUserSessionsAbandoned(t *testing.T) { }) require.NoError(t, err) - require.NoError(t, auth_model.CleanupExpiredUserSessions(t.Context(), retentionSeconds, maxLifetime)) + require.NoError(t, auth_model.CleanupExpiredUserSessions(t.Context(), retention, maxLifetime)) // Clearly old abandoned session should be gone. _, err = auth_model.GetUserSessionByID(t.Context(), "sess-cleanup-abandoned-old") diff --git a/routers/web/admin/sessions.go b/routers/web/admin/sessions.go index 25ec206851..9d86729b89 100644 --- a/routers/web/admin/sessions.go +++ b/routers/web/admin/sessions.go @@ -43,7 +43,6 @@ func UserSessions(ctx *context.Context) { } ctx.Data["Sessions"] = sessions - ctx.Data["SessionsTotal"] = len(sessions) activeCount := 0 for _, s := range sessions { diff --git a/services/cron/tasks_extended.go b/services/cron/tasks_extended.go index 156ab4769a..eb63904d52 100644 --- a/services/cron/tasks_extended.go +++ b/services/cron/tasks_extended.go @@ -182,9 +182,8 @@ func registerCleanupUserSessions() { OlderThan: time.Hour * 24 * 30, // 30 day retention }, func(ctx context.Context, _ *user_model.User, config Config) error { olderThanConfig := config.(*OlderThanConfig) - retentionSeconds := int64(olderThanConfig.OlderThan.Seconds()) - maxLifetime := setting.SessionConfig.Maxlifetime - return auth_model.CleanupExpiredUserSessions(ctx, retentionSeconds, maxLifetime) + maxLifetime := time.Duration(setting.SessionConfig.Maxlifetime) * time.Second + return auth_model.CleanupExpiredUserSessions(ctx, olderThanConfig.OlderThan, maxLifetime) }) } diff --git a/templates/admin/user/sessions.tmpl b/templates/admin/user/sessions.tmpl index 225dd47772..2755c1f0fd 100644 --- a/templates/admin/user/sessions.tmpl +++ b/templates/admin/user/sessions.tmpl @@ -2,7 +2,7 @@

- {{ctx.Locale.Tr "settings.sessions"}} — {{.User.Name}} ({{ctx.Locale.Tr "admin.total" .SessionsTotal}}) + {{ctx.Locale.Tr "settings.sessions"}} — {{.User.Name}} ({{ctx.Locale.Tr "admin.total" (len .Sessions)}})