stormpath-sdk 1.6.0 → 1.7.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.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +21 -0
  3. data/CHANGES.md +11 -0
  4. data/README.md +23 -25
  5. data/lib/stormpath-sdk.rb +11 -2
  6. data/lib/stormpath-sdk/api_key.rb +0 -1
  7. data/lib/stormpath-sdk/auth/basic_authenticator.rb +7 -7
  8. data/lib/stormpath-sdk/auth/basic_login_attempt.rb +7 -11
  9. data/lib/stormpath-sdk/auth/create_factor.rb +1 -1
  10. data/lib/stormpath-sdk/auth/register_service_provider.rb +41 -0
  11. data/lib/stormpath-sdk/auth/username_password_request.rb +3 -5
  12. data/lib/stormpath-sdk/cache/cache.rb +3 -3
  13. data/lib/stormpath-sdk/cache/cache_entry.rb +2 -2
  14. data/lib/stormpath-sdk/cache/cache_manager.rb +3 -4
  15. data/lib/stormpath-sdk/cache/cache_stats.rb +1 -3
  16. data/lib/stormpath-sdk/cache/disabled_cache_store.rb +5 -8
  17. data/lib/stormpath-sdk/cache/memory_store.rb +1 -1
  18. data/lib/stormpath-sdk/cache/redis_store.rb +4 -4
  19. data/lib/stormpath-sdk/client.rb +35 -33
  20. data/lib/stormpath-sdk/data_store.rb +278 -257
  21. data/lib/stormpath-sdk/error.rb +18 -7
  22. data/lib/stormpath-sdk/http/authc/sauthc1_signer.rb +76 -82
  23. data/lib/stormpath-sdk/http/http_client_request_executor.rb +10 -8
  24. data/lib/stormpath-sdk/http/response.rb +5 -7
  25. data/lib/stormpath-sdk/id_site/id_site_result.rb +5 -6
  26. data/lib/stormpath-sdk/oauth/access_token_authentication_result.rb +5 -9
  27. data/lib/stormpath-sdk/oauth/authenticator.rb +2 -2
  28. data/lib/stormpath-sdk/oauth/error.rb +4 -4
  29. data/lib/stormpath-sdk/oauth/id_site_grant_request.rb +1 -1
  30. data/lib/stormpath-sdk/oauth/password_grant_request.rb +1 -1
  31. data/lib/stormpath-sdk/oauth/refresh_grant_request.rb +2 -2
  32. data/lib/stormpath-sdk/oauth/stormpath_grant_request.rb +2 -2
  33. data/lib/stormpath-sdk/provider/account_access.rb +0 -2
  34. data/lib/stormpath-sdk/provider/account_result.rb +1 -2
  35. data/lib/stormpath-sdk/provider/facebook/facebook_provider.rb +6 -2
  36. data/lib/stormpath-sdk/provider/facebook/facebook_provider_data.rb +7 -3
  37. data/lib/stormpath-sdk/provider/github/github_provider.rb +6 -2
  38. data/lib/stormpath-sdk/provider/github/github_provider_data.rb +6 -2
  39. data/lib/stormpath-sdk/provider/google/google_provider.rb +7 -3
  40. data/lib/stormpath-sdk/provider/google/google_provider_data.rb +6 -2
  41. data/lib/stormpath-sdk/provider/linkedin/linkedin_provider.rb +6 -2
  42. data/lib/stormpath-sdk/provider/linkedin/linkedin_provider_data.rb +6 -2
  43. data/lib/stormpath-sdk/provider/provider.rb +8 -4
  44. data/lib/stormpath-sdk/provider/provider_data.rb +6 -2
  45. data/lib/stormpath-sdk/provider/saml/saml_provider.rb +10 -4
  46. data/lib/stormpath-sdk/provider/saml/saml_provider_data.rb +6 -3
  47. data/lib/stormpath-sdk/provider/stormpath/stormpath_provider.rb +6 -2
  48. data/lib/stormpath-sdk/provider/stormpath/stormpath_provider_data.rb +6 -2
  49. data/lib/stormpath-sdk/provider/twitter/twitter_provider.rb +6 -2
  50. data/lib/stormpath-sdk/provider/twitter/twitter_provider_data.rb +6 -2
  51. data/lib/stormpath-sdk/resource/account.rb +46 -40
  52. data/lib/stormpath-sdk/resource/account_link.rb +9 -5
  53. data/lib/stormpath-sdk/resource/account_linking_policy.rb +8 -4
  54. data/lib/stormpath-sdk/resource/account_membership.rb +1 -1
  55. data/lib/stormpath-sdk/resource/account_overrides.rb +20 -16
  56. data/lib/stormpath-sdk/resource/account_store.rb +15 -11
  57. data/lib/stormpath-sdk/resource/account_store_mapping.rb +14 -13
  58. data/lib/stormpath-sdk/resource/application.rb +147 -136
  59. data/lib/stormpath-sdk/resource/application_web_config.rb +11 -7
  60. data/lib/stormpath-sdk/resource/associations.rb +36 -43
  61. data/lib/stormpath-sdk/resource/attribute_statement_mapping_rules.rb +8 -0
  62. data/lib/stormpath-sdk/resource/base.rb +201 -200
  63. data/lib/stormpath-sdk/resource/challenge.rb +12 -8
  64. data/lib/stormpath-sdk/resource/collection.rb +77 -76
  65. data/lib/stormpath-sdk/resource/custom_data.rb +60 -61
  66. data/lib/stormpath-sdk/resource/custom_data_hash_methods.rb +28 -25
  67. data/lib/stormpath-sdk/resource/custom_data_storage.rb +18 -16
  68. data/lib/stormpath-sdk/resource/directory.rb +37 -60
  69. data/lib/stormpath-sdk/resource/email_verification_token.rb +7 -3
  70. data/lib/stormpath-sdk/resource/error.rb +8 -4
  71. data/lib/stormpath-sdk/resource/expansion.rb +22 -20
  72. data/lib/stormpath-sdk/resource/factor.rb +12 -8
  73. data/lib/stormpath-sdk/resource/field.rb +8 -4
  74. data/lib/stormpath-sdk/resource/group.rb +21 -16
  75. data/lib/stormpath-sdk/resource/group_membership.rb +7 -5
  76. data/lib/stormpath-sdk/resource/instance.rb +10 -6
  77. data/lib/stormpath-sdk/resource/linked_account.rb +7 -3
  78. data/lib/stormpath-sdk/resource/oauth_policy.rb +7 -3
  79. data/lib/stormpath-sdk/resource/organization.rb +14 -10
  80. data/lib/stormpath-sdk/resource/organization_account_store_mapping.rb +8 -4
  81. data/lib/stormpath-sdk/resource/password_reset_token.rb +9 -5
  82. data/lib/stormpath-sdk/resource/phone.rb +8 -4
  83. data/lib/stormpath-sdk/resource/registered_saml_service_provider.rb +8 -0
  84. data/lib/stormpath-sdk/resource/saml_identity_provider.rb +14 -0
  85. data/lib/stormpath-sdk/resource/saml_identity_provider_metadata.rb +9 -0
  86. data/lib/stormpath-sdk/resource/saml_policy.rb +10 -0
  87. data/lib/stormpath-sdk/resource/saml_service_provider.rb +7 -0
  88. data/lib/stormpath-sdk/{provider/saml/saml_mapping_rules.rb → resource/saml_service_provider_metadata.rb} +6 -5
  89. data/lib/stormpath-sdk/resource/saml_service_provider_registration.rb +11 -0
  90. data/lib/stormpath-sdk/resource/schema.rb +8 -4
  91. data/lib/stormpath-sdk/resource/tenant.rb +11 -8
  92. data/lib/stormpath-sdk/resource/user_info_mapping_rules.rb +7 -3
  93. data/lib/stormpath-sdk/resource/utils.rb +7 -10
  94. data/lib/stormpath-sdk/resource/verification_email.rb +7 -3
  95. data/lib/stormpath-sdk/resource/x_509_certificate.rb +7 -0
  96. data/lib/stormpath-sdk/util/assert.rb +1 -3
  97. data/lib/stormpath-sdk/version.rb +2 -2
  98. data/spec/auth/basic_authenticator_spec.rb +28 -24
  99. data/spec/auth/register_service_provider_spec.rb +68 -0
  100. data/spec/auth/sauthc1_signer_spec.rb +8 -4
  101. data/spec/cache/cache_entry_spec.rb +28 -29
  102. data/spec/cache/cache_spec.rb +9 -9
  103. data/spec/cache/cache_stats_spec.rb +1 -1
  104. data/spec/client_spec.rb +63 -63
  105. data/spec/data_store_spec.rb +23 -14
  106. data/spec/oauth/access_token_authentication_result_spec.rb +8 -2
  107. data/spec/provider/account_resolver_spec.rb +6 -4
  108. data/spec/provider/provider_spec.rb +6 -6
  109. data/spec/resource/account_creation_policy_spec.rb +1 -1
  110. data/spec/resource/account_link_spec.rb +7 -15
  111. data/spec/resource/account_spec.rb +17 -17
  112. data/spec/resource/account_store_mapping_spec.rb +16 -22
  113. data/spec/resource/account_store_spec.rb +3 -3
  114. data/spec/resource/application_spec.rb +324 -330
  115. data/spec/resource/base_spec.rb +7 -31
  116. data/spec/resource/collection_spec.rb +63 -114
  117. data/spec/resource/custom_data_spec.rb +1 -1
  118. data/spec/resource/directory_spec.rb +91 -87
  119. data/spec/resource/expansion_spec.rb +10 -10
  120. data/spec/resource/factor_spec.rb +1 -1
  121. data/spec/resource/group_spec.rb +1 -1
  122. data/spec/resource/linked_account_spec.rb +7 -7
  123. data/spec/resource/organization_spec.rb +12 -11
  124. data/spec/resource/phone_spec.rb +1 -1
  125. data/spec/resource/registered_saml_service_provider_spec.rb +35 -0
  126. data/spec/resource/saml_identity_provider_metadata_spec.rb +27 -0
  127. data/spec/resource/saml_identity_provider_spec.rb +94 -0
  128. data/spec/resource/saml_policy_spec.rb +27 -0
  129. data/spec/resource/saml_service_provider_registration_spec.rb +58 -0
  130. data/spec/resource/saml_service_provider_spec.rb +19 -0
  131. data/spec/resource/status_spec.rb +4 -3
  132. data/spec/resource/tenant_spec.rb +4 -6
  133. data/spec/spec_helper.rb +1 -1
  134. data/spec/support/custom_data_save_period.rb +4 -0
  135. data/spec/support/custom_data_storage_behavior.rb +7 -8
  136. data/spec/support/mocked_provider_accounts.rb +101 -101
  137. data/spec/support/mocked_saml_responses.rb +130 -0
  138. data/spec/support/resource_factory.rb +4 -4
  139. data/spec/support/resource_helpers.rb +10 -4
  140. data/spec/support/resource_matchers.rb +4 -4
  141. data/spec/support/test_request_executor.rb +2 -2
  142. metadata +21 -8
  143. data/lib/stormpath-sdk/provider/saml/saml_provider_metadata.rb +0 -19
  144. data/spec/fixtures/response/create_saml_directory.json +0 -26
  145. data/spec/fixtures/response/create_saml_directory_mapping_rules.json +0 -12
  146. data/spec/fixtures/response/get_saml_directory_provider.json +0 -16
  147. data/spec/fixtures/response/get_saml_directory_provider_metadata.json +0 -12
