azure-storage 0.10.2.preview → 0.11.0.preview
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/lib/azure/storage/autoload.rb +1 -1
- data/lib/azure/storage/blob/blob_service.rb +4 -1
- data/lib/azure/storage/client.rb +7 -7
- data/lib/azure/storage/client_options.rb +13 -1
- data/lib/azure/storage/configurable.rb +3 -1
- data/lib/azure/storage/core/auth/shared_access_signature.rb +1 -1
- data/lib/azure/storage/core/auth/shared_access_signature_generator.rb +198 -74
- data/lib/azure/storage/core/auth/shared_access_signature_signer.rb +2 -3
- data/lib/azure/storage/core/auth/shared_key.rb +1 -0
- data/lib/azure/storage/core/autoload.rb +2 -0
- data/lib/azure/storage/default.rb +8 -2
- data/lib/azure/storage/queue/queue_service.rb +4 -1
- data/lib/azure/storage/service/cors.rb +1 -1
- data/lib/azure/storage/service/cors_rule.rb +1 -1
- data/lib/azure/storage/service/storage_service.rb +5 -2
- data/lib/azure/storage/table/batch.rb +3 -4
- data/lib/azure/storage/table/table_service.rb +6 -2
- data/lib/azure/storage/version.rb +3 -3
- metadata +3 -19
- data/lib/azure/storage/table/auth/shared_key_lite.rb +0 -53
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8eb09fd448c403c8f348d9d50f1edd4f3824876e
|
4
|
+
data.tar.gz: 86f0661c191d66ea65a979e145aea7ef76d97414
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 213bd465a59e3f6cdfbd24bc20e572f386d2d7e7f7d9f6661dd0058d6012f03920160f3d86b5c6b2fa124b484d4e823036e1ae8ae0066498ba16d35d7e53e7b2
|
7
|
+
data.tar.gz: e543a1360919133f26f822c8ae76bca7ec72467805a7ee2aa11cc6a66b2f0b5d4d2f4df0f315ba5f3663754ec652852b5465ec4eb0e56bfe1b2a14a772e281cb
|
@@ -22,6 +22,7 @@
|
|
22
22
|
# THE SOFTWARE.
|
23
23
|
#--------------------------------------------------------------------------
|
24
24
|
require 'base64'
|
25
|
+
require 'azure/storage/core/auth/shared_key'
|
25
26
|
require 'azure/storage/blob/container'
|
26
27
|
require 'azure/storage/blob/blob'
|
27
28
|
require 'azure/storage/blob/block'
|
@@ -37,7 +38,9 @@ module Azure::Storage
|
|
37
38
|
include Azure::Storage::Blob::Container
|
38
39
|
|
39
40
|
def initialize(options = {})
|
40
|
-
|
41
|
+
client_config = options[:client] || Azure::Storage
|
42
|
+
signer = options[:signer] || Azure::Storage::Core::Auth::SharedKey.new(client_config.storage_account_name, client_config.storage_access_key)
|
43
|
+
super(signer, client_config.storage_account_name, options)
|
41
44
|
@host = client.storage_blob_host
|
42
45
|
end
|
43
46
|
|
data/lib/azure/storage/client.rb
CHANGED
@@ -87,20 +87,20 @@ module Azure::Storage
|
|
87
87
|
|
88
88
|
# Azure Blob service client configured from this Azure Storage client instance
|
89
89
|
# @return [Azure::Storage::Blob::BlobService]
|
90
|
-
def
|
91
|
-
@
|
90
|
+
def blob_client(options = {})
|
91
|
+
@blob_client ||= Azure::Storage::Blob::BlobService.new(default_client(options))
|
92
92
|
end
|
93
93
|
|
94
94
|
# Azure Queue service client configured from this Azure Storage client instance
|
95
95
|
# @return [Azure::Storage::Queue::QueueService]
|
96
|
-
def
|
97
|
-
@
|
96
|
+
def queue_client(options = {})
|
97
|
+
@queue_client ||= Azure::Storage::Queue::QueueService.new(default_client(options))
|
98
98
|
end
|
99
99
|
|
100
100
|
# Azure Table service client configured from this Azure Storage client instance
|
101
101
|
# @return [Azure::Storage::Table::TableService]
|
102
|
-
def
|
103
|
-
@
|
102
|
+
def table_client(options = {})
|
103
|
+
@table_client ||= Azure::Storage::Table::TableService.new(default_client(options))
|
104
104
|
end
|
105
105
|
|
106
106
|
class << self
|
@@ -187,4 +187,4 @@ module Azure::Storage
|
|
187
187
|
end
|
188
188
|
|
189
189
|
end
|
190
|
-
end
|
190
|
+
end
|
@@ -230,6 +230,18 @@ module Azure::Storage
|
|
230
230
|
rescue InvalidOptionsError => e
|
231
231
|
end
|
232
232
|
|
233
|
+
# P6 - account name and key or sas with explicit hosts
|
234
|
+
begin
|
235
|
+
results = validated_options(opts,
|
236
|
+
:required => [:storage_account_name],
|
237
|
+
:only_one => [:storage_access_key, :storage_sas_token],
|
238
|
+
:at_least_one => [:storage_blob_host, :storage_table_host, :storage_file_host, :storage_queue_host])
|
239
|
+
results[:use_path_style_uri] = results.key?(:use_path_style_uri)
|
240
|
+
normalize_hosts(results)
|
241
|
+
return results
|
242
|
+
rescue InvalidOptionsError => e
|
243
|
+
end
|
244
|
+
|
233
245
|
raise InvalidOptionsError,"options provided are not valid set: #{opts}" # wrong opts if move to this line
|
234
246
|
end
|
235
247
|
|
@@ -331,4 +343,4 @@ module Azure::Storage
|
|
331
343
|
|
332
344
|
end
|
333
345
|
|
334
|
-
end
|
346
|
+
end
|
@@ -53,7 +53,8 @@ module Azure::Storage
|
|
53
53
|
|
54
54
|
attr_accessor :storage_access_key,
|
55
55
|
:storage_account_name,
|
56
|
-
:storage_connection_string
|
56
|
+
:storage_connection_string,
|
57
|
+
:storage_sas_token
|
57
58
|
|
58
59
|
attr_writer :storage_table_host,
|
59
60
|
:storage_blob_host,
|
@@ -67,6 +68,7 @@ module Azure::Storage
|
|
67
68
|
:storage_access_key,
|
68
69
|
:storage_account_name,
|
69
70
|
:storage_connection_string,
|
71
|
+
:storage_sas_token,
|
70
72
|
:storage_table_host,
|
71
73
|
:storage_blob_host,
|
72
74
|
:storage_queue_host
|
@@ -29,7 +29,7 @@ require 'time'
|
|
29
29
|
require 'uri'
|
30
30
|
|
31
31
|
# @see https://msdn.microsoft.com/library/azure/dn140255.aspx for more information on construction
|
32
|
-
module Azure::Storage
|
32
|
+
module Azure::Storage::Core
|
33
33
|
module Auth
|
34
34
|
class SharedAccessSignature
|
35
35
|
|
@@ -38,12 +38,32 @@ module Azure::Storage
|
|
38
38
|
version: Azure::Storage::Default::STG_VERSION
|
39
39
|
}
|
40
40
|
|
41
|
-
|
41
|
+
SERVICE_TYPE_MAPPING = {
|
42
|
+
b: Azure::Storage::ServiceType::BLOB,
|
43
|
+
t: Azure::Storage::ServiceType::TABLE,
|
44
|
+
q: Azure::Storage::ServiceType::QUEUE,
|
45
|
+
f: Azure::Storage::ServiceType::FILE
|
46
|
+
}
|
47
|
+
|
48
|
+
ACCOUNT_KEY_MAPPINGS = {
|
49
|
+
version: :sv,
|
50
|
+
service: :ss,
|
51
|
+
resource: :srt,
|
52
|
+
permissions: :sp,
|
53
|
+
start: :st,
|
54
|
+
expiry: :se,
|
55
|
+
protocol: :spr,
|
56
|
+
ip_range: :sip
|
57
|
+
}
|
58
|
+
|
59
|
+
SERVICE_KEY_MAPPINGS = {
|
42
60
|
version: :sv,
|
43
61
|
permissions: :sp,
|
44
62
|
start: :st,
|
45
63
|
expiry: :se,
|
46
|
-
identifier: :si
|
64
|
+
identifier: :si,
|
65
|
+
protocol: :spr,
|
66
|
+
ip_range: :sip
|
47
67
|
}
|
48
68
|
|
49
69
|
BLOB_KEY_MAPPINGS = {
|
@@ -56,14 +76,16 @@ module Azure::Storage
|
|
56
76
|
}
|
57
77
|
|
58
78
|
TABLE_KEY_MAPPINGS = {
|
59
|
-
|
79
|
+
table_name: :tn,
|
60
80
|
startpk: :spk,
|
61
81
|
endpk: :epk,
|
62
82
|
startrk: :srk,
|
63
83
|
endrk: :erk
|
64
84
|
}
|
65
85
|
|
66
|
-
|
86
|
+
SERVICE_OPTIONAL_QUERY_PARAMS = [:sp, :si, :sip, :spr, :rscc, :rscd, :rsce, :rscl, :rsct, :spk, :srk, :epk, :erk]
|
87
|
+
|
88
|
+
ACCOUNT_OPTIONAL_QUERY_PARAMS = [:st, :sip, :spr]
|
67
89
|
|
68
90
|
attr :account_name
|
69
91
|
|
@@ -76,132 +98,234 @@ module Azure::Storage
|
|
76
98
|
@signer = Azure::Core::Auth::Signer.new(access_key)
|
77
99
|
end
|
78
100
|
|
79
|
-
# Shared Access Signature for the given path and options
|
80
|
-
# @param path [String] Path of the URI
|
101
|
+
# Service Shared Access Signature Token for the given path and options
|
102
|
+
# @param path [String] Path of the URI or the table name
|
81
103
|
# @param options [Hash]
|
82
104
|
#
|
83
105
|
# ==== Options
|
84
106
|
#
|
85
|
-
# * +:
|
86
|
-
# * +:
|
87
|
-
# * +:
|
88
|
-
#
|
107
|
+
# * +:service+ - String. Required. Service type. 'b' (blob) or 'q' (queue) or 't' (table) or 'f' (file).
|
108
|
+
# * +:resource+ - String. Required. Resource type, 'b' (blob) or 'c' (container) or 'f' (file) or 's' (share).
|
109
|
+
# * +:permissions+ - String. Optional. Combination of 'r', 'a', 'c', w','d','l' in this order for a container.
|
110
|
+
# Combination of 'r', 'a', 'c', 'w', 'd' in this order for a blob.
|
111
|
+
# Combination of 'r', 'c', 'w', 'd', 'l' in this order for a share.
|
112
|
+
# Combination of 'r', 'c', 'w', 'd' in this order for a file.
|
113
|
+
# Combination of 'r', 'a', 'u', 'p' in this order for a queue.
|
114
|
+
# Combination of 'r', 'a', 'u', 'd' in this order for a table.
|
115
|
+
# This option must be omitted if it has been specified in an associated stored access policy.
|
116
|
+
# * +:start+ - String. Optional. UTC Date/Time in ISO8601 format.
|
117
|
+
# * +:expiry+ - String. Optional. UTC Date/Time in ISO8601 format. Default now + 30 minutes.
|
118
|
+
# * +:identifier+ - String. Optional. Identifier for stored access policy.
|
119
|
+
# * +:protocol+ - String. Optional. Permitted protocols.
|
120
|
+
# * +:ip_range+ - String. Optional. An IP address or a range of IP addresses from which to accept requests.
|
89
121
|
#
|
90
|
-
# Below options for
|
91
|
-
# * +:
|
92
|
-
# * +:
|
93
|
-
# * +:
|
94
|
-
# * +:
|
95
|
-
# * +:
|
96
|
-
# * +:content_type+ - String. Response header override. Optional.
|
122
|
+
# Below options for blob serivce only
|
123
|
+
# * +:cache_control+ - String. Optional. Response header override.
|
124
|
+
# * +:content_disposition+ - String. Optional. Response header override.
|
125
|
+
# * +:content_encoding+ - String. Optional. Response header override.
|
126
|
+
# * +:content_language+ - String. Optional. Response header override.
|
127
|
+
# * +:content_type+ - String. Optional. Response header override.
|
97
128
|
#
|
98
|
-
# Below options for table only
|
99
|
-
# * +:startpk+ - String. The start partition key of a specified partition key range.
|
100
|
-
# * +:endpk+ - String. The end partition key of a specified partition key range.
|
101
|
-
# * +:startrk+ - String. The start row key of a specified row key range.
|
102
|
-
# * +:endrk+ - String. The end row key of a specified row key range.
|
103
|
-
def
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
options[:expiry] = Time.parse(options[:expiry]).utc.iso8601 if options[:expiry]
|
109
|
-
options[:expiry] ||= (Time.now + 60*30).utc.iso8601
|
129
|
+
# Below options for table service only
|
130
|
+
# * +:startpk+ - String. Optional but must accompany startrk. The start partition key of a specified partition key range.
|
131
|
+
# * +:endpk+ - String. Optional but must accompany endrk. The end partition key of a specified partition key range.
|
132
|
+
# * +:startrk+ - String. Optional. The start row key of a specified row key range.
|
133
|
+
# * +:endrk+ - String. Optional. The end row key of a specified row key range.
|
134
|
+
def generate_service_sas_token(path, options={})
|
135
|
+
if options.key?(:service)
|
136
|
+
service_type = SERVICE_TYPE_MAPPING[options[:service].to_sym]
|
137
|
+
options.delete(:service)
|
138
|
+
end
|
110
139
|
|
111
|
-
raise InvalidOptionsError,"SAS version cannot be set" if options[:version]
|
140
|
+
raise Azure::Storage::InvalidOptionsError,"SAS version cannot be set" if options[:version]
|
112
141
|
|
113
142
|
options = DEFAULTS.merge(options)
|
114
|
-
valid_mappings =
|
143
|
+
valid_mappings = SERVICE_KEY_MAPPINGS
|
115
144
|
if service_type == Azure::Storage::ServiceType::BLOB
|
116
|
-
options
|
145
|
+
if options[:resource]
|
146
|
+
options.merge!(resource: options[:resource])
|
147
|
+
else
|
148
|
+
options.merge!(resource: 'b')
|
149
|
+
end
|
117
150
|
valid_mappings.merge!(BLOB_KEY_MAPPINGS)
|
118
151
|
elsif service_type == Azure::Storage::ServiceType::TABLE
|
119
|
-
options.merge!(
|
152
|
+
options.merge!(table_name: path)
|
120
153
|
valid_mappings.merge!(TABLE_KEY_MAPPINGS)
|
121
154
|
end
|
122
155
|
|
123
156
|
invalid_options = options.reject { |k,v| valid_mappings.key?(k) }
|
124
|
-
raise InvalidOptionsError,"invalid options #{invalid_options} provided for SAS token generate" if invalid_options.length > 0
|
157
|
+
raise Azure::Storage::InvalidOptionsError,"invalid options #{invalid_options} provided for SAS token generate" if invalid_options.length > 0
|
158
|
+
|
159
|
+
canonicalize_time(options)
|
125
160
|
|
126
|
-
query_hash = Hash[options.map { |k, v| [
|
127
|
-
.reject { |k, v|
|
128
|
-
.merge( sig: @signer.sign(
|
161
|
+
query_hash = Hash[options.map { |k, v| [SERVICE_KEY_MAPPINGS[k], v] }]
|
162
|
+
.reject { |k, v| SERVICE_OPTIONAL_QUERY_PARAMS.include?(k) && v.to_s == '' }
|
163
|
+
.merge( sig: @signer.sign(signable_string_for_service(service_type, path, options)) )
|
129
164
|
|
130
165
|
sas_params = URI.encode_www_form(query_hash)
|
131
166
|
end
|
132
|
-
|
167
|
+
|
133
168
|
# Construct the plaintext to the spec required for signatures
|
134
169
|
# @return [String]
|
135
|
-
def
|
170
|
+
def signable_string_for_service(service_type, path, options)
|
136
171
|
# Order is significant
|
137
172
|
# The newlines from empty strings here are required
|
138
|
-
|
139
|
-
options[:expiry] = Time.parse(options[:expiry]).utc.iso8601 if options[:expiry]
|
140
|
-
|
141
|
-
signable_string =
|
173
|
+
signable_fields =
|
142
174
|
[
|
143
175
|
options[:permissions],
|
144
176
|
options[:start],
|
145
177
|
options[:expiry],
|
146
178
|
canonicalized_resource(service_type, path),
|
147
179
|
options[:identifier],
|
148
|
-
|
180
|
+
options[:ip_range],
|
181
|
+
options[:protocol],
|
182
|
+
Azure::Storage::Default::STG_VERSION
|
183
|
+
]
|
184
|
+
|
185
|
+
signable_fields.concat [
|
149
186
|
options[:cache_control],
|
150
187
|
options[:content_disposition],
|
151
188
|
options[:content_encoding],
|
152
189
|
options[:content_language],
|
153
190
|
options[:content_type]
|
191
|
+
] if service_type == Azure::Storage::ServiceType::BLOB
|
192
|
+
|
193
|
+
signable_fields.concat [
|
194
|
+
options[:startpk],
|
195
|
+
options[:startrk],
|
196
|
+
options[:endpk],
|
197
|
+
options[:endrk]
|
198
|
+
] if service_type == Azure::Storage::ServiceType::TABLE
|
199
|
+
|
200
|
+
signable_fields.join "\n"
|
201
|
+
end
|
202
|
+
|
203
|
+
# Account Shared Access Signature Token for the given options
|
204
|
+
# @param account_name [String] storage account name
|
205
|
+
# @param options [Hash]
|
206
|
+
#
|
207
|
+
# ==== Options
|
208
|
+
#
|
209
|
+
# * +:service+ - String. Required. Accessible services. Combination of 'b' (blob), 'q' (queue), 't' (table), 'f' (file).
|
210
|
+
# * +:resource+ - String. Required. Accessible resource types. Combination of 's' (service), 'c' (container-level), 'o'(object-level).
|
211
|
+
# * +:permissions+ - String. Required. Permissions. Combination of 'r' (read), 'w' (write), 'd'(delete), 'l'(list), 'a'(add),
|
212
|
+
# 'c'(create), 'u'(update), 'p'(process). Permissions are only valid if they match
|
213
|
+
# the specified signed resource type; otherwise they are ignored.
|
214
|
+
# * +:start+ - String. Optional. UTC Date/Time in ISO8601 format.
|
215
|
+
# * +:expiry+ - String. Optional. UTC Date/Time in ISO8601 format. Default now + 30 minutes.
|
216
|
+
# * +:protocol+ - String. Optional. Permitted protocols.
|
217
|
+
# * +:ip_range+ - String. Optional. An IP address or a range of IP addresses from which to accept requests.
|
218
|
+
# When specifying a range, note that the range is inclusive.
|
219
|
+
def generate_account_sas_token(options={})
|
220
|
+
raise Azure::Storage::InvalidOptionsError,"SAS version cannot be set" if options[:version]
|
221
|
+
|
222
|
+
options = DEFAULTS.merge(options)
|
223
|
+
valid_mappings = ACCOUNT_KEY_MAPPINGS
|
224
|
+
|
225
|
+
invalid_options = options.reject { |k,v| valid_mappings.key?(k) }
|
226
|
+
raise Azure::Storage::InvalidOptionsError,"invalid options #{invalid_options} provided for SAS token generate" if invalid_options.length > 0
|
227
|
+
|
228
|
+
canonicalize_time(options)
|
229
|
+
|
230
|
+
query_hash = Hash[options.map { |k, v| [ACCOUNT_KEY_MAPPINGS[k], v] }]
|
231
|
+
.reject { |k, v| ACCOUNT_OPTIONAL_QUERY_PARAMS.include?(k) && v.to_s == '' }
|
232
|
+
.merge( sig: @signer.sign(signable_string_for_account(options)) )
|
233
|
+
|
234
|
+
sas_params = URI.encode_www_form(query_hash)
|
235
|
+
end
|
236
|
+
|
237
|
+
# Construct the plaintext to the spec required for signatures
|
238
|
+
# @return [String]
|
239
|
+
def signable_string_for_account(options)
|
240
|
+
# Order is significant
|
241
|
+
# The newlines from empty strings here are required
|
242
|
+
signable_string =
|
243
|
+
[
|
244
|
+
@account_name,
|
245
|
+
options[:permissions],
|
246
|
+
options[:service],
|
247
|
+
options[:resource],
|
248
|
+
options[:start],
|
249
|
+
options[:expiry],
|
250
|
+
options[:ip_range],
|
251
|
+
options[:protocol],
|
252
|
+
Azure::Storage::Default::STG_VERSION,
|
253
|
+
''
|
154
254
|
].join("\n")
|
155
255
|
end
|
156
|
-
|
256
|
+
|
157
257
|
# Return the cononicalized resource representation of the blob resource
|
158
258
|
# @return [String]
|
159
259
|
def canonicalized_resource(service_type, path)
|
160
260
|
"/#{service_type}/#{account_name}#{path.start_with?('/') ? '' : '/'}#{path}"
|
161
261
|
end
|
162
262
|
|
263
|
+
def canonicalize_time(options)
|
264
|
+
options[:start] = Time.parse(options[:start]).utc.iso8601 if options[:start]
|
265
|
+
options[:expiry] = Time.parse(options[:expiry]).utc.iso8601 if options[:expiry]
|
266
|
+
options[:expiry] ||= (Time.now + 60*30).utc.iso8601
|
267
|
+
end
|
268
|
+
|
163
269
|
# A customised URI reflecting options for the resource signed with Shared Access Signature
|
164
|
-
# @param uri
|
165
|
-
# @param
|
270
|
+
# @param uri [URI] uri to resource including query options
|
271
|
+
# @param use_account_sas [Boolean] Whether uses account SAS
|
272
|
+
# @param options [Hash]
|
166
273
|
#
|
167
274
|
# ==== Options
|
168
275
|
#
|
169
|
-
# * +:
|
170
|
-
# * +:
|
171
|
-
# * +:
|
172
|
-
# * +:
|
276
|
+
# * +:start+ - String. Optional. UTC Date/Time in ISO8601 format.
|
277
|
+
# * +:expiry+ - String. Optional. UTC Date/Time in ISO8601 format. Default now + 30 minutes.
|
278
|
+
# * +:protocol+ - String. Optional. Permitted protocols.
|
279
|
+
# * +:ip_range+ - String. Optional. An IP address or a range of IP addresses from which to accept requests.
|
280
|
+
# When specifying a range, note that the range is inclusive.
|
281
|
+
#
|
282
|
+
# Below options for account SAS only
|
283
|
+
# * +:service+ - String. Required. Accessible services. Combination of 'b' (blob), 'q' (queue), 't' (table), 'f' (file).
|
284
|
+
# * +:resource+ - String. Required. Accessible resource types. Combination of 's' (service), 'c' (container-level), 'o'(object-level).
|
285
|
+
# * +:permissions+ - String. Required. Permissions. Combination of 'r' (read), 'w' (write), 'd'(delete), 'l'(list), 'a'(add),
|
286
|
+
# 'c'(create), 'u'(update), 'p'(process). Permissions are only valid if they match
|
287
|
+
# the specified signed resource type; otherwise they are ignored.
|
288
|
+
#
|
289
|
+
# Below options for service SAS only
|
290
|
+
# * +:service+ - String. Required. Service type. 'b' (blob) or 'q' (queue) or 't' (table) or 'f' (file).
|
291
|
+
# * +:resource+ - String. Required. Resource type, 'b' (blob) or 'c' (container) or 'f' (file) or 's' (share).
|
292
|
+
# * +:identifier+ - String. Optional. Identifier for stored access policy.
|
293
|
+
# * +:permissions+ - String. Optional. Combination of 'r', 'a', 'c', w','d','l' in this order for a container.
|
294
|
+
# Combination of 'r', 'a', 'c', 'w', 'd' in this order for a blob.
|
295
|
+
# Combination of 'r', 'c', 'w', 'd', 'l' in this order for a share.
|
296
|
+
# Combination of 'r', 'c', 'w', 'd' in this order for a file.
|
297
|
+
# Combination of 'r', 'a', 'u', 'p' in this order for a queue.
|
298
|
+
# Combination of 'r', 'a', 'u', 'd' in this order for a table.
|
173
299
|
#
|
174
|
-
# Below options for Blob only
|
175
|
-
# * +:
|
176
|
-
# * +:
|
177
|
-
# * +:
|
178
|
-
# * +:
|
179
|
-
# * +:
|
180
|
-
# * +:content_type+ - String. Response header override. Optional.
|
300
|
+
# Below options for Blob service only
|
301
|
+
# * +:cache_control+ - String. Optional. Response header override.
|
302
|
+
# * +:content_disposition+ - String. Optional. Response header override.
|
303
|
+
# * +:content_encoding+ - String. Optional. Response header override.
|
304
|
+
# * +:content_language+ - String. Optional. Response header override.
|
305
|
+
# * +:content_type+ - String. Optional. Response header override.
|
181
306
|
#
|
182
|
-
# Below options for
|
183
|
-
# * +:
|
184
|
-
# * +:startpk+
|
185
|
-
# * +:endpk+
|
186
|
-
# * +:startrk+
|
187
|
-
# * +:endrk+
|
188
|
-
def signed_uri(uri, options)
|
307
|
+
# Below options for Table service only
|
308
|
+
# * +:table_name+ - String. Required. Table name for SAS.
|
309
|
+
# * +:startpk+ - String. Optional but must accompany startrk. The start partition key of a specified partition key range.
|
310
|
+
# * +:endpk+ - String. Optional but must accompany endrk. The end partition key of a specified partition key range.
|
311
|
+
# * +:startrk+ - String. Optional. The start row key of a specified row key range.
|
312
|
+
# * +:endrk+ - String. Optional. The end row key of a specified row key range.
|
313
|
+
def signed_uri(uri, use_account_sas, options)
|
189
314
|
parsed_query = CGI::parse(uri.query || '').inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
|
190
|
-
|
191
|
-
if parsed_query.has_key?(:restype)
|
192
|
-
options[:resource] = parsed_query[:restype].first == 'container' ? 'c' : 'b'
|
193
|
-
end
|
194
315
|
|
195
316
|
if options[:service_type] == nil and uri.host != nil
|
196
317
|
host_splits = uri.host.split('.')
|
197
|
-
options[:service_type] = host_splits[1] if host_splits.length > 1 && host_splits[0] == account_name
|
318
|
+
options[:service_type] = host_splits[1] if host_splits.length > 1 && host_splits[0] == @account_name
|
198
319
|
end
|
199
320
|
|
200
|
-
sas_params =
|
321
|
+
sas_params = if use_account_sas
|
322
|
+
generate_account_sas_token(options)
|
323
|
+
else
|
324
|
+
generate_service_sas_token(uri.path, options)
|
325
|
+
end
|
201
326
|
|
202
|
-
URI.parse(uri.to_s + (uri.query.nil? ? '?' : '&') + sas_params)
|
327
|
+
result = URI.parse(uri.to_s + (uri.query.nil? ? '?' : '&') + sas_params)
|
203
328
|
end
|
204
|
-
|
205
329
|
end
|
206
330
|
end
|
207
331
|
end
|
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
require 'azure/core/auth/signer'
|
26
26
|
|
27
|
-
module Azure::Storage
|
27
|
+
module Azure::Storage::Core
|
28
28
|
module Auth
|
29
29
|
class SharedAccessSignatureSigner < Azure::Core::Auth::Signer
|
30
30
|
|
@@ -40,8 +40,7 @@ module Azure::Storage
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def sign_request(req)
|
43
|
-
|
44
|
-
URI.parse(ori_uri.to_s + (ori_uri.query.nil? ? '?' : '&') + sas_token.sub(/^\?/,'') + '&api-version=' + Azure::Storage::Default::STG_VERSION)
|
43
|
+
req.uri = URI.parse(req.uri.to_s + (req.uri.query.nil? ? '?' : '&') + sas_token.sub(/^\?/,'') + '&api-version=' + Azure::Storage::Default::STG_VERSION)
|
45
44
|
end
|
46
45
|
|
47
46
|
end
|
@@ -32,6 +32,8 @@ module Azure
|
|
32
32
|
|
33
33
|
module Auth
|
34
34
|
autoload :SharedKey, 'azure/storage/core/auth/shared_key.rb'
|
35
|
+
autoload :SharedAccessSignature, 'azure/storage/core/auth/shared_access_signature_generator.rb'
|
36
|
+
autoload :SharedAccessSignatureSigner, 'azure/storage/core/auth/shared_access_signature_signer.rb'
|
35
37
|
end
|
36
38
|
|
37
39
|
module Filter
|
@@ -98,6 +98,12 @@ module Azure::Storage
|
|
98
98
|
ENV['AZURE_STORAGE_CONNECTION_STRING']
|
99
99
|
end
|
100
100
|
|
101
|
+
# Default storage shared access signature token
|
102
|
+
# @return [String]
|
103
|
+
def storage_sas_token
|
104
|
+
ENV['AZURE_STORAGE_SAS_TOKEN']
|
105
|
+
end
|
106
|
+
|
101
107
|
# Default storage table host
|
102
108
|
# @return [String]
|
103
109
|
def storage_table_host
|
@@ -124,7 +130,7 @@ module Azure::Storage
|
|
124
130
|
end
|
125
131
|
end
|
126
132
|
|
127
|
-
#
|
133
|
+
# Service Types
|
128
134
|
module ServiceType
|
129
135
|
BLOB = 'blob'
|
130
136
|
QUEUE = 'queue'
|
@@ -1074,4 +1080,4 @@ module Azure::Storage
|
|
1074
1080
|
NOT_IMPLEMENTED = 'NotImplemented'
|
1075
1081
|
end
|
1076
1082
|
|
1077
|
-
end
|
1083
|
+
end
|
@@ -21,6 +21,7 @@
|
|
21
21
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
22
|
# THE SOFTWARE.
|
23
23
|
#--------------------------------------------------------------------------
|
24
|
+
require 'azure/storage/core/auth/shared_key'
|
24
25
|
require 'azure/storage/service/storage_service'
|
25
26
|
require 'azure/storage/queue/serialization'
|
26
27
|
|
@@ -30,7 +31,9 @@ module Azure::Storage
|
|
30
31
|
class QueueService < StorageService
|
31
32
|
|
32
33
|
def initialize(options = {})
|
33
|
-
|
34
|
+
client_config = options[:client] || Azure::Storage
|
35
|
+
signer = options[:signer] || Azure::Storage::Core::Auth::SharedKey.new(client_config.storage_account_name, client_config.storage_access_key)
|
36
|
+
super(signer, client_config.storage_account_name, options)
|
34
37
|
@host = @client.storage_queue_host
|
35
38
|
end
|
36
39
|
|
@@ -34,14 +34,17 @@ module Azure::Storage
|
|
34
34
|
#
|
35
35
|
# @param signer [Azure::Core::Auth::Signer] An implementation of Signer used for signing requests.
|
36
36
|
# (optional, Default=Azure::Storage::Auth::SharedKey.new)
|
37
|
-
# @param account_name [String] The account name (optional, Default=Azure.
|
37
|
+
# @param account_name [String] The account name (optional, Default=Azure::Storage.storage_account_name)
|
38
38
|
# @param options [Azure::Storage::Configurable] the client configuration context
|
39
39
|
def initialize(signer=nil, account_name=nil, options = {})
|
40
40
|
options[:client] = Azure::Storage if options[:client] == nil
|
41
41
|
client_config = options[:client]
|
42
42
|
signer = signer || Azure::Storage::Core::Auth::SharedKey.new(
|
43
43
|
client_config.storage_account_name,
|
44
|
-
client_config.storage_access_key)
|
44
|
+
client_config.storage_access_key) if client_config.storage_access_key
|
45
|
+
signer = signer || Azure::Storage::Core::Auth::SharedAccessSignatureSigner.new(
|
46
|
+
client_config.storage_account_name,
|
47
|
+
client_config.storage_sas_token)
|
45
48
|
super(signer, account_name, options)
|
46
49
|
end
|
47
50
|
|
@@ -21,7 +21,7 @@
|
|
21
21
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
22
|
# THE SOFTWARE.
|
23
23
|
#--------------------------------------------------------------------------
|
24
|
-
require '
|
24
|
+
require 'securerandom'
|
25
25
|
|
26
26
|
require 'azure/core/http/http_error'
|
27
27
|
require 'azure/storage/table/serialization'
|
@@ -63,9 +63,8 @@ module Azure::Storage
|
|
63
63
|
@operations = []
|
64
64
|
@entity_keys = []
|
65
65
|
@table_service = Azure::Storage::Table::TableService.new
|
66
|
-
|
67
|
-
@
|
68
|
-
@changeset_id = "changeset_" + uuid.generate
|
66
|
+
@batch_id = "batch_" + SecureRandom.uuid
|
67
|
+
@changeset_id = "changeset_" + SecureRandom.uuid
|
69
68
|
|
70
69
|
self.instance_eval(&block) if block_given?
|
71
70
|
end
|
@@ -310,7 +310,9 @@ module Azure::Storage
|
|
310
310
|
query = { }
|
311
311
|
query["timeout"] = options[:timeout].to_s if options[:timeout]
|
312
312
|
|
313
|
-
uri = entities_uri(table_name,
|
313
|
+
uri = entities_uri(table_name,
|
314
|
+
entity_values[:PartitionKey] || entity_values['PartitionKey'],
|
315
|
+
entity_values[:RowKey] || entity_values["RowKey"], query)
|
314
316
|
|
315
317
|
headers = {}
|
316
318
|
headers["If-Match"] = if_match || "*" unless options[:create_if_not_exists]
|
@@ -348,7 +350,9 @@ module Azure::Storage
|
|
348
350
|
query = { }
|
349
351
|
query["timeout"] = options[:timeout].to_s if options[:timeout]
|
350
352
|
|
351
|
-
uri = entities_uri(table_name,
|
353
|
+
uri = entities_uri(table_name,
|
354
|
+
entity_values[:PartitionKey] || entity_values['PartitionKey'],
|
355
|
+
entity_values[:RowKey] || entity_values['RowKey'], query)
|
352
356
|
|
353
357
|
headers = { "X-HTTP-Method"=> "MERGE" }
|
354
358
|
headers["If-Match"] = if_match || "*" unless options[:create_if_not_exists]
|
@@ -27,8 +27,8 @@ module Azure
|
|
27
27
|
class Version
|
28
28
|
# Fields represent the parts defined in http://semver.org/
|
29
29
|
MAJOR = 0 unless defined? MAJOR
|
30
|
-
MINOR =
|
31
|
-
UPDATE =
|
30
|
+
MINOR = 11 unless defined? MINOR
|
31
|
+
UPDATE = 0 unless defined? UPDATE
|
32
32
|
PRE = 'preview' unless defined? PRE
|
33
33
|
|
34
34
|
class << self
|
@@ -43,4 +43,4 @@ module Azure
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
46
|
-
end
|
46
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: azure-storage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0.preview
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Microsoft Corporation
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -136,20 +136,6 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0.19'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: uuid
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - "~>"
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '2.0'
|
146
|
-
type: :runtime
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - "~>"
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '2.0'
|
153
139
|
- !ruby/object:Gem::Dependency
|
154
140
|
name: dotenv
|
155
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -297,7 +283,6 @@ files:
|
|
297
283
|
- lib/azure/storage/service/storage_service.rb
|
298
284
|
- lib/azure/storage/service/storage_service_properties.rb
|
299
285
|
- lib/azure/storage/table/auth/shared_key.rb
|
300
|
-
- lib/azure/storage/table/auth/shared_key_lite.rb
|
301
286
|
- lib/azure/storage/table/batch.rb
|
302
287
|
- lib/azure/storage/table/batch_response.rb
|
303
288
|
- lib/azure/storage/table/edmtype.rb
|
@@ -327,9 +312,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
327
312
|
version: 1.3.1
|
328
313
|
requirements: []
|
329
314
|
rubyforge_project:
|
330
|
-
rubygems_version: 2.
|
315
|
+
rubygems_version: 2.5.1
|
331
316
|
signing_key:
|
332
317
|
specification_version: 4
|
333
318
|
summary: Official Ruby client library to consume Azure Storage services
|
334
319
|
test_files: []
|
335
|
-
has_rdoc:
|
@@ -1,53 +0,0 @@
|
|
1
|
-
#-------------------------------------------------------------------------
|
2
|
-
# # Copyright (c) Microsoft and contributors. All rights reserved.
|
3
|
-
#
|
4
|
-
# The MIT License(MIT)
|
5
|
-
|
6
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
# of this software and associated documentation files(the "Software"), to deal
|
8
|
-
# in the Software without restriction, including without limitation the rights
|
9
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
|
10
|
-
# copies of the Software, and to permit persons to whom the Software is
|
11
|
-
# furnished to do so, subject to the following conditions :
|
12
|
-
|
13
|
-
# The above copyright notice and this permission notice shall be included in
|
14
|
-
# all copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
19
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
-
# THE SOFTWARE.
|
23
|
-
#--------------------------------------------------------------------------
|
24
|
-
require 'azure/storage/table/auth/shared_key'
|
25
|
-
|
26
|
-
module Azure::Storage
|
27
|
-
module Table
|
28
|
-
module Auth
|
29
|
-
class SharedKeyLite < SharedKey
|
30
|
-
# Public: The name of the strategy.
|
31
|
-
#
|
32
|
-
# Returns a String.
|
33
|
-
def name
|
34
|
-
'SharedKeyLite'
|
35
|
-
end
|
36
|
-
|
37
|
-
# Generate the string to sign.
|
38
|
-
#
|
39
|
-
# verb - The HTTP request method.
|
40
|
-
# uri - The URI of the request we're signing.
|
41
|
-
# headers - A Hash of HTTP request headers.
|
42
|
-
#
|
43
|
-
# Returns a plain text string.
|
44
|
-
def signable_string(method, uri, headers)
|
45
|
-
[
|
46
|
-
headers.fetch('Date') { headers.fetch('x-ms-date') },
|
47
|
-
canonicalized_resource(uri)
|
48
|
-
].join("\n")
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|