sorcery 0.17.0 → 0.18.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.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -1
  3. data/README.md +8 -5
  4. data/lib/generators/sorcery/helpers.rb +1 -1
  5. data/lib/generators/sorcery/install_generator.rb +9 -18
  6. data/lib/generators/sorcery/templates/initializer.rb +24 -10
  7. data/lib/sorcery/adapters/active_record_adapter.rb +12 -14
  8. data/lib/sorcery/adapters/mongoid_adapter.rb +6 -8
  9. data/lib/sorcery/controller/config.rb +27 -29
  10. data/lib/sorcery/controller/submodules/activity_logging.rb +4 -7
  11. data/lib/sorcery/controller/submodules/brute_force_protection.rb +4 -1
  12. data/lib/sorcery/controller/submodules/external.rb +11 -11
  13. data/lib/sorcery/controller/submodules/http_basic_auth.rb +7 -2
  14. data/lib/sorcery/controller/submodules/remember_me.rb +2 -1
  15. data/lib/sorcery/controller/submodules/session_timeout.rb +2 -2
  16. data/lib/sorcery/controller.rb +36 -18
  17. data/lib/sorcery/crypto_providers/aes256.rb +4 -2
  18. data/lib/sorcery/crypto_providers/bcrypt.rb +2 -1
  19. data/lib/sorcery/crypto_providers/md5.rb +1 -0
  20. data/lib/sorcery/crypto_providers/sha1.rb +1 -0
  21. data/lib/sorcery/crypto_providers/sha256.rb +1 -0
  22. data/lib/sorcery/crypto_providers/sha512.rb +1 -0
  23. data/lib/sorcery/engine.rb +6 -4
  24. data/lib/sorcery/errors.rb +10 -0
  25. data/lib/sorcery/model/config.rb +20 -31
  26. data/lib/sorcery/model/submodules/activity_logging.rb +8 -6
  27. data/lib/sorcery/model/submodules/brute_force_protection.rb +16 -14
  28. data/lib/sorcery/model/submodules/external.rb +8 -10
  29. data/lib/sorcery/model/submodules/magic_login.rb +8 -4
  30. data/lib/sorcery/model/submodules/remember_me.rb +3 -3
  31. data/lib/sorcery/model/submodules/reset_password.rb +21 -13
  32. data/lib/sorcery/model/submodules/user_activation.rb +19 -17
  33. data/lib/sorcery/model/temporary_token.rb +5 -5
  34. data/lib/sorcery/model.rb +21 -25
  35. data/lib/sorcery/providers/base.rb +1 -1
  36. data/lib/sorcery/providers/facebook.rb +2 -2
  37. data/lib/sorcery/providers/github.rb +3 -3
  38. data/lib/sorcery/providers/heroku.rb +1 -2
  39. data/lib/sorcery/providers/jira.rb +3 -2
  40. data/lib/sorcery/providers/line.rb +2 -4
  41. data/lib/sorcery/providers/microsoft.rb +1 -1
  42. data/lib/sorcery/providers/twitter.rb +2 -2
  43. data/lib/sorcery/providers/vk.rb +4 -4
  44. data/lib/sorcery/providers/xing.rb +3 -2
  45. data/lib/sorcery/test_helpers/internal/rails.rb +5 -22
  46. data/lib/sorcery/test_helpers/internal.rb +4 -6
  47. data/lib/sorcery/test_helpers/rails/integration.rb +1 -1
  48. data/lib/sorcery/test_helpers/rails/request.rb +1 -1
  49. data/lib/sorcery/version.rb +1 -1
  50. data/lib/sorcery.rb +6 -1
  51. metadata +21 -150
  52. data/.devcontainer/Dockerfile +0 -10
  53. data/.devcontainer/devcontainer.json +0 -29
  54. data/.devcontainer/postcreate.sh +0 -4
  55. data/.document +0 -5
  56. data/.github/FUNDING.yml +0 -1
  57. data/.github/ISSUE_TEMPLATE.md +0 -24
  58. data/.github/PULL_REQUEST_TEMPLATE.md +0 -7
  59. data/.github/workflows/ruby.yml +0 -54
  60. data/.gitignore +0 -60
  61. data/.rspec +0 -1
  62. data/.rubocop.yml +0 -55
  63. data/.rubocop_todo.yml +0 -163
  64. data/CODE_OF_CONDUCT.md +0 -14
  65. data/Gemfile +0 -8
  66. data/MAINTAINING.md +0 -64
  67. data/Rakefile +0 -8
  68. data/SECURITY.md +0 -19
  69. data/gemfiles/rails_61.gemfile +0 -7
  70. data/gemfiles/rails_70.gemfile +0 -7
  71. data/gemfiles/rails_71.gemfile +0 -7
  72. data/sorcery.gemspec +0 -49
  73. data/spec/active_record/user_activation_spec.rb +0 -17
  74. data/spec/active_record/user_activity_logging_spec.rb +0 -15
  75. data/spec/active_record/user_brute_force_protection_spec.rb +0 -15
  76. data/spec/active_record/user_magic_login_spec.rb +0 -15
  77. data/spec/active_record/user_oauth_spec.rb +0 -15
  78. data/spec/active_record/user_remember_me_spec.rb +0 -15
  79. data/spec/active_record/user_reset_password_spec.rb +0 -15
  80. data/spec/active_record/user_spec.rb +0 -27
  81. data/spec/controllers/controller_activity_logging_spec.rb +0 -113
  82. data/spec/controllers/controller_brute_force_protection_spec.rb +0 -41
  83. data/spec/controllers/controller_http_basic_auth_spec.rb +0 -67
  84. data/spec/controllers/controller_oauth2_spec.rb +0 -568
  85. data/spec/controllers/controller_oauth_spec.rb +0 -266
  86. data/spec/controllers/controller_remember_me_spec.rb +0 -130
  87. data/spec/controllers/controller_session_timeout_spec.rb +0 -168
  88. data/spec/controllers/controller_spec.rb +0 -200
  89. data/spec/orm/active_record.rb +0 -21
  90. data/spec/providers/example_provider_spec.rb +0 -17
  91. data/spec/providers/example_spec.rb +0 -17
  92. data/spec/providers/examples_spec.rb +0 -17
  93. data/spec/providers/vk_spec.rb +0 -42
  94. data/spec/rails_app/app/active_record/authentication.rb +0 -3
  95. data/spec/rails_app/app/active_record/user.rb +0 -5
  96. data/spec/rails_app/app/active_record/user_provider.rb +0 -3
  97. data/spec/rails_app/app/assets/config/manifest.js +0 -1
  98. data/spec/rails_app/app/controllers/application_controller.rb +0 -2
  99. data/spec/rails_app/app/controllers/sorcery_controller.rb +0 -489
  100. data/spec/rails_app/app/helpers/application_helper.rb +0 -2
  101. data/spec/rails_app/app/mailers/sorcery_mailer.rb +0 -38
  102. data/spec/rails_app/app/views/application/index.html.erb +0 -17
  103. data/spec/rails_app/app/views/layouts/application.html.erb +0 -14
  104. data/spec/rails_app/app/views/sorcery_mailer/activation_email.html.erb +0 -17
  105. data/spec/rails_app/app/views/sorcery_mailer/activation_email.text.erb +0 -9
  106. data/spec/rails_app/app/views/sorcery_mailer/activation_needed_email.html.erb +0 -17
  107. data/spec/rails_app/app/views/sorcery_mailer/activation_success_email.html.erb +0 -17
  108. data/spec/rails_app/app/views/sorcery_mailer/activation_success_email.text.erb +0 -9
  109. data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.html.erb +0 -13
  110. data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.text.erb +0 -6
  111. data/spec/rails_app/app/views/sorcery_mailer/reset_password_email.html.erb +0 -16
  112. data/spec/rails_app/app/views/sorcery_mailer/reset_password_email.text.erb +0 -8
  113. data/spec/rails_app/app/views/sorcery_mailer/send_unlock_token_email.text.erb +0 -1
  114. data/spec/rails_app/config/application.rb +0 -61
  115. data/spec/rails_app/config/boot.rb +0 -4
  116. data/spec/rails_app/config/database.yml +0 -22
  117. data/spec/rails_app/config/environment.rb +0 -5
  118. data/spec/rails_app/config/environments/test.rb +0 -37
  119. data/spec/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  120. data/spec/rails_app/config/initializers/compatible_legacy_migration.rb +0 -11
  121. data/spec/rails_app/config/initializers/inflections.rb +0 -10
  122. data/spec/rails_app/config/initializers/mime_types.rb +0 -5
  123. data/spec/rails_app/config/initializers/session_store.rb +0 -12
  124. data/spec/rails_app/config/locales/en.yml +0 -5
  125. data/spec/rails_app/config/routes.rb +0 -81
  126. data/spec/rails_app/config/secrets.yml +0 -4
  127. data/spec/rails_app/config.ru +0 -4
  128. data/spec/rails_app/db/migrate/activation/20101224223622_add_activation_to_users.rb +0 -17
  129. data/spec/rails_app/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +0 -19
  130. data/spec/rails_app/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +0 -13
  131. data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +0 -16
  132. data/spec/rails_app/db/migrate/external/20101224223628_create_authentications_and_user_providers.rb +0 -22
  133. data/spec/rails_app/db/migrate/invalidate_active_sessions/20180221093235_add_invalidate_active_sessions_before_to_users.rb +0 -9
  134. data/spec/rails_app/db/migrate/magic_login/20170924151831_add_magic_login_to_users.rb +0 -17
  135. data/spec/rails_app/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +0 -15
  136. data/spec/rails_app/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +0 -15
  137. data/spec/rails_app/db/schema.rb +0 -21
  138. data/spec/rails_app/db/seeds.rb +0 -7
  139. data/spec/shared_examples/user_activation_shared_examples.rb +0 -361
  140. data/spec/shared_examples/user_activity_logging_shared_examples.rb +0 -106
  141. data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +0 -151
  142. data/spec/shared_examples/user_magic_login_shared_examples.rb +0 -150
  143. data/spec/shared_examples/user_oauth_shared_examples.rb +0 -33
  144. data/spec/shared_examples/user_remember_me_shared_examples.rb +0 -129
  145. data/spec/shared_examples/user_reset_password_shared_examples.rb +0 -370
  146. data/spec/shared_examples/user_shared_examples.rb +0 -678
  147. data/spec/sorcery_crypto_providers_spec.rb +0 -245
  148. data/spec/sorcery_temporary_token_spec.rb +0 -27
  149. data/spec/spec.opts +0 -2
  150. data/spec/spec_helper.rb +0 -50
  151. data/spec/support/migration_helper.rb +0 -29
  152. data/spec/support/providers/example.rb +0 -11
  153. data/spec/support/providers/example_provider.rb +0 -11
  154. data/spec/support/providers/examples.rb +0 -11
