# frozen_string_literal: true require_relative 'spec_helper' module Aws module CloudFront describe UrlSigner do let(:options) { { :key_pair_id => 'CF_KEYPAIR_ID', :private_key_path =>"#{File.dirname(__FILE__)}/unit_test_dummy_key" } } let(:signer) { Aws::CloudFront::UrlSigner.new(options) } let(:expires) { 1357034400 } # January 1, 2013 10:00 am UTC (Unix timestamp) describe '#initialize' do it 'requires key pair id' do expect { Aws::CloudFront::UrlSigner.new( :private_key_path =>"#{File.dirname(__FILE__)}/unit_test_dummy_key" ) }.to raise_error(ArgumentError) end it 'requires either private key or its path' do expect { Aws::CloudFront::UrlSigner.new( :key_pair_id => 'CF_KEYPAIR_ID' ) }.to raise_error(ArgumentError) end end describe '#signed_url' do it 'raises error if url is invalid' do expect { signer.signed_url('what_ever_illegal/url') }.to raise_error(ArgumentError) end it 'can generate signed urls with custom policy' do policy = { 'Statement' => [ 'Resource' => 'images/image.jpg', 'Condition' => { 'IpAddress' => { 'AWS:SourceIp' => '10.52.176.0/24' }, 'DateLessThan' => { 'AWS:EpochTime' => expires } } ] } url = signer.signed_url( 'http://abc.cloudfront.net/images/image.jpg', :policy => policy.to_json ) expected_url = 'http://abc.cloudfront.net/images/image.jpg?'\ 'Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaW1hZ2VzL2l'\ 'tYWdlLmpwZyIsIkNvbmRpdGlvbiI6eyJJcEFkZHJlc3MiOnsiQVdTO'\ 'lNvdXJjZUlwIjoiMTAuNTIuMTc2LjAvMjQifSwiRGF0ZUxlc3NUaGF'\ 'uIjp7IkFXUzpFcG9jaFRpbWUiOjEzNTcwMzQ0MDB9fX1dfQ__'\ '&Signature=n4V7xum3wA-w1PaCMyEMpWVXdfw-Yt8I26RpZJKc~Nk'\ '8yQh8LYOxewItGJXFq0BxnKuSEKoEVYVTFEteFAGKXwhkbC7K~JfL8'\ '3aroPbRagjyG-V9Y5wMLccBAzMj5nHXxjvjlOu541VUR-RlR0KK106'\ 'HT4-Hp1c~nyOmXs4R5mU_&Key-Pair-Id=CF_KEYPAIR_ID' expect(url).to eq(expected_url) end it 'can generate signed urls with canned policy' do url = signer.signed_url( 'https://abc.cloudfront.net/images/image.jpg?color=red', :expires => expires ) expected_url = 'https://abc.cloudfront.net/images/image.jpg?'\ 'color=red&Expires=1357034400&Signature=GvrDx3aAG1u1sAQF'\ '68c~xD6LVORt36mRTvC2u5RwLjsvusXI0sJPxy3D0R8AQp4qFZlRehw'\ 'h~mablw8DBNRFLQ81mazmbrUOhXbuepav5ZmCU-KgOmXtpMS49L7TLG'\ 'USfwSksDx1qriAtB4mS4iJaNt2mfo0C5G-vlt9qMftkJg_'\ '&Key-Pair-Id=CF_KEYPAIR_ID' expect(url).to eq(expected_url) end it 'can generate signed rtmp urls' do url = signer.signed_url( 'rtmp://example-distribution.cloudfront.net/videos/example.mp4', :expires => expires ) expected_url = 'videos/example.mp4?Expires=1357034400'\ '&Signature=TMXSGAw6x4fJsUfmBzJGbR2HYPduVFTPtqmoVQeZOEO'\ 'Bs1NbQ6sARJoIMb9ot4CYyY95nNy8pzuuOkOm4DTsbda30a-8BrKx7'\ 'loGHRb1AZztMkC1u-joz-3B9EgBRH6t6qpAFKtWoZI42F5LSacCb6O'\ 'cTVsiWVeKyCGT~8i81-4_&Key-Pair-Id=CF_KEYPAIR_ID' expect(url).to eq(expected_url) end it 'can handle urls with url-like paths' do url = signer.signed_url( 'https://abc.cloudfront.net/images/from/s3://bucket/file.jpg', :expires => expires ) expected_url = 'https://abc.cloudfront.net/images/from/s3://bucket/file.jpg?'\ 'Expires=1357034400&Signature=Xk0prcC1fjhyROJOIr~x0KUuc-wEOQ~'\ 'v0zHwQ1GjPZH2rJPDIbjwNcvK8NIwyuQSk4PxmpaI1oVV8t62tuMPiQ8NuP2'\ 'LM6y-XWFPUkegRVVRC~~HKxvPUghef4iWS~zwIbn4bDpXjqjtA9nnyIlasau'\ 'Qypl7Zqm94g48YKTL2U0_&Key-Pair-Id=CF_KEYPAIR_ID' expect(url).to eq(expected_url) end end end end end