stormpath-sdk 1.5.0 → 1.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 39b0f751a08c13d32addaf304b2b82edeaa4c0bf
4
- data.tar.gz: 03136baf262d23ca52d8580c809500a53c95be39
3
+ metadata.gz: 9f08a60486a9c8f8163b91cacc5ed4190d5f3a81
4
+ data.tar.gz: 7ebc9d89ffc3a00137239866b8cb42be81617ac7
5
5
  SHA512:
6
- metadata.gz: be90405ab987f48232ac9bb0cfd55272de9baff5f3e4ae04cb019f92a4ebf740a42181a20b14f63215def4ec1fd2fa1e541a2a560b6887b485c91399358cbb8b
7
- data.tar.gz: d48ed19deab4469407c6337fdaea4f87eea74fb8f10e943055a95fdc486988da443e17f45b334d00defe860f519635d60928804793aacf498b6a9c8062fe8852
6
+ metadata.gz: 8f0f63caa6e142c84858aa23f92f24adc2b7d22802c38b4c472ff0e256b5a60c3328960a621b72dfaf1efd1f5fb446bbd64ab83fd825651a94b8b1e31996b96d
7
+ data.tar.gz: 229efc9202e3a12b95f0a2fa9322801c0948eb5678d300c04f3ec38b94d021649f28665707e822704772c150b19560f16e628780eea939b9be81faea536ffeb3
data/CHANGES.md CHANGED
@@ -1,6 +1,14 @@
1
1
  stormpath-sdk-ruby Changelog
2
2
  ============================
3
3
 
4
+ Version 1.6.0
5
+ -------------
6
+
7
+ Released on January 26, 2017
8
+
9
+ - Implement Social login V2 - user info mapping rules on a directory, custom attributes for Google(hd, display, access_type), provider scope, redirect_uri on social grant requests
10
+
11
+
4
12
  Version 1.5.0
5
13
  -------------
6
14
 
@@ -67,6 +67,7 @@ module Stormpath
67
67
  autoload :Challenge, 'stormpath-sdk/resource/challenge'
68
68
  autoload :Schema, 'stormpath-sdk/resource/schema'
69
69
  autoload :Field, 'stormpath-sdk/resource/field'
70
+ autoload :UserInfoMappingRules, 'stormpath-sdk/resource/user_info_mapping_rules'
70
71
  end
71
72
 
72
73
  module Cache
@@ -158,7 +158,7 @@ class Stormpath::DataStore
158
158
 
159
159
  return if http_method == 'delete'
160
160
 
161
- if result[HREF_PROP_NAME] and !resource_is_saml_mapping_rules? resource
161
+ if result[HREF_PROP_NAME] && !resource_is_saml_mapping_rules?(resource) && !user_info_mapping_rules?(resource)
162
162
  cache_walk result
163
163
  else
164
164
  result
@@ -348,6 +348,10 @@ class Stormpath::DataStore
348
348
  Stormpath::Resource::ApplicationWebConfig::ENDPOINTS.include?(name.underscore.to_sym)
349
349
  end
350
350
 
351
+ def user_info_mapping_rules?(resource)
352
+ resource.is_a?(Stormpath::Resource::UserInfoMappingRules)
353
+ end
354
+
351
355
  def resource_is_saml_mapping_rules?(resource)
352
356
  resource.is_a?(Stormpath::Provider::SamlMappingRules)
353
357
  end
@@ -1,14 +1,15 @@
1
1
  module Stormpath
2
2
  module Oauth
3
3
  class SocialGrant < Stormpath::Resource::Base
4
- prop_accessor :grant_type, :provider_id, :code, :access_token
4
+ prop_accessor :grant_type, :provider_id, :code, :access_token, :redirect_uri
5
5
 
6
6
  def form_properties
7
7
  {
8
8
  grant_type: grant_type,
9
9
  providerId: provider_id,
10
10
  code: code,
11
- accessToken: access_token
11
+ accessToken: access_token,
12
+ redirectUri: redirect_uri
12
13
  }
13
14
  end
14
15
 
@@ -16,6 +17,7 @@ module Stormpath
16
17
  set_property :provider_id, request.provider_id
17
18
  set_property :code, request.code if request.code
18
19
  set_property :access_token, request.access_token if request.access_token
20
+ set_property :redirect_uri, request.redirect_uri if request.redirect_uri
19
21
  set_property :grant_type, request.grant_type
20
22
  end
21
23
 
@@ -1,12 +1,13 @@
1
1
  module Stormpath
