sorcery 0.8.6 → 0.9.1
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 +4 -4
- data/.gitignore +2 -1
- data/.travis.yml +75 -14
- data/CHANGELOG.md +32 -1
- data/Gemfile +1 -0
- data/README.md +138 -86
- data/gemfiles/active_record-rails40.gemfile +7 -0
- data/gemfiles/active_record-rails41.gemfile +3 -2
- data/gemfiles/mongo_mapper-rails40.gemfile +9 -0
- data/gemfiles/mongo_mapper-rails41.gemfile +2 -1
- data/gemfiles/mongoid-rails40.gemfile +9 -0
- data/gemfiles/mongoid-rails41.gemfile +3 -5
- data/gemfiles/mongoid3-rails32.gemfile +9 -0
- data/lib/generators/sorcery/USAGE +1 -1
- data/lib/generators/sorcery/install_generator.rb +19 -5
- data/lib/generators/sorcery/templates/initializer.rb +36 -10
- data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +3 -1
- data/lib/generators/sorcery/templates/migration/core.rb +2 -2
- data/lib/generators/sorcery/templates/migration/external.rb +3 -1
- data/lib/sorcery/adapters/active_record_adapter.rb +120 -0
- data/lib/sorcery/adapters/base_adapter.rb +30 -0
- data/lib/sorcery/adapters/data_mapper_adapter.rb +176 -0
- data/lib/sorcery/adapters/mongo_mapper_adapter.rb +110 -0
- data/lib/sorcery/adapters/mongoid_adapter.rb +97 -0
- data/lib/sorcery/controller/config.rb +65 -0
- data/lib/sorcery/controller/submodules/activity_logging.rb +16 -21
- data/lib/sorcery/controller/submodules/brute_force_protection.rb +6 -6
- data/lib/sorcery/controller/submodules/external.rb +9 -29
- data/lib/sorcery/controller/submodules/remember_me.rb +4 -4
- data/lib/sorcery/controller/submodules/session_timeout.rb +10 -6
- data/lib/sorcery/controller.rb +5 -64
- data/lib/sorcery/model/config.rb +96 -0
- data/lib/sorcery/model/submodules/activity_logging.rb +29 -36
- data/lib/sorcery/model/submodules/brute_force_protection.rb +21 -37
- data/lib/sorcery/model/submodules/external.rb +53 -9
- data/lib/sorcery/model/submodules/remember_me.rb +12 -31
- data/lib/sorcery/model/submodules/reset_password.rb +21 -39
- data/lib/sorcery/model/submodules/user_activation.rb +21 -63
- data/lib/sorcery/model/temporary_token.rb +4 -4
- data/lib/sorcery/model.rb +47 -175
- data/lib/sorcery/providers/base.rb +11 -0
- data/lib/sorcery/providers/facebook.rb +16 -5
- data/lib/sorcery/providers/github.rb +11 -2
- data/lib/sorcery/providers/google.rb +1 -1
- data/lib/sorcery/providers/heroku.rb +57 -0
- data/lib/sorcery/providers/jira.rb +77 -0
- data/lib/sorcery/providers/linkedin.rb +1 -1
- data/lib/sorcery/providers/liveid.rb +1 -1
- data/lib/sorcery/providers/salesforce.rb +50 -0
- data/lib/sorcery/providers/twitter.rb +1 -1
- data/lib/sorcery/providers/vk.rb +6 -4
- data/lib/sorcery/providers/xing.rb +2 -2
- data/lib/sorcery/test_helpers/internal.rb +7 -3
- data/lib/sorcery/test_helpers/rails/controller.rb +5 -1
- data/lib/sorcery/version.rb +3 -0
- data/lib/sorcery.rb +75 -43
- data/sorcery.gemspec +6 -2
- data/spec/active_record/user_activity_logging_spec.rb +9 -0
- data/spec/controllers/controller_activity_logging_spec.rb +124 -0
- data/spec/controllers/controller_brute_force_protection_spec.rb +43 -0
- data/spec/{active_record → controllers}/controller_http_basic_auth_spec.rb +14 -11
- data/spec/{active_record → controllers}/controller_oauth2_spec.rb +151 -64
- data/spec/{active_record → controllers}/controller_oauth_spec.rb +94 -70
- data/spec/{active_record → controllers}/controller_remember_me_spec.rb +32 -12
- data/spec/{active_record → controllers}/controller_session_timeout_spec.rb +15 -5
- data/spec/{shared_examples/controller_shared_examples.rb → controllers/controller_spec.rb} +34 -19
- data/spec/{datamapper → data_mapper}/user_activation_spec.rb +1 -1
- data/spec/data_mapper/user_activity_logging_spec.rb +14 -0
- data/spec/{datamapper → data_mapper}/user_brute_force_protection_spec.rb +1 -1
- data/spec/{datamapper → data_mapper}/user_oauth_spec.rb +1 -1
- data/spec/{datamapper → data_mapper}/user_remember_me_spec.rb +1 -1
- data/spec/{datamapper → data_mapper}/user_reset_password_spec.rb +1 -1
- data/spec/{datamapper → data_mapper}/user_spec.rb +1 -1
- data/spec/mongoid/user_spec.rb +13 -0
- data/spec/orm/active_record.rb +12 -0
- data/spec/orm/{datamapper.rb → data_mapper.rb} +16 -2
- data/spec/orm/mongo_mapper.rb +0 -1
- data/spec/orm/mongoid.rb +4 -0
- data/spec/rails_app/app/controllers/sorcery_controller.rb +62 -1
- data/spec/rails_app/app/mongo_mapper/user.rb +2 -0
- data/spec/rails_app/config/routes.rb +9 -0
- data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +2 -2
- data/spec/shared_examples/user_activation_shared_examples.rb +7 -7
- data/spec/shared_examples/user_activity_logging_shared_examples.rb +73 -5
- data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +127 -9
- data/spec/shared_examples/user_oauth_shared_examples.rb +3 -6
- data/spec/shared_examples/user_remember_me_shared_examples.rb +6 -3
- data/spec/shared_examples/user_reset_password_shared_examples.rb +10 -10
- data/spec/shared_examples/user_shared_examples.rb +146 -46
- data/spec/spec_helper.rb +7 -22
- metadata +36 -57
- data/Gemfile.rails4 +0 -22
- data/VERSION +0 -1
- data/lib/sorcery/model/adapters/active_record.rb +0 -54
- data/lib/sorcery/model/adapters/datamapper.rb +0 -123
- data/lib/sorcery/model/adapters/mongo_mapper.rb +0 -60
- data/lib/sorcery/model/adapters/mongoid.rb +0 -88
- data/lib/sorcery/test_helpers/rails.rb +0 -7
- data/spec/active_record/controller_activity_logging_spec.rb +0 -29
- data/spec/active_record/controller_brute_force_protection_spec.rb +0 -158
- data/spec/active_record/controller_spec.rb +0 -8
- data/spec/active_record/integration_spec.rb +0 -23
- data/spec/datamapper/controller_activity_logging_spec.rb +0 -17
- data/spec/datamapper/controller_spec.rb +0 -8
- data/spec/datamapper/user_activity_logging_spec.rb +0 -9
- data/spec/mongo_mapper/controller_spec.rb +0 -8
- data/spec/mongoid/controller_activity_logging_spec.rb +0 -16
- data/spec/mongoid/controller_spec.rb +0 -8
- data/spec/rails_app/public/404.html +0 -26
- data/spec/rails_app/public/422.html +0 -26
- data/spec/rails_app/public/500.html +0 -26
- data/spec/rails_app/public/favicon.ico +0 -0
- data/spec/rails_app/public/images/rails.png +0 -0
- data/spec/rails_app/public/javascripts/application.js +0 -2
- data/spec/rails_app/public/javascripts/controls.js +0 -965
- data/spec/rails_app/public/javascripts/dragdrop.js +0 -974
- data/spec/rails_app/public/javascripts/effects.js +0 -1123
- data/spec/rails_app/public/javascripts/prototype.js +0 -6001
- data/spec/rails_app/public/javascripts/rails.js +0 -175
- data/spec/rails_app/public/robots.txt +0 -5
- data/spec/rails_app/public/stylesheets/.gitkeep +0 -0
- data/spec/shared_examples/controller_activity_logging_shared_examples.rb +0 -125
- data/spec/shared_examples/controller_oauth2_shared_examples.rb +0 -52
- data/spec/shared_examples/controller_oauth_shared_examples.rb +0 -62
- /data/spec/rails_app/app/{datamapper → data_mapper}/authentication.rb +0 -0
- /data/spec/rails_app/app/{datamapper → data_mapper}/user.rb +0 -0
|
@@ -1,32 +1,79 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
|
-
require 'shared_examples/controller_oauth2_shared_examples'
|
|
3
|
+
# require 'shared_examples/controller_oauth2_shared_examples'
|
|
4
4
|
|
|
5
5
|
describe SorceryController, :active_record => true do
|
|
6
6
|
before(:all) do
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
if SORCERY_ORM == :active_record
|
|
8
|
+
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
|
|
9
|
+
User.reset_column_information
|
|
10
|
+
end
|
|
9
11
|
|
|
10
12
|
sorcery_reload!([:external])
|
|
11
13
|
set_external_property
|
|
12
14
|
end
|
|
13
15
|
|
|
14
16
|
after(:all) do
|
|
15
|
-
|
|
17
|
+
if SORCERY_ORM == :active_record
|
|
18
|
+
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
|
|
19
|
+
end
|
|
16
20
|
end
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
describe 'using create_from' do
|
|
23
|
+
before(:each) do
|
|
24
|
+
stub_all_oauth2_requests!
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it 'creates a new user' do
|
|
28
|
+
sorcery_model_property_set(:authentications_class, Authentication)
|
|
29
|
+
sorcery_controller_external_property_set(:facebook, :user_info_mapping, { username: 'name' })
|
|
30
|
+
|
|
31
|
+
expect(User).to receive(:create_from_provider).with('facebook', '123', {username: 'Noam Ben Ari'})
|
|
32
|
+
get :test_create_from_provider, provider: 'facebook'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it 'supports nested attributes' do
|
|
36
|
+
sorcery_model_property_set(:authentications_class, Authentication)
|
|
37
|
+
sorcery_controller_external_property_set(:facebook, :user_info_mapping, { username: 'hometown/name' })
|
|
38
|
+
expect(User).to receive(:create_from_provider).with('facebook', '123', {username: 'Haifa, Israel'})
|
|
39
|
+
|
|
40
|
+
get :test_create_from_provider, provider: 'facebook'
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it 'does not crash on missing nested attributes' do
|
|
44
|
+
sorcery_model_property_set(:authentications_class, Authentication)
|
|
45
|
+
sorcery_controller_external_property_set(:facebook, :user_info_mapping, { username: 'name', created_at: 'does/not/exist' })
|
|
46
|
+
|
|
47
|
+
expect(User).to receive(:create_from_provider).with('facebook', '123', {username: 'Noam Ben Ari'})
|
|
48
|
+
|
|
49
|
+
get :test_create_from_provider, provider: 'facebook'
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe 'with a block' do
|
|
53
|
+
it 'does not create user' do
|
|
54
|
+
sorcery_model_property_set(:authentications_class, Authentication)
|
|
55
|
+
sorcery_controller_external_property_set(:facebook, :user_info_mapping, { username: 'name' })
|
|
56
|
+
|
|
57
|
+
u = double('user')
|
|
58
|
+
expect(User).to receive(:create_from_provider).with('facebook', '123', {username: 'Noam Ben Ari'}).and_return(u).and_yield(u)
|
|
59
|
+
# test_create_from_provider_with_block in controller will check for uniqueness of username
|
|
60
|
+
get :test_create_from_provider_with_block, provider: 'facebook'
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
19
64
|
|
|
20
65
|
# ----------------- OAuth -----------------------
|
|
21
66
|
context "with OAuth features" do
|
|
22
67
|
|
|
68
|
+
let(:user) { double('user', id: 42) }
|
|
69
|
+
|
|
23
70
|
before(:each) do
|
|
24
71
|
stub_all_oauth2_requests!
|
|
25
72
|
end
|
|
26
73
|
|
|
27
74
|
after(:each) do
|
|
28
|
-
User.delete_all
|
|
29
|
-
Authentication.delete_all
|
|
75
|
+
User.sorcery_adapter.delete_all
|
|
76
|
+
Authentication.sorcery_adapter.delete_all
|
|
30
77
|
end
|
|
31
78
|
|
|
32
79
|
context "when callback_url begin with /" do
|
|
@@ -34,39 +81,52 @@ describe SorceryController, :active_record => true do
|
|
|
34
81
|
sorcery_controller_external_property_set(:facebook, :callback_url, "/oauth/twitter/callback")
|
|
35
82
|
end
|
|
36
83
|
it "login_at redirects correctly" do
|
|
37
|
-
create_new_user
|
|
38
84
|
get :login_at_test_facebook
|
|
39
85
|
expect(response).to be_a_redirect
|
|
40
|
-
expect(response).to redirect_to("https://
|
|
86
|
+
expect(response).to redirect_to("https://www.facebook.com/dialog/oauth?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email&state=")
|
|
41
87
|
end
|
|
88
|
+
|
|
42
89
|
it "logins with state" do
|
|
43
|
-
create_new_user
|
|
44
90
|
get :login_at_test_with_state
|
|
45
91
|
expect(response).to be_a_redirect
|
|
46
|
-
expect(response).to redirect_to("https://
|
|
92
|
+
expect(response).to redirect_to("https://www.facebook.com/dialog/oauth?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email&state=bla")
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "logins with Graph API version" do
|
|
96
|
+
sorcery_controller_external_property_set(:facebook, :api_version, "v2.2")
|
|
97
|
+
get :login_at_test_with_state
|
|
98
|
+
expect(response).to be_a_redirect
|
|
99
|
+
expect(response).to redirect_to("https://www.facebook.com/v2.2/dialog/oauth?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email&state=bla")
|
|
47
100
|
end
|
|
101
|
+
|
|
102
|
+
it "logins without state after login with state" do
|
|
103
|
+
get :login_at_test_with_state
|
|
104
|
+
expect(response).to redirect_to("https://www.facebook.com/v2.2/dialog/oauth?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email&state=bla")
|
|
105
|
+
|
|
106
|
+
get :login_at_test_facebook
|
|
107
|
+
expect(response).to redirect_to("https://www.facebook.com/v2.2/dialog/oauth?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email&state=")
|
|
108
|
+
end
|
|
109
|
+
|
|
48
110
|
after do
|
|
49
111
|
sorcery_controller_external_property_set(:facebook, :callback_url, "http://blabla.com")
|
|
50
112
|
end
|
|
51
113
|
end
|
|
52
114
|
|
|
53
|
-
#this test can never pass because of the previous test (the callback url can't change anymore)
|
|
54
|
-
=begin
|
|
55
115
|
context "when callback_url begin with http://" do
|
|
56
116
|
it "login_at redirects correctly" do
|
|
57
117
|
create_new_user
|
|
58
|
-
get :
|
|
59
|
-
response.
|
|
60
|
-
response.
|
|
118
|
+
get :login_at_test_facebook
|
|
119
|
+
expect(response).to be_a_redirect
|
|
120
|
+
expect(response).to redirect_to("https://www.facebook.com/v2.2/dialog/oauth?client_id=#{::Sorcery::Controller::Config.facebook.key}&display=page&redirect_uri=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&response_type=code&scope=email&state=")
|
|
61
121
|
end
|
|
62
122
|
end
|
|
63
|
-
|
|
123
|
+
|
|
64
124
|
it "'login_from' logins if user exists" do
|
|
65
125
|
# dirty hack for rails 4
|
|
66
126
|
allow(subject).to receive(:register_last_activity_time_to_db)
|
|
67
127
|
|
|
68
128
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
69
|
-
|
|
129
|
+
expect(User).to receive(:load_from_provider).with(:facebook, '123').and_return(user)
|
|
70
130
|
get :test_login_from_facebook
|
|
71
131
|
|
|
72
132
|
expect(flash[:notice]).to eq "Success!"
|
|
@@ -74,7 +134,7 @@ describe SorceryController, :active_record => true do
|
|
|
74
134
|
|
|
75
135
|
it "'login_from' fails if user doesn't exist" do
|
|
76
136
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
77
|
-
|
|
137
|
+
expect(User).to receive(:load_from_provider).with(:facebook, '123').and_return(nil)
|
|
78
138
|
get :test_login_from_facebook
|
|
79
139
|
|
|
80
140
|
expect(flash[:alert]).to eq "Failed!"
|
|
@@ -85,19 +145,18 @@ describe SorceryController, :active_record => true do
|
|
|
85
145
|
allow(subject).to receive(:register_last_activity_time_to_db)
|
|
86
146
|
|
|
87
147
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
88
|
-
|
|
148
|
+
expect(User).to receive(:load_from_provider).with(:facebook, '123').and_return(user)
|
|
89
149
|
get :test_return_to_with_external_facebook, {}, :return_to_url => "fuu"
|
|
90
150
|
|
|
91
151
|
expect(response).to redirect_to("fuu")
|
|
92
152
|
expect(flash[:notice]).to eq "Success!"
|
|
93
153
|
end
|
|
94
154
|
|
|
95
|
-
[:github, :google, :liveid].each do |provider|
|
|
155
|
+
[:github, :google, :liveid, :vk, :salesforce].each do |provider|
|
|
96
156
|
|
|
97
157
|
describe "with #{provider}" do
|
|
98
158
|
|
|
99
159
|
it "login_at redirects correctly" do
|
|
100
|
-
create_new_user
|
|
101
160
|
get :"login_at_test_#{provider}"
|
|
102
161
|
|
|
103
162
|
expect(response).to be_a_redirect
|
|
@@ -109,7 +168,7 @@ describe SorceryController, :active_record => true do
|
|
|
109
168
|
allow(subject).to receive(:register_last_activity_time_to_db)
|
|
110
169
|
|
|
111
170
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
112
|
-
|
|
171
|
+
expect(User).to receive(:load_from_provider).with(provider, '123').and_return(user)
|
|
113
172
|
get :"test_login_from_#{provider}"
|
|
114
173
|
|
|
115
174
|
expect(flash[:notice]).to eq "Success!"
|
|
@@ -117,18 +176,18 @@ describe SorceryController, :active_record => true do
|
|
|
117
176
|
|
|
118
177
|
it "'login_from' fails if user doesn't exist" do
|
|
119
178
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
120
|
-
|
|
179
|
+
expect(User).to receive(:load_from_provider).with(provider, '123').and_return(nil)
|
|
121
180
|
get :"test_login_from_#{provider}"
|
|
122
181
|
|
|
123
182
|
expect(flash[:alert]).to eq "Failed!"
|
|
124
183
|
end
|
|
125
184
|
|
|
126
|
-
it "on successful login_from the user is redirected to the url he originally wanted (
|
|
185
|
+
it "on successful login_from the user is redirected to the url he originally wanted (#{provider})" do
|
|
127
186
|
# dirty hack for rails 4
|
|
128
187
|
allow(subject).to receive(:register_last_activity_time_to_db)
|
|
129
188
|
|
|
130
189
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
131
|
-
|
|
190
|
+
expect(User).to receive(:load_from_provider).with(provider, '123').and_return(user)
|
|
132
191
|
get :"test_return_to_with_external_#{provider}", {}, :return_to_url => "fuu"
|
|
133
192
|
|
|
134
193
|
expect(response).to redirect_to "fuu"
|
|
@@ -141,9 +200,13 @@ describe SorceryController, :active_record => true do
|
|
|
141
200
|
|
|
142
201
|
describe "OAuth with User Activation features" do
|
|
143
202
|
before(:all) do
|
|
144
|
-
|
|
203
|
+
if SORCERY_ORM == :active_record
|
|
204
|
+
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activation")
|
|
205
|
+
end
|
|
206
|
+
|
|
145
207
|
sorcery_reload!([:user_activation,:external], :user_activation_mailer => ::SorceryMailer)
|
|
146
|
-
sorcery_controller_property_set(:external_providers, [:facebook, :github, :google, :liveid])
|
|
208
|
+
sorcery_controller_property_set(:external_providers, [:facebook, :github, :google, :liveid, :vk, :salesforce])
|
|
209
|
+
|
|
147
210
|
sorcery_controller_external_property_set(:facebook, :key, "eYVNBjBDi33aa9GkA3w")
|
|
148
211
|
sorcery_controller_external_property_set(:facebook, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
|
|
149
212
|
sorcery_controller_external_property_set(:facebook, :callback_url, "http://blabla.com")
|
|
@@ -156,15 +219,22 @@ describe SorceryController, :active_record => true do
|
|
|
156
219
|
sorcery_controller_external_property_set(:liveid, :key, "eYVNBjBDi33aa9GkA3w")
|
|
157
220
|
sorcery_controller_external_property_set(:liveid, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
|
|
158
221
|
sorcery_controller_external_property_set(:liveid, :callback_url, "http://blabla.com")
|
|
159
|
-
|
|
222
|
+
sorcery_controller_external_property_set(:vk, :key, "eYVNBjBDi33aa9GkA3w")
|
|
223
|
+
sorcery_controller_external_property_set(:vk, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
|
|
224
|
+
sorcery_controller_external_property_set(:vk, :callback_url, "http://blabla.com")
|
|
225
|
+
sorcery_controller_external_property_set(:salesforce, :key, "eYVNBjBDi33aa9GkA3w")
|
|
226
|
+
sorcery_controller_external_property_set(:salesforce, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
|
|
227
|
+
sorcery_controller_external_property_set(:salesforce, :callback_url, "http://blabla.com")
|
|
160
228
|
end
|
|
161
229
|
|
|
162
230
|
after(:all) do
|
|
163
|
-
|
|
231
|
+
if SORCERY_ORM == :active_record
|
|
232
|
+
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/activation")
|
|
233
|
+
end
|
|
164
234
|
end
|
|
165
235
|
|
|
166
236
|
after(:each) do
|
|
167
|
-
User.delete_all
|
|
237
|
+
User.sorcery_adapter.delete_all
|
|
168
238
|
end
|
|
169
239
|
|
|
170
240
|
it "does not send activation email to external users" do
|
|
@@ -183,64 +253,65 @@ describe SorceryController, :active_record => true do
|
|
|
183
253
|
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
|
184
254
|
end
|
|
185
255
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
it "does not send activation email to external users (github)" do
|
|
256
|
+
[:github, :google, :liveid, :vk, :salesforce].each do |provider|
|
|
257
|
+
it "does not send activation email to external users (#{provider})" do
|
|
189
258
|
old_size = ActionMailer::Base.deliveries.size
|
|
190
259
|
create_new_external_user provider
|
|
191
260
|
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
|
192
261
|
end
|
|
193
262
|
|
|
194
|
-
it "does not send external users an activation success email (
|
|
263
|
+
it "does not send external users an activation success email (#{provider})" do
|
|
195
264
|
sorcery_model_property_set(:activation_success_email_method_name, nil)
|
|
196
265
|
create_new_external_user provider
|
|
197
266
|
old_size = ActionMailer::Base.deliveries.size
|
|
198
267
|
@user.activate!
|
|
199
|
-
|
|
200
|
-
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
|
201
268
|
end
|
|
202
269
|
end
|
|
203
270
|
end
|
|
204
271
|
|
|
205
272
|
describe "OAuth with user activation features" do
|
|
273
|
+
|
|
274
|
+
let(:user) { double('user', id: 42) }
|
|
275
|
+
|
|
206
276
|
before(:all) do
|
|
207
|
-
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
|
|
208
|
-
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activity_logging")
|
|
209
|
-
User.reset_column_information
|
|
210
277
|
sorcery_reload!([:activity_logging, :external])
|
|
211
278
|
end
|
|
212
279
|
|
|
213
280
|
after(:all) do
|
|
214
|
-
|
|
215
|
-
|
|
281
|
+
if SORCERY_ORM == :active_record
|
|
282
|
+
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
|
|
283
|
+
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/activity_logging")
|
|
284
|
+
end
|
|
216
285
|
end
|
|
217
286
|
|
|
218
|
-
%w(facebook github google liveid).each do |provider|
|
|
287
|
+
%w(facebook github google liveid vk salesforce).each do |provider|
|
|
219
288
|
context "when #{provider}" do
|
|
220
289
|
before(:each) do
|
|
221
|
-
User.delete_all
|
|
222
|
-
Authentication.delete_all
|
|
223
290
|
sorcery_controller_property_set(:register_login_time, true)
|
|
291
|
+
sorcery_controller_property_set(:register_logout_time, false)
|
|
292
|
+
sorcery_controller_property_set(:register_last_activity_time, false)
|
|
293
|
+
sorcery_controller_property_set(:register_last_ip_address, false)
|
|
224
294
|
stub_all_oauth2_requests!
|
|
225
295
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
226
|
-
create_new_external_user(provider.to_sym)
|
|
227
296
|
end
|
|
228
297
|
|
|
229
298
|
it "registers login time" do
|
|
230
299
|
now = Time.now.in_time_zone
|
|
300
|
+
Timecop.freeze(now)
|
|
301
|
+
expect(User).to receive(:load_from_provider).and_return(user)
|
|
302
|
+
expect(user).to receive(:set_last_login_at).with(be_within(0.1).of(now))
|
|
231
303
|
get "test_login_from_#{provider}".to_sym
|
|
232
|
-
|
|
233
|
-
expect(User.last.last_login_at).not_to be_nil
|
|
234
|
-
expect(User.last.last_login_at.to_s(:db)).to be >= now.to_s(:db)
|
|
235
|
-
expect(User.last.last_login_at.to_s(:db)).to be <= (now+2).to_s(:db)
|
|
304
|
+
Timecop.return
|
|
236
305
|
end
|
|
237
306
|
|
|
238
307
|
it "does not register login time if configured so" do
|
|
239
308
|
sorcery_controller_property_set(:register_login_time, false)
|
|
240
309
|
now = Time.now.in_time_zone
|
|
310
|
+
Timecop.freeze(now)
|
|
311
|
+
expect(User).to receive(:load_from_provider).and_return(user)
|
|
312
|
+
expect(user).to receive(:set_last_login_at).never
|
|
241
313
|
get "test_login_from_#{provider}".to_sym
|
|
242
314
|
|
|
243
|
-
expect(User.last.last_login_at).to be_nil
|
|
244
315
|
end
|
|
245
316
|
end
|
|
246
317
|
end
|
|
@@ -248,24 +319,17 @@ describe SorceryController, :active_record => true do
|
|
|
248
319
|
|
|
249
320
|
describe "OAuth with session timeout features" do
|
|
250
321
|
before(:all) do
|
|
251
|
-
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
|
|
252
|
-
User.reset_column_information
|
|
253
322
|
sorcery_reload!([:session_timeout, :external])
|
|
254
323
|
end
|
|
255
324
|
|
|
256
|
-
|
|
257
|
-
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
|
|
258
|
-
end
|
|
325
|
+
let(:user) { double('user', id: 42) }
|
|
259
326
|
|
|
260
|
-
%w(facebook github google liveid).each do |provider|
|
|
327
|
+
%w(facebook github google liveid vk salesforce).each do |provider|
|
|
261
328
|
context "when #{provider}" do
|
|
262
329
|
before(:each) do
|
|
263
|
-
User.delete_all
|
|
264
|
-
Authentication.delete_all
|
|
265
330
|
sorcery_model_property_set(:authentications_class, Authentication)
|
|
266
331
|
sorcery_controller_property_set(:session_timeout,0.5)
|
|
267
332
|
stub_all_oauth2_requests!
|
|
268
|
-
create_new_external_user(provider.to_sym)
|
|
269
333
|
end
|
|
270
334
|
|
|
271
335
|
after(:each) do
|
|
@@ -273,6 +337,7 @@ describe SorceryController, :active_record => true do
|
|
|
273
337
|
end
|
|
274
338
|
|
|
275
339
|
it "does not reset session before session timeout" do
|
|
340
|
+
expect(User).to receive(:load_from_provider).with(provider.to_sym, '123').and_return(user)
|
|
276
341
|
get "test_login_from_#{provider}".to_sym
|
|
277
342
|
|
|
278
343
|
expect(session[:user_id]).not_to be_nil
|
|
@@ -280,7 +345,9 @@ describe SorceryController, :active_record => true do
|
|
|
280
345
|
end
|
|
281
346
|
|
|
282
347
|
it "resets session after session timeout" do
|
|
348
|
+
expect(User).to receive(:load_from_provider).with(provider.to_sym, '123').and_return(user)
|
|
283
349
|
get "test_login_from_#{provider}".to_sym
|
|
350
|
+
expect(session[:user_id]).to eq "42"
|
|
284
351
|
Timecop.travel(Time.now.in_time_zone+0.6)
|
|
285
352
|
get :test_should_be_logged_in
|
|
286
353
|
|
|
@@ -297,6 +364,7 @@ describe SorceryController, :active_record => true do
|
|
|
297
364
|
response = double(OAuth2::Response)
|
|
298
365
|
allow(response).to receive(:body) { {
|
|
299
366
|
"id"=>"123",
|
|
367
|
+
"user_id"=>"123", # Needed for Salesforce
|
|
300
368
|
"name"=>"Noam Ben Ari",
|
|
301
369
|
"first_name"=>"Noam",
|
|
302
370
|
"last_name"=>"Ben Ari",
|
|
@@ -310,13 +378,24 @@ describe SorceryController, :active_record => true do
|
|
|
310
378
|
"locale"=>"en_US",
|
|
311
379
|
"languages"=>[{"id"=>"108405449189952", "name"=>"Hebrew"}, {"id"=>"106059522759137", "name"=>"English"}, {"id"=>"112624162082677", "name"=>"Russian"}],
|
|
312
380
|
"verified"=>true,
|
|
313
|
-
"updated_time"=>"2011-02-16T20:59:38+0000"
|
|
381
|
+
"updated_time"=>"2011-02-16T20:59:38+0000",
|
|
382
|
+
# response for VK auth
|
|
383
|
+
"response"=>[
|
|
384
|
+
{
|
|
385
|
+
"uid"=>"123",
|
|
386
|
+
"first_name"=>"Noam",
|
|
387
|
+
"last_name"=>"Ben Ari"
|
|
388
|
+
}
|
|
389
|
+
]}.to_json }
|
|
314
390
|
allow(access_token).to receive(:get) { response }
|
|
391
|
+
allow(access_token).to receive(:token) { "187041a618229fdaf16613e96e1caabc1e86e46bbfad228de41520e63fe45873684c365a14417289599f3" }
|
|
392
|
+
# access_token params for VK auth
|
|
393
|
+
allow(access_token).to receive(:params) { { "user_id"=>"100500", "email"=>"nbenari@gmail.com" } }
|
|
315
394
|
allow_any_instance_of(OAuth2::Strategy::AuthCode).to receive(:get_token) { access_token }
|
|
316
395
|
end
|
|
317
396
|
|
|
318
397
|
def set_external_property
|
|
319
|
-
sorcery_controller_property_set(:external_providers, [:facebook, :github, :google, :liveid])
|
|
398
|
+
sorcery_controller_property_set(:external_providers, [:facebook, :github, :google, :liveid, :vk, :salesforce])
|
|
320
399
|
sorcery_controller_external_property_set(:facebook, :key, "eYVNBjBDi33aa9GkA3w")
|
|
321
400
|
sorcery_controller_external_property_set(:facebook, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
|
|
322
401
|
sorcery_controller_external_property_set(:facebook, :callback_url, "http://blabla.com")
|
|
@@ -329,14 +408,22 @@ describe SorceryController, :active_record => true do
|
|
|
329
408
|
sorcery_controller_external_property_set(:liveid, :key, "eYVNBjBDi33aa9GkA3w")
|
|
330
409
|
sorcery_controller_external_property_set(:liveid, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
|
|
331
410
|
sorcery_controller_external_property_set(:liveid, :callback_url, "http://blabla.com")
|
|
411
|
+
sorcery_controller_external_property_set(:vk, :key, "eYVNBjBDi33aa9GkA3w")
|
|
412
|
+
sorcery_controller_external_property_set(:vk, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
|
|
413
|
+
sorcery_controller_external_property_set(:vk, :callback_url, "http://blabla.com")
|
|
414
|
+
sorcery_controller_external_property_set(:salesforce, :key, "eYVNBjBDi33aa9GkA3w")
|
|
415
|
+
sorcery_controller_external_property_set(:salesforce, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
|
|
416
|
+
sorcery_controller_external_property_set(:salesforce, :callback_url, "http://blabla.com")
|
|
332
417
|
end
|
|
333
418
|
|
|
334
419
|
def provider_url(provider)
|
|
335
420
|
{
|
|
336
421
|
github: "https://github.com/login/oauth/authorize?client_id=#{::Sorcery::Controller::Config.github.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=&state=",
|
|
337
422
|
google: "https://accounts.google.com/o/oauth2/auth?client_id=#{::Sorcery::Controller::Config.google.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile&state=",
|
|
338
|
-
liveid: "https://oauth.live.com/authorize?client_id=#{::Sorcery::Controller::Config.liveid.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=wl.basic+wl.emails+wl.offline_access&state="
|
|
423
|
+
liveid: "https://oauth.live.com/authorize?client_id=#{::Sorcery::Controller::Config.liveid.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=wl.basic+wl.emails+wl.offline_access&state=",
|
|
424
|
+
vk: "https://oauth.vk.com/authorize?client_id=#{::Sorcery::Controller::Config.vk.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=#{::Sorcery::Controller::Config.vk.scope}&state=",
|
|
425
|
+
salesforce: "https://login.salesforce.com/services/oauth2/authorize?client_id=#{::Sorcery::Controller::Config.salesforce.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=#{::Sorcery::Controller::Config.salesforce.scope}&state="
|
|
339
426
|
}[provider]
|
|
340
427
|
end
|
|
341
|
-
|
|
342
428
|
end
|
|
429
|
+
|