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,266 +0,0 @@
1
- require 'spec_helper'
2
-
3
- # require 'shared_examples/controller_oauth_shared_examples'
4
- require 'ostruct'
5
-
6
- def stub_all_oauth_requests!
7
- consumer = OAuth::Consumer.new('key', 'secret', site: 'http://myapi.com')
8
- req_token = OAuth::RequestToken.new(consumer)
9
- acc_token = OAuth::AccessToken.new(consumer)
10
-
11
- response = OpenStruct.new
12
- response.body = {
13
- 'following' => false, 'listed_count' => 0, 'profile_link_color' => '0084B4',
14
- 'profile_image_url' => 'http://a1.twimg.com/profile_images/536178575/noamb_normal.jpg',
15
- 'description' => 'Programmer/Heavy Metal Fan/New Father',
16
- 'status' => {
17
- 'text' => 'coming soon to sorcery gem: twitter and facebook authentication support.',
18
- 'truncated' => false, 'favorited' => false, 'source' => 'web', 'geo' => nil,
19
- 'in_reply_to_screen_name' => nil, 'in_reply_to_user_id' => nil,
20
- 'in_reply_to_status_id_str' => nil, 'created_at' => 'Sun Mar 06 23:01:12 +0000 2011',
21
- 'contributors' => nil, 'place' => nil, 'retweeted' => false, 'in_reply_to_status_id' => nil,
22
- 'in_reply_to_user_id_str' => nil, 'coordinates' => nil, 'retweet_count' => 0,
23
- 'id' => 44_533_012_284_706_816, 'id_str' => '44533012284706816'
24
- },
25
- 'show_all_inline_media' => false, 'geo_enabled' => true,
26
- 'profile_sidebar_border_color' => 'a8c7f7', 'url' => nil, 'followers_count' => 10,
27
- 'screen_name' => 'nbenari', 'profile_use_background_image' => true, 'location' => 'Israel',
28
- 'statuses_count' => 25, 'profile_background_color' => '022330', 'lang' => 'en',
29
- 'verified' => false, 'notifications' => false,
30
- 'profile_background_image_url' => 'http://a3.twimg.com/profile_background_images/104087198/04042010339.jpg',
31
- 'favourites_count' => 5, 'created_at' => 'Fri Nov 20 21:58:19 +0000 2009',
32
- 'is_translator' => false, 'contributors_enabled' => false, 'protected' => false,
33
- 'follow_request_sent' => false, 'time_zone' => 'Greenland', 'profile_text_color' => '333333',
34
- 'name' => 'Noam Ben Ari', 'friends_count' => 10, 'profile_sidebar_fill_color' => 'C0DFEC',
35
- 'id' => 123, 'id_str' => '91434812', 'profile_background_tile' => false, 'utc_offset' => -10_800
36
- }.to_json
37
-
38
- session[:request_token] = req_token.token
39
- session[:request_token_secret] = req_token.secret
40
-
41
- allow(OAuth::Consumer).to receive(:new) { consumer }
42
- allow(consumer).to receive(:get_request_token) { req_token }
43
- allow(req_token).to receive(:get_access_token) { acc_token }
44
- allow(OAuth::RequestToken).to receive(:new) { req_token }
45
- allow(acc_token).to receive(:get) { response }
46
- end
47
-
48
- describe SorceryController, type: :controller do
49
- let(:user) { double('user', id: 42) }
50
-
51
- before(:all) do
52
- sorcery_reload!([:external])
53
- sorcery_controller_property_set(:external_providers, %i[twitter jira])
54
- sorcery_controller_external_property_set(:twitter, :key, 'eYVNBjBDi33aa9GkA3w')
55
- sorcery_controller_external_property_set(:twitter, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
56
- sorcery_controller_external_property_set(:twitter, :callback_url, 'http://blabla.com')
57
-
58
- sorcery_controller_external_property_set(:jira, :key, '7810b8e317ebdc81601c72f8daecc0f1')
59
- sorcery_controller_external_property_set(:jira, :secret, 'MyAppUsingJira')
60
- sorcery_controller_external_property_set(:jira, :site, 'http://jira.mycompany.com/plugins/servlet/oauth')
61
- sorcery_controller_external_property_set(:jira, :signature_method, 'RSA-SHA1')
62
- sorcery_controller_external_property_set(:jira, :private_key_file, 'myrsakey.pem')
63
- sorcery_controller_external_property_set(:jira, :callback_url, 'http://myappusingjira.com/home')
64
- end
65
-
66
- # ----------------- OAuth -----------------------
67
- describe SorceryController, "'using external API to login'" do
68
- before(:each) do
69
- stub_all_oauth_requests!
70
- end
71
-
72
- context 'when callback_url begin with /' do
73
- before do
74
- sorcery_controller_external_property_set(:twitter, :callback_url, '/oauth/twitter/callback')
75
- end
76
- it 'login_at redirects correctly' do
77
- get :login_at_test
78
- expect(response).to be_a_redirect
79
- expect(response).to redirect_to('http://myapi.com/oauth/authorize?oauth_callback=http%3A%2F%2Ftest.host%2Foauth%2Ftwitter%2Fcallback&oauth_token=')
80
- end
81
- after do
82
- sorcery_controller_external_property_set(:twitter, :callback_url, 'http://blabla.com')
83
- end
84
- end
85
-
86
- context 'when callback_url begin with http://' do
87
- before do
88
- sorcery_controller_external_property_set(:twitter, :callback_url, '/oauth/twitter/callback')
89
- end
90
- it 'login_at redirects correctly', pending: true do
91
- get :login_at_test
92
- expect(response).to be_a_redirect
93
- expect(response).to redirect_to('http://myapi.com/oauth/authorize?oauth_callback=http%3A%2F%2Fblabla.com&oauth_token=')
94
- end
95
- after do
96
- sorcery_controller_external_property_set(:twitter, :callback_url, 'http://blabla.com')
97
- end
98
- end
99
-
100
- it 'logins if user exists' do
101
- expect(User).to receive(:load_from_provider).with(:twitter, '123').and_return(user)
102
-
103
- get :test_login_from, params: { oauth_verifier: 'blablaRERASDFcxvSDFA' }
104
- expect(flash[:notice]).to eq 'Success!'
105
- end
106
-
107
- it "'login_from' fails if user doesn't exist" do
108
- expect(User).to receive(:load_from_provider).with(:twitter, '123').and_return(nil)
109
-
110
- get :test_login_from, params: { oauth_verifier: 'blablaRERASDFcxvSDFA' }
111
- expect(flash[:alert]).to eq 'Failed!'
112
- end
113
-
114
- it "on successful 'login_from' the user is redirected to the url he originally wanted" do
115
- expect(User).to receive(:load_from_provider).with(:twitter, '123').and_return(user)
116
- get :test_return_to_with_external, params: {}, session: { return_to_url: 'fuu' }
117
- expect(response).to redirect_to('fuu')
118
- expect(flash[:notice]).to eq 'Success!'
119
- end
120
-
121
- context 'when jira' do
122
- it 'user logins successfully' do
123
- get :login_at_test_jira
124
- expect(session[:request_token]).not_to be_nil
125
- expect(response).to be_a_redirect
126
- end
127
- end
128
- end
129
-
130
- describe SorceryController do
131
- describe "using 'create_from'" do
132
- before(:each) do
133
- stub_all_oauth_requests!
134
- end
135
-
136
- it 'creates a new user' do
137
- sorcery_controller_external_property_set(:twitter, :user_info_mapping, username: 'screen_name')
138
- expect(User).to receive(:load_from_provider).with('twitter', '123').and_return(nil)
139
- expect(User).to receive(:create_from_provider).with('twitter', '123', { username: 'nbenari' }).and_return(user)
140
-
141
- get :test_create_from_provider, params: { provider: 'twitter' }
142
- end
143
-
144
- it 'supports nested attributes' do
145
- sorcery_controller_external_property_set(:twitter, :user_info_mapping, username: 'status/text')
146
- expect(User).to receive(:load_from_provider).with('twitter', '123').and_return(nil)
147
- expect(User).to receive(:create_from_provider).with('twitter', '123', { username: 'coming soon to sorcery gem: twitter and facebook authentication support.' }).and_return(user)
148
-
149
- get :test_create_from_provider, params: { provider: 'twitter' }
150
- end
151
-
152
- it 'does not crash on missing nested attributes' do
153
- sorcery_controller_external_property_set(:twitter, :user_info_mapping, username: 'status/text', created_at: 'does/not/exist')
154
- expect(User).to receive(:load_from_provider).with('twitter', '123').and_return(nil)
155
- expect(User).to receive(:create_from_provider).with('twitter', '123', { username: 'coming soon to sorcery gem: twitter and facebook authentication support.' }).and_return(user)
156
-
157
- get :test_create_from_provider, params: { provider: 'twitter' }
158
- end
159
-
160
- it 'binds new provider' do
161
- sorcery_model_property_set(:authentications_class, UserProvider)
162
-
163
- allow(user).to receive_message_chain(:sorcery_config, :username_attribute_names, :first) { :username }
164
- allow(user).to receive(:username).and_return('bla@bla.com')
165
- login_user(user)
166
-
167
- expect(user).to receive(:add_provider_to_user).with('twitter', '123')
168
- get :test_add_second_provider, params: { provider: 'twitter' }
169
- end
170
-
171
- describe 'with a block' do
172
- it 'does not create user' do
173
- sorcery_model_property_set(:authentications_class, Authentication)
174
- sorcery_controller_external_property_set(:twitter, :user_info_mapping, username: 'screen_name')
175
-
176
- u = double('user')
177
- expect(User).to receive(:load_from_provider).with('twitter', '123').and_return(nil)
178
- expect(User).to receive(:create_from_provider).with('twitter', '123', { username: 'nbenari' }).and_return(u).and_yield(u)
179
-
180
- get :test_create_from_provider_with_block, params: { provider: 'twitter' }
181
- end
182
- end
183
- end
184
- end
185
-
186
- describe SorceryController, 'OAuth with user activation features' do
187
- before(:all) do
188
- sorcery_reload!(%i[activity_logging external])
189
- end
190
-
191
- context 'when twitter' do
192
- before(:each) do
193
- sorcery_controller_property_set(:register_login_time, true)
194
- sorcery_controller_property_set(:register_logout_time, false)
195
- sorcery_controller_property_set(:register_last_activity_time, false)
196
- sorcery_controller_property_set(:register_last_ip_address, false)
197
- stub_all_oauth_requests!
198
- end
199
-
200
- it 'registers login time' do
201
- now = Time.now.in_time_zone
202
- Timecop.freeze(now)
203
- expect(User).to receive(:load_from_provider).and_return(user)
204
- expect(user).to receive(:set_last_login_at).with(be_within(0.1).of(now))
205
- get :test_login_from
206
- Timecop.return
207
- end
208
-
209
- it 'does not register login time if configured so' do
210
- sorcery_controller_property_set(:register_login_time, false)
211
- now = Time.now.in_time_zone
212
- Timecop.freeze(now)
213
- expect(User).to receive(:load_from_provider).and_return(user)
214
- expect(user).to receive(:set_last_login_at).never
215
- get :test_login_from
216
- Timecop.return
217
- end
218
- end
219
- end
220
-
221
- describe SorceryController, 'OAuth with session timeout features' do
222
- before(:all) do
223
- if SORCERY_ORM == :active_record
224
- MigrationHelper.migrate("#{Rails.root}/db/migrate/external")
225
- User.reset_column_information
226
- end
227
-
228
- sorcery_reload!(%i[session_timeout external])
229
- end
230
-
231
- after(:all) do
232
- if SORCERY_ORM == :active_record
233
- MigrationHelper.rollback("#{Rails.root}/db/migrate/external")
234
- end
235
- end
236
-
237
- context 'when twitter' do
238
- before(:each) do
239
- sorcery_model_property_set(:authentications_class, Authentication)
240
- sorcery_controller_property_set(:session_timeout, 0.5)
241
- stub_all_oauth_requests!
242
- end
243
-
244
- after(:each) do
245
- Timecop.return
246
- end
247
-
248
- it 'does not reset session before session timeout' do
249
- expect(User).to receive(:load_from_provider).with(:twitter, '123').and_return(user)
250
- get :test_login_from
251
-
252
- expect(session[:user_id]).not_to be_nil
253
- expect(flash[:notice]).to eq 'Success!'
254
- end
255
-
256
- it 'resets session after session timeout' do
257
- get :test_login_from
258
- Timecop.travel(Time.now.in_time_zone + 0.6)
259
- get :test_should_be_logged_in
260
-
261
- expect(session[:user_id]).to be_nil
262
- expect(response).to be_a_redirect
263
- end
264
- end
265
- end
266
- end
@@ -1,130 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe SorceryController, type: :controller do
4
- let!(:user) { double('user', id: 42) }
5
-
6
- # ----------------- REMEMBER ME -----------------------
7
- context 'with remember me features' do
8
- before(:all) do
9
- if SORCERY_ORM == :active_record
10
- MigrationHelper.migrate("#{Rails.root}/db/migrate/remember_me")
11
- User.reset_column_information
12
- end
13
-
14
- sorcery_reload!([:remember_me])
15
- end
16
-
17
- after(:all) do
18
- if SORCERY_ORM == :active_record
19
- MigrationHelper.rollback("#{Rails.root}/db/migrate/remember_me")
20
- end
21
- end
22
-
23
- before(:each) do
24
- allow(user).to receive(:remember_me_token)
25
- allow(user).to receive(:remember_me_token_expires_at)
26
- allow(user).to receive_message_chain(:sorcery_config, :remember_me_token_attribute_name).and_return(:remember_me_token)
27
- allow(user).to receive_message_chain(:sorcery_config, :remember_me_token_expires_at_attribute_name).and_return(:remember_me_token_expires_at)
28
- end
29
-
30
- it 'sets cookie on remember_me!' do
31
- expect(User).to receive(:authenticate).with('bla@bla.com', 'secret') { |&block| block.call(user, nil) }
32
- expect(user).to receive(:remember_me!)
33
-
34
- post :test_login_with_remember, params: { email: 'bla@bla.com', password: 'secret' }
35
-
36
- expect(cookies.signed['remember_me_token']).to eq assigns[:current_user].remember_me_token
37
- end
38
-
39
- it 'clears cookie on forget_me!' do
40
- request.cookies[:remember_me_token] = { value: 'asd54234dsfsd43534', expires: 3600 }
41
- get :test_logout_with_forget_me
42
-
43
- expect(response.cookies[:remember_me_token]).to be_nil
44
- end
45
-
46
- it 'clears cookie on force_forget_me!' do
47
- request.cookies[:remember_me_token] = { value: 'asd54234dsfsd43534', expires: 3600 }
48
- get :test_logout_with_force_forget_me
49
-
50
- expect(response.cookies[:remember_me_token]).to be_nil
51
- end
52
-
53
- it 'login(email,password,remember_me) logs user in and remembers' do
54
- expect(User).to receive(:authenticate).with('bla@bla.com', 'secret', '1') { |&block| block.call(user, nil) }
55
- expect(user).to receive(:remember_me!)
56
- expect(user).to receive(:remember_me_token).and_return('abracadabra').twice
57
-
58
- post :test_login_with_remember_in_login, params: { email: 'bla@bla.com', password: 'secret', remember: '1' }
59
-
60
- expect(cookies.signed['remember_me_token']).not_to be_nil
61
- expect(cookies.signed['remember_me_token']).to eq assigns[:user].remember_me_token
62
- end
63
-
64
- it 'logout also calls forget_me!' do
65
- session[:user_id] = user.id.to_s
66
- expect(User.sorcery_adapter).to receive(:find_by_id).with(user.id.to_s).and_return(user)
67
- expect(user).to receive(:remember_me!)
68
- expect(user).to receive(:forget_me!)
69
- get :test_logout_with_remember
70
-
71
- expect(cookies['remember_me_token']).to be_nil
72
- end
73
-
74
- it 'logs user in from cookie' do
75
- session[:user_id] = user.id.to_s
76
- expect(User.sorcery_adapter).to receive(:find_by_id).with(user.id.to_s).and_return(user)
77
- expect(user).to receive(:remember_me!)
78
- expect(user).to receive(:remember_me_token).and_return('token').twice
79
- expect(user).to receive(:has_remember_me_token?) { true }
80
-
81
- subject.remember_me!
82
- subject.instance_eval do
83
- remove_instance_variable :@current_user
84
- end
85
- session[:user_id] = nil
86
-
87
- expect(User.sorcery_adapter).to receive(:find_by_remember_me_token).with('token').and_return(user)
88
-
89
- expect(subject).to receive(:after_remember_me!).with(user)
90
-
91
- get :test_login_from_cookie
92
-
93
- expect(assigns[:current_user]).to eq user
94
- end
95
-
96
- it 'doest not remember_me! when not asked to, even if third parameter is used' do
97
- post :test_login_with_remember_in_login, params: { email: 'bla@bla.com', password: 'secret', remember: '0' }
98
-
99
- expect(cookies['remember_me_token']).to be_nil
100
- end
101
-
102
- it 'doest not remember_me! when not asked to' do
103
- post :test_login, params: { email: 'bla@bla.com', password: 'secret' }
104
- expect(cookies['remember_me_token']).to be_nil
105
- end
106
-
107
- # --- login_user(user) ---
108
- specify { expect(@controller).to respond_to :auto_login }
109
-
110
- it 'auto_login(user) logs in an user instance without remembering' do
111
- session[:user_id] = nil
112
- subject.auto_login(user)
113
- get :test_login_from_cookie
114
-
115
- expect(assigns[:current_user]).to eq user
116
- expect(cookies['remember_me_token']).to be_nil
117
- end
118
-
119
- it 'auto_login(user, true) logs in an user instance with remembering' do
120
- session[:user_id] = nil
121
- expect(user).to receive(:remember_me!)
122
- subject.auto_login(user, true)
123
-
124
- get :test_login_from_cookie
125
-
126
- expect(assigns[:current_user]).to eq user
127
- expect(cookies['remember_me_token']).not_to be_nil
128
- end
129
- end
130
- end
@@ -1,168 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe SorceryController, type: :controller do
4
- let!(:user) { double('user', id: 42) }
5
-
6
- # ----------------- SESSION TIMEOUT -----------------------
7
- context 'with session timeout features' do
8
- before(:all) do
9
- sorcery_reload!([:session_timeout])
10
- sorcery_controller_property_set(:session_timeout, 0.5)
11
- end
12
-
13
- after(:each) do
14
- Timecop.return
15
- end
16
-
17
- before(:each) do
18
- allow(user).to receive(:username)
19
- allow(user).to receive_message_chain(:sorcery_config, :username_attribute_names, :first) { :username }
20
- end
21
-
22
- it 'does not reset session before session timeout' do
23
- login_user user
24
- get :test_should_be_logged_in
25
-
26
- expect(session[:user_id]).not_to be_nil
27
- expect(response).to be_successful
28
- end
29
-
30
- it 'resets session after session timeout' do
31
- login_user user
32
- Timecop.travel(Time.now.in_time_zone + 0.6)
33
- get :test_should_be_logged_in
34
-
35
- expect(session[:user_id]).to be_nil
36
- expect(response).to be_a_redirect
37
- end
38
-
39
- context "with 'invalidate_active_sessions_enabled'" do
40
- it 'does not reset the session if invalidate_sessions_before is nil' do
41
- sorcery_controller_property_set(:session_timeout_invalidate_active_sessions_enabled, true)
42
- login_user user
43
- allow(user).to receive(:invalidate_sessions_before) { nil }
44
-
45
- get :test_should_be_logged_in
46
-
47
- expect(session[:user_id]).not_to be_nil
48
- expect(response).to be_successful
49
- end
50
-
51
- it 'does not reset the session if it was not created before invalidate_sessions_before' do
52
- sorcery_controller_property_set(:session_timeout_invalidate_active_sessions_enabled, true)
53
- login_user user
54
- allow(user).to receive(:invalidate_sessions_before) { Time.now.in_time_zone - 10.minutes }
55
-
56
- get :test_should_be_logged_in
57
-
58
- expect(session[:user_id]).not_to be_nil
59
- expect(response).to be_successful
60
- end
61
-
62
- it 'resets the session if the session was created before invalidate_sessions_before' do
63
- sorcery_controller_property_set(:session_timeout_invalidate_active_sessions_enabled, true)
64
- login_user user
65
- allow(user).to receive(:invalidate_sessions_before) { Time.now.in_time_zone }
66
- get :test_should_be_logged_in
67
-
68
- expect(session[:user_id]).to be_nil
69
- expect(response).to be_a_redirect
70
- end
71
-
72
- it 'resets active sessions on next action if invalidate_active_sessions! is called' do
73
- sorcery_controller_property_set(:session_timeout_invalidate_active_sessions_enabled, true)
74
- # precondition that the user is logged in
75
- login_user user
76
- get :test_should_be_logged_in
77
- expect(response).to be_successful
78
-
79
- allow(user).to receive(:send) { |_method, value| allow(user).to receive(:invalidate_sessions_before) { value } }
80
- allow(user).to receive(:save)
81
- get :test_invalidate_active_session
82
- expect(response).to be_successful
83
-
84
- get :test_should_be_logged_in
85
- expect(session[:user_id]).to be_nil
86
- expect(response).to be_a_redirect
87
- end
88
-
89
- it 'allows login after invalidate_active_sessions! is called' do
90
- sorcery_controller_property_set(:session_timeout_invalidate_active_sessions_enabled, true)
91
- # precondition that the user is logged in
92
- login_user user
93
- get :test_should_be_logged_in
94
- expect(response).to be_successful
95
-
96
- allow(user).to receive(:send) { |_method, value| allow(user).to receive(:invalidate_sessions_before) { value } }
97
- allow(user).to receive(:save)
98
- # Call to invalidate
99
- get :test_invalidate_active_session
100
- expect(response).to be_successful
101
-
102
- # Check that existing sessions were logged out
103
- get :test_should_be_logged_in
104
- expect(session[:user_id]).to be_nil
105
- expect(response).to be_a_redirect
106
-
107
- # Check that new session is allowed to login
108
- login_user user
109
- get :test_should_be_logged_in
110
- expect(response).to be_successful
111
- expect(session[:user_id]).not_to be_nil
112
-
113
- # Check an additional request to make sure not logged out on next request
114
- get :test_should_be_logged_in
115
- expect(response).to be_successful
116
- expect(session[:user_id]).not_to be_nil
117
- end
118
- end
119
-
120
- it 'works if the session is stored as a string or a Time' do
121
- session[:login_time] = Time.now.to_s
122
- # TODO: ???
123
- expect(User).to receive(:authenticate).with('bla@bla.com', 'secret') { |&block| block.call(user, nil) }
124
-
125
- get :test_login, params: { email: 'bla@bla.com', password: 'secret' }
126
-
127
- expect(session[:user_id]).not_to be_nil
128
- expect(response).to be_successful
129
- end
130
-
131
- context "with 'session_timeout_from_last_action'" do
132
- before { create_new_user }
133
- after { User.delete_all }
134
-
135
- it 'does not logout if there was activity' do
136
- sorcery_controller_property_set(:session_timeout_from_last_action, true)
137
-
138
- get :test_login, params: { email: 'bla@bla.com', password: 'secret' }
139
- Timecop.travel(Time.now.in_time_zone + 0.3)
140
- get :test_should_be_logged_in
141
-
142
- expect(session[:user_id]).not_to be_nil
143
-
144
- Timecop.travel(Time.now.in_time_zone + 0.3)
145
- get :test_should_be_logged_in
146
-
147
- expect(session[:user_id]).not_to be_nil
148
- expect(response).to be_successful
149
- end
150
-
151
- it "with 'session_timeout_from_last_action' logs out if there was no activity" do
152
- sorcery_controller_property_set(:session_timeout_from_last_action, true)
153
- get :test_login, params: { email: 'bla@bla.com', password: 'secret' }
154
- Timecop.travel(Time.now.in_time_zone + 0.6)
155
- get :test_should_be_logged_in
156
-
157
- expect(session[:user_id]).to be_nil
158
- expect(response).to be_a_redirect
159
- end
160
- end
161
-
162
- it 'registers login time on remember_me callback' do
163
- expect(subject).to receive(:register_login_time).with(user)
164
-
165
- subject.send(:after_remember_me!, user)
166
- end
167
- end
168
- end