@@ -0,0 +1,8 @@
1
+ module Stormpath
2
+ module Resource
3
+ class AttributeStatementMappingRules < Stormpath::Resource::Instance
4
+ prop_accessor :items
5
+ prop_reader :href, :created_at, :modified_at
6
+ end
7
+ end
8
+ end
@@ -13,257 +13,258 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- class Stormpath::Resource::Base
17
- include Stormpath::Resource::Utils
18
- include Stormpath::Resource::Associations
19
-
20
- HREF_PROP_NAME = "href"
21
- DEFAULT_SERVER_HOST = Stormpath::DataStore::DEFAULT_SERVER_HOST
22
- attr_reader :client, :properties, :dirty_properties
23
-
24
- class << self
25
- def prop_reader(*args)
26
- args.each do |name|
27
- define_method(name) do
28
- get_property name
16
+ module Stormpath
17
+ module Resource
18
+ class Base
19
+ include Stormpath::Resource::Utils
20
+ include Stormpath::Resource::Associations
21
+
22
+ HREF_PROP_NAME = 'href'.freeze
23
+ DEFAULT_SERVER_HOST = Stormpath::DataStore::DEFAULT_SERVER_HOST
24
+ attr_reader :client, :properties, :dirty_properties
25
+
26
+ class << self
27
+ def prop_reader(*args)
28
+ args.each do |name|
29
+ define_method(name) do
30
+ get_property name
31
+ end
32
+ end
29
33
  end
