stormpath-sdk 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f4ee6a6b7b3e99f340ad7056d571cc497cc47163
4
- data.tar.gz: b4191c5270f3d690590d288553609fdef02a4174
3
+ metadata.gz: 39b0f751a08c13d32addaf304b2b82edeaa4c0bf
4
+ data.tar.gz: 03136baf262d23ca52d8580c809500a53c95be39
5
5
  SHA512:
6
- metadata.gz: f7600ac17e42f60a5b62df5d396a5534fa9907b19cbd1ce77115846c7df88dbfe0409e9cba0781f5e9261743cd36d4e3de8844aa7d91a03a84213c4a93f42f6c
7
- data.tar.gz: 8762d8e4df8a3f557a4f2c48505593d89fd27050a5dd9dc6c2a3e6b3d058c1c18bdf69353412b8608dd90cc55f276b4bae6d4e6c11148cac98aec892b507af68
6
+ metadata.gz: be90405ab987f48232ac9bb0cfd55272de9baff5f3e4ae04cb019f92a4ebf740a42181a20b14f63215def4ec1fd2fa1e541a2a560b6887b485c91399358cbb8b
7
+ data.tar.gz: d48ed19deab4469407c6337fdaea4f87eea74fb8f10e943055a95fdc486988da443e17f45b334d00defe860f519635d60928804793aacf498b6a9c8062fe8852
data/CHANGES.md CHANGED
@@ -1,6 +1,18 @@
1
1
  stormpath-sdk-ruby Changelog
2
2
  ============================
3
3
 
4
+ Version 1.5.0
5
+ -------------
6
+
7
+ Released on January 24, 2017
8
+
9
+ - Create AccountLinkingPolicy resource and associate it to Application and Organization
10
+ - Create Twitter provider
11
+ - Implement ApplicationWebConfig on the Application resource
12
+ - Added more specs for basic authentication
13
+ - Refactor codebase
14
+
15
+
4
16
  Version 1.4.0
5
17
  -------------
6
18
 
@@ -38,6 +38,7 @@ module Stormpath
38
38
  autoload :Tenant, 'stormpath-sdk/resource/tenant'
39
39
  autoload :LinkedAccount, 'stormpath-sdk/resource/linked_account'
40
40
  autoload :AccountLink, 'stormpath-sdk/resource/account_link'
41
+ autoload :AccountLinkingPolicy, 'stormpath-sdk/resource/account_linking_policy'
41
42
  autoload :Application, 'stormpath-sdk/resource/application'
42
43
  autoload :Directory, 'stormpath-sdk/resource/directory'
43
44
  autoload :Account, 'stormpath-sdk/resource/account'
@@ -52,6 +53,7 @@ module Stormpath
52
53
  autoload :PasswordResetToken, 'stormpath-sdk/resource/password_reset_token'
53
54
  autoload :VerificationEmail, 'stormpath-sdk/resource/verification_email'
54
55
  autoload :OauthPolicy, 'stormpath-sdk/resource/oauth_policy'
56
+ autoload :ApplicationWebConfig, 'stormpath-sdk/resource/application_web_config'
55
57
  autoload :AccessToken, 'stormpath-sdk/resource/access_token'
56
58
  autoload :RefreshToken, 'stormpath-sdk/resource/refresh_token'
57
59
  autoload :Organization, 'stormpath-sdk/resource/organization'
@@ -103,6 +105,8 @@ module Stormpath
103
105
  autoload :LinkedinProviderData, 'stormpath-sdk/provider/linkedin/linkedin_provider_data'
104
106
  autoload :GithubProvider, 'stormpath-sdk/provider/github/github_provider'
105
107
  autoload :GithubProviderData, 'stormpath-sdk/provider/github/github_provider_data'
108
+ autoload :TwitterProvider, 'stormpath-sdk/provider/twitter/twitter_provider'
109
+ autoload :TwitterProviderData, 'stormpath-sdk/provider/twitter/twitter_provider_data'
106
110
  autoload :SamlProvider, 'stormpath-sdk/provider/saml/saml_provider'
107
111
  autoload :SamlProviderData, 'stormpath-sdk/provider/saml/saml_provider_data'
