aws-sdk 1.6.5 → 1.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,7 +11,7 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'builder'
14
+ require 'nokogiri'
15
15
  require 'uuidtools'
16
16
 
17
17
  module AWS
@@ -0,0 +1,109 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ class S3
16
+
17
+ # Manages tags for a single S3 {Bucket}.
18
+ #
19
+ # @example Setting a tag.
20
+ #
21
+ # bucket.tags['key'] = 'value'
22
+ #
23
+ # @exapmle Getting a tag.
24
+ #
25
+ # bucket.tags['key']
26
+ # #=> 'value'
27
+ #
28
+ # @example Getting all tags
29
+ #
30
+ # bucket.tags.to_h
31
+ # #=> { 'key' => 'value', ... }
32
+ #
33
+ # @example Removing all tags
34
+ #
35
+ # bucket.tags.clear
36
+ #
37
+ class BucketTagCollection
38
+
39
+ include Core::Model
40
+
41
+ # @param [Bucket] bucket
42
+ # @param [Hash] options
43
+ def initialize bucket, options = {}
44
+ @bucket = bucket
45
+ super
46
+ end
47
+
48
+ # @return [Bucket]
49
+ attr_reader :bucket
50
+
51
+ # @param [String] key
52
+ # @return [String,nil] Returns the tag for the given key. If there
53
+ # Returns +nil+ if the key does not exist.
54
+ def [] key
55
+ self.to_h[key]
56
+ end
57
+
58
+ # @param [String] key
59
+ # @param [String] value
60
+ def []= key, value
61
+ self.set(self.to_h.merge(key => value))
62
+ end
63
+
64
+ # @param [Hash<String,String>] tags A hash of tag keys and values.
65
+ # @return [nil]
66
+ def set tags
67
+ if tags.nil? or tags.empty?
68
+ self.clear
69
+ else
70
+ client.put_bucket_tagging(:bucket_name => bucket.name, :tags => tags)
71
+ end
72
+ nil
73
+ end
74
+
75
+ # Removes all tags from the bucket.
76
+ #
77
+ # bucket.tags.clear
78
+ # bucket.tags.to_h #=> {}
79
+ #
80
+ # @return [nil]
81
+ def clear
82
+ client.delete_bucket_tagging(:bucket_name => bucket.name)
83
+ nil
84
+ end
85
+
86
+ # @return [Hash]
87
+ def to_h
88
+ client.get_bucket_tagging(:bucket_name => bucket.name).data[:tags]
89
+ rescue AWS::S3::Errors::NoSuchTagSet
90
+ {}
91
+ end
92
+ alias_method :to_hash, :to_h
93
+
94
+ # @param [Hash] other
95
+ # @return [Boolean] Returns +true+ if the tags for this bucket match
96
+ # the passed hash.
97
+ def eql? other
98
+ self.to_h == other
99
+ end
100
+ alias_method :==, :eql?
101
+
102
+ # @private
103
+ def inspect
104
+ self.to_h.inspect
105
+ end
106
+
107
+ end
108
+ end
109
+ end
@@ -16,6 +16,7 @@ require 'pathname'
16
16
  require 'stringio'
17
17
  require 'json'
18
18
  require 'digest/md5'
19
+ require 'nokogiri'
19
20
 
20
21
  module AWS
21
22
  class S3
@@ -166,10 +167,9 @@ module AWS
166
167
 
167
168
  configure_request do |req, options|
168
169
  xml = options[:lifecycle_configuration]
169
- md5 = Base64.encode64(Digest::MD5.digest(xml)).strip
170
170
  req.add_param('lifecycle')
171
171
  req.body = xml
172
- req.headers['content-md5'] = md5
172
+ req.headers['content-md5'] = md5(xml)
173
173
  super(req, options)
174
174
  end
175
175
 
@@ -206,6 +206,166 @@ module AWS
206
206
 
207
207
  end
208
208
 