30
- end
31
- end
32
34
 
33
- def prop_writer(*args)
34
- args.each do |name|
35
- define_method("#{name.to_s}=") do |value|
36
- set_property name, value
35
+ def prop_writer(*args)
36
+ args.each do |name|
37
+ define_method("#{name}=") do |value|
38
+ set_property name, value
39
+ end
40
+ end
37
41
  end
38
- end
39
- end
40
42
 
41
- def prop_accessor(*args)
42
- args.each do |name|
43
- prop_reader name
44
- prop_writer name
43
+ def prop_accessor(*args)
44
+ args.each do |name|
45
+ prop_reader name
46
+ prop_writer name
47
+ end
48
+ end
49
+
50
+ def prop_non_printable(*args)
51
+ @non_printable_properties ||= []
52
+ args.each do |name|
53
+ property_name = name.to_s.camelize :lower
54
+ @non_printable_properties << property_name
55
+ end
56
+ end
57
+
58
+ def non_printable_properties
59
+ @non_printable_properties ||= []
60
+ Array.new(@non_printable_properties)
61
+ end
45
62
  end
46
- end
47
63
 
48
- def prop_non_printable(*args)
49
- @non_printable_properties ||= []
50
- args.each do |name|
51
- property_name = name.to_s.camelize :lower
52
- @non_printable_properties << property_name
64
+ def initialize(properties_or_url, client = nil, query = nil)
65
+ properties = case properties_or_url
66
+ when String
67
+ { HREF_PROP_NAME => properties_or_url }
68
+ when Hash
69
+ properties_or_url
70
+ else
71
+ {}
72
+ end
73
+
74
+ @client = client
75
+ @query = query
76
+ @read_lock = Mutex.new
77
+ @write_lock = Mutex.new
78
+ @properties = {}
79
+ @dirty_properties = {}
80
+ @deleted_properties = []
81
+ set_properties properties
53
82
  end
