From 0b8e9807f079ae1c142b8c203c01d38f6b9253ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Fri, 6 Dec 2024 09:24:30 +0100 Subject: [PATCH] Use service to clean sessions --- .../sessions/clear_old_sessions_service.rb | 42 +++++++++++++++++++ app/workers/cron/clear_old_sessions_job.rb | 2 +- lib/tasks/database.rake | 8 +--- 3 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 app/services/sessions/clear_old_sessions_service.rb diff --git a/app/services/sessions/clear_old_sessions_service.rb b/app/services/sessions/clear_old_sessions_service.rb new file mode 100644 index 000000000000..fd3d5e57b757 --- /dev/null +++ b/app/services/sessions/clear_old_sessions_service.rb @@ -0,0 +1,42 @@ +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ +module Sessions + class ClearOldSessionsService + class << self + ## + # Drop all sessions for the given user + def call!(days_ago: 30) + # sessions expire after 30 days of inactivity by default + expiration_time = Date.today - days_ago.days + + sessions_table = ActiveRecord::SessionStore::Session.table_name + ActiveRecord::Base.connection.execute "DELETE FROM #{sessions_table} WHERE updated_at < '#{expiration_time}'" + end + end + end +end diff --git a/app/workers/cron/clear_old_sessions_job.rb b/app/workers/cron/clear_old_sessions_job.rb index 0398b3a8859c..088574463485 100644 --- a/app/workers/cron/clear_old_sessions_job.rb +++ b/app/workers/cron/clear_old_sessions_job.rb @@ -31,7 +31,7 @@ class ClearOldSessionsJob < ApplicationJob include ::RakeJob def perform - super("db:sessions:expire", 7) + Sessions::ClearOldSessionsService.call! end end end diff --git a/lib/tasks/database.rake b/lib/tasks/database.rake index 47de484b5bce..2562ea8bec92 100644 --- a/lib/tasks/database.rake +++ b/lib/tasks/database.rake @@ -29,12 +29,8 @@ namespace "db:sessions" do desc "Expire old sessions from the sessions table" task :expire, [:days_ago] => [:environment, "db:load_config"] do |_task, args| - # sessions expire after 30 days of inactivity by default - days_ago = Integer(args[:days_ago] || 30) - expiration_time = Date.today - days_ago.days - - sessions_table = ActiveRecord::SessionStore::Session.table_name - ActiveRecord::Base.connection.execute "DELETE FROM #{sessions_table} WHERE updated_at < '#{expiration_time}'" + days_ago = args.key?(:days_ago) ? args[:days_ago].to_i : 30 + Sessions::ClearOldSessionsService.call!(days_ago:) end end