stormpath-sdk 1.6.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
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