54
- end
55
83
 
56
- def non_printable_properties
57
- @non_printable_properties ||= []
58
- Array.new @non_printable_properties
59
- end
60
- end
84
+ def new?
85
+ prop = read_property HREF_PROP_NAME
61
86
 
62
- def initialize properties_or_url, client=nil, query=nil
63
- properties = case properties_or_url
64
- when String
65
- { HREF_PROP_NAME => properties_or_url }
66
- when Hash
67
- properties_or_url
68
- else
69
- {}
70
- end
71
-
72
- @client = client
73
- @query = query
74
- @read_lock = Mutex.new
75
- @write_lock = Mutex.new
76
- @properties = Hash.new
77
- @dirty_properties = Hash.new
78
- @deleted_properties = Array.new
79
- set_properties properties
80
- end
87
+ if prop.nil?
88
+ true
89
+ else
90
+ prop.respond_to?('empty') && prop.empty?
91
+ end
92
+ end
81
93
 
82
- def new?
83
- prop = read_property HREF_PROP_NAME
94
+ def href
95
+ get_property HREF_PROP_NAME
96
+ end
84
97
 
85
- if prop.nil?
86
- true
87
- else
88
- prop.respond_to? 'empty' and prop.empty?
89
- end
90
- end
98
+ def get_property_names
99
+ @read_lock.lock
91
100
 
92
- def href
93
- get_property HREF_PROP_NAME
94
- end
101
+ begin
102
+ @properties.keys
103
+ ensure
104
+ @read_lock.unlock
105
+ end
106
+ end
95
107
 
96
- def get_property_names
97
- @read_lock.lock
108
+ def get_dirty_property_names
109
+ @read_lock.lock
98
110
 
