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
@@ -1,22 +1,26 @@
1
- module Stormpath::Resource::AccountOverrides
2
- extend ActiveSupport::Concern
1
+ module Stormpath
2
+ module Resource
3
+ module AccountOverrides
4
+ extend ActiveSupport::Concern
3
5
 
4
- included do
5
- def create_account account, registration_workflow_enabled=nil
6
- href = accounts.href
7
- if registration_workflow_enabled == false
8
- href += "?registrationWorkflowEnabled=#{registration_workflow_enabled.to_s}"
9
- end
6
+ included do
7
+ def create_account(account, registration_workflow_enabled = nil)
8
+ href = accounts.href
9
+ if registration_workflow_enabled == false
10
+ href += "?registrationWorkflowEnabled=#{registration_workflow_enabled}"
11
+ end
10
12
 
11
- resource = case account
12
- when Stormpath::Resource::Base
13
- account
14
- else
15
- Stormpath::Resource::Account.new account, client
16
- end
13
+ resource = case account
14
+ when Stormpath::Resource::Base
15
+ account
16
+ else
17
+ Stormpath::Resource::Account.new(account, client)
18
+ end
17
19
 
18
- resource.apply_custom_data_updates_if_necessary
19
- data_store.create href, resource, Stormpath::Resource::Account
20
+ resource.apply_custom_data_updates_if_necessary
21
+ data_store.create(href, resource, Stormpath::Resource::Account)
22
+ end
23
+ end
20
24
  end
21
25
  end
22
26
  end
@@ -13,17 +13,21 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- class Stormpath::Resource::AccountStore < Stormpath::Resource::Instance
17
- def self.new(*args)
18
- href = args.first[HREF_PROP_NAME]
19
- if href =~ /directories/
20
- Stormpath::Resource::Directory.new(*args)
21
- elsif href =~ /group/
22
- Stormpath::Resource::Group.new(*args)
23
- elsif href =~ /organizations/
24
- Stormpath::Resource::Organization.new(*args)
25
- else
26
- raise 'inappropriate type of an account store'
16
+ module Stormpath
17
+ module Resource
18
+ class AccountStore < Stormpath::Resource::Instance
19
+ def self.new(*args)
20
+ href = args.first[HREF_PROP_NAME]
21
+ if href =~ /directories/
22
+ Stormpath::Resource::Directory.new(*args)
23
+ elsif href =~ /group/
24
+ Stormpath::Resource::Group.new(*args)
25
+ elsif href =~ /organizations/
26
+ Stormpath::Resource::Organization.new(*args)
27
+ else
28
+ raise 'inappropriate type of an account store'
29
+ end
30
+ end
27
31
  end
28
32
  end
29
33
  end
@@ -13,23 +13,24 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- class Stormpath::Resource::AccountStoreMapping < Stormpath::Resource::Instance
16
+ module Stormpath
17
+ module Resource
18
+ class AccountStoreMapping < Stormpath::Resource::Instance
19
+ prop_accessor :list_index, :is_default_account_store, :is_default_group_store
17
20
 
18
- prop_accessor :list_index, :is_default_account_store, :is_default_group_store
21
+ belongs_to :application
19
22
 
20
- belongs_to :application
23
+ has_one :account_store
21
24
 
22
- has_one :account_store
25
+ alias default_account_store is_default_account_store
26
+ alias default_account_store? is_default_account_store
23
27
 
24
- alias_method :default_account_store, :is_default_account_store
25
- alias_method :default_account_store?, :is_default_account_store
28
+ alias default_account_store= is_default_account_store=
26
29
 
27
- alias_method :default_account_store=, :is_default_account_store=
28
-
29
- alias_method :default_group_store, :is_default_group_store
30
- alias_method :default_group_store?, :is_default_group_store
31
-
32
- alias_method :default_group_store=, :is_default_group_store=
30
+ alias default_group_store is_default_group_store
31
+ alias default_group_store? is_default_group_store
33
32
 
33
+ alias default_group_store= is_default_group_store=
34
+ end
35
+ end
34
36
  end
