6ddefe7cad
If the EncryptColumns background migration runs in a sidekiq with a stale view of the database schema, or when the purported destination columns don't actually exist, data loss can result. Attempt to work around these issues by reloading schema information before running the migration, and raising errors if the model reports that any of its source or destination columns are missing.
41 lines
1.8 KiB
Ruby
41 lines
1.8 KiB
Ruby
module AttrEncrypted
|
|
module Adapters
|
|
module ActiveRecord
|
|
module GitlabMonkeyPatches
|
|
# Prevent attr_encrypted from defining virtual accessors for encryption
|
|
# data when the code and schema are out of sync. See this issue for more
|
|
# details: https://github.com/attr-encrypted/attr_encrypted/issues/332
|
|
def attribute_instance_methods_as_symbols_available?
|
|
false
|
|
end
|
|
|
|
# Prevent attr_encrypted from checking out a database connection
|
|
# indefinitely. The result of this method is only used when the former
|
|
# is true, but it is called unconditionally, so there is still value to
|
|
# ensuring the connection is released
|
|
def attribute_instance_methods_as_symbols
|
|
# Use with_connection so the connection doesn't stay pinned to the thread.
|
|
connected = ::ActiveRecord::Base.connection_pool.with_connection(&:active?) rescue false
|
|
|
|
if connected
|
|
# Call version from AttrEncrypted::Adapters::ActiveRecord
|
|
super
|
|
else
|
|
# Call version from AttrEncrypted, i.e., `super` with regards to AttrEncrypted::Adapters::ActiveRecord
|
|
AttrEncrypted.instance_method(:attribute_instance_methods_as_symbols).bind(self).call
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# As of v3.1.0, the attr_encrypted gem defines the AttrEncrypted and
|
|
# AttrEncrypted::Adapters::ActiveRecord modules, and uses "extend" to mix them
|
|
# into the ActiveRecord::Base class. This intervention overrides utility methods
|
|
# defined by attr_encrypted to fix two bugs, as detailed above.
|
|
#
|
|
# The methods are used here: https://github.com/attr-encrypted/attr_encrypted/blob/3.1.0/lib/attr_encrypted.rb#L145-158
|
|
ActiveSupport.on_load(:active_record) do
|
|
extend AttrEncrypted::Adapters::ActiveRecord::GitlabMonkeyPatches
|
|
end
|