aws-sdk 1.15.0 → 1.16.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -466,7 +466,11 @@ module AWS
466
466
  # that response bodies match the content-length specified in the
467
467
  # response header, if present. Note that some HTTP handlers will
468
468
  # always do this whether or not this value is true.
469
- #
469
+ #
470
+ # @option options [Boolean] :sqs_verify_checksums (true)
471
+ # When `true` all SQS operations will check body content against
472
+ # MD5 checksums, raising an exception if there is a mismatch.
473
+ #
470
474
  # @return [Core::Configuration] Returns the new configuration.
471
475
  #
472
476
  def config options = {}
@@ -182,6 +182,10 @@ module AWS
182
182
  # if all SimpleDB read requests should be done consistently.
183
183
  # Consistent reads are slower, but reflect all changes to SDB.
184
184
  #
185
+ # @attr_reader [Boolean] sqs_verify_checksums (true)
186
+ # When `true` all SQS operations will check body content against
187
+ # MD5 checksums, raising an exception if there is a mismatch.
188
+ #
185
189
  # @attr_reader [CredentialProvider::Provider] credential_provider
186
190
  # Returns the object that is responsible for loading credentials.
187
191
  #
@@ -317,6 +321,13 @@ module AWS
317
321
  "<#{self.class.name}>"
318
322
  end
319
323
 
324
+ # @api private
325
+ def endpoint_region(svc)
326
+ (supplied[svc.method_name] || {})[:region] or
327
+ supplied[:"#{svc.old_name}_region"] or
328
+ region
329
+ end
330
+
320
331
  protected
321
332
 
322
333
  def supplied
@@ -395,9 +406,9 @@ module AWS
395
406
  elsif endpoint = config.send(svc_opt)[:endpoint]
396
407
  endpoint
397
408
  elsif endpoint_pattern
398
- endpoint_pattern % config.region
409
+ endpoint_pattern % config.endpoint_region(svc)
399
410
  else
400
- endpoint_builder.call(config.region)
411
+ endpoint_builder.call(config.endpoint_region(svc))
401
412
  end
402
413
  end
403
414
 
@@ -426,7 +437,7 @@ module AWS
426
437
  else
427
438
  'us-gov-west-1' # e.g. iam.us-gov.amazonaws.com
428
439
  end
429
- elsif matches = endpoint.match(/^.+\.(.+)\.amazonaws.com$/)
440
+ elsif matches = endpoint.match(/^.+?[.-](.+)\.amazonaws.com$/)
430
441
  matches[1]
431
442
  else
432
443
  AWS.const_get(name).global_endpoint? ? 'us-east-1' : config.region
@@ -435,6 +446,7 @@ module AWS
435
446
  end
436
447
 
437
448
  needs = [
449
+ :"#{svc_opt}",
438
450
  :"#{ruby_name}_endpoint",
439
451
  :"#{ruby_name}_port",
440
452
  :"#{ruby_name}_region",
@@ -457,7 +469,8 @@ module AWS
457
469
  ]
458
470
 
459
471
  create_block = lambda do |config,client_options|
460
- AWS.const_get(name)::Client.new(:config => config)
472
+ options = client_options[:"#{svc_opt}"]
473
+ AWS.const_get(name)::Client.new(options.merge(:config => config))
461
474
  end
462
475
 
463
476
  add_option_with_needs :"#{ruby_name}_client", needs, &create_block
@@ -29,6 +29,7 @@ module AWS
29
29
  def start_document; end
30
30
  def end_document; end
31
31
  def error(*args); end
32
+ def comment(*args); end
32
33
 
33
34
  def start_element_namespace element_name, attributes = [], *ignore
34
35
 
@@ -125,6 +125,14 @@ module AWS
125
125
 
126
126
  endpoint_prefix 'dynamodb'
127
127
 
128
+
129
+ def initialize options = {}
130
+ options = options.dup
131
+ options[:dynamo_db] ||= {}
132
+ options[:dynamo_db][:api_version] = '2011-12-05'
133
+ super(options)
134
+ end
135
+
128
136
  # Returns a collection representing all the tables in your account.
129
137
  #
130
138
  # @return [TableCollection]
