aws-sdk-core 2.7.11 → 2.7.12
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.
- checksums.yaml +4 -4
- data/apis/ec2/2016-11-15/api-2.json +11 -0
- data/lib/aws-sdk-core/client_stubs.rb +15 -2
- data/lib/aws-sdk-core/cloudfront.rb +2 -0
- data/lib/aws-sdk-core/cloudfront/cookie_signer.rb +44 -0
- data/lib/aws-sdk-core/cloudfront/signer.rb +141 -0
- data/lib/aws-sdk-core/cloudfront/url_signer.rb +7 -128
- data/lib/aws-sdk-core/stubbing/protocols/rest.rb +7 -1
- data/lib/aws-sdk-core/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49fd678d04874002883367eef281b0a51ab8733c
|
4
|
+
data.tar.gz: 632c85e825d4bae5b595584116b35cb7306181c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 451971284067ed6fed856141f710c98c54ff6f3abe9ec760ca7dd6f78c0d0550d79e4e57f29e2f7a46e57691ef419534f328af7a0f59b857947b447156232c52
|
7
|
+
data.tar.gz: 3744041eefa7ef6fe9a403c868add5e3c19735ff3ef1cefa509af8c0b5d09ac6d189abf09fb5140a14faefd7536da6f3cabd72df58440f30de49b654fb612008
|
@@ -2802,6 +2802,13 @@
|
|
2802
2802
|
"modifying"
|
2803
2803
|
]
|
2804
2804
|
},
|
2805
|
+
"BillingProductList":{
|
2806
|
+
"type":"list",
|
2807
|
+
"member":{
|
2808
|
+
"shape":"String",
|
2809
|
+
"locationName":"item"
|
2810
|
+
}
|
2811
|
+
},
|
2805
2812
|
"Blob":{"type":"blob"},
|
2806
2813
|
"BlobAttributeValue":{
|
2807
2814
|
"type":"structure",
|
@@ -11385,6 +11392,10 @@
|
|
11385
11392
|
"shape":"String",
|
11386
11393
|
"locationName":"ramdiskId"
|
11387
11394
|
},
|
11395
|
+
"BillingProducts":{
|
11396
|
+
"shape":"BillingProductList",
|
11397
|
+
"locationName":"BillingProduct"
|
11398
|
+
},
|
11388
11399
|
"RootDeviceName":{
|
11389
11400
|
"shape":"String",
|
11390
11401
|
"locationName":"rootDeviceName"
|
@@ -50,8 +50,18 @@ module Aws
|
|
50
50
|
# buckets: [{ name: 'my-bucket' }]
|
51
51
|
# })
|
52
52
|
#
|
53
|
-
# client.list_buckets.buckets.map(&:name)
|
54
|
-
# #=> ['
|
53
|
+
# client.list_buckets.buckets.map(&:name)
|
54
|
+
# #=> ['my-bucket']
|
55
|
+
#
|
56
|
+
# With a Resource class {#stub_responses} on the corresponding client:
|
57
|
+
#
|
58
|
+
# s3 = Aws::S3::Resource.new(stub_responses: true)
|
59
|
+
# s3.client.stub_responses(:list_buckets, {
|
60
|
+
# buckets: [{ name: 'my-bucket' }]
|
61
|
+
# })
|
62
|
+
#
|
63
|
+
# s3.buckets.map(&:name)
|
64
|
+
# #=> ['my-bucket']
|
55
65
|
#
|
56
66
|
# Lastly, default stubs can be configured via `Aws.config`:
|
57
67
|
#
|
@@ -64,6 +74,9 @@ module Aws
|
|
64
74
|
# Aws::S3::Client.new.list_buckets.buckets.map(&:name)
|
65
75
|
# #=> ['my-bucket']
|
66
76
|
#
|
77
|
+
# Aws::S3::Resource.new.buckets.map(&:name)
|
78
|
+
# #=> ['my-bucket']
|
79
|
+
#
|
67
80
|
# ## Stubbing Errors
|
68
81
|
#
|
69
82
|
# When stubbing is enabled, the SDK will default to generate
|
@@ -9,7 +9,9 @@ Aws.add_service(:CloudFront, {
|
|
9
9
|
module Aws
|
10
10
|
module CloudFront
|
11
11
|
|
12
|
+
autoload :Signer, 'aws-sdk-core/cloudfront/signer.rb'
|
12
13
|
autoload :UrlSigner, 'aws-sdk-core/cloudfront/url_signer.rb'
|
14
|
+
autoload :CookieSigner, 'aws-sdk-core/cloudfront/cookie_signer.rb'
|
13
15
|
|
14
16
|
end
|
15
17
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'uri'
|
3
|
+
require 'time'
|
4
|
+
require 'json'
|
5
|
+
require 'openssl'
|
6
|
+
|
7
|
+
module Aws
|
8
|
+
module CloudFront
|
9
|
+
|
10
|
+
# Allows you to create signed cookie for Amazon CloudFront resources
|
11
|
+
#
|
12
|
+
# signer = Aws::CloudFront::CookieSigner.new(
|
13
|
+
# key_pair_id: "cf-keypair-id",
|
14
|
+
# private_key_path: "./cf_private_key.pem"
|
15
|
+
# )
|
16
|
+
# cookies = signer.signed_cookie(url,
|
17
|
+
# policy: policy.to_json
|
18
|
+
# )
|
19
|
+
#
|
20
|
+
class CookieSigner
|
21
|
+
include Signer
|
22
|
+
|
23
|
+
# create a signed Amazon CloudFront URL
|
24
|
+
# @param [String] url
|
25
|
+
# @option params [Time, DateTime, Date, String, Integer<timestamp>] :expires
|
26
|
+
# @option params [String<JSON>] :policy
|
27
|
+
def signed_cookie(url, params = {})
|
28
|
+
scheme, uri = scheme_and_uri(url)
|
29
|
+
signed_content = signature(
|
30
|
+
resource: resource(scheme, uri),
|
31
|
+
expires: time(params[:expires]),
|
32
|
+
policy: params[:policy]
|
33
|
+
)
|
34
|
+
|
35
|
+
cookie_parameters = {}
|
36
|
+
signed_content.each { |k, v|
|
37
|
+
cookie_parameters["CloudFront-#{k}"] = v.to_s.gsub("\n", '')
|
38
|
+
}
|
39
|
+
cookie_parameters
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'uri'
|
3
|
+
require 'time'
|
4
|
+
require 'json'
|
5
|
+
require 'openssl'
|
6
|
+
|
7
|
+
module Aws
|
8
|
+
module CloudFront
|
9
|
+
|
10
|
+
module Signer
|
11
|
+
|
12
|
+
# @option options [String] :key_pair_id
|
13
|
+
# @option options [String] :private_key
|
14
|
+
# @option options [String] :private_key_path
|
15
|
+
def initialize(options = {})
|
16
|
+
@key_pair_id = key_pair_id(options)
|
17
|
+
@private_key = private_key(options)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def scheme_and_uri(url)
|
23
|
+
url_sections = url.split('://')
|
24
|
+
if url_sections.length < 2
|
25
|
+
raise ArgumentError, "Invaild URL:#{url}"
|
26
|
+
end
|
27
|
+
scheme = url_sections[0].gsub('*', '')
|
28
|
+
uri = "#{scheme}://#{url_sections[1]}"
|
29
|
+
[scheme, uri]
|
30
|
+
end
|
31
|
+
|
32
|
+
def time(expires)
|
33
|
+
case expires
|
34
|
+
when Time then expires.to_i
|
35
|
+
when DateTime, Date then expires.to_time.to_i
|
36
|
+
when String then Time.parse(expires).to_i
|
37
|
+
when Integer, NIL then expires
|
38
|
+
else
|
39
|
+
msg = "expected a time value for :expires, got `#{expires.class}'"
|
40
|
+
raise ArgumentError, msg
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# create a relative signed URL for RTMP distribution
|
45
|
+
def rtmp_url(uri)
|
46
|
+
result = uri.path.gsub(' ', '/')
|
47
|
+
result[0] = ''
|
48
|
+
if uri.query
|
49
|
+
"#{result}?#{uri.query}"
|
50
|
+
else
|
51
|
+
result
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# prepare resource for signing
|
56
|
+
def resource(scheme, url)
|
57
|
+
case scheme
|
58
|
+
when 'http', 'http*', 'https' then url
|
59
|
+
when 'rtmp'
|
60
|
+
url_info = URI.parse(url)
|
61
|
+
path = url_info.path
|
62
|
+
path[0] = ''
|
63
|
+
resource_content = "#{File.dirname(path)}/#{File.basename(path)}".gsub(' ', '/')
|
64
|
+
if url_info.query
|
65
|
+
"#{resource_content}?#{uri.query}"
|
66
|
+
else
|
67
|
+
resource_content
|
68
|
+
end
|
69
|
+
else
|
70
|
+
msg = "Invaild URI scheme:#{scheme}.Scheme must be one of: http, https or rtmp."
|
71
|
+
raise ArgumentError, msg
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# create signed values that used to construct signed URLs or Set-Cookie parameters
|
76
|
+
# @option param [String] :resource
|
77
|
+
# @option param [Integer<timestamp>] :expires
|
78
|
+
# @option param [String<JSON>] :policy
|
79
|
+
def signature(params = {})
|
80
|
+
signature_content = {}
|
81
|
+
if params[:policy]
|
82
|
+
policy = params[:policy].gsub('/\s/s', '')
|
83
|
+
signature_content['Policy'] = encode(policy)
|
84
|
+
elsif params[:resource] && params[:expires]
|
85
|
+
policy = canned_policy(params[:resource], params[:expires])
|
86
|
+
signature_content['Expires'] = params[:expires]
|
87
|
+
else
|
88
|
+
msg = "Either a policy or a resource with an expiration time must be provided."
|
89
|
+
raise ArgumentError, msg
|
90
|
+
end
|
91
|
+
|
92
|
+
signature_content['Signature'] = encode(sign_policy(policy))
|
93
|
+
signature_content['Key-Pair-Id'] = @key_pair_id
|
94
|
+
signature_content
|
95
|
+
end
|
96
|
+
|
97
|
+
# create the signature string with policy signed
|
98
|
+
def sign_policy(policy)
|
99
|
+
key = OpenSSL::PKey::RSA.new(@private_key)
|
100
|
+
key.sign(OpenSSL::Digest::SHA1.new, policy)
|
101
|
+
end
|
102
|
+
|
103
|
+
# create canned policy that used for signing
|
104
|
+
def canned_policy(resource, expires)
|
105
|
+
json_hash = {
|
106
|
+
'Statement' => [
|
107
|
+
'Resource' => resource,
|
108
|
+
'Condition' => {
|
109
|
+
'DateLessThan' => {'AWS:EpochTime' => expires}
|
110
|
+
}
|
111
|
+
]
|
112
|
+
}
|
113
|
+
JSON.dump(json_hash)
|
114
|
+
end
|
115
|
+
|
116
|
+
def encode(policy)
|
117
|
+
Base64.encode64(policy).gsub(/[+=\/]/, '+' => '-', '=' => '_', '/' => '~')
|
118
|
+
end
|
119
|
+
|
120
|
+
def key_pair_id(options)
|
121
|
+
if options[:key_pair_id].nil? or options[:key_pair_id] == ''
|
122
|
+
raise ArgumentError, ":key_pair_id must not be blank"
|
123
|
+
else
|
124
|
+
options[:key_pair_id]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def private_key(options)
|
129
|
+
if options[:private_key]
|
130
|
+
options[:private_key]
|
131
|
+
elsif options[:private_key_path]
|
132
|
+
File.open(options[:private_key_path], 'rb') { |f| f.read }
|
133
|
+
else
|
134
|
+
msg = ":private_key or :private_key_path should be provided"
|
135
|
+
raise ArgumentError, msg
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -18,35 +18,23 @@ module Aws
|
|
18
18
|
# )
|
19
19
|
#
|
20
20
|
class UrlSigner
|
21
|
-
|
22
|
-
# @option options [String] :key_pair_id
|
23
|
-
# @option options [String] :private_key
|
24
|
-
# @option options [String] :private_key_path
|
25
|
-
def initialize(options = {})
|
26
|
-
@key_pair_id = key_pair_id(options)
|
27
|
-
@private_key = private_key(options)
|
28
|
-
end
|
21
|
+
include Signer
|
29
22
|
|
30
23
|
# create a signed Amazon CloudFront URL
|
31
24
|
# @param [String] url
|
32
25
|
# @option params [Time, DateTime, Date, String, Integer<timestamp>] :expires
|
33
26
|
# @option params [String<JSON>] :policy
|
34
27
|
def signed_url(url, params = {})
|
35
|
-
|
36
|
-
if url_sections.length < 2
|
37
|
-
raise ArgumentError, "Invaild URL:#{url}"
|
38
|
-
end
|
39
|
-
# removing wildcard character to get real scheme
|
40
|
-
scheme = url_sections[0].gsub('*', '')
|
41
|
-
uri = "#{scheme}://#{url_sections[1]}"
|
28
|
+
scheme, uri = scheme_and_uri(url)
|
42
29
|
signed_content = signature(
|
43
|
-
:
|
44
|
-
:
|
45
|
-
:
|
30
|
+
resource: resource(scheme, uri),
|
31
|
+
expires: time(params[:expires]),
|
32
|
+
policy: params[:policy]
|
46
33
|
)
|
47
34
|
|
48
35
|
start_flag = URI.parse(uri).query ? '&' : '?'
|
49
|
-
|
36
|
+
signature = signed_content.map{ |k, v| "#{k}=#{v}" }.join('&').gsub("\n", '')
|
37
|
+
uri = "#{uri}#{start_flag}#{signature}"
|
50
38
|
|
51
39
|
if scheme == 'rtmp'
|
52
40
|
rtmp_url(URI(uri))
|
@@ -55,115 +43,6 @@ module Aws
|
|
55
43
|
end
|
56
44
|
end
|
57
45
|
|
58
|
-
private
|
59
|
-
|
60
|
-
def time(expires)
|
61
|
-
case expires
|
62
|
-
when Time then expires.to_i
|
63
|
-
when DateTime, Date then expires.to_time.to_i
|
64
|
-
when String then Time.parse(expires).to_i
|
65
|
-
when Integer, NIL then expires
|
66
|
-
else
|
67
|
-
msg = "expected a time value for :expires, got `#{expires.class}'"
|
68
|
-
raise ArgumentError, msg
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
# create a relative signed URL for RTMP distribution
|
73
|
-
def rtmp_url(uri)
|
74
|
-
result = uri.path.gsub(' ', '/')
|
75
|
-
result[0] = ''
|
76
|
-
if uri.query
|
77
|
-
"#{result}?#{uri.query}"
|
78
|
-
else
|
79
|
-
result
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
# prepare resource for signing
|
84
|
-
def resource(scheme, url)
|
85
|
-
case scheme
|
86
|
-
when 'http', 'http*', 'https' then url
|
87
|
-
when 'rtmp'
|
88
|
-
url_info = URI.parse(url)
|
89
|
-
path = url_info.path
|
90
|
-
path[0] = ''
|
91
|
-
resource_content = "#{File.dirname(path)}/#{File.basename(path)}".gsub(' ', '/')
|
92
|
-
if url_info.query
|
93
|
-
"#{resource_content}?#{uri.query}"
|
94
|
-
else
|
95
|
-
resource_content
|
96
|
-
end
|
97
|
-
else
|
98
|
-
msg = "Invaild URI scheme:#{scheme}.Scheme must be one of: http, https or rtmp."
|
99
|
-
raise ArgumentError, msg
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
# create signed values that used to construct signed URLs
|
104
|
-
# @option param [String] :resource
|
105
|
-
# @option param [Integer<timestamp>] :expires
|
106
|
-
# @option param [String<JSON>] :policy
|
107
|
-
def signature(params = {})
|
108
|
-
signature_content = []
|
109
|
-
if params[:policy]
|
110
|
-
policy = params[:policy].gsub('/\s/s', '')
|
111
|
-
signature_content << "Policy=#{encode(policy)}"
|
112
|
-
elsif params[:resource] && params[:expires]
|
113
|
-
policy = canned_policy(params[:resource], params[:expires])
|
114
|
-
signature_content << "Expires=#{params[:expires]}"
|
115
|
-
else
|
116
|
-
msg = "Either a policy or a resource with an expiration time must be provided."
|
117
|
-
raise ArgumentError, msg
|
118
|
-
end
|
119
|
-
|
120
|
-
signature_content << "Signature=#{encode(sign_policy(policy))}"
|
121
|
-
signature_content << "Key-Pair-Id=#{@key_pair_id}"
|
122
|
-
signature_content.join('&').gsub("\n", '')
|
123
|
-
end
|
124
|
-
|
125
|
-
# create the signature string with policy signed
|
126
|
-
def sign_policy(policy)
|
127
|
-
key = OpenSSL::PKey::RSA.new(@private_key)
|
128
|
-
key.sign(OpenSSL::Digest::SHA1.new, policy)
|
129
|
-
end
|
130
|
-
|
131
|
-
# create canned policy that used for signing
|
132
|
-
def canned_policy(resource, expires)
|
133
|
-
json_hash = {
|
134
|
-
'Statement' => [
|
135
|
-
'Resource' => resource,
|
136
|
-
'Condition' => {
|
137
|
-
'DateLessThan' => {'AWS:EpochTime' => expires}
|
138
|
-
}
|
139
|
-
]
|
140
|
-
}
|
141
|
-
JSON.dump(json_hash)
|
142
|
-
end
|
143
|
-
|
144
|
-
def encode(policy)
|
145
|
-
Base64.encode64(policy).gsub(/[+=\/]/, '+' => '-', '=' => '_', '/' => '~')
|
146
|
-
end
|
147
|
-
|
148
|
-
def key_pair_id(options)
|
149
|
-
if options[:key_pair_id].nil? or options[:key_pair_id] == ''
|
150
|
-
raise ArgumentError, ":key_pair_id must not be blank"
|
151
|
-
else
|
152
|
-
options[:key_pair_id]
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def private_key(options)
|
157
|
-
if options[:private_key]
|
158
|
-
options[:private_key]
|
159
|
-
elsif options[:private_key_path]
|
160
|
-
File.open(options[:private_key_path], 'rb') { |f| f.read }
|
161
|
-
else
|
162
|
-
msg = ":private_key or :private_key_path should be provided"
|
163
|
-
raise ArgumentError, msg
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
46
|
end
|
168
47
|
end
|
169
48
|
end
|
@@ -40,7 +40,9 @@ module Aws
|
|
40
40
|
|
41
41
|
def build_body(api, operation, data)
|
42
42
|
rules = operation.output
|
43
|
-
if
|
43
|
+
if head_operation(operation)
|
44
|
+
""
|
45
|
+
elsif streaming?(rules)
|
44
46
|
data[rules[:payload]]
|
45
47
|
elsif rules[:payload]
|
46
48
|
body_for(api, operation, rules[:payload_member], data[rules[:payload]])
|
@@ -68,6 +70,10 @@ module Aws
|
|
68
70
|
end
|
69
71
|
end
|
70
72
|
|
73
|
+
def head_operation(operation)
|
74
|
+
operation.http_method == "HEAD"
|
75
|
+
end
|
76
|
+
|
71
77
|
end
|
72
78
|
end
|
73
79
|
end
|
data/lib/aws-sdk-core/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-sdk-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.7.
|
4
|
+
version: 2.7.12
|
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: 2017-02-
|
11
|
+
date: 2017-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jmespath
|
@@ -399,6 +399,8 @@ files:
|
|
399
399
|
- lib/aws-sdk-core/clouddirectory.rb
|
400
400
|
- lib/aws-sdk-core/cloudformation.rb
|
401
401
|
- lib/aws-sdk-core/cloudfront.rb
|
402
|
+
- lib/aws-sdk-core/cloudfront/cookie_signer.rb
|
403
|
+
- lib/aws-sdk-core/cloudfront/signer.rb
|
402
404
|
- lib/aws-sdk-core/cloudfront/url_signer.rb
|
403
405
|
- lib/aws-sdk-core/cloudhsm.rb
|
404
406
|
- lib/aws-sdk-core/cloudsearch.rb
|