aws-sdk 1.30.1 → 1.31.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -3
  3. data/lib/aws/api_config/CloudFront-2013-11-11.yml +2886 -0
  4. data/lib/aws/api_config/CloudTrail-2013-11-01.yml +36 -0
  5. data/lib/aws/api_config/ElasticTranscoder-2012-09-25.yml +67 -446
  6. data/lib/aws/auto_scaling.rb +0 -1
  7. data/lib/aws/auto_scaling/client.rb +2 -0
  8. data/lib/aws/cloud_formation.rb +0 -1
  9. data/lib/aws/cloud_formation/client.rb +2 -0
  10. data/lib/aws/cloud_front.rb +0 -1
  11. data/lib/aws/cloud_front/client.rb +6 -6
  12. data/lib/aws/cloud_search.rb +0 -1
  13. data/lib/aws/cloud_search/client.rb +3 -0
  14. data/lib/aws/cloud_trail.rb +0 -1
  15. data/lib/aws/cloud_trail/client.rb +2 -0
  16. data/lib/aws/cloud_watch.rb +0 -1
  17. data/lib/aws/cloud_watch/client.rb +2 -0
  18. data/lib/aws/core.rb +8 -6
  19. data/lib/aws/core/client.rb +30 -4
  20. data/lib/aws/core/configuration.rb +1 -1
  21. data/lib/aws/core/http/request.rb +2 -1
  22. data/lib/aws/core/signers/base.rb +46 -0
  23. data/lib/aws/core/signers/cloud_front.rb +56 -0
  24. data/lib/aws/core/signers/s3.rb +159 -0
  25. data/lib/aws/core/signers/version_2.rb +72 -0
  26. data/lib/aws/core/signers/version_3.rb +86 -0
  27. data/lib/aws/core/signers/version_3_https.rb +61 -0
  28. data/lib/aws/core/signers/version_4.rb +228 -0
  29. data/lib/aws/core/signers/version_4/chunk_signed_stream.rb +191 -0
  30. data/lib/aws/data_pipeline.rb +0 -1
  31. data/lib/aws/data_pipeline/client.rb +3 -0
  32. data/lib/aws/direct_connect.rb +0 -1
  33. data/lib/aws/direct_connect/client.rb +3 -0
  34. data/lib/aws/dynamo_db.rb +0 -1
  35. data/lib/aws/dynamo_db/client.rb +2 -0
  36. data/lib/aws/ec2.rb +0 -1
  37. data/lib/aws/ec2/client.rb +21 -0
  38. data/lib/aws/elastic_beanstalk.rb +0 -1
  39. data/lib/aws/elastic_beanstalk/client.rb +3 -0
  40. data/lib/aws/elastic_transcoder.rb +0 -1
  41. data/lib/aws/elastic_transcoder/client.rb +2 -0
  42. data/lib/aws/elasticache.rb +0 -1
  43. data/lib/aws/elasticache/client.rb +2 -0
  44. data/lib/aws/elb.rb +0 -1
  45. data/lib/aws/elb/client.rb +2 -0
  46. data/lib/aws/emr.rb +0 -1
  47. data/lib/aws/emr/client.rb +2 -0
  48. data/lib/aws/glacier.rb +0 -1
  49. data/lib/aws/glacier/client.rb +2 -0
  50. data/lib/aws/iam.rb +0 -1
  51. data/lib/aws/iam/client.rb +2 -0
  52. data/lib/aws/import_export.rb +0 -1
  53. data/lib/aws/import_export/client.rb +2 -0
  54. data/lib/aws/kinesis.rb +0 -1
  55. data/lib/aws/kinesis/client.rb +2 -0
  56. data/lib/aws/ops_works.rb +0 -1
  57. data/lib/aws/ops_works/client.rb +2 -0
  58. data/lib/aws/rds.rb +0 -1
  59. data/lib/aws/rds/client.rb +2 -0
  60. data/lib/aws/redshift.rb +0 -1
  61. data/lib/aws/redshift/client.rb +2 -0
  62. data/lib/aws/route_53.rb +0 -1
  63. data/lib/aws/route_53/client.rb +2 -0
  64. data/lib/aws/s3.rb +1 -0
  65. data/lib/aws/s3/bucket_collection.rb +9 -7
  66. data/lib/aws/s3/client.rb +70 -9
  67. data/lib/aws/s3/config.rb +12 -0
  68. data/lib/aws/s3/object_collection.rb +4 -9
  69. data/lib/aws/s3/presign_v4.rb +127 -0
  70. data/lib/aws/s3/presigned_post.rb +1 -1
  71. data/lib/aws/s3/request.rb +0 -136
  72. data/lib/aws/s3/s3_object.rb +40 -19
  73. data/lib/aws/simple_db.rb +0 -1
  74. data/lib/aws/simple_db/client.rb +2 -0
  75. data/lib/aws/simple_email_service.rb +0 -1
  76. data/lib/aws/simple_email_service/client.rb +2 -0
  77. data/lib/aws/simple_workflow.rb +0 -1
  78. data/lib/aws/simple_workflow/client.rb +2 -0
  79. data/lib/aws/sns.rb +0 -1
  80. data/lib/aws/sns/client.rb +2 -0
  81. data/lib/aws/sqs.rb +0 -1
  82. data/lib/aws/sqs/client.rb +2 -0
  83. data/lib/aws/storage_gateway.rb +0 -1
  84. data/lib/aws/storage_gateway/client.rb +2 -0
  85. data/lib/aws/sts.rb +0 -1
  86. data/lib/aws/sts/client.rb +2 -0
  87. data/lib/aws/support.rb +0 -1
  88. data/lib/aws/support/client.rb +2 -0
  89. data/lib/aws/version.rb +1 -1
  90. metadata +12 -38
  91. data/lib/aws/auto_scaling/request.rb +0 -29
  92. data/lib/aws/cloud_formation/request.rb +0 -29
  93. data/lib/aws/cloud_front/request.rb +0 -30
  94. data/lib/aws/cloud_search/request.rb +0 -23
  95. data/lib/aws/cloud_trail/request.rb +0 -30
  96. data/lib/aws/cloud_watch/request.rb +0 -29
  97. data/lib/aws/core/signature/version_2.rb +0 -56
  98. data/lib/aws/core/signature/version_3.rb +0 -77
  99. data/lib/aws/core/signature/version_3_https.rb +0 -54
  100. data/lib/aws/core/signature/version_4.rb +0 -135
  101. data/lib/aws/core/signer.rb +0 -46
  102. data/lib/aws/data_pipeline/request.rb +0 -26
  103. data/lib/aws/direct_connect/request.rb +0 -27
  104. data/lib/aws/dynamo_db/request.rb +0 -26
  105. data/lib/aws/ec2/request.rb +0 -21
  106. data/lib/aws/elastic_beanstalk/request.rb +0 -29
  107. data/lib/aws/elastic_transcoder/request.rb +0 -30
  108. data/lib/aws/elasticache/request.rb +0 -23
  109. data/lib/aws/elb/request.rb +0 -29
  110. data/lib/aws/emr/request.rb +0 -28
  111. data/lib/aws/glacier/request.rb +0 -29
  112. data/lib/aws/iam/request.rb +0 -29
  113. data/lib/aws/import_export/request.rb +0 -23
  114. data/lib/aws/kinesis/request.rb +0 -26
  115. data/lib/aws/ops_works/request.rb +0 -27
  116. data/lib/aws/rds/request.rb +0 -29
  117. data/lib/aws/redshift/request.rb +0 -29
  118. data/lib/aws/route_53/request.rb +0 -23
  119. data/lib/aws/simple_db/request.rb +0 -23
  120. data/lib/aws/simple_email_service/request.rb +0 -27
  121. data/lib/aws/simple_workflow/request.rb +0 -28
  122. data/lib/aws/sns/request.rb +0 -29
  123. data/lib/aws/sqs/request.rb +0 -31
  124. data/lib/aws/storage_gateway/request.rb +0 -28
  125. data/lib/aws/sts/request.rb +0 -29
  126. data/lib/aws/support/request.rb +0 -27