@@ -81,6 +81,10 @@ module AWS
81
81
  #
82
82
  # @attr [Time] throughput_last_decreased_at
83
83
  #
84
+ # @attr [Integer] size_bytes
85
+ #
86
+ # @attr [Integer] item_count
87
+ #
84
88
  # @attr [PrimaryKeyElement] hash_key Returns the hash key element
85
89
  # for this table.
86
90
  #
@@ -113,6 +117,10 @@ module AWS
113
117
 
114
118
  attribute :write_capacity_units
115
119
 
120
+ attribute :item_count
121
+
122
+ attribute :size_bytes, :from => 'TableSizeBytes'
123
+
116
124
  attribute :hash_key, :from => "HashKeyElement", :static => true do
117
125
  translates_output {|v| PrimaryKeyElement.new(v) }
118
126
  end
@@ -550,6 +550,90 @@ module AWS
550
550
 
551
551
  end
552
552
 
553
+ # @overload put_bucket_logging(options = {})
554
+ # @param [Hash] options
555
+ # @option options [required,String] :bucket_name
556
+ # @option options [Boolean] :logging_enabled Set to true if turning on
557
+ # bucket logging. If not set or false, all of the following options
558
+ # will be ignored.
559
+ # @option options [String] :target_bucket The name of the bucket in
560
+ # which you want Amazon S3 to store server access logs. You can push
561
+ # logs to any bucket you own, including the bucket being logged.
562
+ # @option options [String] :target_prefix Allows you to specify a prefix
563
+ # for the keys that the log files will be stored under. Recommended
564
+ # if you will be writing logs from multiple buckets to the same target
565
+ # bucket.
566
+ # @option options [Array<Hash>] :grants An array of hashes specifying
567
+ # permission grantees. For each hash, specify ONLY ONE of :id, :uri,
568
+ # or :email_address.
569
+ # * `:email_address` - (String) E-mail address of the person being
570
+ # granted logging permissions.
571
+ # * `:id` - (String) The canonical user ID of the grantee.
572
+ # * `:uri` - (String) URI of the grantee group.
573
+ # * `:permission` - (String) Logging permissions given to the Grantee
574
+ # for the bucket. The bucket owner is automatically granted FULL_CONTROL
575
+ # to all logs delivered to the bucket. This optional element enables
576
+ # you grant access to others. Valid Values: FULL_CONTROL | READ | WRITE
577
+ # @return [Core::Response]
578
+ bucket_method(:put_bucket_logging, :put) do
579
+ configure_request do |req, options|
580
+
581
+ req.add_param('logging')
582
+
583
+ xml = Nokogiri::XML::Builder.new
584
+ xml.BucketLoggingStatus('xmlns' => XMLNS) do |xml|
585
+ if options[:logging_enabled] == true
586
+ xml.LoggingEnabled do
587
+ xml.TargetBucket(options[:target_bucket])
588
+ xml.TargetPrefix(options[:target_prefix])
589
+ unless options[:grants].nil?
590
+
591
+ xml.TargetGrants do
592
+ options[:grants].each do |grant|
593
+ xml.Grant do
594
+ if !grant[:email_address].nil?
595
+ xml.Grantee('xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
596
+ 'xsi:type' => 'AmazonCustomerByEmail') do
597
+ xml.EmailAddress(grant[:email_address])
598
+ end
599
+ elsif !grant[:uri].nil?
600
+ xml.Grantee('xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
601
+ 'xsi:type' => 'Group') do
602
+ xml.URI(grant[:uri])
603
+ end
604
+ elsif !grant[:id].nil?
605
+ xml.Grantee('xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
606
+ 'xsi:type' => 'CanonicalUser') do
607
+ xml.ID(grant[:id])
608
+ end
609
+ end
610
+
611
+ xml.Permission(grant[:permission])
612
+ end
613
+ end
614
+ end
615
+ end
616
+ end
617
+ end
618
+ end
619
+
620
+ xml = xml.doc.root.to_xml
621
+ req.body = xml
622
+ req.headers['content-md5'] = md5(xml)
623
+
624
+ super(req, options)
625
+
626
+ end
627
+ end
628
+
629
+ # Gets the bucket's logging status.
630
+ # @overload get_bucket_logging(options = {})
631
+ # @param [Hash] options
632
+ # @option options [required,String] :bucket_name
633
+ # @return [Core::Response]
634
+ bucket_method(:get_bucket_logging, :get, 'logging',
635
+ XML::GetBucketLogging)
636
+
553
637
  # @overload get_bucket_versioning(options = {})