2
2
  module Oauth
3
3
  class SocialGrantRequest
4
- attr_accessor :grant_type, :provider_id, :code, :access_token
4
+ attr_accessor :grant_type, :provider_id, :code, :access_token, :redirect_uri
5
5
 
6
6
  def initialize(provider_id, options = {})
7
7
  @provider_id = provider_id.to_s
8
8
  @code = options[:code]
9
9
  @access_token = options[:access_token]
10
+ @redirect_uri = options[:redirect_uri]
10
11
  @grant_type = 'stormpath_social'
11
12
  end
12
13
  end
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright 2014 Stormpath, Inc.
2
+ # Copyright 2016 Stormpath, Inc.
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
5
5
  # you may not use this file except in compliance with the License.
@@ -33,6 +33,8 @@ module Stormpath
33
33
  end
34
34
 
35
35
  def provider_data
36
+ # TODO: need to add an options hash and pass all attributes from the providers?
37
+ # https://stormpath.atlassian.net/wiki/display/AM/Social+Login+V2/#SocialLoginV2-ClientAPIChanges
36
38
  @provider_data ||= {}.tap do |body|
37
39
  body[request.token_type.to_s.camelize(:lower)] = request.token_value
38
40
  body['providerId'] = request.provider
@@ -15,4 +15,4 @@
15
15
  #
16
16
  class Stormpath::Provider::FacebookProvider < Stormpath::Provider::Provider
17
17
  prop_reader :client_id, :client_secret
18
- end
18
+ end
@@ -14,5 +14,6 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  class Stormpath::Provider::GoogleProvider < Stormpath::Provider::Provider
17
+ prop_accessor :hd, :display, :access_type
17
18
  prop_reader :client_id, :client_secret, :redirect_uri
18
- end
19
+ end
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright 2014 Stormpath, Inc.
2
+ # Copyright 2016 Stormpath, Inc.
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
5
5
  # you may not use this file except in compliance with the License.
@@ -13,6 +13,9 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- class Stormpath::Provider::Provider < Stormpath::Resource::Base
16
+ class Stormpath::Provider::Provider < Stormpath::Resource::Instance
17
+ prop_accessor :scope
17
18
  prop_reader :provider_id, :created_at, :modified_at
18
- end
19
+
20
+ has_one :user_info_mapping_rules
21
+ end
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright 2014 Stormpath, Inc.
2
+ # Copyright 2016 Stormpath, Inc.
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
5
5
  # you may not use this file except in compliance with the License.
@@ -14,5 +14,5 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  class Stormpath::Provider::ProviderData < Stormpath::Resource::Base
17
- prop_reader :provider_id, :created_at, :modified_at
18
- end
17
+ prop_reader :provider_id, :created_at, :modified_at, :user_info
18
+ end
@@ -59,19 +59,17 @@ class Stormpath::Resource::Application < Stormpath::Resource::Instance
59
59
  end
60
60
 
61
61
  def create_id_site_url(options = {})
62
- base = client.data_store.base_url.sub("v" + Stormpath::DataStore::DEFAULT_API_VERSION.to_s, "sso")
62
+ base = client.data_store.base_url.sub("v#{Stormpath::DataStore::DEFAULT_API_VERSION}", 'sso')
63
63
  base += '/logout' if options[:logout]
64
64
 
65
- if options[:callback_uri].empty?
66
- raise Stormpath::Oauth::Error.new(:jwt_cb_uri_incorrect)
67
- end
65
+ raise Stormpath::Oauth::Error.new(:jwt_cb_uri_incorrect) if options[:callback_uri].empty?
68
66
 
69
67
  token = JWT.encode(jwt_token_payload(options), client.data_store.api_key.secret, 'HS256')
70
68
  base + '?jwtRequest=' + token
71
69
  end
72
70
 
73
71
  def handle_id_site_callback(response_url)
74
- assert_not_nil response_url, "No response provided. Please provide response object."
72
+ assert_not_nil response_url, 'No response provided. Please provide response object.'
75
73
 
76
74
  uri = URI(response_url)
77
75
  params = CGI::parse(uri.query)
@@ -99,11 +97,11 @@ class Stormpath::Resource::Application < Stormpath::Resource::Instance
99
97
  password_reset_token.account
100
98
  end
101
99
 
102
- def verify_password_reset_token token
100
+ def verify_password_reset_token(token)
103
101
  password_reset_tokens.get(token).account
104
102
  end
105
103
 