35
-
@@ -13,143 +13,154 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- class Stormpath::Resource::Application < Stormpath::Resource::Instance
17
- include Stormpath::Resource::CustomDataStorage
18
- include Stormpath::Resource::AccountOverrides
19
- include UUIDTools
20
-
21
- class LoadError < ArgumentError; end
22
-
23
- prop_accessor :name, :description, :authorized_callback_uris, :status, :authorized_origin_uris
24
- prop_reader :created_at, :modified_at
25
-
26
- belongs_to :tenant
27
-
28
- has_many :accounts, can: [:get, :create]
29
- has_many :password_reset_tokens, can: [:get, :create]
30
- has_many :account_store_mappings, can: [:get, :create]
31
- has_many :groups, can: [:get, :create]
32
- has_many :verification_emails, can: :create
33
- has_many :api_keys
34
-
35
- has_one :default_account_store_mapping, class_name: :accountStoreMapping
36
- has_one :default_group_store_mapping, class_name: :accountStoreMapping
37
- has_one :custom_data
38
- has_one :o_auth_policy, class_name: :oauthPolicy
39
- has_one :web_config, class_name: :applicationWebConfig
40
- has_one :account_linking_policy
41
-
42
- alias_method :oauth_policy, :o_auth_policy
43
-
44
- def self.load(composite_url)
45
- begin
46
- builder = Stormpath::Util::UriBuilder.new(composite_url)
47
- api_key_id, api_key_secret = builder.userinfo.split(':')
48
-
49
- client = Stormpath::Client.new api_key: {
50
- id: api_key_id,
51
- secret: api_key_secret
52
- }
53
-
54
- application_path = builder.uri.path.slice(/\/applications(.)*$/)
55
- client.applications.get(application_path)
56
- rescue
57
- raise LoadError
58
- end
59
- end
60
-
61
- def create_id_site_url(options = {})
62
- base = client.data_store.base_url.sub("v#{Stormpath::DataStore::DEFAULT_API_VERSION}", 'sso')
63
- base += '/logout' if options[:logout]
64
-
65
- raise Stormpath::Oauth::Error.new(:jwt_cb_uri_incorrect) if options[:callback_uri].empty?
66
-
67
- token = JWT.encode(jwt_token_payload(options), client.data_store.api_key.secret, 'HS256')
68
- base + '?jwtRequest=' + token
69
- end
70
-
71
- def handle_id_site_callback(response_url)
72
- assert_not_nil response_url, 'No response provided. Please provide response object.'
73
-
74
- uri = URI(response_url)
75
- params = CGI::parse(uri.query)
76
- token = params["jwtResponse"].first
77
-
78
- begin
79
- jwt_response, _header = JWT.decode(token, client.data_store.api_key.secret)
80
- rescue JWT::ExpiredSignature => error
81
- # JWT raises error if the signature expired, we need to capture this and
82
- # rerase IdSite::Error
83
- raise Stormpath::Oauth::Error.new(:jwt_expired)
84
- end
85
-
86
- id_site_result = Stormpath::IdSite::IdSiteResult.new(jwt_response)
87
-
88
- if id_site_result.jwt_invalid?(api_key_id)
89
- raise Stormpath::Oauth::Error.new(:jwt_invalid)
90
- end
91
-
92
- id_site_result
93
- end
94
-
95
- def send_password_reset_email(email, account_store: nil)
96
- password_reset_token = create_password_reset_token(email, account_store: account_store)
97
- password_reset_token.account
98
- end
99
-
100
- def verify_password_reset_token(token)
101
- password_reset_tokens.get(token).account
102
- end
103
-
104
- def authenticate_account(request)
105
- Stormpath::Authentication::BasicAuthenticator.new(data_store).authenticate(href, request)
106
- end
107
-
108
- def get_provider_account(request)
109
- Stormpath::Provider::AccountResolver.new(data_store, href, request).resolve_provider_account
110
- end
111
-
112
- def authenticate_oauth(request)
113
- Stormpath::Oauth::Authenticator.new(data_store).authenticate(href, request)
114
- end
115
-
116
- private
117
-
118
- def jwt_token_payload(options)
119
- {}.tap do |payload|
120
- payload['iat'] = Time.now.to_i
121
- payload['jti'] = UUID.method(:random_create).call.to_s
122
- payload['iss'] = client.data_store.api_key.id
123
- payload['sub'] = href
124
- payload['cb_uri'] = options[:callback_uri]
125
- payload['path'] = options[:path] || ''
126
- payload['state'] = options[:state] || ''
127
- payload['sof'] = options[:show_organization_field]
128
- payload['onk'] = options[:organization_name_key]
129
- payload['usd'] = options[:use_subdomain]
130
- end.compact
131
- end
132
-
133
- def api_key_id
134
- client.data_store.api_key.id
135
- end
136
-
137
- def create_password_reset_token(email, account_store: nil)
138
- params = { email: email }
139
- params[:account_store] = account_store_to_hash(account_store) if account_store
140
- password_reset_tokens.create(params)
141
- end
16
+ module Stormpath
17
+ module Resource
18
+ class Application < Stormpath::Resource::Instance
19
+ include Stormpath::Resource::CustomDataStorage
20
+ include Stormpath::Resource::AccountOverrides
21
+
22
+ include UUIDTools
23
+
24
+ class LoadError < ArgumentError; end
142
25
 