99
- begin
100
- @properties.keys
101
- ensure
102
- @read_lock.unlock
103
- end
104
- end
111
+ begin
112
+ @dirty_properties.keys
113
+ ensure
114
+ @read_lock.unlock
115
+ end
116
+ end
105
117
 
106
- def get_dirty_property_names
107
- @read_lock.lock
118
+ def set_properties(properties)
119
+ @write_lock.lock
108
120
 
109
- begin
110
- @dirty_properties.keys
111
- ensure
112
- @read_lock.unlock
113
- end
114
- end
121
+ begin
122
+ @properties.clear
123
+ @dirty_properties.clear
124
+ @dirty = false
125
+
126
+ if properties
127
+ @properties = deep_sanitize properties
128
+ @dirty_properties = @properties if new?
129
+ # Don't consider this resource materialized if it is only a reference. A reference is any object that
130
+ # has only one 'href' property.
131
+ href_only = ((@properties.size == 1) && @properties.key?(HREF_PROP_NAME))
132
+ @materialized = !href_only
133
+ else
134
+ @materialized = false
135
+ end
115
136
 
116
- def set_properties properties
117
- @write_lock.lock
118
-
119
- begin
120
- @properties.clear
121
- @dirty_properties.clear
122
- @dirty = false
123
-
124
- if properties
125
- @properties = deep_sanitize properties
126
- @dirty_properties = @properties if new?
127
- # Don't consider this resource materialized if it is only a reference. A reference is any object that
128
- # has only one 'href' property.
129
- href_only = (@properties.size == 1 and @properties.has_key? HREF_PROP_NAME)
130
- @materialized = !href_only
131
- else
132
- @materialized = false
137
+ ensure
138
+ @write_lock.unlock
139
+ end
133
140
  end
134
141
 
135
- ensure
136
- @write_lock.unlock
137
- end
138
- end
142
+ def get_property(name, options = {})
143
+ property_name = name.to_s
139
144
 
140
- def get_property name, options = {}
141
- property_name = name.to_s
145
+ unless options[:ignore_camelcasing] == true
146
+ property_name = property_name.camelize(:lower)
147
+ end
142
148
 
143
- unless options[:ignore_camelcasing] == true
144
- property_name = property_name.camelize(:lower)
145
- end
149
+ if HREF_PROP_NAME != property_name
150
+ # not the href/id, must be a property that requires materialization:
151
+ unless new? || materialized?
146
152
 
147
- if HREF_PROP_NAME != property_name
148
- #not the href/id, must be a property that requires materialization:
149
- unless new? or materialized?
153
+ # only materialize if the property hasn't been set previously (no need to execute a server
154
+ # request since we have the most recent value already):
155
+ present = false
150
156
 
151
- # only materialize if the property hasn't been set previously (no need to execute a server
152
- # request since we have the most recent value already):
153
- present = false
157
+ @read_lock.lock
158
+ begin
159
+ present = @dirty_properties.key? property_name
160
+ ensure
161
+ @read_lock.unlock
162
+ end
154
163
 
155
- @read_lock.lock
156
- begin
157
- present = @dirty_properties.has_key? property_name
158
- ensure
159
- @read_lock.unlock
164
+ unless present
165
+ # exhausted present properties - we require a server call:
166
+ materialize
167
+ end
168
+ end
160
169
  end
161
170
 
162
- unless present
163
- # exhausted present properties - we require a server call:
164
- materialize
165
- end
171
+ read_property property_name
166
172
  end
167
- end
168
173
 
169
- read_property property_name
170
- end
174
+ def set_property(name, value, options = {})
175
+ property_name = name.to_s
171
176
 
172
- def set_property name, value, options={}
173
- property_name = name.to_s
174
-
175
- unless options[:ignore_camelcasing] == true
176
- property_name = property_name.camelize(:lower)
177
- end
177
+ unless options[:ignore_camelcasing] == true
178
+ property_name = property_name.camelize(:lower)
179
+ end
178
180
 
179
- @write_lock.lock
181
+ @write_lock.lock
180
182
 
