From 0cf4ce11c85c419c849d6cac866e65636d2b9f0b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com>
Date: Fri, 6 Jan 2023 16:16:49 +0100
Subject: [PATCH] rescue the other one

---
 ...2654_migrate_to_rails7_sha256_signature.rb | 25 ++++++++-----
 db/schema.rb                                  |  2 +-
 docs/_rd/digest_upgrade.md                    | 37 +++++++++++--------
 3 files changed, 38 insertions(+), 26 deletions(-)

diff --git a/db/migrate/20230106132654_migrate_to_rails7_sha256_signature.rb b/db/migrate/20230106132654_migrate_to_rails7_sha256_signature.rb
index e71709a48..be9ae9c9b 100644
--- a/db/migrate/20230106132654_migrate_to_rails7_sha256_signature.rb
+++ b/db/migrate/20230106132654_migrate_to_rails7_sha256_signature.rb
@@ -32,17 +32,22 @@ class MigrateToRails7Sha256Signature < ActiveRecord::Migration[7.0]
       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)
+      begin
+        # Try to find blob with ID from SHA1-signed_id
+        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)
+        ActiveStorage::Blob.find_by_id(verifier.verify(legacy_signed_id, purpose: :blob_id)).try(:signed_id)
+      rescue ActiveSupport::MessageVerifier::InvalidSignature
+        # Blob not found (SHA1 and SHA256), corrupted blob ID, ignore
+        legacy_signed_id
+      end
     end
   end
 end
diff --git a/db/schema.rb b/db/schema.rb
index 5e200f19f..0afdf7c29 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema[7.0].define(version: 2023_01_06_094946) do
+ActiveRecord::Schema[7.0].define(version: 2023_01_06_132654) do
   # These are extensions that must be enabled in order to support this database
   enable_extension "pgcrypto"
   enable_extension "plpgsql"
diff --git a/docs/_rd/digest_upgrade.md b/docs/_rd/digest_upgrade.md
index 5548cd873..d4bbad530 100644
--- a/docs/_rd/digest_upgrade.md
+++ b/docs/_rd/digest_upgrade.md
@@ -19,21 +19,28 @@ Pour les fichiers médias, une mise à jour des sites web va actualiser sans pro
 ```ruby
 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)
+    begin
+      # 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
+      begin
+        # Try to find blob with ID from SHA1-signed_id
+        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)
+      rescue ActiveSupport::MessageVerifier::InvalidSignature
+        # Blob not found (SHA1 and SHA256), corrupted blob ID, ignore
+        legacy_signed_id
+      end
+    end
   end
 end
 ```
-- 
GitLab