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,200 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe SorceryController, type: :controller do
4
- describe 'plugin configuration' do
5
- before(:all) do
6
- sorcery_reload!
7
- end
8
-
9
- after(:each) do
10
- Sorcery::Controller::Config.reset!
11
- sorcery_reload!
12
- end
13
-
14
- it "enables configuration option 'user_class'" do
15
- sorcery_controller_property_set(:user_class, 'TestUser')
16
-
17
- expect(Sorcery::Controller::Config.user_class).to eq 'TestUser'
18
- end
19
-
20
- it "enables configuration option 'not_authenticated_action'" do
21
- sorcery_controller_property_set(:not_authenticated_action, :my_action)
22
-
23
- expect(Sorcery::Controller::Config.not_authenticated_action).to eq :my_action
24
- end
25
- end
26
-
27
- # ----------------- PLUGIN ACTIVATED -----------------------
28
- context 'when activated with sorcery' do
29
- let(:user) { double('user', id: 42) }
30
-
31
- before(:all) do
32
- sorcery_reload!
33
- end
34
-
35
- after(:each) do
36
- Sorcery::Controller::Config.reset!
37
- sorcery_reload!
38
- sorcery_controller_property_set(:user_class, User)
39
- sorcery_model_property_set(:username_attribute_names, [:email])
40
- end
41
-
42
- specify { should respond_to(:login) }
43
-
44
- specify { should respond_to(:logout) }
45
-
46
- specify { should respond_to(:logged_in?) }
47
-
48
- specify { should respond_to(:current_user) }
49
-
50
- specify { should respond_to(:require_login) }
51
-
52
- describe '#login' do
53
- context 'when succeeds' do
54
- before do
55
- expect(User).to receive(:authenticate).with('bla@bla.com', 'secret') { |&block| block.call(user, nil) }
56
- get :test_login, params: { email: 'bla@bla.com', password: 'secret' }
57
- end
58
-
59
- it 'assigns user to @user variable' do
60
- expect(assigns[:user]).to eq user
61
- end
62
-
63
- it 'writes user id in session' do
64
- expect(session[:user_id]).to eq user.id.to_s
65
- end
66
-
67
- # NOTE: The lack of a CSRF token may mean that sessions will break
68
- # horribly for Sorcery when using Rails 7.1+. We shall see.
69
- it 'sets csrf token in session' do
70
- if Gem::Version.new(Rails.version) >= Gem::Version.new('7.1')
71
- pending 'Rails 7.1 is not including the csrf token in the session for unknown reasons'
72
- end
73
-
74
- expect(session[:_csrf_token]).not_to be_nil
75
- end
76
- end
77
-
78
- context 'when fails' do
79
- before do
80
- expect(User).to receive(:authenticate).with('bla@bla.com', 'opensesame!').and_return(nil)
81
- get :test_login, params: { email: 'bla@bla.com', password: 'opensesame!' }
82
- end
83
-
84
- it 'sets @user variable to nil' do
85
- expect(assigns[:user]).to be_nil
86
- end
87
-
88
- it 'sets user_id in session to nil' do
89
- expect(session[:user_id]).to be_nil
90
- end
91
- end
92
- end
93
-
94
- describe '#logout' do
95
- it 'clears the session' do
96
- cookies[:remember_me_token] = nil
97
- session[:user_id] = user.id.to_s
98
- expect(User.sorcery_adapter).to receive(:find_by_id).with('42') { user }
99
- get :test_logout
100
-
101
- expect(session[:user_id]).to be_nil
102
- end
103
- end
104
-
105
- describe '#logged_in?' do
106
- it 'returns true when user is logged in' do
107
- session[:user_id] = user.id.to_s
108
- expect(User.sorcery_adapter).to receive(:find_by_id).with('42') { user }
109
-
110
- expect(subject.logged_in?).to be true
111
- end
112
-
113
- it 'returns false when user is not logged in' do
114
- session[:user_id] = nil
115
-
116
- expect(subject.logged_in?).to be false
117
- end
118
- end
119
-
120
- describe '#current_user' do
121
- it 'current_user returns the user instance if logged in' do
122
- session[:user_id] = user.id.to_s
123
- expect(User.sorcery_adapter).to receive(:find_by_id).once.with('42') { user }
124
-
125
- 2.times { expect(subject.current_user).to eq user } # memoized!
126
- end
127
-
128
- it 'current_user returns false if not logged in' do
129
- session[:user_id] = nil
130
- expect(User.sorcery_adapter).to_not receive(:find_by_id)
131
-
132
- 2.times { expect(subject.current_user).to be_nil } # memoized!
133
- end
134
- end
135
-
136
- it "calls the configured 'not_authenticated_action' when authenticate before_action fails" do
137
- session[:user_id] = nil
138
- sorcery_controller_property_set(:not_authenticated_action, :test_not_authenticated_action)
139
- get :test_logout
140
-
141
- expect(response).to be_successful
142
- end
143
-
144
- it 'require_login before_action saves the url that the user originally wanted' do
145
- get :some_action
146
-
147
- expect(session[:return_to_url]).to eq 'http://test.host/some_action'
148
- expect(response).to redirect_to('http://test.host/')
149
- end
150
-
151
- it 'require_login before_action does not save the url that the user originally wanted upon all non-get http methods' do
152
- %i[post put delete].each do |m|
153
- send(m, :some_action)
154
-
155
- expect(session[:return_to_url]).to be_nil
156
- end
157
- end
158
-
159
- it 'require_login before_action does not save the url for JSON requests' do
160
- get :some_action, format: :json
161
- expect(session[:return_to_url]).to be_nil
162
- end
163
-
164
- it 'require_login before_action does not save the url for XHR requests' do
165
- get :some_action, xhr: true
166
- expect(session[:return_to_url]).to be_nil
167
- end
168
-
169
- it 'on successful login the user is redirected to the url he originally wanted' do
170
- session[:return_to_url] = 'http://test.host/some_action'
171
- post :test_return_to, params: { email: 'bla@bla.com', password: 'secret' }
172
-
173
- expect(response).to redirect_to('http://test.host/some_action')
174
- expect(flash[:notice]).to eq 'haha!'
175
- end
176
-
177
- # --- auto_login(user) ---
178
- specify { should respond_to(:auto_login) }
179
-
180
- it 'auto_login(user) logs in a user instance' do
181
- session[:user_id] = nil
182
- subject.auto_login(user)
183
-
184
- expect(subject.logged_in?).to be true
185
- end
186
-
187
- it 'auto_login(user) works even if current_user was already set to false' do
188
- get :test_logout
189
-
190
- expect(session[:user_id]).to be_nil
191
- expect(subject.current_user).to be_nil
192
-
193
- expect(User).to receive(:first) { user }
194
-
195
- get :test_auto_login
196
-
197
- expect(assigns[:result]).to eq user
198
- end
199
- end
200
- end
@@ -1,21 +0,0 @@
1
- require 'sorcery'
2
-
3
- ActiveRecord::Migration.verbose = false
4
- # ActiveRecord::Base.logger = Logger.new(nil)
5
- # ActiveRecord::Base.include_root_in_json = true
6
-
7
- class TestUser < ActiveRecord::Base
8
- authenticates_with_sorcery!
9
- end
10
-
11
- def setup_orm
12
- MigrationHelper.migrate(migrations_path)
13
- end
14
-
15
- def teardown_orm
16
- MigrationHelper.rollback(migrations_path)
17
- end
18
-
19
- def migrations_path
20
- Rails.root.join('db', 'migrate', 'core')
21
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'sorcery/providers/base'
5
-
6
- describe Sorcery::Providers::ExampleProvider do
7
- before(:all) do
8
- sorcery_reload!([:external])
9
- sorcery_controller_property_set(:external_providers, [:example_provider])
10
- end
11
-
12
- context 'fetching a multi-word custom provider' do
13
- it 'returns the provider' do
14
- expect(Sorcery::Controller::Config.example_provider).to be_a(Sorcery::Providers::ExampleProvider)
15
- end
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'sorcery/providers/base'
5
-
6
- describe Sorcery::Providers::Example do
7
- before(:all) do
8
- sorcery_reload!([:external])
9
- sorcery_controller_property_set(:external_providers, [:example])
10
- end
11
-
12
- context 'fetching a single-word custom provider' do
13
- it 'returns the provider' do
14
- expect(Sorcery::Controller::Config.example).to be_a(Sorcery::Providers::Example)
15
- end
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'sorcery/providers/base'
5
-
6
- describe Sorcery::Providers::Examples do
7
- before(:all) do
8
- sorcery_reload!([:external])
9
- sorcery_controller_property_set(:external_providers, [:examples])
10
- end
11
-
12
- context 'fetching a plural custom provider' do
13
- it 'returns the provider' do
14
- expect(Sorcery::Controller::Config.examples).to be_a(Sorcery::Providers::Examples)
15
- end
16
- end
17
- end
@@ -1,42 +0,0 @@
1
- require 'spec_helper'
2
- require 'sorcery/providers/base'
3
- require 'sorcery/providers/vk'
4
- require 'webmock/rspec'
5
-
6
- describe Sorcery::Providers::Vk do
7
- include WebMock::API
8
-
9
- let(:provider) { Sorcery::Controller::Config.vk }
10
-
11
- before(:all) do
12
- sorcery_reload!([:external])
13
- sorcery_controller_property_set(:external_providers, [:vk])
14
- sorcery_controller_external_property_set(:vk, :key, 'KEY')
15
- sorcery_controller_external_property_set(:vk, :secret, 'SECRET')
16
- end
17
-
18
- def stub_vk_authorize
19
- stub_request(:post, %r{https\:\/\/oauth\.vk\.com\/access_token}).to_return(
20
- status: 200,
21
- body: '{"access_token":"TOKEN","expires_in":86329,"user_id":1}',
22
- headers: { 'content-type' => 'application/json' }
23
- )
24
- end
25
-
26
- context 'getting user info hash' do
27
- it 'should provide VK API version' do
28
- stub_vk_authorize
29
- sorcery_controller_external_property_set(:vk, :api_version, '5.71')
30
-
31
- get_user = stub_request(
32
- :get,
33
- 'https://api.vk.com/method/getProfiles?access_token=TOKEN&fields=&scope=email&uids=1&v=5.71'
34
- ).to_return(body: '{"response":[{"id":1}]}')
35
-
36
- token = provider.process_callback({ code: 'CODE' }, nil)
37
- provider.get_user_hash(token)
38
-
39
- expect(get_user).to have_been_requested
40
- end
41
- end
42
- end
@@ -1,3 +0,0 @@
1
- class Authentication < ActiveRecord::Base
2
- belongs_to :user
3
- end
@@ -1,5 +0,0 @@
1
- class User < ActiveRecord::Base
2
- has_many :authentications, dependent: :destroy
3
- has_many :user_providers, dependent: :destroy
4
- accepts_nested_attributes_for :authentications
5
- end
@@ -1,3 +0,0 @@
1
- class UserProvider < ActiveRecord::Base
2
- belongs_to :user
3
- end
@@ -1 +0,0 @@
1
- {}
@@ -1,2 +0,0 @@
1
- class ApplicationController < ActionController::Base
2
- end