106
- def authenticate_account request
104
+ def authenticate_account(request)
107
105
  Stormpath::Authentication::BasicAuthenticator.new(data_store).authenticate(href, request)
108
106
  end
109
107
 
@@ -118,20 +116,18 @@ class Stormpath::Resource::Application < Stormpath::Resource::Instance
118
116
  private
119
117
 
120
118
  def jwt_token_payload(options)
121
- payload = {
122
- 'iat' => Time.now.to_i,
123
- 'jti' => UUID.method(:random_create).call.to_s,
124
- 'iss' => client.data_store.api_key.id,
125
- 'sub' => href,
126
- 'cb_uri' => options[:callback_uri],
127
- 'path' => options[:path] || '',
128
- 'state' => options[:state] || '',
129
- }
130
-
131
- payload["sof"] = options[:show_organization_field] if options[:show_organization_field]
132
- payload["onk"] = options[:organization_name_key] if options[:organization_name_key]
133
- payload["usd"] = options[:use_subdomain] if options[:use_subdomain]
134
- payload
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
135
131
  end
136
132
 
137
133
  def api_key_id
@@ -29,6 +29,7 @@ class Stormpath::Resource::Directory < Stormpath::Resource::Instance
29
29
  has_one :password_policy
30
30
  has_one :account_creation_policy
31
31
  has_one :account_schema, class_name: :schema
32
+ delegate :user_info_mapping_rules, to: :provider
32
33
 
33
34
  def provider
34
35
  internal_instance = instance_variable_get "@_provider"
@@ -46,17 +47,17 @@ class Stormpath::Resource::Directory < Stormpath::Resource::Instance
46
47
  end
47
48
 
48
49
  def provider_metadata
49
- metadata_href = provider.service_provider_metadata["href"]
50
+ metadata_href = provider.service_provider_metadata['href']
50
51
  data_store.get_resource metadata_href, Stormpath::Provider::SamlProviderMetadata
51
52
  end
52
53
 
53
54
  def statement_mapping_rules
54
- metadata_href = provider.attribute_statement_mapping_rules["href"]
55
+ metadata_href = provider.attribute_statement_mapping_rules['href']
55
56
  data_store.get_resource metadata_href, Stormpath::Provider::SamlMappingRules
56
57
  end
57
58
 
58
59
  def create_attribute_mappings(mappings)
59
- mappings.set_options(href: provider.attribute_statement_mapping_rules["href"])
60
+ mappings.set_options(href: provider.attribute_statement_mapping_rules['href'])
60
61
  data_store.create mappings.href, mappings, Stormpath::Provider::SamlMappingRules
61
62
  end
62
63
  end
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright 2012 Stormpath, Inc.
2
+ # Copyright 2016 Stormpath, Inc.
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
5
5
  # you may not use this file except in compliance with the License.
@@ -15,12 +15,10 @@
15
15
  #
16
16
  class Stormpath::Resource::Instance < Stormpath::Resource::Base
17
17
  def save
18
- data_store.save self
18
+ data_store.save(self)
19
19
  end
20
20
 
21
21
  def delete
22
- unless new?
23
- data_store.delete self
24
- end
22
+ data_store.delete(self) unless new?
25
23
  end
26
24
  end
@@ -0,0 +1,19 @@
1
+ #
2
+ # Copyright 2016 Stormpath, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ class Stormpath::Resource::UserInfoMappingRules < Stormpath::Resource::Instance
17
+ prop_accessor :items
18
+ prop_reader :href, :created_at, :modified_at
19
+ end
@@ -14,6 +14,6 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  module Stormpath
17
- VERSION = '1.5.0'
18
- VERSION_DATE = '2017-01-24'
17
+ VERSION = '1.6.0'
18
+ VERSION_DATE = '2017-01-26'
19
19
  end
@@ -290,7 +290,7 @@ properties
290
290
  context 'pagination' do
291
291
  let!(:applications) do
292
292
  (0..2).to_a.map do |index|
293
- test_api_client.applications.create(application_attrs(name: "ruby-sdk-test-#{index}"))
293
+ test_api_client.applications.create(application_attrs(name: "ruby-sdk-test-#{index}-#{random_number}"))
294
294
  end
295
295
  end
296
296
 
@@ -537,14 +537,13 @@ properties
537
537
 
538
538
  describe '#organization' do
539
539
  context 'search' do
540
+ let(:random_org_name) { "ruby-org-#{random_number}" }
540
541
  let!(:organization) do
541
- test_api_client.organizations.create(organization_attrs(name: 'ruby-org'))
542
+ test_api_client.organizations.create(organization_attrs(name: random_org_name))
542
543
  end
