diff --git a/app/services/active_storage_key_converter.rb b/app/services/active_storage_key_converter.rb new file mode 100644 index 0000000000000000000000000000000000000000..1e5c643e328cc54510e92b9371cac0dfd84b42d8 --- /dev/null +++ b/app/services/active_storage_key_converter.rb @@ -0,0 +1,19 @@ +class ActiveStorageKeyConverter + def self.convert(legacy_signed_id) + # Try to find blob with the un-modified legacy_signed_id + blob = ActiveStorage::Blob.find_signed!(legacy_signed_id) + legacy_signed_id + rescue ActiveSupport::MessageVerifier::InvalidSignature + # + key_generator = ActiveSupport::KeyGenerator.new( + Rails.application.secrets.secret_key_base, + iterations: 1000, + hash_digest_class: OpenSSL::Digest::SHA1 + ) + key_generator = ActiveSupport::CachingKeyGenerator.new(key_generator) + secret = key_generator.generate_key("ActiveStorage") + verifier = ActiveSupport::MessageVerifier.new(secret) + + ActiveStorage::Blob.find_by_id(verifier.verify(legacy_signed_id, purpose: :blob_id)).try(:signed_id) + end +end diff --git a/app/services/blocks_migration.rb b/app/services/blocks_migration.rb new file mode 100644 index 0000000000000000000000000000000000000000..95dfcf0327d181c8d9dbcb35dcba66c8bb0d1eb4 --- /dev/null +++ b/app/services/blocks_migration.rb @@ -0,0 +1,30 @@ +class BlocksMigration + + def self.cleanup + Communication::Block.all.find_each { |block| + self.crawl(block.data) + block.save + } + end + + protected + + def self.crawl(enumerable) + case enumerable + when Array + enumerable.each do |item| + crawl(item) if [Array, Hash].include?(item.class) + end + when Hash + enumerable.keys.each do |key| + if key == "signed_id" + # Convert value + enumerable[key] = ActiveStorageKeyConverter.convert(enumerable[key]) if key == "signed_id" + elsif [Array, Hash].include?(enumerable[key].class) + crawl(enumerable[key]) + end + end + end + end + +end \ No newline at end of file diff --git a/lib/tasks/app.rake b/lib/tasks/app.rake index edf86d1e73499af97aa4098b02e33df99b1db7b2..b3c536e31ffdf2f80760ee58f2370825ac6b8fef 100644 --- a/lib/tasks/app.rake +++ b/lib/tasks/app.rake @@ -8,6 +8,7 @@ namespace :app do desc 'Fix things' task fix: :environment do + BlocksMigration.cleanup end namespace :websites do