143
- def account_store_to_hash(account_store)
144
- case account_store
145
- when Stormpath::Resource::Organization
146
- { name_key: account_store.name_key }
147
- when Stormpath::Resource::Group, Stormpath::Resource::Directory
148
- { href: account_store.href }
149
- when Hash
150
- account_store
151
- else
152
- raise ArgumentError, 'Account store has to be passed either as an resource or a hash'
26
+ prop_accessor :name, :description, :authorized_callback_uris, :status, :authorized_origin_uris
27
+ prop_reader :created_at, :modified_at
28
+
29
+ belongs_to :tenant
30
+
31
+ has_many :accounts, can: [:get, :create]
32
+ has_many :password_reset_tokens, can: [:get, :create]
33
+ has_many :account_store_mappings, can: [:get, :create]
34
+ has_many :groups, can: [:get, :create]
35
+ has_many :verification_emails, can: :create
36
+ has_many :api_keys
37
+
38
+ has_one :default_account_store_mapping, class_name: :accountStoreMapping
39
+ has_one :default_group_store_mapping, class_name: :accountStoreMapping
40
+ has_one :custom_data
41
+ has_one :o_auth_policy, class_name: :oauthPolicy
42
+ has_one :web_config, class_name: :applicationWebConfig
43
+ has_one :account_linking_policy
44
+ has_one :saml_policy
45
+
46
+ alias oauth_policy o_auth_policy
47
+
48
+ def self.load(composite_url)
49
+ builder = Stormpath::Util::UriBuilder.new(composite_url)
50
+ api_key_id, api_key_secret = builder.userinfo.split(':')
51
+
52
+ client = Stormpath::Client.new(
53
+ api_key: {
54
+ id: api_key_id,
55
+ secret: api_key_secret
56
+ }
57
+ )
58
+
59
+ application_path = builder.uri.path.slice(/\/applications(.)*$/)
60
+ client.applications.get(application_path)
61
+ rescue
62
+ raise LoadError
63
+ end
64
+
65
+ def create_id_site_url(options = {})
66
+ raise Stormpath::Oauth::Error, :jwt_cb_uri_incorrect if options[:callback_uri].blank?
67
+
68
+ base = client.data_store.base_url.sub("v#{Stormpath::DataStore::DEFAULT_API_VERSION}", 'sso')
69
+ base += '/logout' if options[:logout]
70
+
71
+ token = JWT.encode(jwt_token_payload(options), client.data_store.api_key.secret, 'HS256')
72
+ "#{base}?jwtRequest=#{token}"
73
+ end
74
+
75
+ def handle_id_site_callback(response_url)
76
+ assert_not_nil(response_url, 'No response provided. Please provide response object.')
77
+
78
+ uri = URI(response_url)
79
+ params = CGI.parse(uri.query)
80
+ token = params['jwtResponse'].first
81
+
82
+ begin
83
+ jwt_response, _header = JWT.decode(token, client.data_store.api_key.secret)
84
+ rescue JWT::ExpiredSignature => error
85
+ # JWT raises error if the signature expired, we need to capture this and
86
+ # reraise IdSite::Error
87
+ raise Stormpath::Oauth::Error, :jwt_expired
88
+ end
89
+
90
+ id_site_result = Stormpath::IdSite::IdSiteResult.new(jwt_response)
91
+
92
+ raise Stormpath::Oauth::Error, :jwt_invalid if id_site_result.jwt_invalid?(api_key_id)
93
+
94
+ id_site_result
95
+ end
96
+
97
+ def send_password_reset_email(email, account_store: nil)
98
+ password_reset_token = create_password_reset_token(email, account_store: account_store)
99
+ password_reset_token.account
100
+ end
101
+
102
+ def verify_password_reset_token(token)
103
+ password_reset_tokens.get(token).account
104
+ end
105
+
106
+ def authenticate_account(request)
107
+ Stormpath::Authentication::BasicAuthenticator.new(data_store).authenticate(href, request)
108
+ end
109
+
110
+ def get_provider_account(request)
111
+ Stormpath::Provider::AccountResolver.new(data_store, href, request).resolve_provider_account
112
+ end
113
+
114
+ def authenticate_oauth(request)
115
+ Stormpath::Oauth::Authenticator.new(data_store).authenticate(href, request)
116
+ end
117
+
118
+ def register_service_provider(options = {})
119
+ Stormpath::Authentication::RegisterServiceProvider.new(
120
+ saml_policy.identity_provider, options
121
+ ).call
122
+ end
123
+
124
+ private
125
+
126
+ def jwt_token_payload(options)
127
+ {}.tap do |payload|
128
+ payload[:jti] = UUID.method(:random_create).call.to_s
129
+ payload[:iat] = Time.now.to_i
130
+ payload[:iss] = client.data_store.api_key.id
131
+ payload[:sub] = href
132
+ payload[:state] = options[:state] || ''
133
+ payload[:path] = options[:path] || ''
134
+ payload[:cb_uri] = options[:callback_uri]
135
+ payload[:sof] = options[:show_organization_field]
136
+ payload[:onk] = options[:organization_name_key]
137
+ payload[:usd] = options[:use_subdomain]
138
+ payload[:require_mfa] = options[:require_mfa]
139
+ end.compact
140
+ end
141
+
142
+ def api_key_id
143
+ client.data_store.api_key.id
144
+ end
145
+
146
+ def create_password_reset_token(email, account_store: nil)
147
+ params = { email: email }
148
+ params[:account_store] = account_store_to_hash(account_store) if account_store
149
+ password_reset_tokens.create(params)
150
+ end
151
+
152
+ def account_store_to_hash(account_store)
153
+ case account_store
154
+ when Stormpath::Resource::Organization
155
+ { name_key: account_store.name_key }
156
+ when Stormpath::Resource::Group, Stormpath::Resource::Directory
157
+ { href: account_store.href }
158
+ when Hash
159
+ account_store
160
+ else
161
+ raise ArgumentError, 'Account store has to be passed either as an resource or a hash'
162
+ end
163
+ end
153
164
  end