@@ -0,0 +1,72 @@
1
+ # Copyright 2011-2013 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
+ module Core
16
+ module Signers
17
+ # @api private
18
+ class Version2
19
+
20
+ include Base
21
+
22
+ # @param [CredentialProviders::Provider] credentials
23
+ def initialize credentials
24
+ @credentials = credentials
25
+ end
26
+
27
+ # @return [CredentialProviders::Provider]
28
+ attr_reader :credentials
29
+
30
+ # @param [Http::Request] req
31
+ # @return [Http::Request]
32
+ def sign_request req
33
+ req.add_param('AWSAccessKeyId', credentials.access_key_id)
34
+ if token = credentials.session_token
35
+ req.add_param("SecurityToken", token)
36
+ end
37
+ req.add_param('SignatureVersion', '2')
38
+ req.add_param('SignatureMethod', 'HmacSHA256')
39
+ req.add_param('Signature', signature(req))
40
+ req.body = req.url_encoded_params
41
+ req
42
+ end
43
+
44
+ private
45
+
46
+ # @param [Http::Request] req
47
+ def signature req
48
+ sign(credentials.secret_access_key, string_to_sign(req))
49
+ end
50
+
51
+ # @param [Http::Request] req
52
+ def string_to_sign req
53
+
54
+ host =
55
+ case req.port
56
+ when 80, 443 then req.host
57
+ else "#{req.host}:#{req.port}"
58
+ end
59
+
60
+ [
61
+ req.http_method,
62
+ host.to_s.downcase,
63
+ req.path,
64
+ req.url_encoded_params,
65
+ ].join("\n")
66
+
67
+ end
68
+
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,86 @@
1
+ # Copyright 2011-2013 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
+ require 'openssl'
15
+ require 'time'
16
+
17
+ module AWS
18
+ module Core
19
+ module Signers
20
+ # @api private
21
+ class Version3
22
+
23
+ include Base
24
+
25
+ # @param [CredentialProviders::Provider] credentials
26
+ def initialize credentials
27
+ @credentials = credentials
28
+ end
29
+
30
+ # @return [CredentialProviders::Provider]
31
+ attr_reader :credentials
32
+
33
+ # @param [Http::Request] req
34
+ # @return [Http::Request]
35
+ def sign_request req
36
+ req.headers["x-amz-date"] ||= (req.headers["date"] ||= Time.now.httpdate)
37
+ req.headers["host"] ||= req.host
38
+ req.headers["x-amz-security-token"] = credentials.session_token if
39
+ credentials.session_token
40
+ req.headers["x-amzn-authorization"] =
41
+ "AWS3 "+
42
+ "AWSAccessKeyId=#{credentials.access_key_id},"+
43
+ "Algorithm=HmacSHA256,"+
44
+ "SignedHeaders=#{headers_to_sign(req).join(';')},"+
45
+ "Signature=#{signature(req)}"
46
+ end
47
+
48
+ private
49
+
50
+ # @param [Http::Request] req
51
+ def signature req, service_signing_name = nil
52
+ sign(credentials.secret_access_key, string_to_sign(req))
53
+ end
54
+
55
+ # @param [Http::Request] req
56
+ def string_to_sign req
57
+ OpenSSL::Digest::SHA256.digest([
58
+ req.http_method,
59
+ "/",
60
+ "",
61
+ canonical_headers(req),
62
+ req.body
63
+ ].join("\n"))
64
+ end
65
+
66
+ # @param [Http::Request] req
67
+ def canonical_headers req
68
+ headers_to_sign(req).map do |name|
69
+ value = req.headers[name]
70
+ "#{name.downcase.strip}:#{value.strip}\n"
71
+ end.sort.join
72
+ end
73
+
74
+ # @param [Http::Request] req
75
+ def headers_to_sign req
76
+ req.headers.keys.select do |header|
77
+ header == "host" ||
78
+ header == "content-encoding" ||
79
+ header =~ /^x-amz/
80
+ end
81
+ end
82
+
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,61 @@
1
+ # Copyright 2011-2013 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
+ require 'time'
15
+
16
+ module AWS
17
+ module Core
18
+ module Signers
19
+ # @api private
20
+ class Version3Https
21
+
22
+ include Base
23
+
24
+ # @param [CredentialProviders::Provider] credentials
25
+ def initialize credentials
26
+ @credentials = credentials
27
+ end
28
+
29
+ # @return [CredentialProviders::Provider]
30
+ attr_reader :credentials
31
+
32
+ # @param [Http::Request] req
33
+ # @return [Http::Request]
34
+ def sign_request req
35
+ parts = []
36
+ parts << "AWS3-HTTPS AWSAccessKeyId=#{credentials.access_key_id}"
37
+ parts << "Algorithm=HmacSHA256"
38
+ parts << "Signature=#{signature(req)}"
39
+ req.headers['x-amzn-authorization'] = parts.join(',')
40
+ req.headers['x-amz-security-token'] = credentials.session_token if
41
+ credentials.session_token
42
+ req
43
+ end
44
+
45
+ private
46
+
47
+ # @param [Http::Request] req
48
+ def signature req
49
+ sign(credentials.secret_access_key, string_to_sign(req))
50
+ end
51
+
52
+ # @param [Http::Request] req
53
+ def string_to_sign req
54
+ req.headers['date'] ||= Time.now.httpdate
55
+ end
56
+
57
+ end
58
+ end
59
+ end
60
+ end
61
+
@@ -0,0 +1,228 @@
1
+ # Copyright 2011-2013 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
+ require 'time'
15
+ require 'openssl'
16
+ require 'digest'
17
+
18
+ module AWS
19
+ module Core
20
+ module Signers
21
+ # @api private
22
+ class Version4
23
+
24
+ autoload :ChunkSignedStream, 'aws/core/signers/version_4/chunk_signed_stream'
25
+
26
+ # @api private
27
+ # SHA256 hex digest of the empty string
28
+ EMPTY_DIGEST = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
29
+
30
+ # @api private
31
+ STREAMING_CHECKSUM = "STREAMING-AWS4-HMAC-SHA256-PAYLOAD"
32
+
33
+ # @param [CredentialProviders::Provider] credentials
34
+ # @param [String] service_name
35
+ # @param [String] region
36
+ def initialize credentials, service_name, region
37
+ @credentials = credentials
38
+ @service_name = service_name
39
+ @region = region
40
+ end
41
+
42
+ # @return [CredentialProviders::Provider]
43
+ attr_reader :credentials
44
+
45
+ # @return [String]
46
+ attr_reader :service_name
47
+
48
+ # @return [String]
49
+ attr_reader :region
50
+
51
+ # @param [Http::Request] req
52
+ # @option options [Boolean] :chunk_signing (false) When +true+, the
53
+ # request body will be signed in chunk.
54
+ # @option options [DateTime String<YYYYMMDDTHHMMSSZ>] :datetime
55
+ # @return [Http::Request]
56
+ def sign_request req, options = {}
57
+ datetime = options[:datetime] || Time.now.utc.strftime("%Y%m%dT%H%M%SZ")
58
+ key = derive_key(datetime)
59
+ token = credentials.session_token
60
+ chunk_signing = !!options[:chunk_signing]
61
+ content_sha256 = req.headers['x-amz-content-sha256'] || body_digest(req, chunk_signing)
62
+
63
+ req.headers['host'] = req.host
64
+ req.headers['x-amz-date'] = datetime
65
+ req.headers['x-amz-security-token'] = token if token
66
+ req.headers['x-amz-content-sha256'] = content_sha256
67
+
68
+ if chunk_signing
69
+ orig_size = req.headers['content-length'].to_i
70
+ signed_size = ChunkSignedStream.signed_size(orig_size.to_i)
71
+ req.headers['content-length'] = signed_size.to_s
72
+ req.headers['x-amz-decoded-content-length'] = orig_size.to_s
73
+ end
74
+
75
+ req.headers['authorization'] = authorization(req, key, datetime, content_sha256)
76
+
77
+ req.body_stream = chunk_signed_stream(req, key) if chunk_signing
78
+
79
+ req
80
+ end
81
+
82
+ def signature(request, key, datetime, content_sha256)
83
+ string = string_to_sign(request, datetime, content_sha256)
84
+ hexhmac(key, string)
85
+ end
86
+
87
+ def credential(datetime)
88
+ "#{credentials.access_key_id}/#{key_path(datetime)}"
89
+ end
90
+
91
+ def derive_key(datetime)
92
+ k_secret = credentials.secret_access_key
93
+ k_date = hmac("AWS4" + k_secret, datetime[0,8])
94
+ k_region = hmac(k_date, region)
95
+ k_service = hmac(k_region, service_name)
96
+ k_credentials = hmac(k_service, 'aws4_request')
97
+ end
98
+
99
+ private
100
+
101
+ # Wraps the req body stream with another stream. The wrapper signs
102
+ # the original body as it is read, injecting signatures of indiviaul
103
+ # chunks into the resultant stream.
104
+ # @param [Http::Request] req
105
+ # @param [String] key
106
+ # @param [String] datetime
107
+ def chunk_signed_stream req, key
108
+ args = []
109
+ args << req.body_stream
110
+ args << req.headers['x-amz-decoded-content-length'].to_i
111
+ args << key
112
+ args << key_path(req.headers['x-amz-date'])
113
+ args << req.headers['x-amz-date']
114
+ args << req.headers['authorization'].split('Signature=')[1]
115
+ ChunkSignedStream.new(*args)
116
+ end
117
+
118
+ def authorization req, key, datetime, content_sha256
119
+ parts = []
120
+ parts << "AWS4-HMAC-SHA256 Credential=#{credential(datetime)}"
121
+ parts << "SignedHeaders=#{signed_headers(req)}"
122
+ parts << "Signature=#{signature(req, key, datetime, content_sha256)}"
123
+ parts.join(', ')
124
+ end
125
+
126
+ def string_to_sign req, datetime, content_sha256
127
+ parts = []
128
+ parts << 'AWS4-HMAC-SHA256'
129
+ parts << datetime
130
+ parts << key_path(datetime)
131
+ parts << hexdigest(canonical_request(req, content_sha256))
132
+ parts.join("\n")
133
+ end
134
+
135
+ # @param [String] datetime
136
+ # @return [String] the signature scope.
137
+ def key_path datetime
138
+ parts = []
139
+ parts << datetime[0,8]
140
+ parts << region
141
+ parts << service_name
142
+ parts << 'aws4_request'
143
+ parts.join("/")
144
+ end
145
+
146
+ # @param [Http::Request] req
147
+ def canonical_request req, content_sha256
148
+ parts = []
149
+ parts << req.http_method
150
+ parts << req.path
151
+ parts << req.querystring
152
+ parts << canonical_headers(req) + "\n"
153
+ parts << signed_headers(req)
154
+ parts << content_sha256
155
+ parts.join("\n")
156
+ end
157
+
158
+ # @param [Http::Request] req
159
+ def signed_headers req
160
+ to_sign = req.headers.keys.map{|k| k.to_s.downcase }
161
+ to_sign.delete('authorization')
162
+ to_sign.sort.join(";")
163
+ end
164
+
165
+ # @param [Http::Request] req
166
+ def canonical_headers req
167
+ headers = []
168
+ req.headers.each_pair do |k,v|
169
+ headers << [k,v] unless k == 'authorization'
170
+ end
171
+ headers = headers.sort_by(&:first)
172
+ headers.map{|k,v| "#{k}:#{canonical_header_values(v)}" }.join("\n")
173
+ end
174
+
175
+ # @param [String,Array<String>] values
176
+ def canonical_header_values values
177
+ values = [values] unless values.is_a?(Array)
178
+ values.map(&:to_s).join(',').gsub(/\s+/, ' ').strip
179
+ end
180
+
181
+ # @param [Http::Request] req
182
+ # @param [Boolean] chunk_signing
183
+ # @return [String]
184
+ def body_digest req, chunk_signing
185
+ case
186
+ when chunk_signing then STREAMING_CHECKSUM
187
+ when ['', nil].include?(req.body) then EMPTY_DIGEST
188
+ else hexdigest(req.body)
189
+ end
190
+ end
191
+
192
+ # @param [String] value
193
+ # @return [String]
194
+ def hexdigest value
195
+ digest = Digest::SHA256.new
196
+ if value.respond_to?(:read)
197
+ chunk = nil
198
+ chunk_size = 1024 * 1024 # 1 megabyte
199
+ digest.update(chunk) while chunk = value.read(chunk_size)
200
+ value.rewind
201
+ else
202
+ digest.update(value)
203
+ end
204
+ digest.hexdigest
205
+ end
206
+
207
+ # @param [String] key
208
+ # @param [String] value
209
+ # @return [String]
210
+ def hmac key, value
211
+ OpenSSL::HMAC.digest(sha256_digest, key, value)
212
+ end
213
+
214
+ # @param [String] key
215
+ # @param [String] value
216
+ # @return [String]
217
+ def hexhmac key, value
218
+ OpenSSL::HMAC.hexdigest(sha256_digest, key, value)
219
+ end
220
+
221
+ def sha256_digest
222
+ OpenSSL::Digest::Digest.new('sha256')
223
+ end
224
+
225
+ end
226
+ end
227
+ end
228
+ end