108
112
  autoload :SamlProviderMetadata, 'stormpath-sdk/provider/saml/saml_provider_metadata'
@@ -118,231 +118,237 @@ class Stormpath::DataStore
118
118
 
119
119
  private
120
120
 
121
- def needs_to_be_fully_qualified?(href)
122
- !href.downcase.start_with? 'http'
123
- end
121
+ def needs_to_be_fully_qualified?(href)
122
+ !href.downcase.start_with? 'http'
123
+ end
124
124
 
125
- def qualify(href)
126
- needs_to_be_fully_qualified?(href) ? @base_url + href : href
127
- end
125
+ def qualify(href)
126
+ needs_to_be_fully_qualified?(href) ? @base_url + href : href
127
+ end
128
128
 
129
- def execute_request(http_method, href, resource=nil, query=nil)
130
- if http_method == 'get' && (cache = cache_for href)
131
- cached_result = cache.get href
132
- return cached_result if cached_result
133
- end
129
+ def execute_request(http_method, href, resource=nil, query=nil)
130
+ if http_method == 'get' && (cache = cache_for href)
131
+ cached_result = cache.get href
132
+ return cached_result if cached_result
133
+ end
134
134
 
135
- body = extract_body_from_resource(resource)
135
+ body = extract_body_from_resource(resource)
136
136
 
137
- request = Request.new(http_method, href, query, Hash.new, body, @api_key)
137
+ request = Request.new(http_method, href, query, Hash.new, body, @api_key)
138
138
 
139
- if resource.try(:form_data?)
140
- apply_form_data_request_headers request
141
- else
142
- apply_default_request_headers request
143
- end
139
+ if resource.try(:form_data?)
140
+ apply_form_data_request_headers request
141
+ else
142
+ apply_default_request_headers request
143
+ end
144
144
 
145
- response = @request_executor.execute_request request
145
+ response = @request_executor.execute_request request
146
146
 
147
- result = response.body.length > 0 ? MultiJson.load(response.body) : ''
147
+ result = response.body.length > 0 ? MultiJson.load(response.body) : ''
148
148
 
149
- if response.error?
150
- error = Stormpath::Resource::Error.new result
151
- raise Stormpath::Error.new error
152
- end
149
+ if response.error?
150
+ error = Stormpath::Resource::Error.new result
151
+ raise Stormpath::Error.new error
152
+ end
153
153
 
154
- if resource.is_a? Stormpath::Provider::AccountAccess
155
- is_new_account = response.http_status == 201
156
- result = {is_new_account: is_new_account, account: result }
157
- end
154
+ if resource.is_a? Stormpath::Provider::AccountAccess
155
+ is_new_account = response.http_status == 201
156
+ result = {is_new_account: is_new_account, account: result }
157
+ end
158
158
 
159
- return if http_method == 'delete'
159
+ return if http_method == 'delete'
160
160
 
161
- if result[HREF_PROP_NAME] and !resource_is_saml_mapping_rules? resource
162
- cache_walk result
163
- else
164
- result
165
- end
161
+ if result[HREF_PROP_NAME] and !resource_is_saml_mapping_rules? resource
162
+ cache_walk result
163
+ else
164
+ result
166
165
  end
166
+ end
167
167
 
168
- def clear_cache_on_delete href
169
- if href =~ custom_data_delete_field_url_regex
170
- href = href.split('/')[0..-2].join('/')
171
- end
172
- clear_cache href
168
+ def clear_cache_on_delete href
169
+ if href =~ custom_data_delete_field_url_regex
170
+ href = href.split('/')[0..-2].join('/')
173
171
  end
172
+ clear_cache href
173
+ end
174
174
 
175
- def custom_data_delete_field_url_regex
176
- /#{@base_url}\/(accounts|groups)\/\w+\/customData\/\w+[\/]{0,1}$/
177
- end
175
+ def custom_data_delete_field_url_regex
176
+ /#{@base_url}\/(accounts|groups)\/\w+\/customData\/\w+[\/]{0,1}$/
177
+ end
178
178
 
179
- def clear_cache(href)
180
- cache = cache_for href
181
- cache.delete href if cache
182
- end
179
+ def clear_cache(href)
180
+ cache = cache_for href
181
+ cache.delete href if cache
182
+ end
183
183
 