154
165
  end
155
166
  end
@@ -1,9 +1,13 @@
1
- class Stormpath::Resource::ApplicationWebConfig < Stormpath::Resource::Instance
2
- ENDPOINTS = [:oauth2, :register, :login, :verify_email, :forgot_password, :change_password, :me].freeze
3
- prop_accessor :dns_label, :status, *ENDPOINTS
4
- prop_reader :domain_name, :created_at, :modified_at
1
+ module Stormpath
2
+ module Resource
3
+ class ApplicationWebConfig < Stormpath::Resource::Instance
4
+ ENDPOINTS = [:oauth2, :register, :login, :verify_email, :forgot_password, :change_password, :me].freeze
5
+ prop_accessor :dns_label, :status, *ENDPOINTS
6
+ prop_reader :domain_name, :created_at, :modified_at
5
7
 
6
- has_one :signing_api_key, class_name: :api_key
7
- belongs_to :application
8
- belongs_to :tenant
8
+ has_one :signing_api_key, class_name: :api_key
9
+ belongs_to :application
10
+ belongs_to :tenant
11
+ end
12
+ end
9
13
  end
@@ -19,8 +19,7 @@ module Stormpath
19
19
  extend ActiveSupport::Concern
20
20
 
21
21
  module ClassMethods
22
-
23
- def resource_prop_reader(name, options={})
22
+ def resource_prop_reader(name, options = {})
24
23
  options[:class_name] ||= name
