Make sure the message format doesn't change

When `use_message_serializer_for_metadata` is false, the message
format should be enveloped in the same way it was in Rails 7.0
to make sure we don't have inconsistent formats.
This commit is contained in:
Rafael Mendonça França 2023-09-01 23:03:24 +00:00
parent ed873f1389
commit fea9ad3337
No known key found for this signature in database
GPG Key ID: FC23B6D0F1EEE948
2 changed files with 22 additions and 1 deletions

@ -32,7 +32,7 @@ def serialize_with_metadata(data, **metadata)
if has_metadata && !use_message_serializer_for_metadata?
data_string = serialize_to_json_safe_string(data)
envelope = wrap_in_metadata_envelope({ "message" => data_string }, **metadata)
envelope = wrap_in_metadata_legacy_envelope({ "message" => data_string }, **metadata)
serialize_to_json(envelope)
else
data = wrap_in_metadata_envelope({ "data" => data }, **metadata) if has_metadata
@ -68,6 +68,13 @@ def wrap_in_metadata_envelope(hash, expires_at: nil, expires_in: nil, purpose: n
{ "_rails" => hash }
end
def wrap_in_metadata_legacy_envelope(hash, expires_at: nil, expires_in: nil, purpose: nil)
expiry = pick_expiry(expires_at, expires_in)
hash["exp"] = expiry
hash["pur"] = purpose
{ "_rails" => hash }
end
def extract_from_metadata_envelope(envelope, purpose: nil)
hash = envelope["_rails"]

@ -86,6 +86,20 @@ class MessageVerifierMetadataTest < ActiveSupport::TestCase
end
end
test "messages keep the old format when use_message_serializer_for_metadata is false" do
# Message generated by Rails 7.0 using:
#
# verifier = ActiveSupport::MessageVerifier.new("secret", serializer: JSON)
# legacy_message = verifier.generate("legacy", purpose: "test")
legacy_message = "eyJfcmFpbHMiOnsibWVzc2FnZSI6IklteGxaMkZqZVNJPSIsImV4cCI6bnVsbCwicHVyIjoidGVzdCJ9fQ==--53b1fc02f5b89b2da8c6ce94efa95f5cb656d975"
verifier = ActiveSupport::MessageVerifier.new("secret", serializer: JSON)
using_message_serializer_for_metadata(false) do
assert_equal legacy_message, verifier.generate("legacy", purpose: "test")
end
end
private
def make_codec(**options)
ActiveSupport::MessageVerifier.new("secret", **options)