aws-sdk 1.15.0 → 1.16.0

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.
@@ -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