209
+ # @overload put_bucket_cors(options = {})
210
+ # @param [Hash] options
211
+ # @option options [required,String] :bucket_name
212
+ # @option options [required,Array<Hash>] :rules An array of rule hashes.
213
+ # * +:id+ - (String) A unique identifier for the rule. The ID
214
+ # value can be up to 255 characters long. The IDs help you find
215
+ # a rule in the configuration.
216
+ # * +:allowed_methods+ - (required,Array<String>) A list of HTTP
217
+ # methods that you want to allow the origin to execute.
218
+ # Each rule must identify at least one method.
219
+ # * +:allowed_origins+ - (required,Array<String>) A list of origins
220
+ # you want to allow cross-domain requests from. This can
221
+ # contain at most one * wild character.
222
+ # * +:allowed_headers+ - (Array<String>) A list of headers allowed
223
+ # in a pre-flight OPTIONS request via the
224
+ # Access-Control-Request-Headers header. Each header name
225
+ # specified in the Access-Control-Request-Headers header must
226
+ # have a corresponding entry in the rule.
227
+ # Amazon S3 will send only the allowed headers in a response
228
+ # that were requested. This can contain at most one * wild
229
+ # character.
230
+ # * +:max_age_seconds+ - (Integer) The time in seconds that your
231
+ # browser is to cache the preflight response for the specified
232
+ # resource.
233
+ # * +:expose_headers+ - (Array<String>) One or more headers in
234
+ # the response that you want customers to be able to access
235
+ # from their applications (for example, from a JavaScript
236
+ # XMLHttpRequest object).
237
+ # @return [Core::Response]
238
+ bucket_method(:put_bucket_cors, :put) do
239
+ configure_request do |req, options|
240
+
241
+ req.add_param('cors')
242
+
243
+ xml = Nokogiri::XML::Builder.new do |xml|
244
+ xml.CORSConfiguration do
245
+ options[:rules].each do |rule|
246
+ xml.CORSRule do
247
+
248
+ xml.ID(rule[:id]) if rule[:id]
249
+
250
+ (rule[:allowed_methods] || []).each do |method|
251
+ xml.AllowedMethod(method)
252
+ end
253
+
254
+ (rule[:allowed_origins] || []).each do |origin|
255
+ xml.AllowedOrigin(origin)
256
+ end
257
+
258
+ (rule[:allowed_headers] || []).each do |header|
259
+ xml.AllowedHeader(header)
260
+ end
261
+
262
+ xml.MaxAgeSeconds(rule[:max_age_seconds]) if
263
+ rule[:max_age_seconds]
264
+
265
+ (rule[:expose_headers] || []).each do |header|
266
+ xml.ExposeHeader(header)
267
+ end
268
+
269
+ end
270
+ end
271
+ end
272
+ end.doc.root.to_xml
273
+
274
+ req.body = xml
275
+ req.headers['content-md5'] = md5(xml)
276
+
277
+ super(req, options)
278
+
279
+ end
280
+ end
281
+
282
+ # @overload get_bucket_cors(options = {})
283
+ # @param [Hash] options
284
+ # @option options [required,String] :bucket_name
285
+ # @return [Core::Response]
286
+ bucket_method(:get_bucket_cors, :get) do
287
+
288
+ configure_request do |req, options|
289
+ req.add_param('cors')
290
+ super(req, options)
291
+ end
292
+
293
+ process_response do |resp|
294
+ resp.data = XML::GetBucketCors.parse(resp.http_response.body)
295
+ end
296
+
297
+ end
298
+
299
+ # @overload delete_bucket_cors(options = {})
300
+ # @param [Hash] options
301
+ # @option options [required,String] :bucket_name
302
+ # @return [Core::Response]
303
+ bucket_method(:delete_bucket_cors, :delete) do
304
+ configure_request do |req, options|
305
+ req.add_param('cors')
306
+ super(req, options)
307
+ end
308
+ end
309
+
310
+ # @overload put_bucket_tagging(options = {})
311
+ # @param [Hash] options
312
+ # @option options [required,String] :bucket_name
313
+ # @option options [Hash] :tags
314
+ # @return [Core::Response]
315
+ bucket_method(:put_bucket_tagging, :put) do
316
+ configure_request do |req, options|
317
+
318
+ req.add_param('tagging')
319
+
320
+ xml = Nokogiri::XML::Builder.new
321
+ xml.Tagging do |xml|
322
+ xml.TagSet do
323
+ options[:tags].each_pair do |key,value|
324
+ xml.Tag do
325
+ xml.Key(key)
326
+ xml.Value(value)
327
+ end
328
+ end
329
+ end
330
+ end
331
+
332
+ xml = xml.doc.root.to_xml
333
+ req.body = xml
334
+ req.headers['content-md5'] = md5(xml)
335
+
336
+ super(req, options)
337
+
338
+ end
339
+ end
340
+
341
+ # @overload get_bucket_tagging(options = {})
342
+ # @param [Hash] options
343
+ # @option options [required,String] :bucket_name
344
+ # @return [Core::Response]
345
+ bucket_method(:get_bucket_tagging, :get) do
346
+
347
+ configure_request do |req, options|
348
+ req.add_param('tagging')
349
+ super(req, options)
350
+ end
351
+
352
+ process_response do |resp|
353
+ resp.data = XML::GetBucketTagging.parse(resp.http_response.body)
354
+ end
355
+
356
+ end
357
+
358
+ # @overload delete_bucket_tagging(options = {})
359
+ # @param [Hash] options
360
+ # @option options [required,String] :bucket_name
361
+ # @return [Core::Response]
362
+ bucket_method(:delete_bucket_tagging, :delete) do
363
+ configure_request do |req, options|
364
+ req.add_param('tagging')
365
+ super(req, options)
366
+ end
367
+ end
368
+
209
369
  # @overload list_buckets(options = {})