184
- def cache_walk(resource)
185
- assert_not_nil resource[HREF_PROP_NAME], "resource must have 'href' property"
186
- items = resource['items']
184
+ def cache_walk(resource)
185
+ assert_not_nil resource[HREF_PROP_NAME], "resource must have 'href' property"
186
+ items = resource['items']
187
187
 
188
- if items # collection resource
189
- resource['items'] = items.map do |item|
190
- cache_walk item
191
- { HREF_PROP_NAME => item[HREF_PROP_NAME] }
192
- end
193
- else # single resource
194
- resource.each do |attr, value|
195
- if value.is_a? Hash and value[HREF_PROP_NAME]
196
- walked = cache_walk value
197
- resource[attr] = { HREF_PROP_NAME => value[HREF_PROP_NAME] }
198
- resource[attr]['items'] = walked['items'] if walked['items']
199
- end
188
+ if items # collection resource
189
+ resource['items'] = items.map do |item|
190
+ cache_walk item
191
+ { HREF_PROP_NAME => item[HREF_PROP_NAME] }
192
+ end
193
+ else # single resource
194
+ resource.each do |attr, value|
195
+ if value.is_a? Hash and value[HREF_PROP_NAME]
196
+ walked = cache_walk value
197
+ resource[attr] = { HREF_PROP_NAME => value[HREF_PROP_NAME] }
198
+ resource[attr]['items'] = walked['items'] if walked['items']
200
199
  end
201
- cache resource if resource.length > 1
202
200
  end
203
- resource
201
+ cache resource if resource.length > 1
204
202
  end
203
+ resource
204
+ end
205
205
 
206
- def cache(resource)
207
- cache = cache_for resource[HREF_PROP_NAME]
208
- cache.put resource[HREF_PROP_NAME], resource if cache
209
- end
206
+ def cache(resource)
207
+ cache = cache_for resource[HREF_PROP_NAME]
208
+ cache.put resource[HREF_PROP_NAME], resource if cache
209
+ end
210
210
 
211
- def cache_for(href)
212
- @cache_manager.get_cache(region_for href)
213
- end
211
+ def cache_for(href)
212
+ @cache_manager.get_cache(region_for href)
213
+ end
214
214
 
215
- def region_for(href)
216
- return nil if href.nil?
217
- if href.include? "/customData"
218
- region = href.split('/')[-1]
219
- else
220
- region = href.split('/')[-2]
221
- end
222
- CACHE_REGIONS.include?(region) ? region : nil
215
+ def region_for(href)
216
+ return nil if href.nil?
217
+ if href.include? "/customData"
218
+ region = href.split('/')[-1]
219
+ else
220
+ region = href.split('/')[-2]
223
221
  end
222
+ CACHE_REGIONS.include?(region) ? region : nil
223
+ end
224
224
 
225
- def apply_default_request_headers(request)
226
- request.http_headers.store 'Accept', 'application/json'
227
- apply_default_user_agent(request)
225
+ def apply_default_request_headers(request)
226
+ request.http_headers.store 'Accept', 'application/json'
227
+ apply_default_user_agent(request)
228
228
 
229
- if request.body and request.body.length > 0
230
- request.http_headers.store 'Content-Type', 'application/json'
231
- end
229
+ if request.body and request.body.length > 0
230
+ request.http_headers.store 'Content-Type', 'application/json'
232
231
  end
232
+ end
233
233
 
234
- def apply_form_data_request_headers(request)
235
- request.http_headers.store 'Content-Type', 'application/x-www-form-urlencoded'
236
- apply_default_user_agent(request)
237
- end
234
+ def apply_form_data_request_headers(request)
235
+ request.http_headers.store 'Content-Type', 'application/x-www-form-urlencoded'
236
+ apply_default_user_agent(request)
237
+ end
238
238
 
239
- def apply_default_user_agent(request)
240
- request.http_headers.store 'User-Agent', 'stormpath-sdk-ruby/' + Stormpath::VERSION +
241
- " ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}" +
242
- " " + Gem::Platform.local.os.to_s + "/" + Gem::Platform.local.version.to_s
243
- end
239
+ def apply_default_user_agent(request)
240
+ request.http_headers.store 'User-Agent', 'stormpath-sdk-ruby/' + Stormpath::VERSION +
241
+ " ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}" +
242
+ " " + Gem::Platform.local.os.to_s + "/" + Gem::Platform.local.version.to_s
243
+ end
244
244
 