543
544
 
544
545
  context 'by any attribute' do
545
- let(:search_results) do
546
- test_api_client.organizations.search('ruby-org')
547
- end
546
+ let(:search_results) { test_api_client.organizations.search(random_org_name) }
548
547
 
549
548
  it 'returns the application' do
550
549
  expect(search_results.count).to eq 1
@@ -552,7 +551,7 @@ properties
552
551
  end
553
552
 
554
553
  context 'by an explicit attribute' do
555
- let(:search_results) { test_api_client.organizations.search(name: 'ruby-org') }
554
+ let(:search_results) { test_api_client.organizations.search(name: random_org_name) }
556
555
 
557
556
  it 'returns the application' do
558
557
  expect(search_results.count).to eq 1
@@ -17,6 +17,10 @@ describe Stormpath::Provider::Provider, :vcr do
17
17
  directory.provider
18
18
  end
19
19
 
20
+ def social_directory?
21
+ provider_id != 'stormpath'
22
+ end
23
+
20
24
  after do
21
25
  directory.delete
22
26
  application.delete
@@ -41,13 +45,41 @@ describe Stormpath::Provider::Provider, :vcr do
41
45
  provider_clazz = "Stormpath::Provider::#{provider_id.capitalize}Provider".constantize
42
46
  expect(provider).to be_instance_of(provider_clazz)
43
47
 
44
- if %w(google facebook twitter).include?(provider_id)
48
+ if social_directory?
45
49
  expect(provider.client_id).to eq(client_id)
46
50
  expect(provider.client_secret).to eq(client_secret)
47
51
  end
48
52
 
49
53
  if provider_id == 'google'
50
54
  expect(provider.redirect_uri).to eq(redirect_uri)
55
+ expect(provider.hd).to eq(hd)
56
+ expect(provider.display).to eq(display)
57
+ expect(provider.access_type).to eq(access_type)
58
+ end
59
+ end
60
+
61
+ it 'should be able to update the scope' do
62
+ if social_directory?
63
+ provider.scope = ['email']
64
+ provider.save
65
+ expect(provider.scope).to include 'email'
66
+ end
67
+ end
68
+
69
+ context 'user info mapping rules for social directories' do
70
+ let(:rule) { { 'name' => 'email', 'accountAttributes' => ['email'] } }
71
+ before do
72
+ if social_directory?
73
+ directory.user_info_mapping_rules.items = [rule]
74
+ directory.user_info_mapping_rules.save
75
+ end
76
+ end
77
+
78
+ it 'should be able to create and fetch user info mapping rules' do
79
+ if social_directory?
80
+ expect(directory.user_info_mapping_rules).to be_kind_of(Stormpath::Resource::UserInfoMappingRules)
81
+ expect(directory.user_info_mapping_rules.items).to include(rule)
82
+ end
51
83
  end
52
84
  end
53
85
  end
@@ -129,12 +161,18 @@ describe Stormpath::Provider::Provider, :vcr do
129
161
  let(:client_id) { 'GOOGLE_CLIENT_ID' }
130
162
  let(:client_secret) { 'GOOGLE_CLIENT_SECRET' }
131
163
  let(:redirect_uri) { 'GOOGLE_REDIRECT_URI' }
164
+ let(:hd) { 'www.example.com' }
165
+ let(:display) { 'page' }
166
+ let(:access_type) { 'online' }
132
167
  let(:provider_info) do
133
168
  {
134
169
  provider_id: provider_id,
135
170
  client_id: client_id,
136
171
  client_secret: client_secret,
137
- redirect_uri: redirect_uri
172
+ redirect_uri: redirect_uri,
173
+ hd: hd,
174
+ display: display,
175
+ access_type: access_type
138
176
  }
139
177
  end
140
178
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stormpath-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stormpath, Inc
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-01-24 00:00:00.000000000 Z
12
+ date: 2017-01-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
@@ -428,6 +428,7 @@ files:
428
428
  - lib/stormpath-sdk/resource/refresh_token.rb
429
429
  - lib/stormpath-sdk/resource/schema.rb
430
430
  - lib/stormpath-sdk/resource/tenant.rb
431
+ - lib/stormpath-sdk/resource/user_info_mapping_rules.rb
431
432
  - lib/stormpath-sdk/resource/utils.rb
432
433
  - lib/stormpath-sdk/resource/verification_email.rb
433
434
  - lib/stormpath-sdk/util/assert.rb