210
370
  # @param [Hash] options
211
371
  # @return [Core::Response]
@@ -929,10 +1089,7 @@ module AWS
929
1089
  xml << "<Delete><Quiet>#{quiet}</Quiet>#{objects}</Delete>"
930
1090
 
931
1091
  req.body = xml
932
-
933
- md5 = Base64.encode64(Digest::MD5.digest(xml)).strip
934
-
935
- req.headers['content-md5'] = md5
1092
+ req.headers['content-md5'] = md5(xml)
936
1093
 
937
1094
  end
938
1095
  end
@@ -1192,6 +1349,10 @@ module AWS
1192
1349
  end
1193
1350
  end
1194
1351
 
1352
+ def md5 str
1353
+ Base64.encode64(Digest::MD5.digest(str)).strip
1354
+ end
1355
+
1195
1356
  module Validators
1196
1357
 
1197
1358
  # @return [Boolean] Returns true if the given bucket name is valid.
@@ -164,13 +164,49 @@ module AWS
164
164
  GetBucketLifecycleConfiguration = BaseGrammar.customize do
165
165
  element("Rule") do
166
166
  list
167
- rename(:rules)
167
+ rename(:rules)
168
168
  element("Expiration") do
169
169
  element("Days") { integer_value }
170
170
  end
171
171
  end
172
172
  end
173
173
 
174
+ GetBucketCors = BaseGrammar.customize do
175
+ element "CORSRule" do
176
+ list
177
+ rename :rules
178
+ element "AllowedMethod" do
179
+ list
180
+ rename :allowed_methods
181
+ end
182
+ element "AllowedOrigin" do
183
+ list
184
+ rename :allowed_origins
185
+ end
186
+ element "AllowedHeader" do
187
+ list
188
+ rename :allowed_headers
189
+ end
190
+ element "MaxAgeSeconds" do
191
+ integer
192
+ end
193
+ element "ExposeHeader" do
194
+ list
195
+ rename :expose_headers
196
+ end
197
+ end
198
+ end
199
+
200
+ GetBucketTagging = BaseGrammar.customize do
201
+ element "TagSet" do
202
+ ignore
203
+ element "Tag" do
204
+ map_entry("Key", "Value")
205
+ rename :tags
206
+ end
207
+ end
208
+ end
209
+
174
210
  end
175
211
  end
176
212
  end
@@ -29,6 +29,8 @@ AWS::Core::Configuration.module_eval do
29
29
 
30
30
  add_option :s3_encryption_materials_location, :metadata
