diff --git a/fog.gemspec b/fog.gemspec index b89f5f397..cf9cf8ca1 100644 --- a/fog.gemspec +++ b/fog.gemspec @@ -274,6 +274,7 @@ Gem::Specification.new do |s| lib/fog/aws/requests/storage/put_bucket_logging.rb lib/fog/aws/requests/storage/put_bucket_versioning.rb lib/fog/aws/requests/storage/put_object.rb + lib/fog/aws/requests/storage/put_object_acl.rb lib/fog/aws/requests/storage/put_object_url.rb lib/fog/aws/requests/storage/put_request_payment.rb lib/fog/aws/requests/storage/upload_part.rb diff --git a/lib/fog/aws/requests/storage/put_object_acl.rb b/lib/fog/aws/requests/storage/put_object_acl.rb new file mode 100644 index 000000000..4fd1f043d --- /dev/null +++ b/lib/fog/aws/requests/storage/put_object_acl.rb @@ -0,0 +1,93 @@ +module Fog + module AWS + class Storage + class Real + + # Change access control list for an S3 object + # + # ==== Parameters + # * bucket_name<~String> - name of bucket to modify + # * object_name<~String> - name of object to get access control list for + # * acl<~Hash>: + # * Owner<~Hash>: + # * ID<~String>: id of owner + # * DisplayName<~String>: display name of owner + # * AccessControlList<~Array>: + # * Grantee<~Hash>: + # * 'DisplayName'<~String> - Display name of grantee + # * 'ID'<~String> - Id of grantee + # or + # * 'EmailAddress'<~String> - Email address of grantee + # or + # * 'URI'<~String> - URI of group to grant access for + # * Permission<~String> - Permission, in [FULL_CONTROL, WRITE, WRITE_ACP, READ, READ_ACP] + # * options<~Hash>: + # * 'versionId'<~String> - specify a particular version to retrieve + # + # ==== See Also + # http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectPUTacl.html + + def put_object_acl(bucket_name, object_name, acl, options = {}) + query = {'acl' => nil} + if version_id = options.delete('versionId') + query['versionId'] = version_id + end + + data = +<<-DATA + + + #{acl['Owner']['ID']} + #{acl['Owner']['DisplayName']} + + +DATA + + acl['AccessControlList'].each do |grant| + data << " " + type = case grant['Grantee'].keys.sort + when ['DisplayName', 'ID'] + 'CanonicalUser' + when ['EmailAddress'] + 'AmazonCustomerByEmail' + when ['URI'] + 'Group' + end + data << " " + for key, value in grant['Grantee'] + data << " <#{key}>#{value}" + end + data << " " + data << " #{grant['Permission']}" + data << " " + end + + data << +<<-DATA + + +DATA + + request({ + :body => data, + :expects => 200, + :headers => {}, + :host => "#{bucket_name}.#{@host}", + :method => 'PUT', + :path => CGI.escape(object_name), + :query => query + }) + end + + end + + class Mock # :nodoc:all + + def put_object_acl(bucket_name, object_name, options, acl) + Fog::Mock.not_implemented + end + + end + end + end +end diff --git a/lib/fog/aws/storage.rb b/lib/fog/aws/storage.rb index 11eb5cc95..7db767d24 100644 --- a/lib/fog/aws/storage.rb +++ b/lib/fog/aws/storage.rb @@ -38,6 +38,7 @@ module Fog request :put_bucket_logging request :put_bucket_versioning request :put_object + request :put_object_acl request :put_object_url request :put_request_payment request :upload_part diff --git a/tests/helper.rb b/tests/helper.rb index 95c460d94..e49d74a1f 100644 --- a/tests/helper.rb +++ b/tests/helper.rb @@ -1,13 +1,17 @@ +__DIR__ = File.dirname(__FILE__) +__LIB_DIR__ = File.join(__DIR__, '../lib') + +[ __DIR__, __LIB_DIR__ ].each do |directory| + $LOAD_PATH.unshift directory unless + $LOAD_PATH.include?(directory) || + $LOAD_PATH.include?(File.expand_path(directory)) +end + require 'fog' require 'fog/core/bin' + Fog.bin = true -__DIR__ = File.dirname(__FILE__) - -$LOAD_PATH.unshift __DIR__ unless - $LOAD_PATH.include?(__DIR__) || - $LOAD_PATH.include?(File.expand_path(__DIR__)) - require 'tests/helpers/collection_tests' require 'tests/helpers/model_tests'