bffaa888ac
By default, these classes use Marshal for serializing and deserializing messages. Unfortunately, the Marshal format is closely associated with Ruby internals and even changes between different interpreters. This makes the resulting message very hard to impossible to unserialize messages generated by these classes in other environments like node.js. This patch solves this by allowing you to set your own custom serializer and deserializer lambda functions. By default, it still uses Marshal to be backwards compatible.
66 lines
2.0 KiB
Ruby
66 lines
2.0 KiB
Ruby
require 'abstract_unit'
|
|
|
|
begin
|
|
require 'openssl'
|
|
OpenSSL::Digest::SHA1
|
|
rescue LoadError, NameError
|
|
$stderr.puts "Skipping MessageEncryptor test: broken OpenSSL install"
|
|
else
|
|
|
|
require 'active_support/time'
|
|
require 'active_support/json'
|
|
|
|
class MessageEncryptorTest < Test::Unit::TestCase
|
|
def setup
|
|
@encryptor = ActiveSupport::MessageEncryptor.new(SecureRandom.hex(64))
|
|
@data = { :some => "data", :now => Time.local(2010) }
|
|
end
|
|
|
|
def test_simple_round_tripping
|
|
message = @encryptor.encrypt(@data)
|
|
assert_equal @data, @encryptor.decrypt(message)
|
|
end
|
|
|
|
def test_encrypting_twice_yields_differing_cipher_text
|
|
first_messqage = @encryptor.encrypt(@data)
|
|
second_message = @encryptor.encrypt(@data)
|
|
assert_not_equal first_messqage, second_message
|
|
end
|
|
|
|
def test_messing_with_either_value_causes_failure
|
|
text, iv = @encryptor.encrypt(@data).split("--")
|
|
assert_not_decrypted([iv, text] * "--")
|
|
assert_not_decrypted([text, munge(iv)] * "--")
|
|
assert_not_decrypted([munge(text), iv] * "--")
|
|
assert_not_decrypted([munge(text), munge(iv)] * "--")
|
|
end
|
|
|
|
def test_signed_round_tripping
|
|
message = @encryptor.encrypt_and_sign(@data)
|
|
assert_equal @data, @encryptor.decrypt_and_verify(message)
|
|
end
|
|
|
|
def test_alternative_serialization_method
|
|
@encryptor.serializer = lambda { |value| ActiveSupport::JSON.encode(value) }
|
|
@encryptor.deserializer = lambda { |value| ActiveSupport::JSON.decode(value) }
|
|
|
|
message = @encryptor.encrypt_and_sign({ :foo => 123, 'bar' => Time.local(2010) })
|
|
assert_equal @encryptor.decrypt_and_verify(message), { "foo" => 123, "bar" => "2010-01-01T00:00:00-05:00" }
|
|
end
|
|
|
|
private
|
|
def assert_not_decrypted(value)
|
|
assert_raise(ActiveSupport::MessageEncryptor::InvalidMessage) do
|
|
@encryptor.decrypt(value)
|
|
end
|
|
end
|
|
|
|
def munge(base64_string)
|
|
bits = ActiveSupport::Base64.decode64(base64_string)
|
|
bits.reverse!
|
|
ActiveSupport::Base64.encode64s(bits)
|
|
end
|
|
end
|
|
|
|
end
|