Skip to content

Commit 1dc5019

Browse files
Merge pull request rails#54873 from jonathanhefner/isolate-message-codec-rotations-on-dup
Isolate `AS::Message{Encryptor,Verifier}` rotations on `dup`
2 parents 65014e2 + 41f483f commit 1dc5019

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

activesupport/lib/active_support/messages/rotator.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ def read_message(message, on_rotation: @on_rotation, **options)
4545
end
4646
end
4747

48+
def initialize_dup(*)
49+
super
50+
@rotations = @rotations.dup
51+
end
52+
4853
private
4954
def build_rotation(*args, **options)
5055
self.class.new(*args, *@args.drop(args.length), **@options, **options)

activesupport/test/messages/message_rotator_tests.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,22 @@ def self.load(*); raise Class.new(StandardError); end
8181
assert_equal DATA, decode(old_message, codec, on_rotation: proc { called += "via method" })
8282
assert_equal "via method", called
8383
end
84+
85+
test "dup isolates rotations" do
86+
foo_codec = make_codec(secret("foo"))
87+
foo_message = encode(DATA, foo_codec)
88+
bar_codec = make_codec(secret("bar"))
89+
bar_message = encode(DATA, bar_codec)
90+
91+
foobar_codec = foo_codec.dup
92+
foobar_codec.rotate(secret("bar"))
93+
94+
assert_equal DATA, decode(foo_message, foobar_codec)
95+
assert_equal DATA, decode(bar_message, foobar_codec)
96+
97+
assert_equal DATA, decode(foo_message, foo_codec)
98+
assert_nil decode(bar_message, foo_codec)
99+
end
84100
end
85101

86102
private

0 commit comments

Comments
 (0)