diff --git a/lib/fog/azurerm/requests/storage/get_blob_http_url.rb b/lib/fog/azurerm/requests/storage/get_blob_http_url.rb index 051b12cf..5707f978 100644 --- a/lib/fog/azurerm/requests/storage/get_blob_http_url.rb +++ b/lib/fog/azurerm/requests/storage/get_blob_http_url.rb @@ -15,6 +15,7 @@ class Real # def get_blob_http_url(container_name, blob_name, expires) relative_path = "#{container_name}/#{blob_name}" + relative_path = remove_trailing_periods_from_path_segments(relative_path) params = { service: 'b', resource: 'b', diff --git a/lib/fog/azurerm/requests/storage/get_blob_https_url.rb b/lib/fog/azurerm/requests/storage/get_blob_https_url.rb index aa3f8dd0..dc2c7223 100644 --- a/lib/fog/azurerm/requests/storage/get_blob_https_url.rb +++ b/lib/fog/azurerm/requests/storage/get_blob_https_url.rb @@ -15,6 +15,7 @@ class Real # def get_blob_https_url(container_name, blob_name, expires) relative_path = "#{container_name}/#{blob_name}" + relative_path = remove_trailing_periods_from_path_segments(relative_path) params = { service: 'b', resource: 'b', diff --git a/lib/fog/azurerm/utilities/general.rb b/lib/fog/azurerm/utilities/general.rb index 1bfba245..b1fee245 100755 --- a/lib/fog/azurerm/utilities/general.rb +++ b/lib/fog/azurerm/utilities/general.rb @@ -189,3 +189,7 @@ def get_image_name(id) def get_subscription_id(id) id.split('/')[2] end + +def remove_trailing_periods_from_path_segments(path) + path.split('/').map { |segment| segment.gsub(/\.*$/, '') }.join('/') +end diff --git a/test/requests/storage/test_get_blob_http_url.rb b/test/requests/storage/test_get_blob_http_url.rb index a6666509..f2eb4b3a 100644 --- a/test/requests/storage/test_get_blob_http_url.rb +++ b/test/requests/storage/test_get_blob_http_url.rb @@ -24,6 +24,22 @@ def test_get_blob_http_url_success end end + def test_get_url_remove_trailing_periods_from_path_segments + mock_generate_uri = Minitest::Mock.new + mock_generate_service_token = Minitest::Mock.new + + mock_generate_uri.expect(:call, @url, ['.test0/..test1/...test2', {}, { encode: true }]) + mock_generate_service_token.expect(:call, @token) do |relative_path, _| + relative_path == '.test0/..test1/...test2' + end + + @blob_client.stub :generate_uri, mock_generate_uri do + @signature_client.stub :generate_service_sas_token, mock_generate_service_token do + assert_equal "#{@url}?#{@token}", @service.get_blob_http_url('.test0.', '..test1../...test2...', Time.now.utc + 3600) + end + end + end + def test_get_blob_http_url_mock assert_equal "#{@url}?#{@token}", @mock_service.get_blob_http_url('test_container', 'test_blob', Time.now.utc + 3600) end diff --git a/test/requests/storage/test_get_blob_https_url.rb b/test/requests/storage/test_get_blob_https_url.rb index c16c8c39..d610d907 100644 --- a/test/requests/storage/test_get_blob_https_url.rb +++ b/test/requests/storage/test_get_blob_https_url.rb @@ -31,6 +31,25 @@ def test_get_blob_https_url_success end end + def test_get_url_remove_trailing_periods_from_path_segments + mock_generate_uri = Minitest::Mock.new + mock_generate_service_token = Minitest::Mock.new + + 2.times do + mock_generate_uri.expect(:call, @url, ['.test0/..test1/...test2', {}, { encode: true }]) + mock_generate_service_token.expect(:call, @token) do |relative_path, _| + relative_path == '.test0/..test1/...test2' + end + end + + @blob_client.stub :generate_uri, mock_generate_uri do + @signature_client.stub :generate_service_sas_token, mock_generate_service_token do + assert_equal "#{@url}?#{@token}", @service.get_blob_https_url('.test0.', '..test1../...test2...', Time.now.utc + 3600) + assert_equal "#{@url}?#{@token}", @service.get_object_url('.test0.', '..test1../...test2...', Time.now.utc + 3600) + end + end + end + def test_get_blob_https_url_with_domain_success service = Fog::Storage::AzureRM.new(storage_account_credentials_with_domain) blob_client = service.instance_variable_get(:@blob_client)