31
31
 
32
+ add_option :s3_encryption_matdesc, '{}'
33
+
32
34
  add_option :s3_storage_class, 'STANDARD'
33
35
 
34
36
  end
@@ -0,0 +1,106 @@
1
+ # Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ class S3
16
+
17
+ # Represents a single CORS rule for an S3 {Bucket}.
18
+ #
19
+ # rule = bucket.cors.first
20
+ # rule.allowed_methods #=> ['GET', 'HEAD']
21
+ # rule.allowed_origins #=> ['*']
22
+ #
23
+ # @see CORSRuleCollection
24
+ class CORSRule
25
+
26
+ # @param [Hash] options A hash of the rule details.
27
+ #
28
+ # @option options [String] :id A unique identifier for the rule. The ID
29
+ # value can be up to 255 characters long. The IDs help you find
30
+ # a rule in the configuration.
31
+ #
32
+ # @option options [required,Array<String>] :allowed_methods A list of HTTP
33
+ # methods that you want to allow the origin to execute.
34
+ # Each rule must identify at least one method.
35
+ #
36
+ # @option options [required,Array<String>] :allowed_origins A list of
37
+ # origins you want to allow cross-domain requests from. This can
38
+ # contain at most one * wild character.
39
+ #
40
+ # @option options [Array<String>] :allowed_headers A list of headers
41
+ # allowed in a pre-flight OPTIONS request via the
42
+ # Access-Control-Request-Headers header. Each header name
43
+ # specified in the Access-Control-Request-Headers header must
44
+ # have a corresponding entry in the rule.
45
+ #
46
+ # Amazon S3 will send only the allowed headers in a response
47
+ # that were requested. This can contain at most one '*' wild
48
+ # character.
49
+ #
50
+ # @option options [Array<String>] :max_age_seconds The time in
51
+ # seconds that your browser is to cache the pre-flight response for
52
+ # the specified resource.
53
+ #
54
+ # @option options [Array<String>] :expose_headers One or more headers in
55
+ # the response that you want customers to be able to access
56
+ # from their applications (for example, from a JavaScript
57
+ # XMLHttpRequest object).
58
+ #
59
+ def initialize options = {}
60
+ @id = options[:id]
61
+ @allowed_methods = options[:allowed_methods] || []
62
+ @allowed_origins = options[:allowed_origins] || []
63
+ @allowed_headers = options[:allowed_headers] || []
64
+ @max_age_seconds = options[:max_age_seconds]
65
+ @expose_headers = options[:expose_headers] || []
66
+ end
67
+
68
+ # @return [String,nil] A user supplied unique identifier for this role.
69
+ # Set this when you set or add roles via {CORSRuleCollection}.
70
+ attr_reader :id
71
+
72
+ # @return [Array<String>] A list of HTTP methods (GET, POST, etc) this
73
+ # role authorizes.
74
+ attr_reader :allowed_methods
75
+
76
+ # @return [Array<String>] The list of origins allowed to make
77
+ # cross-domain requests to the bucket.
78
+ attr_reader :allowed_origins
79
+
80
+ # @return [Array<String>] A list of headers allowed in the pre-flight
81
+ # OPTIONS request.
82
+ attr_reader :allowed_headers
83
+
84
+ # @return [Integer,nil] The time in seconds the browser may cache the
85
+ # pre-flight response.
86
+ attr_reader :max_age_seconds
87
+
88
+ # @return [Array<String>] The headers that may be accessed cross-domain.
89
+ attr_reader :expose_headers
90
+
91
+ # @return [Hash]
92
+ def to_h
93
+ h = {}
94
+ h[:id] = id if id
95
+ h[:allowed_methods] = allowed_methods
96
+ h[:allowed_origins] = allowed_origins
97
+ h[:allowed_headers] = allowed_headers unless allowed_headers.empty?
98
+ h[:max_age_seconds] = max_age_seconds if max_age_seconds
99
+ h[:expose_headers] = expose_headers unless expose_headers.empty?
100
+ h
101
+ end
102
+
103
+ end
104
+
105
+ end
106
+ end