554
638
  # @param [Hash] options
555
639
  # @option options [required,String] :bucket_name
@@ -71,6 +71,24 @@ module AWS
71
71
 
72
72
  end
73
73
 
74
+ GetBucketLogging = BaseGrammar.customize do
75
+ element("LoggingEnabled") do
76
+ element("TargetBucket") { }
77
+ element("TargetPrefix") { }
78
+ element("TargetGrants") do
79
+ list "Grant"
80
+ element("Grant") do
81
+ element("Grantee") do
82
+ element("EmailAddress") { }
83
+ element("ID") { }
84
+ element("URI") { }
85
+ end
86
+ element("Permission") { }
87
+ end
88
+ end
89
+ end
90
+ end
91
+
74
92
  GetBucketVersioning = BaseGrammar.customize do
75
93
  default_value :status, :unversioned
76
94
  element("Status") do
@@ -53,6 +53,13 @@ module AWS
53
53
  # object.metadata['purpose'] = 'research'
54
54
  # object.metadata['purpose'] # => 'research'
55
55
  #
56
+ # @deprecated In order to safely update an S3 object's metadata, you
57
+ # should use {S3Object#copy_from}. This operation does not preserve
58
+ # the ACL, storage class (standard vs. reduced redundancy) or server
59
+ # side encryption settings. Using this method on anything other than
60
+ # vanilla S3 objects risks clobbering other metadata values set on the
61
+ # object.
62
+ #
56
63
  # @note The name and value of each metadata field must conform
57
64
  # to US-ASCII.
58
65
  #
@@ -803,6 +803,8 @@ module AWS
803
803
  # @option options [Hash] :metadata A hash of metadata to save
804
804
  # with the copied object. Each name, value pair must conform
805
805
  # to US-ASCII. When blank, the sources metadata is copied.
806
+ # If you set this value, you must set ALL metadata values for
807
+ # the object as we do not preserve existing values.
806
808
  #
807
809
  # @option options [String] :content_type The content type of
808
810
  # the copied object. Defaults to the source object's content
@@ -17,7 +17,11 @@ module AWS
17
17
  # @api private
18
18
  class Request < Core::Http::Request
19
19
 
20
- include Core::Signature::Version3
20
+ include Core::Signature::Version4
21
+
22
+ def service
23
+ 'swf'
24
+ end
21
25
 
22
26
  end
23
27
  end
@@ -15,4 +15,6 @@ AWS::Core::Configuration.module_eval do
15
15
 
16
16
  add_service 'SQS', 'sqs', 'sqs.%s.amazonaws.com'
17
17
 
18
+ add_option :sqs_verify_checksums, true, :boolean => true
19
+
18
20
  end
@@ -96,6 +96,29 @@ module AWS
96
96
  attr_reader :failures
97
97
 
98
98
  end
99
+
100
+ class ChecksumError < StandardError
101
+
102
+ def initialize failures
103
+ # failures can also be a single failure, always generate an array
104
+ @failures = failures.is_a?(Array) ? failures : [failures]
105
+ super("#{@failures.size} messages failed checksum verification")
106
+ end
107
+
108
+ attr_reader :failures
109
+ end
110
+
111
+ class BatchSendMultiError < StandardError
112
+ def initialize *error_set
113
+ @errors = []
114
+ error_set.each do |error|
115
+ @errors << error
116
+ end
117
+ end
118
+
119
+ attr_reader :errors
120
+ end
121
+
99
122
  end
100
123
  end
101
124
  end
@@ -11,6 +11,8 @@
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 'digest'
15
+
14
16
  module AWS
15
17
  class SQS
16
18
 
@@ -118,10 +120,13 @@ module AWS
118
120
  client_opts[:message_body] = body
119
121
 
120
122
  response = client.send_message(client_opts)
