Skip to content

Commit 62b33b8

Browse files
committed
Fix on_rotation for find_signed! & find_signed
1 parent 5a630d6 commit 62b33b8

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

activerecord/lib/active_record/signed_id.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ module ClassMethods
5252
def find_signed(signed_id, purpose: nil, on_rotation: nil)
5353
raise UnknownPrimaryKey.new(self) if primary_key.nil?
5454

55-
if id = signed_id_verifier.verified(signed_id, purpose: combine_signed_id_purposes(purpose), on_rotation: on_rotation)
55+
options = { on_rotation: on_rotation }.compact
56+
if id = signed_id_verifier.verified(signed_id, purpose: combine_signed_id_purposes(purpose), **options)
5657
find_by primary_key => id
5758
end
5859
end
@@ -70,7 +71,8 @@ def find_signed(signed_id, purpose: nil, on_rotation: nil)
7071
# User.first.destroy
7172
# User.find_signed! signed_id # => ActiveRecord::RecordNotFound
7273
def find_signed!(signed_id, purpose: nil, on_rotation: nil)
73-
if id = signed_id_verifier.verify(signed_id, purpose: combine_signed_id_purposes(purpose), on_rotation: on_rotation)
74+
options = { on_rotation: on_rotation }.compact
75+
if id = signed_id_verifier.verify(signed_id, purpose: combine_signed_id_purposes(purpose), **options)
7476
find(id)
7577
end
7678
end

activerecord/test/cases/signed_id_test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,20 @@ def set_signed_id
192192
Account.signed_id_verifier = old_verifier
193193
end
194194

195+
test "on_rotation callback using custom verifier" do
196+
old_verifier = Account.signed_id_verifier
197+
198+
Account.signed_id_verifier = ActiveSupport::MessageVerifier.new("old secret")
199+
old_account_signed_id = @account.signed_id
200+
on_rotation_is_called = false
201+
Account.signed_id_verifier = ActiveSupport::MessageVerifier.new("new secret", on_rotation: -> { on_rotation_is_called = true })
202+
Account.signed_id_verifier.rotate("old secret")
203+
Account.find_signed(old_account_signed_id)
204+
assert on_rotation_is_called
205+
ensure
206+
Account.signed_id_verifier = old_verifier
207+
end
208+
195209
test "on_rotation callback using find_signed & find_signed!" do
196210
old_verifier = Account.signed_id_verifier
197211

0 commit comments

Comments
 (0)