@@ -1,568 +0,0 @@
1
- require 'spec_helper'
2
-
3
- # require 'shared_examples/controller_oauth2_shared_examples'
4
-
5
- describe SorceryController, active_record: true, type: :controller do
6
- before(:all) do
7
- if SORCERY_ORM == :active_record
8
- MigrationHelper.migrate("#{Rails.root}/db/migrate/external")
9
- MigrationHelper.migrate("#{Rails.root}/db/migrate/activation")
10
- MigrationHelper.migrate("#{Rails.root}/db/migrate/activity_logging")
11
- User.reset_column_information
12
- end
13
-
14
- sorcery_reload!([:external])
15
- set_external_property
16
- end
17
-
18
- after(:all) do
19
- if SORCERY_ORM == :active_record
20
- MigrationHelper.rollback("#{Rails.root}/db/migrate/external")
21
- MigrationHelper.rollback("#{Rails.root}/db/migrate/activity_logging")
22
- MigrationHelper.rollback("#{Rails.root}/db/migrate/activation")
23
- end
24
- end
25
-
26
- describe 'using create_from' do
27
- before(:each) do
28
- stub_all_oauth2_requests!
29
- end
30
-
31
- it 'creates a new user' do
32
- sorcery_model_property_set(:authentications_class, Authentication)
33
- sorcery_controller_external_property_set(:facebook, :user_info_mapping, username: 'name')
34
-
35
- expect(User).to receive(:create_from_provider).with('facebook', '123', { username: 'Noam Ben Ari' })
36
- get :test_create_from_provider, params: { provider: 'facebook' }
37
- end
38
-
39
- it 'supports nested attributes' do
40
- sorcery_model_property_set(:authentications_class, Authentication)
41
- sorcery_controller_external_property_set(:facebook, :user_info_mapping, username: 'hometown/name')
42
- expect(User).to receive(:create_from_provider).with('facebook', '123', { username: 'Haifa, Israel' })
43
-
44
- get :test_create_from_provider, params: { provider: 'facebook' }
45
- end
46
-
47
- it 'does not crash on missing nested attributes' do
48
- sorcery_model_property_set(:authentications_class, Authentication)
49
- sorcery_controller_external_property_set(:facebook, :user_info_mapping, username: 'name', created_at: 'does/not/exist')
50
-
51
- expect(User).to receive(:create_from_provider).with('facebook', '123', { username: 'Noam Ben Ari' })
52
-
53
- get :test_create_from_provider, params: { provider: 'facebook' }
54
- end
55
-
56
- describe 'with a block' do
57
- it 'does not create user' do
58
- sorcery_model_property_set(:authentications_class, Authentication)
59
- sorcery_controller_external_property_set(:facebook, :user_info_mapping, username: 'name')
60
-
61
- u = double('user')
62
- expect(User).to receive(:create_from_provider).with('facebook', '123', { username: 'Noam Ben Ari' }).and_return(u).and_yield(u)
63
- # test_create_from_provider_with_block in controller will check for uniqueness of username
64
- get :test_create_from_provider_with_block, params: { provider: 'facebook' }
65
- end
66
- end
67
- end
68
-
69
- # ----------------- OAuth -----------------------
70
- context 'with OAuth features' do
71
- let(:user) { double('user', id: 42) }
72
-
73
- before(:each) do
74
- stub_all_oauth2_requests!
75
- end
76
-
77
- after(:each) do
78
- User.sorcery_adapter.delete_all
79
- Authentication.sorcery_adapter.delete_all
80
- end
81
-
82
- context 'when callback_url begin with /' do
83
- before do
84
- sorcery_controller_external_property_set(:facebook, :callback_url, '/oauth/twitter/callback')
85
- end
86
- it 'login_at redirects correctly' do
87
- get :login_at_test_facebook
88
- expect(response).to be_a_redirect
89
- 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")
90
- end
91
-
92
- it 'logins with state' do
93
- get :login_at_test_with_state
94
- expect(response).to be_a_redirect
95
- 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")
96
- end
97
-
98
- it 'logins with Graph API version' do
99
- sorcery_controller_external_property_set(:facebook, :api_version, 'v2.2')
100
- get :login_at_test_with_state
101
- expect(response).to be_a_redirect
102
- 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")
103
- end
104
-
105
- it 'logins without state after login with state' do
106
- get :login_at_test_with_state
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=bla")
108
-
109
- get :login_at_test_facebook
110
- 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")
111
- end
112
-
113
- after do
114
- sorcery_controller_external_property_set(:facebook, :callback_url, 'http://blabla.com')
115
- end
116
- end
117
-
118
- context 'when callback_url begin with http://' do
119
- before do
120
- sorcery_controller_external_property_set(:facebook, :callback_url, '/oauth/twitter/callback')
121
- sorcery_controller_external_property_set(:facebook, :api_version, 'v2.2')
122
- end
123
-
124
- it 'login_at redirects correctly' do
125
- create_new_user
126
- get :login_at_test_facebook
127
- expect(response).to be_a_redirect
128
- 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")
129
- end
130
-
131
- after do
132
- sorcery_controller_external_property_set(:facebook, :callback_url, 'http://blabla.com')
133
- end
134
- end
135
-
136
- it "'login_from' logins if user exists" do
137
- # dirty hack for rails 4
138
- allow(subject).to receive(:register_last_activity_time_to_db)
139
-
140
- sorcery_model_property_set(:authentications_class, Authentication)
141
- expect(User).to receive(:load_from_provider).with(:facebook, '123').and_return(user)
142
- get :test_login_from_facebook
143
-
144
- expect(flash[:notice]).to eq 'Success!'
145
- end
146
-
147
- it "'login_from' fails if user doesn't exist" do
148
- sorcery_model_property_set(:authentications_class, Authentication)
149
- expect(User).to receive(:load_from_provider).with(:facebook, '123').and_return(nil)
150
- get :test_login_from_facebook
151
-
152
- expect(flash[:alert]).to eq 'Failed!'
153
- end
154
-
155
- it 'on successful login_from the user is redirected to the url he originally wanted' do
156
- # dirty hack for rails 4
157
- allow(subject).to receive(:register_last_activity_time_to_db)
158
-
159
- sorcery_model_property_set(:authentications_class, Authentication)
160
- expect(User).to receive(:load_from_provider).with(:facebook, '123').and_return(user)
161
- get :test_return_to_with_external_facebook, params: {}, session: { return_to_url: 'fuu' }
162
-
163
- expect(response).to redirect_to('fuu')
164
- expect(flash[:notice]).to eq 'Success!'
165
- end
166
-
167
- %i[github google liveid vk salesforce paypal slack wechat microsoft instagram auth0 discord battlenet].each do |provider|
168
- describe "with #{provider}" do
169
- it 'login_at redirects correctly' do
170
- get :"login_at_test_#{provider}"
171
-
172
- expect(response).to be_a_redirect
173
- expect(response).to redirect_to(provider_url(provider))
174
- end
175
-
176
- it "'login_from' logins if user exists" do
177
- # dirty hack for rails 4
178
- allow(subject).to receive(:register_last_activity_time_to_db)
179
-
180
- sorcery_model_property_set(:authentications_class, Authentication)
181
- expect(User).to receive(:load_from_provider).with(provider, '123').and_return(user)
182
- get :"test_login_from_#{provider}"
183
-
184
- expect(flash[:notice]).to eq 'Success!'
185
- end
186
-
187
- it "'login_from' fails if user doesn't exist" do
188
- sorcery_model_property_set(:authentications_class, Authentication)
189
- expect(User).to receive(:load_from_provider).with(provider, '123').and_return(nil)
190
- get :"test_login_from_#{provider}"
191
-
192
- expect(flash[:alert]).to eq 'Failed!'
193
- end
194
-
195
- it "on successful login_from the user is redirected to the url he originally wanted (#{provider})" do
196
- # dirty hack for rails 4
197
- allow(subject).to receive(:register_last_activity_time_to_db)
198
-
199
- sorcery_model_property_set(:authentications_class, Authentication)
200
- expect(User).to receive(:load_from_provider).with(provider, '123').and_return(user)
201
- get :"test_return_to_with_external_#{provider}", params: {}, session: { return_to_url: 'fuu' }
202
-
203
- expect(response).to redirect_to 'fuu'
204
- expect(flash[:notice]).to eq 'Success!'
205
- end
206
- end
207
- end
208
- end
209
-
210
- describe 'OAuth with User Activation features' do
211
- before(:all) do
212
- sorcery_reload!(%i[user_activation external], user_activation_mailer: ::SorceryMailer)
213
- sorcery_controller_property_set(
214
- :external_providers,
215
- %i[
216
- facebook
217
- github
218
- google
219
- liveid
220
- vk
221
- salesforce
222
- paypal
223
- slack
224
- wechat
225
- microsoft
226
- instagram
227
- auth0
228
- line
229
- discord
230
- battlenet
231
- ]
232
- )
233
-
234
- # TODO: refactor
235
- sorcery_controller_external_property_set(:facebook, :key, 'eYVNBjBDi33aa9GkA3w')
236
- sorcery_controller_external_property_set(:facebook, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
237
- sorcery_controller_external_property_set(:facebook, :callback_url, 'http://blabla.com')
238
- sorcery_controller_external_property_set(:github, :key, 'eYVNBjBDi33aa9GkA3w')
239
- sorcery_controller_external_property_set(:github, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
240
- sorcery_controller_external_property_set(:github, :callback_url, 'http://blabla.com')
241
- sorcery_controller_external_property_set(:google, :key, 'eYVNBjBDi33aa9GkA3w')
242
- sorcery_controller_external_property_set(:google, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
243
- sorcery_controller_external_property_set(:google, :callback_url, 'http://blabla.com')
244
- sorcery_controller_external_property_set(:liveid, :key, 'eYVNBjBDi33aa9GkA3w')
245
- sorcery_controller_external_property_set(:liveid, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
246
- sorcery_controller_external_property_set(:liveid, :callback_url, 'http://blabla.com')
247
- sorcery_controller_external_property_set(:vk, :key, 'eYVNBjBDi33aa9GkA3w')
248
- sorcery_controller_external_property_set(:vk, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
249
- sorcery_controller_external_property_set(:vk, :callback_url, 'http://blabla.com')
250
- sorcery_controller_external_property_set(:salesforce, :key, 'eYVNBjBDi33aa9GkA3w')
251
- sorcery_controller_external_property_set(:salesforce, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
252
- sorcery_controller_external_property_set(:salesforce, :callback_url, 'http://blabla.com')
253
- sorcery_controller_external_property_set(:paypal, :key, 'eYVNBjBDi33aa9GkA3w')
254
- sorcery_controller_external_property_set(:paypal, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
255
- sorcery_controller_external_property_set(:paypal, :callback_url, 'http://blabla.com')
256
- sorcery_controller_external_property_set(:slack, :key, 'eYVNBjBDi33aa9GkA3w')
257
- sorcery_controller_external_property_set(:slack, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
258
- sorcery_controller_external_property_set(:slack, :callback_url, 'http://blabla.com')
259
- sorcery_controller_external_property_set(:wechat, :key, 'eYVNBjBDi33aa9GkA3w')
260
- sorcery_controller_external_property_set(:wechat, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
261
- sorcery_controller_external_property_set(:wechat, :callback_url, 'http://blabla.com')
262
- sorcery_controller_external_property_set(:microsoft, :key, 'eYVNBjBDi33aa9GkA3w')
263
- sorcery_controller_external_property_set(:microsoft, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
264
- sorcery_controller_external_property_set(:microsoft, :callback_url, 'http://blabla.com')
265
- sorcery_controller_external_property_set(:instagram, :key, 'eYVNBjBDi33aa9GkA3w')
266
- sorcery_controller_external_property_set(:instagram, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
267
- sorcery_controller_external_property_set(:instagram, :callback_url, 'http://blabla.com')
268
- sorcery_controller_external_property_set(:auth0, :key, 'eYVNBjBDi33aa9GkA3w')
269
- sorcery_controller_external_property_set(:auth0, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
270
- sorcery_controller_external_property_set(:auth0, :callback_url, 'http://blabla.com')
271
- sorcery_controller_external_property_set(:auth0, :site, 'https://sorcery-test.auth0.com')
272
- sorcery_controller_external_property_set(:line, :key, "eYVNBjBDi33aa9GkA3w")
273
- sorcery_controller_external_property_set(:line, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
274
- sorcery_controller_external_property_set(:line, :callback_url, "http://blabla.com")
275
- sorcery_controller_external_property_set(:discord, :key, 'eYVNBjBDi33aa9GkA3w')
276
- sorcery_controller_external_property_set(:discord, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
277
- sorcery_controller_external_property_set(:discord, :callback_url, 'http://blabla.com')
278
- sorcery_controller_external_property_set(:battlenet, :key, '4c43d4862c774ca5bbde89873bf0d338')
279
- sorcery_controller_external_property_set(:battlenet, :secret, 'TxY7IwKOykACd8kUxPyVGTqBs44UBDdX')
280
- sorcery_controller_external_property_set(:battlenet, :callback_url, 'http://blabla.com')
281
- end
282
-
283
- after(:each) do
284
- User.sorcery_adapter.delete_all
285
- end
286
-
287
- it 'does not send activation email to external users' do
288
- old_size = ActionMailer::Base.deliveries.size
289
- create_new_external_user(:facebook)
290
-
291
- expect(ActionMailer::Base.deliveries.size).to eq old_size
292
- end
293
-
294
- it 'does not send external users an activation success email' do
295
- sorcery_model_property_set(:activation_success_email_method_name, nil)
296
- create_new_external_user(:facebook)
297
- old_size = ActionMailer::Base.deliveries.size
298
- @user.activate!
299
-
300
- expect(ActionMailer::Base.deliveries.size).to eq old_size
301
- end
302
-
303
- %i[github google liveid vk salesforce paypal wechat microsoft instagram auth0 discord battlenet].each do |provider|
304
- it "does not send activation email to external users (#{provider})" do
305
- old_size = ActionMailer::Base.deliveries.size
306
- create_new_external_user provider
307
- expect(ActionMailer::Base.deliveries.size).to eq old_size
308
- end
309
-
310
- it "does not send external users an activation success email (#{provider})" do
311
- sorcery_model_property_set(:activation_success_email_method_name, nil)
312
- create_new_external_user provider
313
- old_size = ActionMailer::Base.deliveries.size
314
- @user.activate!
315
- expect(ActionMailer::Base.deliveries.size).to eq old_size
316
- end
317
- end
318
- end
319
-
320
- describe 'OAuth with user activation features' do
321
- let(:user) { double('user', id: 42) }
322
-
323
- before(:all) do
324
- sorcery_reload!(%i[activity_logging external])
325
- end
326
-
327
- %w[facebook github google liveid vk salesforce slack discord battlenet].each do |provider|
328
- context "when #{provider}" do
329
- before(:each) do
330
- sorcery_controller_property_set(:register_login_time, true)
331
- sorcery_controller_property_set(:register_logout_time, false)
332
- sorcery_controller_property_set(:register_last_activity_time, false)
333
- sorcery_controller_property_set(:register_last_ip_address, false)
334
- stub_all_oauth2_requests!
335
- sorcery_model_property_set(:authentications_class, Authentication)
336
- end
337
-
338
- it 'registers login time' do
339
- now = Time.now.in_time_zone
340
- Timecop.freeze(now)
341
- expect(User).to receive(:load_from_provider).and_return(user)
342
- expect(user).to receive(:set_last_login_at).with(be_within(0.1).of(now))
343
- get "test_login_from_#{provider}".to_sym
344
- Timecop.return
345
- end
346
-
347
- it 'does not register login time if configured so' do
348
- sorcery_controller_property_set(:register_login_time, false)
349
- now = Time.now.in_time_zone
350
- Timecop.freeze(now)
351
- expect(User).to receive(:load_from_provider).and_return(user)
352
- expect(user).to receive(:set_last_login_at).never
353
- get "test_login_from_#{provider}".to_sym
354
- end
355
- end
356
- end
357
- end
358
-
359
- describe 'OAuth with session timeout features' do
360
- before(:all) do
361
- sorcery_reload!(%i[session_timeout external])
362
- end
363
-
364
- let(:user) { double('user', id: 42) }
365
-
366
- %w[facebook github google liveid vk salesforce slack discord battlenet].each do |provider|
367
- context "when #{provider}" do
368
- before(:each) do
369
- sorcery_model_property_set(:authentications_class, Authentication)
370
- sorcery_controller_property_set(:session_timeout, 0.5)
371
- stub_all_oauth2_requests!
372
- end
373
-
374
- after(:each) do
375
- Timecop.return
376
- end
377
-
378
- it 'does not reset session before session timeout' do
379
- expect(User).to receive(:load_from_provider).with(provider.to_sym, '123').and_return(user)
380
- get "test_login_from_#{provider}".to_sym
381
-
382
- expect(session[:user_id]).not_to be_nil
383
- expect(flash[:notice]).to eq 'Success!'
384
- end
385
-
386
- it 'resets session after session timeout' do
387
- expect(User).to receive(:load_from_provider).with(provider.to_sym, '123').and_return(user)
388
- get "test_login_from_#{provider}".to_sym
389
- expect(session[:user_id]).to eq '42'
390
- Timecop.travel(Time.now.in_time_zone + 0.6)
391
- get :test_should_be_logged_in
392
-
393
- expect(session[:user_id]).to be_nil
394
- expect(response).to be_a_redirect
395
- end
396
- end
397
- end
398
- end
399
-
400
- def stub_all_oauth2_requests!
401
- access_token = double(OAuth2::AccessToken)
402
- allow(access_token).to receive(:token_param=)
403
- # Needed for Instagram
404
- allow(access_token).to receive(:[]).with(:client_id) { 'eYVNBjBDi33aa9GkA3w' }
405
- response = double(OAuth2::Response)
406
- allow(response).to receive(:body) {
407
- {
408
- 'id' => '123',
409
- 'user_id' => '123', # Needed for Salesforce
410
- 'sub' => '123', # Needed for Auth0
411
- 'name' => 'Noam Ben Ari',
412
- 'first_name' => 'Noam',
413
- 'last_name' => 'Ben Ari',
414
- 'link' => 'http://www.facebook.com/nbenari1',
415
- 'hometown' => {
416
- 'id' => '110619208966868',
417
- 'name' => 'Haifa, Israel'
418
- },
419
- 'location' => {
420
- 'id' => '106906559341067',
421
- 'name' => 'Pardes Hanah, Hefa, Israel'
422
- },
423
- 'bio' => "I'm a new daddy, and enjoying it!",
424
- 'gender' => 'male',
425
- 'email' => 'nbenari@gmail.com',
426
- 'timezone' => 2,
427
- 'locale' => 'en_US',
428
- 'languages' => [
429
- {
430
- 'id' => '108405449189952',
431
- 'name' => 'Hebrew'
432
- },
433
- {
434
- 'id' => '106059522759137',
435
- 'name' => 'English'
436
- },
437
- {
438
- 'id' => '112624162082677',
439
- 'name' => 'Russian'
440
- }
441
- ],
442
- 'verified' => true,
443
- 'updated_time' => '2011-02-16T20:59:38+0000',
444
- # response for VK auth
445
- 'response' => [
446
- {
447
- 'id' => '123',
448
- 'first_name' => 'Noam',
449
- 'last_name' => 'Ben Ari'
450
- }
451
- ],
452
- 'user' => {
453
- 'name' => 'Sonny Whether',
454
- 'id' => '123',
455
- 'email' => 'bobby@example.com'
456
- },
457
- # response for wechat auth
458
- 'unionid' => '123',
459
- # response for instagram
460
- 'data' => {
461
- 'username' => 'pnmahoney',
462
- 'bio' => 'turn WHAT down?',
463
- 'website' => '',
464
- 'profile_picture' => 'http://photos-d.ak.instagram.com/hphotos-ak-xpa1/10454121_417985815007395_867850883_a.jpg',
465
- 'full_name' => 'Patrick Mahoney',
466
- 'counts' => {
467
- 'media' => 2,
468
- 'followed_by' => 100,
469
- 'follows' => 71
470
- },
471
- 'id' => '123'
472
- }
473
- }.to_json
474
- }
475
- allow(access_token).to receive(:get) { response }
476
- allow(access_token).to receive(:token) { '187041a618229fdaf16613e96e1caabc1e86e46bbfad228de41520e63fe45873684c365a14417289599f3' }
477
- # access_token params for VK auth
478
- allow(access_token).to receive(:params) { { 'user_id' => '100500', 'email' => 'nbenari@gmail.com' } }
479
- allow_any_instance_of(OAuth2::Strategy::AuthCode).to receive(:get_token) { access_token }
480
- end
481
-
482
- def set_external_property
483
- sorcery_controller_property_set(
484
- :external_providers,
485
- %i[
486
- facebook
487
- github
488
- google
489
- liveid
490
- vk
491
- salesforce
492
- paypal
493
- slack
494
- wechat
495
- microsoft
496
- instagram
497
- auth0
498
- line
499
- discord
500
- battlenet
501
- ]
502
- )
503
- sorcery_controller_external_property_set(:facebook, :key, 'eYVNBjBDi33aa9GkA3w')
504
- sorcery_controller_external_property_set(:facebook, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
505
- sorcery_controller_external_property_set(:facebook, :callback_url, 'http://blabla.com')
506
- sorcery_controller_external_property_set(:github, :key, 'eYVNBjBDi33aa9GkA3w')
507
- sorcery_controller_external_property_set(:github, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
508
- sorcery_controller_external_property_set(:github, :callback_url, 'http://blabla.com')
509
- sorcery_controller_external_property_set(:google, :key, 'eYVNBjBDi33aa9GkA3w')
510
- sorcery_controller_external_property_set(:google, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
511
- sorcery_controller_external_property_set(:google, :callback_url, 'http://blabla.com')
512
- sorcery_controller_external_property_set(:liveid, :key, 'eYVNBjBDi33aa9GkA3w')
513
- sorcery_controller_external_property_set(:liveid, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
514
- sorcery_controller_external_property_set(:liveid, :callback_url, 'http://blabla.com')
515
- sorcery_controller_external_property_set(:vk, :key, 'eYVNBjBDi33aa9GkA3w')
516
- sorcery_controller_external_property_set(:vk, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
517
- sorcery_controller_external_property_set(:vk, :callback_url, 'http://blabla.com')
518
- sorcery_controller_external_property_set(:salesforce, :key, 'eYVNBjBDi33aa9GkA3w')
519
- sorcery_controller_external_property_set(:salesforce, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
520
- sorcery_controller_external_property_set(:salesforce, :callback_url, 'http://blabla.com')
521
- sorcery_controller_external_property_set(:paypal, :key, 'eYVNBjBDi33aa9GkA3w')
522
- sorcery_controller_external_property_set(:paypal, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
523
- sorcery_controller_external_property_set(:paypal, :callback_url, 'http://blabla.com')
524
- sorcery_controller_external_property_set(:slack, :key, 'eYVNBjBDi33aa9GkA3w')
525
- sorcery_controller_external_property_set(:slack, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
526
- sorcery_controller_external_property_set(:slack, :callback_url, 'http://blabla.com')
527
- sorcery_controller_external_property_set(:wechat, :key, 'eYVNBjBDi33aa9GkA3w')
528
- sorcery_controller_external_property_set(:wechat, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
529
- sorcery_controller_external_property_set(:wechat, :callback_url, 'http://blabla.com')
530
- sorcery_controller_external_property_set(:microsoft, :key, 'eYVNBjBDi33aa9GkA3w')
531
- sorcery_controller_external_property_set(:microsoft, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
532
- sorcery_controller_external_property_set(:microsoft, :callback_url, 'http://blabla.com')
533
- sorcery_controller_external_property_set(:instagram, :key, 'eYVNBjBDi33aa9GkA3w')
534
- sorcery_controller_external_property_set(:instagram, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
535
- sorcery_controller_external_property_set(:instagram, :callback_url, 'http://blabla.com')
536
- sorcery_controller_external_property_set(:auth0, :key, 'eYVNBjBDi33aa9GkA3w')
537
- sorcery_controller_external_property_set(:auth0, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
538
- sorcery_controller_external_property_set(:auth0, :callback_url, 'http://blabla.com')
539
- sorcery_controller_external_property_set(:auth0, :site, 'https://sorcery-test.auth0.com')
540
- sorcery_controller_external_property_set(:line, :key, "eYVNBjBDi33aa9GkA3w")
541
- sorcery_controller_external_property_set(:line, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8")
542
- sorcery_controller_external_property_set(:line, :callback_url, "http://blabla.com")
543
- sorcery_controller_external_property_set(:discord, :key, 'eYVNBjBDi33aa9GkA3w')
544
- sorcery_controller_external_property_set(:discord, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
545
- sorcery_controller_external_property_set(:discord, :callback_url, 'http://blabla.com')
546
- sorcery_controller_external_property_set(:battlenet, :key, '4c43d4862c774ca5bbde89873bf0d338')
547
- sorcery_controller_external_property_set(:battlenet, :secret, 'TxY7IwKOykACd8kUxPyVGTqBs44UBDdX')
548
- sorcery_controller_external_property_set(:battlenet, :callback_url, 'http://blabla.com')
549
- end
550
-
551
- def provider_url(provider)
552
- {
553
- 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",
554
- paypal: "https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize?client_id=#{::Sorcery::Controller::Config.paypal.key}&display&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=openid+email&state",
555
- 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",
556
- 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",
557
- 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",
558
- 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 unless ::Sorcery::Controller::Config.salesforce.scope.nil?}&state",
559
- slack: "https://slack.com/oauth/authorize?client_id=#{::Sorcery::Controller::Config.slack.key}&display&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=identity.basic%2C+identity.email&state",
560
- wechat: "https://open.weixin.qq.com/connect/qrconnect?appid=#{::Sorcery::Controller::Config.wechat.key}&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=snsapi_login&state=#wechat_redirect",
561
- microsoft: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=#{::Sorcery::Controller::Config.microsoft.key}&display&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=openid+email+https%3A%2F%2Fgraph.microsoft.com%2FUser.Read&state",
562
- instagram: "https://api.instagram.com/oauth/authorize?client_id=#{::Sorcery::Controller::Config.instagram.key}&display&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=#{::Sorcery::Controller::Config.instagram.scope}&state",
563
- auth0: "https://sorcery-test.auth0.com/authorize?client_id=#{::Sorcery::Controller::Config.auth0.key}&display&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=openid+profile+email&state",
564
- discord: "https://discordapp.com/api/oauth2/authorize?client_id=#{::Sorcery::Controller::Config.discord.key}&display&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=identify&state",
565
- battlenet: "https://eu.battle.net/oauth/authorize?client_id=#{::Sorcery::Controller::Config.battlenet.key}&display&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=openid&state"
566
- }[provider]
567
- end
568
- end