sorcery 0.16.5 → 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 (155) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -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 -11
  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 +19 -149
  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 -70
  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_52.gemfile +0 -7
  70. data/gemfiles/rails_60.gemfile +0 -7
  71. data/gemfiles/rails_61.gemfile +0 -7
  72. data/gemfiles/rails_70.gemfile +0 -7
  73. data/sorcery.gemspec +0 -49
  74. data/spec/active_record/user_activation_spec.rb +0 -17
  75. data/spec/active_record/user_activity_logging_spec.rb +0 -15
  76. data/spec/active_record/user_brute_force_protection_spec.rb +0 -15
  77. data/spec/active_record/user_magic_login_spec.rb +0 -15
  78. data/spec/active_record/user_oauth_spec.rb +0 -15
  79. data/spec/active_record/user_remember_me_spec.rb +0 -15
  80. data/spec/active_record/user_reset_password_spec.rb +0 -15
  81. data/spec/active_record/user_spec.rb +0 -27
  82. data/spec/controllers/controller_activity_logging_spec.rb +0 -113
  83. data/spec/controllers/controller_brute_force_protection_spec.rb +0 -41
  84. data/spec/controllers/controller_http_basic_auth_spec.rb +0 -67
  85. data/spec/controllers/controller_oauth2_spec.rb +0 -568
  86. data/spec/controllers/controller_oauth_spec.rb +0 -266
  87. data/spec/controllers/controller_remember_me_spec.rb +0 -130
  88. data/spec/controllers/controller_session_timeout_spec.rb +0 -166
  89. data/spec/controllers/controller_spec.rb +0 -194
  90. data/spec/orm/active_record.rb +0 -21
  91. data/spec/providers/example_provider_spec.rb +0 -17
  92. data/spec/providers/example_spec.rb +0 -17
  93. data/spec/providers/examples_spec.rb +0 -17
  94. data/spec/providers/vk_spec.rb +0 -42
  95. data/spec/rails_app/app/active_record/authentication.rb +0 -3
  96. data/spec/rails_app/app/active_record/user.rb +0 -5
  97. data/spec/rails_app/app/active_record/user_provider.rb +0 -3
  98. data/spec/rails_app/app/assets/config/manifest.js +0 -1
  99. data/spec/rails_app/app/controllers/application_controller.rb +0 -2
  100. data/spec/rails_app/app/controllers/sorcery_controller.rb +0 -489
  101. data/spec/rails_app/app/helpers/application_helper.rb +0 -2
  102. data/spec/rails_app/app/mailers/sorcery_mailer.rb +0 -38
  103. data/spec/rails_app/app/views/application/index.html.erb +0 -17
  104. data/spec/rails_app/app/views/layouts/application.html.erb +0 -14
  105. data/spec/rails_app/app/views/sorcery_mailer/activation_email.html.erb +0 -17
  106. data/spec/rails_app/app/views/sorcery_mailer/activation_email.text.erb +0 -9
  107. data/spec/rails_app/app/views/sorcery_mailer/activation_needed_email.html.erb +0 -17
  108. data/spec/rails_app/app/views/sorcery_mailer/activation_success_email.html.erb +0 -17
  109. data/spec/rails_app/app/views/sorcery_mailer/activation_success_email.text.erb +0 -9
  110. data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.html.erb +0 -13
  111. data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.text.erb +0 -6
  112. data/spec/rails_app/app/views/sorcery_mailer/reset_password_email.html.erb +0 -16
  113. data/spec/rails_app/app/views/sorcery_mailer/reset_password_email.text.erb +0 -8
  114. data/spec/rails_app/app/views/sorcery_mailer/send_unlock_token_email.text.erb +0 -1
  115. data/spec/rails_app/config/application.rb +0 -61
  116. data/spec/rails_app/config/boot.rb +0 -4
  117. data/spec/rails_app/config/database.yml +0 -22
  118. data/spec/rails_app/config/environment.rb +0 -5
  119. data/spec/rails_app/config/environments/test.rb +0 -37
  120. data/spec/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  121. data/spec/rails_app/config/initializers/compatible_legacy_migration.rb +0 -11
  122. data/spec/rails_app/config/initializers/inflections.rb +0 -10
  123. data/spec/rails_app/config/initializers/mime_types.rb +0 -5
  124. data/spec/rails_app/config/initializers/session_store.rb +0 -12
  125. data/spec/rails_app/config/locales/en.yml +0 -5
  126. data/spec/rails_app/config/routes.rb +0 -81
  127. data/spec/rails_app/config/secrets.yml +0 -4
  128. data/spec/rails_app/config.ru +0 -4
  129. data/spec/rails_app/db/migrate/activation/20101224223622_add_activation_to_users.rb +0 -17
  130. data/spec/rails_app/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +0 -19
  131. data/spec/rails_app/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +0 -13
  132. data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +0 -16
  133. data/spec/rails_app/db/migrate/external/20101224223628_create_authentications_and_user_providers.rb +0 -22
  134. data/spec/rails_app/db/migrate/invalidate_active_sessions/20180221093235_add_invalidate_active_sessions_before_to_users.rb +0 -9
  135. data/spec/rails_app/db/migrate/magic_login/20170924151831_add_magic_login_to_users.rb +0 -17
  136. data/spec/rails_app/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +0 -15
  137. data/spec/rails_app/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +0 -15
  138. data/spec/rails_app/db/schema.rb +0 -21
  139. data/spec/rails_app/db/seeds.rb +0 -7
  140. data/spec/shared_examples/user_activation_shared_examples.rb +0 -361
  141. data/spec/shared_examples/user_activity_logging_shared_examples.rb +0 -106
  142. data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +0 -151
  143. data/spec/shared_examples/user_magic_login_shared_examples.rb +0 -150
  144. data/spec/shared_examples/user_oauth_shared_examples.rb +0 -33
  145. data/spec/shared_examples/user_remember_me_shared_examples.rb +0 -129
  146. data/spec/shared_examples/user_reset_password_shared_examples.rb +0 -370
  147. data/spec/shared_examples/user_shared_examples.rb +0 -678
  148. data/spec/sorcery_crypto_providers_spec.rb +0 -245
  149. data/spec/sorcery_temporary_token_spec.rb +0 -27
  150. data/spec/spec.opts +0 -2
  151. data/spec/spec_helper.rb +0 -50
  152. data/spec/support/migration_helper.rb +0 -29
  153. data/spec/support/providers/example.rb +0 -11
  154. data/spec/support/providers/example_provider.rb +0 -11
  155. data/spec/support/providers/examples.rb +0 -11