25
24
  resource_class = "Stormpath::Resource::#{options[:class_name].to_s.camelize}".constantize
26
25
  property_name = name.to_s.camelize :lower
@@ -29,10 +28,10 @@ module Stormpath
29
28
  end
30
29
  end
31
30
 
32
- alias_method :has_one, :resource_prop_reader
33
- alias_method :belongs_to, :resource_prop_reader
31
+ alias has_one resource_prop_reader
32
+ alias belongs_to resource_prop_reader
34
33
 
35
- def has_many(name, options={}, &block)
34
+ def has_many(name, options = {}, &block)
36
35
  options[:class_name] ||= name.to_s.singularize
37
36
  item_class = "Stormpath::Resource::#{options[:class_name].to_s.camelize}".constantize
38
37
  property_name = name.to_s.camelize :lower
@@ -42,53 +41,52 @@ module Stormpath
42
41
  href = options[:href] || get_resource_href_property(property_name)
43
42
  collection_href = "#{tenant.send(name).href}" if options[:delegate]
44
43
 
45
- Stormpath::Resource::Collection.new(href, item_class, client,
46
- collection_href: collection_href).tap do |collection|
44
+ Stormpath::Resource::Collection.new(
45
+ href, item_class, client, collection_href: collection_href
46
+ ).tap do |collection|
47
47
 
48
48
  collection.class_eval do
49
- if can.include? :create
49
+ if can.include?(:create)
50
50
  def create(properties_or_resource, options = {})
51
51
  resource = case properties_or_resource
52
- when Stormpath::Resource::Base
53
- properties_or_resource
54
- else
55
- item_class.new properties_or_resource, client
56
- end
57
- data_store.create href, resource, item_class, options
52
+ when Stormpath::Resource::Base
53
+ properties_or_resource
54
+ else
55
+ item_class.new(properties_or_resource, client)
56
+ end
57
+ data_store.create(href, resource, item_class, options)
58
58
  end
59
- end#can.include? :create
59
+ end # can.include? :create
60
60
 
61
61
  if can.include? :get
62
- def get(id_or_href, expansion=nil)
62
+ def get(id_or_href, expansion = nil)
63
63
  item_href = if id_or_href.index '/'
64
- id_or_href
65
- else
66
- "#{href}/#{id_or_href}"
67
- end
68
- data_store.get_resource item_href, item_class, (expansion ? expansion.to_query : nil)
64
+ id_or_href
65
+ else
66
+ "#{href}/#{id_or_href}"
67
+ end
68
+ data_store.get_resource(
69
+ item_href, item_class, (expansion ? expansion.to_query : nil)
70
+ )
69
71
  end
70
- end#can.include? :get
71
- end#collection.class_eval do
72
+ end # can.include? :get
73
+ end # collection.class_eval do
72
74
 
73
75
  collection.class_eval(&block) if block
74
- end#Stormpath::Resource::Collection.new
75
- end#define_method(name)
76
- end#def has_many
77
-
78
- end#module Class Methods
76
+ end # Stormpath::Resource::Collection.new
77
+ end # define_method(name)
78
+ end # def has_many
79
+ end # module Class Methods
79
80
 
80
81
  included do
81
-
82
82
  private
83
83
 
84
84
  def get_resource_property(key, clazz)
85
85
  value = get_property key
86
86
 
87
- return nil if value.nil? and clazz != Stormpath::Resource::CustomData
87
+ return nil if value.nil? && (clazz != Stormpath::Resource::CustomData)
88
88
 
89
- if value.is_a? Hash
90
- resource_href = get_href_from_hash value
91
- end
89
+ resource_href = get_href_from_hash value if value.is_a? Hash
92
90
 
93
91
  key_name = "@_#{key.underscore}"
94
92
 
@@ -105,14 +103,9 @@ module Stormpath
105
103
  def get_resource_href_property(key)
106
104
  value = get_property key
107
105
 
108
- if value.is_a? Hash
109
- get_href_from_hash value
110
- else
111
- nil
112
- end
106
+ get_href_from_hash value if value.is_a? Hash
113
107
  end
114
-
115
- end#included do
116
- end#Associations
117
- end#Resource
118
- end#Stormpath
108
+ end # included do
109
+ end # Associations
110
+ end # Resource
111
+ end # Stormpath