devise_token_auth_multi_email 0.9.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 +7 -0
- data/LICENSE +13 -0
- data/README.md +97 -0
- data/Rakefile +42 -0
- data/app/controllers/devise_token_auth/application_controller.rb +100 -0
- data/app/controllers/devise_token_auth/concerns/resource_finder.rb +68 -0
- data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +199 -0
- data/app/controllers/devise_token_auth/confirmations_controller.rb +89 -0
- data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +284 -0
- data/app/controllers/devise_token_auth/passwords_controller.rb +216 -0
- data/app/controllers/devise_token_auth/registrations_controller.rb +205 -0
- data/app/controllers/devise_token_auth/sessions_controller.rb +153 -0
- data/app/controllers/devise_token_auth/token_validations_controller.rb +31 -0
- data/app/controllers/devise_token_auth/unlocks_controller.rb +94 -0
- data/app/models/devise_token_auth/concerns/active_record_support.rb +18 -0
- data/app/models/devise_token_auth/concerns/confirmable_support.rb +28 -0
- data/app/models/devise_token_auth/concerns/mongoid_support.rb +19 -0
- data/app/models/devise_token_auth/concerns/tokens_serialization.rb +31 -0
- data/app/models/devise_token_auth/concerns/user.rb +282 -0
- data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +39 -0
- data/app/validators/devise_token_auth_email_validator.rb +31 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise_token_auth/omniauth_external_window.html.erb +38 -0
- data/config/locales/da-DK.yml +52 -0
- data/config/locales/de.yml +51 -0
- data/config/locales/en.yml +60 -0
- data/config/locales/es.yml +51 -0
- data/config/locales/fa.yml +60 -0
- data/config/locales/fr.yml +51 -0
- data/config/locales/he.yml +52 -0
- data/config/locales/it.yml +48 -0
- data/config/locales/ja.yml +60 -0
- data/config/locales/ko.yml +51 -0
- data/config/locales/nl.yml +32 -0
- data/config/locales/pl.yml +51 -0
- data/config/locales/pt-BR.yml +48 -0
- data/config/locales/pt.yml +51 -0
- data/config/locales/ro.yml +48 -0
- data/config/locales/ru.yml +52 -0
- data/config/locales/sq.yml +48 -0
- data/config/locales/sv.yml +52 -0
- data/config/locales/uk.yml +61 -0
- data/config/locales/vi.yml +52 -0
- data/config/locales/zh-CN.yml +48 -0
- data/config/locales/zh-HK.yml +50 -0
- data/config/locales/zh-TW.yml +50 -0
- data/lib/devise_token_auth/blacklist.rb +6 -0
- data/lib/devise_token_auth/controllers/helpers.rb +157 -0
- data/lib/devise_token_auth/controllers/url_helpers.rb +10 -0
- data/lib/devise_token_auth/engine.rb +105 -0
- data/lib/devise_token_auth/errors.rb +8 -0
- data/lib/devise_token_auth/rails/routes.rb +122 -0
- data/lib/devise_token_auth/token_factory.rb +126 -0
- data/lib/devise_token_auth/url.rb +44 -0
- data/lib/devise_token_auth/version.rb +5 -0
- data/lib/devise_token_auth.rb +14 -0
- data/lib/generators/devise_token_auth/USAGE +31 -0
- data/lib/generators/devise_token_auth/install_generator.rb +91 -0
- data/lib/generators/devise_token_auth/install_generator_helpers.rb +98 -0
- data/lib/generators/devise_token_auth/install_mongoid_generator.rb +46 -0
- data/lib/generators/devise_token_auth/install_views_generator.rb +18 -0
- data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +66 -0
- data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +49 -0
- data/lib/generators/devise_token_auth/templates/user.rb.erb +9 -0
- data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +56 -0
- data/lib/tasks/devise_token_auth_tasks.rake +6 -0
- data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
- data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
- data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
- data/test/controllers/custom/custom_registrations_controller_test.rb +63 -0
- data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
- data/test/controllers/custom/custom_token_validations_controller_test.rb +42 -0
- data/test/controllers/demo_group_controller_test.rb +151 -0
- data/test/controllers/demo_mang_controller_test.rb +313 -0
- data/test/controllers/demo_user_controller_test.rb +658 -0
- data/test/controllers/devise_token_auth/confirmations_controller_test.rb +275 -0
- data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +438 -0
- data/test/controllers/devise_token_auth/passwords_controller_test.rb +893 -0
- data/test/controllers/devise_token_auth/registrations_controller_test.rb +920 -0
- data/test/controllers/devise_token_auth/sessions_controller_test.rb +605 -0
- data/test/controllers/devise_token_auth/token_validations_controller_test.rb +142 -0
- data/test/controllers/devise_token_auth/unlocks_controller_test.rb +235 -0
- data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
- data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
- data/test/controllers/overrides/passwords_controller_test.rb +64 -0
- data/test/controllers/overrides/registrations_controller_test.rb +46 -0
- data/test/controllers/overrides/sessions_controller_test.rb +35 -0
- data/test/controllers/overrides/token_validations_controller_test.rb +43 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/app/active_record/confirmable_user.rb +11 -0
- data/test/dummy/app/active_record/lockable_user.rb +7 -0
- data/test/dummy/app/active_record/mang.rb +5 -0
- data/test/dummy/app/active_record/only_email_user.rb +7 -0
- data/test/dummy/app/active_record/scoped_user.rb +9 -0
- data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
- data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
- data/test/dummy/app/active_record/user.rb +6 -0
- data/test/dummy/app/controllers/application_controller.rb +14 -0
- data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
- data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
- data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
- data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
- data/test/dummy/app/controllers/custom/registrations_controller.rb +39 -0
- data/test/dummy/app/controllers/custom/sessions_controller.rb +29 -0
- data/test/dummy/app/controllers/custom/token_validations_controller.rb +19 -0
- data/test/dummy/app/controllers/demo_group_controller.rb +15 -0
- data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
- data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
- data/test/dummy/app/controllers/overrides/confirmations_controller.rb +29 -0
- data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
- data/test/dummy/app/controllers/overrides/passwords_controller.rb +36 -0
- data/test/dummy/app/controllers/overrides/registrations_controller.rb +29 -0
- data/test/dummy/app/controllers/overrides/sessions_controller.rb +36 -0
- data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
- data/test/dummy/app/helpers/application_helper.rb +1058 -0
- data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
- data/test/dummy/app/mongoid/confirmable_user.rb +52 -0
- data/test/dummy/app/mongoid/lockable_user.rb +38 -0
- data/test/dummy/app/mongoid/mang.rb +46 -0
- data/test/dummy/app/mongoid/only_email_user.rb +33 -0
- data/test/dummy/app/mongoid/scoped_user.rb +50 -0
- data/test/dummy/app/mongoid/unconfirmable_user.rb +44 -0
- data/test/dummy/app/mongoid/unregisterable_user.rb +47 -0
- data/test/dummy/app/mongoid/user.rb +49 -0
- data/test/dummy/app/views/layouts/application.html.erb +12 -0
- data/test/dummy/config/application.rb +50 -0
- data/test/dummy/config/application.yml.bk +0 -0
- data/test/dummy/config/boot.rb +11 -0
- data/test/dummy/config/environment.rb +7 -0
- data/test/dummy/config/environments/development.rb +36 -0
- data/test/dummy/config/environments/production.rb +68 -0
- data/test/dummy/config/environments/test.rb +58 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +9 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test/dummy/config/initializers/devise.rb +290 -0
- data/test/dummy/config/initializers/devise_token_auth.rb +55 -0
- data/test/dummy/config/initializers/figaro.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
- data/test/dummy/config/initializers/inflections.rb +18 -0
- data/test/dummy/config/initializers/mime_types.rb +6 -0
- data/test/dummy/config/initializers/omniauth.rb +11 -0
- data/test/dummy/config/initializers/session_store.rb +5 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
- data/test/dummy/config/routes.rb +57 -0
- data/test/dummy/config/spring.rb +3 -0
- data/test/dummy/config.ru +18 -0
- data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +58 -0
- data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +57 -0
- data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +8 -0
- data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +7 -0
- data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +55 -0
- data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +56 -0
- data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +56 -0
- data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +56 -0
- data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +56 -0
- data/test/dummy/db/migrate/20190924101113_devise_token_auth_create_confirmable_users.rb +49 -0
- data/test/dummy/db/schema.rb +198 -0
- data/test/dummy/lib/migration_database_helper.rb +43 -0
- data/test/dummy/tmp/generators/app/models/mang.rb +9 -0
- data/test/dummy/tmp/generators/app/models/user.rb +9 -0
- data/test/dummy/tmp/generators/config/initializers/devise_token_auth.rb +60 -0
- data/test/dummy/tmp/generators/config/routes.rb +9 -0
- data/test/dummy/tmp/generators/db/migrate/20210305040222_devise_token_auth_create_mangs.rb +49 -0
- data/test/dummy/tmp/generators/db/migrate/20210305040222_devise_token_auth_create_users.rb +49 -0
- data/test/factories/users.rb +41 -0
- data/test/lib/devise_token_auth/blacklist_test.rb +19 -0
- data/test/lib/devise_token_auth/rails/custom_routes_test.rb +29 -0
- data/test/lib/devise_token_auth/rails/routes_test.rb +87 -0
- data/test/lib/devise_token_auth/token_factory_test.rb +191 -0
- data/test/lib/devise_token_auth/url_test.rb +26 -0
- data/test/lib/generators/devise_token_auth/install_generator_test.rb +217 -0
- data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +222 -0
- data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +25 -0
- data/test/models/concerns/mongoid_support_test.rb +31 -0
- data/test/models/concerns/tokens_serialization_test.rb +104 -0
- data/test/models/confirmable_user_test.rb +35 -0
- data/test/models/only_email_user_test.rb +29 -0
- data/test/models/user_test.rb +224 -0
- data/test/support/controllers/routes.rb +43 -0
- data/test/test_helper.rb +134 -0
- metadata +502 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
# was the web request successful?
|
|
6
|
+
# was the user redirected to the right page?
|
|
7
|
+
# was the user successfully authenticated?
|
|
8
|
+
# was the correct object stored in the response?
|
|
9
|
+
# was the appropriate message delivered in the json payload?
|
|
10
|
+
|
|
11
|
+
class DeviseTokenAuth::ConfirmationsControllerTest < ActionController::TestCase
|
|
12
|
+
describe DeviseTokenAuth::ConfirmationsController do
|
|
13
|
+
def token_and_client_config_from(body)
|
|
14
|
+
token = body.match(/confirmation_token=([^&]*)[&"]/)[1]
|
|
15
|
+
client_config = body.match(/config=([^&]*)&/)[1]
|
|
16
|
+
[token, client_config]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe 'Confirmation' do
|
|
20
|
+
before do
|
|
21
|
+
@redirect_url = Faker::Internet.url
|
|
22
|
+
@new_user = create(:user)
|
|
23
|
+
@new_user.send_confirmation_instructions(redirect_url: @redirect_url)
|
|
24
|
+
mail = ActionMailer::Base.deliveries.last
|
|
25
|
+
@token, @client_config = token_and_client_config_from(mail.body)
|
|
26
|
+
@token_params = %w[access-token client client_id config expiry token uid]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
test 'should generate raw token' do
|
|
30
|
+
assert @token
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
test "should include config name as 'default' in confirmation link" do
|
|
34
|
+
assert_equal 'default', @client_config
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
test 'should store token hash in user' do
|
|
38
|
+
assert @new_user.confirmation_token
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe 'success' do
|
|
42
|
+
describe 'when authenticated' do
|
|
43
|
+
before do
|
|
44
|
+
sign_in(@new_user)
|
|
45
|
+
get :show,
|
|
46
|
+
params: { confirmation_token: @token,
|
|
47
|
+
redirect_url: @redirect_url },
|
|
48
|
+
xhr: true
|
|
49
|
+
@resource = assigns(:resource)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
test 'user should now be confirmed' do
|
|
53
|
+
assert @resource.confirmed?
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
test 'should save the authentication token' do
|
|
57
|
+
assert @resource.reload.tokens.present?
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
test 'should redirect to success url' do
|
|
61
|
+
assert_redirected_to(/^#{@redirect_url}/)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
test 'redirect url includes token params' do
|
|
65
|
+
assert @token_params.all? { |param| response.body.include?(param) }
|
|
66
|
+
assert response.body.include?('account_confirmation_success')
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
describe 'when unauthenticated' do
|
|
71
|
+
before do
|
|
72
|
+
sign_out(@new_user)
|
|
73
|
+
get :show,
|
|
74
|
+
params: { confirmation_token: @token,
|
|
75
|
+
redirect_url: @redirect_url },
|
|
76
|
+
xhr: true
|
|
77
|
+
@resource = assigns(:resource)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
test 'user should now be confirmed' do
|
|
81
|
+
assert @resource.confirmed?
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
test 'should redirect to success url' do
|
|
85
|
+
assert_redirected_to(/^#{@redirect_url}/)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
test 'redirect url does not include token params' do
|
|
89
|
+
refute @token_params.any? { |param| response.body.include?(param) }
|
|
90
|
+
assert response.body.include?('account_confirmation_success')
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
describe 'resend confirmation' do
|
|
95
|
+
describe 'without paranoid mode' do
|
|
96
|
+
|
|
97
|
+
describe 'on success' do
|
|
98
|
+
before do
|
|
99
|
+
post :create,
|
|
100
|
+
params: { email: @new_user.email,
|
|
101
|
+
redirect_url: @redirect_url },
|
|
102
|
+
xhr: true
|
|
103
|
+
@resource = assigns(:resource)
|
|
104
|
+
@data = JSON.parse(response.body)
|
|
105
|
+
@mail = ActionMailer::Base.deliveries.last
|
|
106
|
+
@token, @client_config = token_and_client_config_from(@mail.body)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
test 'user should not be confirmed' do
|
|
110
|
+
assert_nil @resource.confirmed_at
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
test 'should generate raw token' do
|
|
114
|
+
assert @token
|
|
115
|
+
assert_equal @new_user.confirmation_token, @token
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
test 'user should receive confirmation email' do
|
|
119
|
+
assert_equal @resource.email, @mail['to'].to_s
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
test 'response should contain message' do
|
|
123
|
+
assert_equal @data['message'], I18n.t('devise_token_auth.confirmations.sended', email: @resource.email)
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
describe 'on failure' do
|
|
128
|
+
before do
|
|
129
|
+
post :create,
|
|
130
|
+
params: { email: 'chester@cheet.ah',
|
|
131
|
+
redirect_url: @redirect_url },
|
|
132
|
+
xhr: true
|
|
133
|
+
@data = JSON.parse(response.body)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
test 'response should contain errors' do
|
|
137
|
+
assert_equal @data['errors'], [I18n.t('devise_token_auth.confirmations.user_not_found', email: 'chester@cheet.ah')]
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
describe 'with paranoid mode' do
|
|
144
|
+
describe 'on success' do
|
|
145
|
+
before do
|
|
146
|
+
swap Devise, paranoid: true do
|
|
147
|
+
post :create,
|
|
148
|
+
params: { email: @new_user.email,
|
|
149
|
+
redirect_url: @redirect_url },
|
|
150
|
+
xhr: true
|
|
151
|
+
@resource = assigns(:resource)
|
|
152
|
+
@data = JSON.parse(response.body)
|
|
153
|
+
@mail = ActionMailer::Base.deliveries.last
|
|
154
|
+
@token, @client_config = token_and_client_config_from(@mail.body)
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
test 'user should not be confirmed' do
|
|
159
|
+
assert_nil @resource.confirmed_at
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
test 'should generate raw token' do
|
|
163
|
+
assert @token
|
|
164
|
+
assert_equal @new_user.confirmation_token, @token
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
test 'user should receive confirmation email' do
|
|
168
|
+
assert_equal @resource.email, @mail['to'].to_s
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
test 'response should contain message' do
|
|
172
|
+
assert_equal @data['message'], I18n.t('devise_token_auth.confirmations.sended_paranoid', email: @resource.email)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
test 'response should return success status' do
|
|
176
|
+
assert_equal 200, response.status
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
describe 'on failure' do
|
|
181
|
+
before do
|
|
182
|
+
swap Devise, paranoid: true do
|
|
183
|
+
@email = 'chester@cheet.ah'
|
|
184
|
+
post :create,
|
|
185
|
+
params: { email: @email,
|
|
186
|
+
redirect_url: @redirect_url },
|
|
187
|
+
xhr: true
|
|
188
|
+
@data = JSON.parse(response.body)
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
test 'response should not contain errors' do
|
|
193
|
+
assert_equal @data['message'], I18n.t('devise_token_auth.confirmations.sended_paranoid', email: @email)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
test 'response should return success status' do
|
|
197
|
+
assert_equal 200, response.status
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
describe 'failure' do
|
|
204
|
+
test 'user should not be confirmed' do
|
|
205
|
+
get :show,
|
|
206
|
+
params: { confirmation_token: 'bogus',
|
|
207
|
+
redirect_url: @redirect_url }
|
|
208
|
+
|
|
209
|
+
assert_redirected_to(/^#{@redirect_url}/)
|
|
210
|
+
|
|
211
|
+
@resource = assigns(:resource)
|
|
212
|
+
refute @resource.confirmed?
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
test 'request resend confirmation without email' do
|
|
216
|
+
post :create, params: { email: nil }, xhr: true
|
|
217
|
+
|
|
218
|
+
assert_equal 401, response.status
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
test 'user should not be found on resend confirmation request' do
|
|
222
|
+
post :create, params: { email: 'bogus' }, xhr: true
|
|
223
|
+
|
|
224
|
+
assert_equal 404, response.status
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# test with non-standard user class
|
|
230
|
+
describe 'Alternate user model' do
|
|
231
|
+
setup do
|
|
232
|
+
@request.env['devise.mapping'] = Devise.mappings[:mang]
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
teardown do
|
|
236
|
+
@request.env['devise.mapping'] = Devise.mappings[:user]
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
before do
|
|
240
|
+
@config_name = 'altUser'
|
|
241
|
+
@new_user = create(:mang_user)
|
|
242
|
+
|
|
243
|
+
@new_user.send_confirmation_instructions(client_config: @config_name)
|
|
244
|
+
|
|
245
|
+
mail = ActionMailer::Base.deliveries.last
|
|
246
|
+
@token, @client_config = token_and_client_config_from(mail.body)
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
test 'should generate raw token' do
|
|
250
|
+
assert @token
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
test 'should include config name in confirmation link' do
|
|
254
|
+
assert_equal @config_name, @client_config
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
test 'should store token hash in user' do
|
|
258
|
+
assert @new_user.confirmation_token
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
describe 'success' do
|
|
262
|
+
before do
|
|
263
|
+
@redirect_url = Faker::Internet.url
|
|
264
|
+
get :show, params: { confirmation_token: @token,
|
|
265
|
+
redirect_url: @redirect_url }
|
|
266
|
+
@resource = assigns(:resource)
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
test 'user should now be confirmed' do
|
|
270
|
+
assert @resource.confirmed?
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
# was the web request successful?
|
|
5
|
+
# was the user redirected to the right page?
|
|
6
|
+
# was the user successfully authenticated?
|
|
7
|
+
# was the correct object stored in the response?
|
|
8
|
+
# was the appropriate message delivered in the json payload?
|
|
9
|
+
|
|
10
|
+
class OmniauthTest < ActionDispatch::IntegrationTest
|
|
11
|
+
setup do
|
|
12
|
+
OmniAuth.config.test_mode = true
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
before do
|
|
16
|
+
@redirect_url = 'https://ng-token-auth.dev/'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def get_parsed_data_json
|
|
20
|
+
encoded_json_data = @response.body.match(/var data \= JSON.parse\(decodeURIComponent\(\'(.+)\'\)\)\;/)[1]
|
|
21
|
+
JSON.parse(CGI.unescape(encoded_json_data))
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe 'success callback' do
|
|
25
|
+
setup do
|
|
26
|
+
OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new(
|
|
27
|
+
provider: 'facebook',
|
|
28
|
+
uid: '123545',
|
|
29
|
+
info: {
|
|
30
|
+
name: 'chong',
|
|
31
|
+
email: 'chongbong@aol.com'
|
|
32
|
+
}
|
|
33
|
+
)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
test 'request should pass correct redirect_url' do
|
|
37
|
+
get_success
|
|
38
|
+
assert_equal @redirect_url,
|
|
39
|
+
controller.send(:omniauth_params)['auth_origin_url']
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
test 'user should have been created' do
|
|
43
|
+
get_success
|
|
44
|
+
assert @resource
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
test 'user should be assigned info from provider' do
|
|
48
|
+
get_success
|
|
49
|
+
assert_equal 'chongbong@aol.com', @resource.email
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
test 'user should be assigned token' do
|
|
53
|
+
get_success
|
|
54
|
+
|
|
55
|
+
client_id = controller.auth_params[:client_id]
|
|
56
|
+
token = controller.auth_params[:auth_token]
|
|
57
|
+
expiry = controller.auth_params[:expiry]
|
|
58
|
+
|
|
59
|
+
# the expiry should have been set
|
|
60
|
+
assert_equal expiry, @resource.tokens[client_id]['expiry'] || @resource.tokens[client_id][:expiry]
|
|
61
|
+
|
|
62
|
+
# the token sent down to the client should now be valid
|
|
63
|
+
assert @resource.valid_token?(token, client_id)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
test 'session vars have been cleared' do
|
|
67
|
+
get_success
|
|
68
|
+
refute request.session['dta.omniauth.auth']
|
|
69
|
+
refute request.session['dta.omniauth.params']
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
test 'sign_in was called' do
|
|
73
|
+
DeviseTokenAuth::OmniauthCallbacksController.any_instance\
|
|
74
|
+
.expects(:sign_in).with(
|
|
75
|
+
:user, instance_of(User), has_entries(store: false, bypass: false)
|
|
76
|
+
)
|
|
77
|
+
get_success
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
test 'should be redirected via valid url' do
|
|
81
|
+
get_success
|
|
82
|
+
assert_equal 'http://www.example.com/auth/facebook/callback',
|
|
83
|
+
request.original_url
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
describe 'with default user model' do
|
|
87
|
+
before do
|
|
88
|
+
get_success
|
|
89
|
+
end
|
|
90
|
+
test 'request should determine the correct resource_class' do
|
|
91
|
+
assert_equal 'User', controller.send(:omniauth_params)['resource_class']
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
test 'user should be of the correct class' do
|
|
95
|
+
assert_equal User, @resource.class
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
describe 'with alternate user model' do
|
|
100
|
+
before do
|
|
101
|
+
post '/mangs/facebook',
|
|
102
|
+
params: {
|
|
103
|
+
auth_origin_url: @redirect_url,
|
|
104
|
+
omniauth_window_type: 'newWindow'
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
follow_all_redirects!
|
|
108
|
+
|
|
109
|
+
assert_equal 200, response.status
|
|
110
|
+
@resource = assigns(:resource)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
test 'request should determine the correct resource_class' do
|
|
114
|
+
assert_equal 'Mang', controller.send(:omniauth_params)['resource_class']
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
test 'user should be of the correct class' do
|
|
118
|
+
assert_equal Mang, @resource.class
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
describe 'pass additional params' do
|
|
123
|
+
before do
|
|
124
|
+
@fav_color = 'alizarin crimson'
|
|
125
|
+
@unpermitted_param = 'M. Bison'
|
|
126
|
+
post '/auth/facebook',
|
|
127
|
+
params: { auth_origin_url: @redirect_url,
|
|
128
|
+
favorite_color: @fav_color,
|
|
129
|
+
name: @unpermitted_param,
|
|
130
|
+
omniauth_window_type: 'newWindow' }
|
|
131
|
+
|
|
132
|
+
follow_all_redirects!
|
|
133
|
+
|
|
134
|
+
@resource = assigns(:resource)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
test 'status shows success' do
|
|
138
|
+
assert_equal 200, response.status
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
test 'additional attribute was passed' do
|
|
142
|
+
assert_equal @fav_color, @resource.favorite_color
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
test 'non-whitelisted attributes are ignored' do
|
|
146
|
+
refute_equal @unpermitted_param, @resource.name
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
describe 'oauth registration attr' do
|
|
151
|
+
after do
|
|
152
|
+
User.any_instance.unstub(:new_record?)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
describe 'with new user' do
|
|
156
|
+
before do
|
|
157
|
+
User.any_instance.expects(:new_record?).returns(true).at_least_once
|
|
158
|
+
# https://docs.mongodb.com/mongoid/master/tutorials/mongoid-documents/#notes-on-persistence
|
|
159
|
+
User.any_instance.expects(:save!).returns(true)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
test 'response contains oauth_registration attr' do
|
|
163
|
+
post '/auth/facebook',
|
|
164
|
+
params: { auth_origin_url: @redirect_url,
|
|
165
|
+
omniauth_window_type: 'newWindow' }
|
|
166
|
+
|
|
167
|
+
follow_all_redirects!
|
|
168
|
+
|
|
169
|
+
assert_equal true, controller.auth_params[:oauth_registration]
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
describe 'with existing user' do
|
|
174
|
+
before do
|
|
175
|
+
User.any_instance.expects(:new_record?).returns(false).at_least_once
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
test 'response does not contain oauth_registration attr' do
|
|
179
|
+
post '/auth/facebook',
|
|
180
|
+
params: { auth_origin_url: @redirect_url,
|
|
181
|
+
omniauth_window_type: 'newWindow' }
|
|
182
|
+
|
|
183
|
+
follow_all_redirects!
|
|
184
|
+
|
|
185
|
+
assert_equal false, controller.auth_params.key?(:oauth_registration)
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
describe 'using namespaces' do
|
|
191
|
+
before do
|
|
192
|
+
post '/api/v1/auth/facebook',
|
|
193
|
+
params: { auth_origin_url: @redirect_url,
|
|
194
|
+
omniauth_window_type: 'newWindow' }
|
|
195
|
+
|
|
196
|
+
follow_all_redirects!
|
|
197
|
+
|
|
198
|
+
@resource = assigns(:resource)
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
test 'request is successful' do
|
|
202
|
+
assert_equal 200, response.status
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
test 'user should have been created' do
|
|
206
|
+
assert @resource
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
test 'user should be of the correct class' do
|
|
210
|
+
assert_equal User, @resource.class
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
describe 'with omniauth_window_type=inAppBrowser' do
|
|
215
|
+
test 'response contains all expected data' do
|
|
216
|
+
get_success(omniauth_window_type: 'inAppBrowser')
|
|
217
|
+
assert_expected_data_in_new_window
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
describe 'with omniauth_window_type=newWindow' do
|
|
222
|
+
test 'response contains all expected data' do
|
|
223
|
+
get_success(omniauth_window_type: 'newWindow')
|
|
224
|
+
assert_expected_data_in_new_window
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def assert_expected_data_in_new_window
|
|
229
|
+
data = get_parsed_data_json
|
|
230
|
+
expected_data = @resource.as_json.merge(controller.auth_params.as_json)
|
|
231
|
+
expected_data = ActiveSupport::JSON.decode(expected_data.to_json)
|
|
232
|
+
assert_equal(expected_data.merge('message' => 'deliverCredentials'), data)
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
describe 'with omniauth_window_type=sameWindow' do
|
|
236
|
+
test 'redirects to auth_origin_url with all expected query params' do
|
|
237
|
+
post '/auth/facebook',
|
|
238
|
+
params: { auth_origin_url: '/auth_origin',
|
|
239
|
+
omniauth_window_type: 'sameWindow' }
|
|
240
|
+
|
|
241
|
+
follow_all_redirects!
|
|
242
|
+
|
|
243
|
+
assert_equal 200, response.status
|
|
244
|
+
|
|
245
|
+
# We have been forwarded to a url with all the expected
|
|
246
|
+
# data in the query params.
|
|
247
|
+
|
|
248
|
+
# Assert that a uid was passed along. We have to assume
|
|
249
|
+
# that the rest of the values were as well, as we don't
|
|
250
|
+
# have access to @resource in this test anymore
|
|
251
|
+
assert(controller.params['uid'], 'No uid found')
|
|
252
|
+
|
|
253
|
+
# check that all the auth stuff is there
|
|
254
|
+
%i[auth_token client_id uid expiry config].each do |key|
|
|
255
|
+
assert(controller.params.key?(key), "No value for #{key.inspect}")
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def get_success(params = {})
|
|
261
|
+
post '/auth/facebook',
|
|
262
|
+
params: {
|
|
263
|
+
auth_origin_url: @redirect_url,
|
|
264
|
+
omniauth_window_type: 'newWindow'
|
|
265
|
+
}.merge(params)
|
|
266
|
+
|
|
267
|
+
follow_all_redirects!
|
|
268
|
+
|
|
269
|
+
assert_equal 200, response.status
|
|
270
|
+
|
|
271
|
+
@resource = assigns(:resource)
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
describe 'failure callback' do
|
|
276
|
+
setup do
|
|
277
|
+
OmniAuth.config.mock_auth[:facebook] = :invalid_credentials
|
|
278
|
+
OmniAuth.config.on_failure = proc { |env|
|
|
279
|
+
OmniAuth::FailureEndpoint.new(env).redirect_to_failure
|
|
280
|
+
}
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
test 'renders expected data' do
|
|
284
|
+
silence_omniauth do
|
|
285
|
+
post '/auth/facebook',
|
|
286
|
+
params: { auth_origin_url: @redirect_url,
|
|
287
|
+
omniauth_window_type: 'newWindow' }
|
|
288
|
+
|
|
289
|
+
follow_all_redirects!
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
assert_equal 200, response.status
|
|
293
|
+
|
|
294
|
+
data = get_parsed_data_json
|
|
295
|
+
|
|
296
|
+
assert_equal({ 'error' => 'invalid_credentials', 'message' => 'authFailure' }, data)
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
test 'renders something with no auth_origin_url' do
|
|
300
|
+
silence_omniauth do
|
|
301
|
+
post '/auth/facebook'
|
|
302
|
+
follow_all_redirects!
|
|
303
|
+
end
|
|
304
|
+
assert_equal 200, response.status
|
|
305
|
+
assert_select 'body', 'invalid_credentials'
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
describe 'User with only :database_authenticatable and :registerable included' do
|
|
310
|
+
test 'OnlyEmailUser should not be able to use OAuth' do
|
|
311
|
+
assert_raises(ActionController::RoutingError) do
|
|
312
|
+
get '/only_email_auth/facebook',
|
|
313
|
+
params: { auth_origin_url: @redirect_url }
|
|
314
|
+
follow_all_redirects!
|
|
315
|
+
end
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
describe 'Using redirect_whitelist' do
|
|
320
|
+
|
|
321
|
+
describe "newWindow" do
|
|
322
|
+
before do
|
|
323
|
+
@user_email = 'slemp.diggler@sillybandz.gov'
|
|
324
|
+
OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new(
|
|
325
|
+
provider: 'facebook',
|
|
326
|
+
uid: '123545',
|
|
327
|
+
info: {
|
|
328
|
+
name: 'chong',
|
|
329
|
+
email: @user_email
|
|
330
|
+
}
|
|
331
|
+
)
|
|
332
|
+
@good_redirect_url = Faker::Internet.url
|
|
333
|
+
@bad_redirect_url = Faker::Internet.url
|
|
334
|
+
DeviseTokenAuth.redirect_whitelist = [@good_redirect_url]
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
teardown do
|
|
338
|
+
DeviseTokenAuth.redirect_whitelist = nil
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
test 'request using non-whitelisted redirect fail' do
|
|
342
|
+
post '/auth/facebook',
|
|
343
|
+
params: { auth_origin_url: @bad_redirect_url,
|
|
344
|
+
omniauth_window_type: 'newWindow' }
|
|
345
|
+
|
|
346
|
+
follow_all_redirects!
|
|
347
|
+
|
|
348
|
+
data = get_parsed_data_json
|
|
349
|
+
assert_equal "Redirect to '#{@bad_redirect_url}' not allowed.",
|
|
350
|
+
data['error']
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
test 'request to whitelisted redirect should succeed' do
|
|
354
|
+
post '/auth/facebook',
|
|
355
|
+
params: {
|
|
356
|
+
auth_origin_url: @good_redirect_url,
|
|
357
|
+
omniauth_window_type: 'newWindow'
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
follow_all_redirects!
|
|
361
|
+
|
|
362
|
+
data = get_parsed_data_json
|
|
363
|
+
assert_equal @user_email, data['email']
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
test 'should support wildcards' do
|
|
367
|
+
DeviseTokenAuth.redirect_whitelist = ["#{@good_redirect_url[0..8]}*"]
|
|
368
|
+
post '/auth/facebook',
|
|
369
|
+
params: { auth_origin_url: @good_redirect_url,
|
|
370
|
+
omniauth_window_type: 'newWindow' }
|
|
371
|
+
|
|
372
|
+
follow_all_redirects!
|
|
373
|
+
|
|
374
|
+
data = get_parsed_data_json
|
|
375
|
+
assert_equal @user_email, data['email']
|
|
376
|
+
end
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
describe "sameWindow" do
|
|
380
|
+
before do
|
|
381
|
+
@user_email = 'slemp.diggler@sillybandz.gov'
|
|
382
|
+
OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new(
|
|
383
|
+
provider: 'facebook',
|
|
384
|
+
uid: '123545',
|
|
385
|
+
info: {
|
|
386
|
+
name: 'chong',
|
|
387
|
+
email: @user_email
|
|
388
|
+
}
|
|
389
|
+
)
|
|
390
|
+
@good_redirect_url = '/auth_origin'
|
|
391
|
+
@bad_redirect_url = Faker::Internet.url
|
|
392
|
+
DeviseTokenAuth.redirect_whitelist = [@good_redirect_url]
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
teardown do
|
|
396
|
+
DeviseTokenAuth.redirect_whitelist = nil
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
test 'request using non-whitelisted redirect fail' do
|
|
400
|
+
post '/auth/facebook',
|
|
401
|
+
params: { auth_origin_url: @bad_redirect_url,
|
|
402
|
+
omniauth_window_type: 'sameWindow' }
|
|
403
|
+
|
|
404
|
+
follow_all_redirects!
|
|
405
|
+
|
|
406
|
+
assert_equal 200, response.status
|
|
407
|
+
assert_equal true, response.body.include?("Redirect to '#{@bad_redirect_url}' not allowed")
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
test 'request to whitelisted redirect should succeed' do
|
|
411
|
+
post '/auth/facebook',
|
|
412
|
+
params: {
|
|
413
|
+
auth_origin_url: '/auth_origin',
|
|
414
|
+
omniauth_window_type: 'sameWindow'
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
follow_all_redirects!
|
|
418
|
+
|
|
419
|
+
assert_equal 200, response.status
|
|
420
|
+
assert_equal false, response.body.include?("Redirect to '#{@good_redirect_url}' not allowed")
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
test 'should support wildcards' do
|
|
424
|
+
DeviseTokenAuth.redirect_whitelist = ["#{@good_redirect_url[0..8]}*"]
|
|
425
|
+
post '/auth/facebook',
|
|
426
|
+
params: {
|
|
427
|
+
auth_origin_url: '/auth_origin',
|
|
428
|
+
omniauth_window_type: 'sameWindow'
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
follow_all_redirects!
|
|
432
|
+
|
|
433
|
+
assert_equal 200, response.status
|
|
434
|
+
assert_equal false, response.body.include?("Redirect to '#{@good_redirect_url}' not allowed")
|
|
435
|
+
end
|
|
436
|
+
end
|
|
437
|
+
end
|
|
438
|
+
end
|