181
- begin
182
- @properties.store property_name, value
183
- @dirty_properties.store property_name, value
184
- @dirty = true
185
- ensure
186
- @write_lock.unlock
187
- end
188
- end
183
+ begin
184
+ @properties.store property_name, value
185
+ @dirty_properties.store property_name, value
186
+ @dirty = true
187
+ ensure
188
+ @write_lock.unlock
189
+ end
190
+ end
189
191
 
190
- def == other
191
- if other.is_a?(self.class)
192
- href == other.href
193
- else
194
- super
195
- end
196
- end
192
+ def ==(other)
193
+ if other.is_a?(self.class)
194
+ href == other.href
195
+ else
196
+ super
197
+ end
198
+ end
197
199
 
198
- private
200
+ private
199
201
 
200
- def data_store
201
- client.data_store
202
- end
202
+ def data_store
203
+ client.data_store
204
+ end
203
205
 
204
- def materialized?
205
- @materialized
206
- end
206
+ def materialized?
207
+ @materialized
208
+ end
207
209
 
208
- def materialize
209
- clazz = self.class
210
+ def materialize
211
+ clazz = self.class
210
212
 
211
- @write_lock.lock
213
+ @write_lock.lock
212
214
 
213
- begin
214
- resource = data_store.get_resource href, clazz, @query
215
- @properties.replace resource.properties
215
+ begin
216
+ resource = data_store.get_resource href, clazz, @query
217
+ @properties.replace resource.properties
216
218
 
217
- #retain dirty properties:
218
- @properties.merge! @dirty_properties
219
+ # retain dirty properties:
220
+ @properties.merge! @dirty_properties
219
221
 
220
- @materialized = true
221
- ensure
222
- @write_lock.unlock
222
+ @materialized = true
223
+ ensure
224
+ @write_lock.unlock
225
+ end
223
226
  end
224
- end
225
227
 
226
- def printable_property? property_name
227
- !self.class.non_printable_properties.include? property_name
228
- end
228
+ def printable_property?(property_name)
229
+ !self.class.non_printable_properties.include? property_name
230
+ end
229
231
 
230
- def get_href_from_hash(props)
231
- if props and props.is_a? Hash
232
- props[HREF_PROP_NAME]
232
+ def get_href_from_hash(props)
233
+ props[HREF_PROP_NAME] if props && props.is_a?(Hash)
233
234
  end
234
- end
235
235
 
236
- def read_property name
237
- @read_lock.lock
236
+ def read_property(name)
237
+ @read_lock.lock
238
238
 
239
- begin
240
- @properties[name]
241
- ensure
242
- @read_lock.unlock
239
+ begin
240
+ @properties[name]
241
+ ensure
242
+ @read_lock.unlock
243
+ end
243
244
  end
244
- end
245
245
 
246
- def sanitize(properties)
247
- {}.tap do |sanitized_properties|
248
- properties.map do |key, value|
249
- property_name = key.to_s.camelize :lower
250
- sanitized_properties[property_name] =
251
- if (value.kind_of? Hash or value.kind_of? Stormpath::Resource::Base) and property_name != "customData"
252
- deep_sanitize value
253
- else
254
- value
255
- end
246
+ def sanitize(properties)
247
+ {}.tap do |sanitized_properties|
248
+ properties.map do |key, value|
249
+ property_name = key.to_s.camelize :lower
250
+ sanitized_properties[property_name] =
251
+ if (value.is_a?(Hash) || value.is_a?(Stormpath::Resource::Base)) && (property_name != 'customData')
252
+ deep_sanitize value
253
+ else
254
+ value
255
+ end
256
+ end
256
257
  end
257
258
  end
258
- end
259
259
 
260
- def deep_sanitize(hash_or_resource)
261
- case hash_or_resource
262
- when Stormpath::Resource::Base
263
- deep_sanitize hash_or_resource.properties
264
- when Hash
265
- sanitize hash_or_resource
260
+ def deep_sanitize(hash_or_resource)
261
+ case hash_or_resource
262
+ when Stormpath::Resource::Base
263
+ deep_sanitize hash_or_resource.properties
264
+ when Hash
265
+ sanitize hash_or_resource
266
+ end
266
267
  end
267
268
  end
268
-
269
+ end
269
270
  end