@@ -1,194 +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
- it 'sets csrf token in session' do
68
- expect(session[:_csrf_token]).not_to be_nil
69
- end
70
- end
71
-
72
- context 'when fails' do
73
- before do
74
- expect(User).to receive(:authenticate).with('bla@bla.com', 'opensesame!').and_return(nil)
75
- get :test_login, params: { email: 'bla@bla.com', password: 'opensesame!' }
76
- end
77
-
78
- it 'sets @user variable to nil' do
79
- expect(assigns[:user]).to be_nil
80
- end
81
-
82
- it 'sets user_id in session to nil' do
83
- expect(session[:user_id]).to be_nil
84
- end
85
- end
86
- end
87
-
88
- describe '#logout' do
89
- it 'clears the session' do
90
- cookies[:remember_me_token] = nil
91
- session[:user_id] = user.id.to_s
92
- expect(User.sorcery_adapter).to receive(:find_by_id).with('42') { user }
93
- get :test_logout
94
-
95
- expect(session[:user_id]).to be_nil
96
- end
97
- end
98
-
99
- describe '#logged_in?' do
100
- it 'returns true when user is logged in' do
101
- session[:user_id] = user.id.to_s
102
- expect(User.sorcery_adapter).to receive(:find_by_id).with('42') { user }
103
-
104
- expect(subject.logged_in?).to be true
105
- end
106
-
107
- it 'returns false when user is not logged in' do
108
- session[:user_id] = nil
109
-
110
- expect(subject.logged_in?).to be false
111
- end
112
- end
113
-
114
- describe '#current_user' do
115
- it 'current_user returns the user instance if logged in' do
116
- session[:user_id] = user.id.to_s
117
- expect(User.sorcery_adapter).to receive(:find_by_id).once.with('42') { user }
118
-
119
- 2.times { expect(subject.current_user).to eq user } # memoized!
120
- end
121
-
122
- it 'current_user returns false if not logged in' do
123
- session[:user_id] = nil
124
- expect(User.sorcery_adapter).to_not receive(:find_by_id)
125
-
126
- 2.times { expect(subject.current_user).to be_nil } # memoized!
127
- end
128
- end
129
-
130
- it "calls the configured 'not_authenticated_action' when authenticate before_action fails" do
131
- session[:user_id] = nil
132
- sorcery_controller_property_set(:not_authenticated_action, :test_not_authenticated_action)
133
- get :test_logout
134
-
135
- expect(response).to be_successful
136
- end
137
-
138
- it 'require_login before_action saves the url that the user originally wanted' do
139
- get :some_action
140
-
141
- expect(session[:return_to_url]).to eq 'http://test.host/some_action'
142
- expect(response).to redirect_to('http://test.host/')
143
- end
144
-
145
- it 'require_login before_action does not save the url that the user originally wanted upon all non-get http methods' do
146
- %i[post put delete].each do |m|
147
- send(m, :some_action)
148
-
149
- expect(session[:return_to_url]).to be_nil
150
- end
151
- end
152
-
153
- it 'require_login before_action does not save the url for JSON requests' do
154
- get :some_action, format: :json
155
- expect(session[:return_to_url]).to be_nil
156
- end
157
-
158
- it 'require_login before_action does not save the url for XHR requests' do
159
- get :some_action, xhr: true
160
- expect(session[:return_to_url]).to be_nil
161
- end
162
-
163
- it 'on successful login the user is redirected to the url he originally wanted' do
164
- session[:return_to_url] = 'http://test.host/some_action'
165
- post :test_return_to, params: { email: 'bla@bla.com', password: 'secret' }
166
-
167
- expect(response).to redirect_to('http://test.host/some_action')
168
- expect(flash[:notice]).to eq 'haha!'
169
- end
170
-
171
- # --- auto_login(user) ---
172
- specify { should respond_to(:auto_login) }
173
-
174
- it 'auto_login(user) logs in a user instance' do
175
- session[:user_id] = nil
176
- subject.auto_login(user)
177
-
178
- expect(subject.logged_in?).to be true
179
- end
180
-
181
- it 'auto_login(user) works even if current_user was already set to false' do
182
- get :test_logout
183
-
184
- expect(session[:user_id]).to be_nil
185
- expect(subject.current_user).to be_nil
186
-
187
- expect(User).to receive(:first) { user }
188
-
189
- get :test_auto_login
190
-
191
- expect(assigns[:result]).to eq user
192
- end
193
- end
194
- 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