245
- def save_resource(href, resource, return_type)
246
- assert_not_nil resource, "resource argument cannot be null."
247
- assert_not_nil return_type, "returnType class cannot be null."
248
- assert_kind_of Stormpath::Resource::Base, resource, "resource argument must be instance of Stormpath::Resource::Base"
245
+ def save_resource(href, resource, return_type)
246
+ assert_not_nil resource, "resource argument cannot be null."
247
+ assert_not_nil return_type, "returnType class cannot be null."
248
+ assert_kind_of Stormpath::Resource::Base, resource, "resource argument must be instance of Stormpath::Resource::Base"
249
249
 
250
- q_href = qualify href
250
+ q_href = qualify href
251
251
 
252
- clear_cache_on_save(resource)
252
+ clear_cache_on_save(resource)
253
253
 
254
- response = execute_request 'post', q_href, resource
254
+ response = execute_request 'post', q_href, resource
255
255
 
256
- instantiate return_type, parse_response(response)
257
- end
256
+ instantiate return_type, parse_response(response)
257
+ end
258
258
 
259
- def parse_response(response)
260
- return {} if response.is_a? String and response.blank?
261
- response.to_hash
262
- end
259
+ def parse_response(response)
260
+ return {} if response.is_a? String and response.blank?
261
+ response.to_hash
262
+ end
263
263
 
264
- def clear_cache_on_save(resource)
265
- if resource.is_a? Stormpath::Resource::CustomDataStorage
266
- clear_custom_data_cache_on_custom_data_storage_save(resource)
267
- elsif resource.is_a? Stormpath::Resource::AccountStoreMapping
268
- clear_application_cache_on_account_store_save(resource)
269
- end
264
+ def clear_cache_on_save(resource)
265
+ if resource.is_a? Stormpath::Resource::CustomDataStorage
266
+ clear_custom_data_cache_on_custom_data_storage_save(resource)
267
+ elsif resource.is_a? Stormpath::Resource::AccountStoreMapping
268
+ clear_application_cache_on_account_store_save(resource)
270
269
  end
270
+ end
271
271
 
272
272
 
273
- def clear_custom_data_cache_on_custom_data_storage_save resource
274
- if resource.dirty_properties.has_key? "customData" and resource.new? == false
275
- cached_href = resource.href + "/customData"
276
- clear_cache cached_href
277
- end
273
+ def clear_custom_data_cache_on_custom_data_storage_save resource
274
+ if resource.dirty_properties.has_key? "customData" and resource.new? == false
275
+ cached_href = resource.href + "/customData"
276
+ clear_cache cached_href
278
277
  end
278
+ end
279
279
 
280
- def clear_application_cache_on_account_store_save resource
281
- if resource.new?
282
- if resource.default_account_store? == true || resource.default_group_store? == true
283
- clear_cache resource.application.href
284
- end
285
- else
286
- if resource.dirty_properties["isDefaultAccountStore"] != nil || resource.dirty_properties["isDefaultGroupStore"] != nil
287
- clear_cache resource.application.href
288
- end
280
+ def clear_application_cache_on_account_store_save resource
281
+ if resource.new?
282
+ if resource.default_account_store? == true || resource.default_group_store? == true
283
+ clear_cache resource.application.href
289
284
  end
290
- end
291
-
292
- def extract_body_from_resource(resource)
293
- return if resource.nil?
294
- form_data = resource.try(:form_data?)
295
-
296
- if form_data
297
- form_request_parse(resource)
298
- else
299
- MultiJson.dump(to_hash(resource))
285
+ else
286
+ if resource.dirty_properties["isDefaultAccountStore"] != nil || resource.dirty_properties["isDefaultGroupStore"] != nil
287
+ clear_cache resource.application.href
300
288
  end
301
289
  end
290
+ end
291
+
292
+ def extract_body_from_resource(resource)
293
+ return if resource.nil?
294
+ form_data = resource.try(:form_data?)
302
295
 
