diff --git a/lib/active_record/session_store/session.rb b/lib/active_record/session_store/session.rb index aec3253..c9a1cf2 100644 --- a/lib/active_record/session_store/session.rb +++ b/lib/active_record/session_store/session.rb @@ -88,7 +88,9 @@ def secure! # is already private, nothing to do else session_id_object = Rack::Session::SessionId.new(raw_session_id) - update_column(session_id_column, session_id_object.private_id) + logger.silence do + update_column(session_id_column, session_id_object.private_id) + end end end @@ -112,6 +114,16 @@ def raise_on_session_data_overflow! raise ActionController::SessionOverflowError end end + + module NilLogger + def self.silence + yield + end + end + + def logger + ActiveRecord::Base.logger || NilLogger + end end end end diff --git a/lib/tasks/database.rake b/lib/tasks/database.rake index 377a0b6..2f6c797 100644 --- a/lib/tasks/database.rake +++ b/lib/tasks/database.rake @@ -21,6 +21,20 @@ namespace 'db:sessions' do desc "Upgrade current sessions in the database to the secure version" task :upgrade => [:environment, 'db:load_config'] do - ActionDispatch::Session::ActiveRecordStore.session_class.find_each(&:secure!) + logger.silence do + ActionDispatch::Session::ActiveRecordStore.session_class.find_each(&:secure!) + end + end + + private + + module NilLogger + def self.silence + yield + end + end + + def logger + ActiveRecord::Base.logger || NilLogger end end diff --git a/test/logger_silencer_test.rb b/test/logger_silencer_test.rb index 8462fbb..4782d9d 100644 --- a/test/logger_silencer_test.rb +++ b/test/logger_silencer_test.rb @@ -44,6 +44,14 @@ def test_log_silencer_with_logger_not_raise_exception end end + def test_secure_does_not_log_update_sql + with_fake_logger do + create_old_session! + ActiveRecord::SessionStore::Session.find_each(&:secure!) + assert_no_match(/UPDATE/, fake_logger.string) + end + end + private def with_logger(logger) @@ -61,4 +69,12 @@ def with_fake_logger(&block) def fake_logger @fake_logger ||= StringIO.new end + + def create_old_session! + session = ActionDispatch::Session::ActiveRecordStore.session_class.new( + session_id: "original_session_id", + data: "data" + ) + session.save + end end diff --git a/test/tasks/database_rake_test.rb b/test/tasks/database_rake_test.rb index 85fd7be..21bad85 100644 --- a/test/tasks/database_rake_test.rb +++ b/test/tasks/database_rake_test.rb @@ -23,6 +23,7 @@ def setup Session.reset_column_information Rake.application.rake_require "tasks/database" + Rake::Task.tasks.each(&:reenable) Rake::Task.define_task(:environment) Rake::Task.define_task("db:load_config") end diff --git a/test/tasks/logger_silencer_test.rb b/test/tasks/logger_silencer_test.rb new file mode 100644 index 0000000..1d02b85 --- /dev/null +++ b/test/tasks/logger_silencer_test.rb @@ -0,0 +1,54 @@ +require 'helper' +require 'rake' +require 'stringio' + +module ActiveRecord + module SessionStore + class LoggerSilencerTest < ActiveSupport::TestCase + def setup + Session.drop_table! if Session.table_exists? + Session.create_table! + + Rake.application.rake_require 'tasks/database' + Rake::Task.tasks.each(&:reenable) + Rake::Task.define_task(:environment) + Rake::Task.define_task('db:load_config') + end + + def teardown + Session.drop_table! if Session.table_exists? + Session.connection.schema_cache.clear! + Session.reset_column_information + end + + def test_upgrade_task_does_not_log_sql + Session.create!(session_id: 'original_session_id', data: 'data') + + with_fake_logger do + Rake.application.invoke_task 'db:sessions:upgrade' + + assert_no_match(/SELECT/, fake_logger.string) + assert_no_match(/UPDATE/, fake_logger.string) + end + end + + private + + def with_logger(logger) + original_logger = ActiveRecord::Base.logger + ActiveRecord::Base.logger = logger + yield + ensure + ActiveRecord::Base.logger = original_logger + end + + def with_fake_logger(&block) + with_logger(ActiveSupport::Logger.new(fake_logger), &block) + end + + def fake_logger + @fake_logger ||= StringIO.new + end + end + end +end