121
-
123
+
122
124
  msg = SentMessage.new
123
125
  msg.message_id = response[:message_id]
124
126
  msg.md5 = response[:md5_of_message_body]
127
+
128
+ verify_send_message_checksum body, msg.md5
129
+
125
130
  msg
126
131
 
127
132
  end
@@ -187,6 +192,10 @@ module AWS
187
192
  def receive_message(opts = {}, &block)
188
193
  resp = client.receive_message(receive_opts(opts))
189
194
 
195
+ failed = verify_receive_message_checksum resp
196
+
197
+ raise Errors::ChecksumError.new(failed) unless failed.empty?
198
+
190
199
  messages = resp[:messages].map do |m|
191
200
  ReceivedMessage.new(self, m[:message_id], m[:receipt_handle],
192
201
  :body => m[:body],
@@ -530,9 +539,11 @@ module AWS
530
539
  client_opts[:entries] = entries
531
540
 
532
541
  response = client.send_message_batch(client_opts)
533
-
542
+
534
543
  failed = batch_failures(entries, response)
535
544
 
545
+ checksum_failed = verify_send_message_batch_checksum entries, response
546
+
536
547
  sent = response[:successful].collect do |sent|
537
548
  msg = SentMessage.new
538
549
  msg.message_id = sent[:message_id]
@@ -540,7 +551,15 @@ module AWS
540
551
  msg
541
552
  end
542
553
 
543
- raise Errors::BatchSendError.new(sent, failed) unless failed.empty?
554
+ if !failed.empty? && !checksum_failed.empty?
555
+ send_error = Errors::BatchSendError.new(sent, failed)
556
+ checksum_error = Errors::ChecksumError.new(checksum_failed)
557
+ raise Errors::BatchSendMultiError.new send_error, checksum_error
558
+ elsif !failed.empty?
559
+ raise Errors::BatchSendError.new(sent, failed) unless failed.empty?
560
+ elsif !checksum_failed.empty?
561
+ raise Errors::ChecksumError.new(checksum_failed)
562
+ end
544
563
 
545
564
  sent
546
565
 
@@ -757,6 +776,59 @@ module AWS
757
776
  })
758
777
  end
759
778
 
779
+ # @api private
780
+ protected
781
+ def is_checksum_valid checksum, data
782
+ if config.sqs_verify_checksums?
783
+ calculate_checksum(data) == checksum
784
+ else
785
+ true
786
+ end
787
+ end
788
+
789
+ # @api private
790
+ protected
791
+ def calculate_checksum data
792
+ Digest::MD5.hexdigest data
793
+ end
794
+
795
+ # @api private
796
+ protected
797
+ def verify_send_message_checksum body, md5
798
+ unless is_checksum_valid md5, body
799
+ raise Errors::ChecksumError.new "Invalid MD5 #{md5} for message body #{body}"
800
+ end
801
+ end
802
+
803
+ # @api private
804
+ protected
805
+ def verify_send_message_batch_checksum entries, response
806
+ failed = []
807
+
808
+ response[:successful].each do |msg|
809
+ entry = entries.find{ |e| e[:id] == msg[:id] }
810
+ failed << msg unless is_checksum_valid msg[:md5_of_message_body], entry[:message_body]
811
+ end
812
+
813
+ failed
814
+ end
815
+
816
+ # @api private
817
+ protected
818
+ def verify_receive_message_checksum response
819
+ return [] if response[:messages].nil?
820
+
821
+ invalid_msgs = []
822
+
823
+ response[:messages].each do |msg|
824
+ md5 = msg[:md5_of_body]
825
+ body = msg[:body]
826
+ invalid_msgs << msg unless is_checksum_valid md5, body
827
+ end
828
+
829
+ invalid_msgs
830
+ end
831
+
760
832
  end
761
833
 
762
834
  end
@@ -13,5 +13,5 @@
13
13
 
14
14
  module AWS
15
15
  # Current version of the AWS SDK for Ruby
16
- VERSION = '1.15.0'
16
+ VERSION = '1.16.0'
17
17
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.15.0
4
+ version: 1.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amazon Web Services
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-13 00:00:00.000000000 Z
11
+ date: 2013-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: uuidtools