303
- def form_request_parse(resource)
304
- URI.encode_www_form(resource.form_properties.to_a)
296
+ if form_data
297
+ form_request_parse(resource)
298
+ else
299
+ MultiJson.dump(to_hash(resource))
305
300
  end
301
+ end
306
302
 
307
- def to_hash(resource)
308
- Hash.new.tap do |properties|
309
- resource.get_dirty_property_names.each do |name|
310
- ignore_camelcasing = resource_is_custom_data(resource, name)
311
- property = resource.get_property name, ignore_camelcasing: ignore_camelcasing
303
+ def form_request_parse(resource)
304
+ URI.encode_www_form(resource.form_properties.to_a)
305
+ end
312
306
 
313
- # Special use cases are with Custom Data, Provider and ProviderData, their hashes should not be simplified
314
- # As of the implementation for MFA, Phone resource is added too
315
- if property.kind_of?(Hash) and !resource_nested_submittable(resource, name) and name != "items" and name != 'phone'
316
- property = to_simple_reference name, property
317
- end
307
+ def to_hash(resource)
308
+ {}.tap do |properties|
309
+ resource.get_dirty_property_names.each do |name|
310
+ ignore_camelcasing = resource_is_custom_data(resource, name)
311
+ property = resource.get_property name, ignore_camelcasing: ignore_camelcasing
318
312
 
319
- if name == "items" and resource_is_saml_mapping_rules? resource
320
- property = property.map { |item| item.transform_keys { |key| key.to_s.camelize(:lower).to_sym } }
321
- end
313
+ # Special use cases are with Custom Data, Provider and ProviderData, their hashes should not be simplified
314
+ # As of the implementation for MFA, Phone resource is added too
315
+ if property.is_a?(Hash) && !resource_nested_submittable(resource, name) && name != 'items' && name != 'phone'
316
+ property = to_simple_reference name, property
317
+ end
322
318
 
323
- properties.store name, property
319
+ if name == 'items' && resource_is_saml_mapping_rules?(resource)
320
+ property = property.map { |item| item.transform_keys { |key| key.to_s.camelize(:lower).to_sym } }
324
321
  end
322
+
323
+ properties.store name, property
325
324
  end
326
325
  end
326
+ end
327
327
 
328
- def to_simple_reference(property_name, hash)
329
- assert_true hash.key?(HREF_PROP_NAME), "Nested resource '#{property_name}' must have an 'href' property."
328
+ def to_simple_reference(property_name, hash)
329
+ assert_true hash.key?(HREF_PROP_NAME), "Nested resource '#{property_name}' must have an 'href' property."
330
330
 
331
- href = hash[HREF_PROP_NAME]
331
+ href = hash[HREF_PROP_NAME]
332
332
 
333
- { HREF_PROP_NAME => href }
334
- end
333
+ { HREF_PROP_NAME => href }
334
+ end
335
335
 
336
- def resource_nested_submittable resource, name
337
- ['provider', 'providerData', 'accountStore'].include?(name) or resource_is_custom_data(resource, name)
338
- end
336
+ def resource_nested_submittable(resource, name)
337
+ ['provider', 'providerData', 'accountStore'].include?(name) ||
338
+ resource_is_custom_data(resource, name) ||
339
+ resource_is_application_web_config(resource, name)
340
+ end
339
341
 
340
- def resource_is_custom_data resource, name
341
- resource.is_a? Stormpath::Resource::CustomData or name == 'customData'
342
- end
342
+ def resource_is_custom_data(resource, name)
343
+ resource.is_a?(Stormpath::Resource::CustomData) || name == 'customData'
344
+ end
343
345
 
344
- def resource_is_saml_mapping_rules? resource
345
- resource.is_a? Stormpath::Provider::SamlMappingRules
346
- end
346
+ def resource_is_application_web_config(resource, name)
347
+ resource.is_a?(Stormpath::Resource::ApplicationWebConfig) &&
348
+ Stormpath::Resource::ApplicationWebConfig::ENDPOINTS.include?(name.underscore.to_sym)
349
+ end
347
350
 
351
+ def resource_is_saml_mapping_rules?(resource)
352
+ resource.is_a?(Stormpath::Provider::SamlMappingRules)
353
+ end
348
354
  end