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,113 +0,0 @@
1
- require 'spec_helper'
2
-
3
- # require 'shared_examples/controller_activity_logging_shared_examples'
4
-
5
- describe SorceryController, type: :controller do
6
- after(:all) do
7
- sorcery_controller_property_set(:register_login_time, true)
8
- sorcery_controller_property_set(:register_logout_time, true)
9
- sorcery_controller_property_set(:register_last_activity_time, true)
10
- # sorcery_controller_property_set(:last_login_from_ip_address_name, true)
11
- end
12
-
13
- # ----------------- ACTIVITY LOGGING -----------------------
14
- context 'with activity logging features' do
15
- let(:adapter) { double('sorcery_adapter') }
16
- let(:user) { double('user', id: 42, sorcery_adapter: adapter) }
17
-
18
- before(:all) do
19
- sorcery_reload!([:activity_logging])
20
- end
21
-
22
- before(:each) do
23
- allow(user).to receive(:username)
24
- allow(user).to receive_message_chain(:sorcery_config, :username_attribute_names, :first) { :username }
25
- allow(User.sorcery_config).to receive(:last_login_at_attribute_name) { :last_login_at }
26
- allow(User.sorcery_config).to receive(:last_login_from_ip_address_name) { :last_login_from_ip_address }
27
-
28
- sorcery_controller_property_set(:register_login_time, false)
29
- sorcery_controller_property_set(:register_last_ip_address, false)
30
- sorcery_controller_property_set(:register_last_activity_time, false)
31
- end
32
-
33
- it 'logs login time on login' do
34
- now = Time.now.in_time_zone
35
- Timecop.freeze(now)
36
-
37
- sorcery_controller_property_set(:register_login_time, true)
38
- expect(user).to receive(:set_last_login_at).with(be_within(0.1).of(now))
39
- login_user(user)
40
-
41
- Timecop.return
42
- end
43
-
44
- it 'logs logout time on logout' do
45
- login_user(user)
46
- now = Time.now.in_time_zone
47
- Timecop.freeze(now)
48
- expect(user).to receive(:set_last_logout_at).with(be_within(0.1).of(now))
49
-
50
- logout_user
51
-
52
- Timecop.return
53
- end
54
-
55
- it 'logs last activity time when logged in' do
56
- sorcery_controller_property_set(:register_last_activity_time, true)
57
-
58
- login_user(user)
59
- now = Time.now.in_time_zone
60
- Timecop.freeze(now)
61
- expect(user).to receive(:set_last_activity_at).with(be_within(0.1).of(now))
62
-
63
- get :some_action
64
-
65
- Timecop.return
66
- end
67
-
68
- it 'logs last IP address when logged in' do
69
- sorcery_controller_property_set(:register_last_ip_address, true)
70
- expect(user).to receive(:set_last_ip_address).with('0.0.0.0')
71
-
72
- login_user(user)
73
- end
74
-
75
- it 'updates nothing but activity fields' do
76
- pending 'Move to model'
77
- original_user_name = User.last.username
78
- login_user(user)
79
- get :some_action_making_a_non_persisted_change_to_the_user
80
-
81
- expect(User.last.username).to eq original_user_name
82
- end
83
-
84
- it 'does not register login time if configured so' do
85
- sorcery_controller_property_set(:register_login_time, false)
86
-
87
- expect(user).to receive(:set_last_login_at).never
88
- login_user(user)
89
- end
90
-
91
- it 'does not register logout time if configured so' do
92
- sorcery_controller_property_set(:register_logout_time, false)
93
- login_user(user)
94
-
95
- expect(user).to receive(:set_last_logout_at).never
96
- logout_user
97
- end
98
-
99
- it 'does not register last activity time if configured so' do
100
- sorcery_controller_property_set(:register_last_activity_time, false)
101
-
102
- expect(user).to receive(:set_last_activity_at).never
103
- login_user(user)
104
- end
105
-
106
- it 'does not register last IP address if configured so' do
107
- sorcery_controller_property_set(:register_last_ip_address, false)
108
- expect(user).to receive(:set_last_ip_address).never
109
-
110
- login_user(user)
111
- end
112
- end
113
- end
@@ -1,41 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe SorceryController, type: :controller do
4
- let(:user) { double('user', id: 42, email: 'bla@bla.com') }
5
-
6
- def request_test_login
7
- get :test_login, params: { email: 'bla@bla.com', password: 'blabla' }
8
- end
9
-
10
- # ----------------- SESSION TIMEOUT -----------------------
11
- describe 'brute force protection features' do
12
- before(:all) do
13
- sorcery_reload!([:brute_force_protection])
14
- end
15
-
16
- after(:each) do
17
- Sorcery::Controller::Config.reset!
18
- sorcery_controller_property_set(:user_class, User)
19
- Timecop.return
20
- end
21
-
22
- it 'counts login retries' do
23
- allow(User).to receive(:authenticate) { |&block| block.call(nil, :other) }
24
- allow(User.sorcery_adapter).to receive(:find_by_credentials).with(['bla@bla.com', 'blabla']).and_return(user)
25
-
26
- expect(user).to receive(:register_failed_login!).exactly(3).times
27
-
28
- 3.times { request_test_login }
29
- end
30
-
31
- it 'resets the counter on a good login' do
32
- # dirty hack for rails 4
33
- allow(@controller).to receive(:register_last_activity_time_to_db)
34
-
35
- allow(User).to receive(:authenticate) { |&block| block.call(user, nil) }
36
- expect(user).to receive_message_chain(:sorcery_adapter, :update_attribute).with(:failed_logins_count, 0)
37
-
38
- get :test_login, params: { email: 'bla@bla.com', password: 'secret' }
39
- end
40
- end
41
- end
@@ -1,67 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe SorceryController, type: :controller do
4
- let(:user) { double('user', id: 42, email: 'bla@bla.com') }
5
-
6
- describe 'with http basic auth features' do
7
- before(:all) do
8
- sorcery_reload!([:http_basic_auth])
9
-
10
- sorcery_controller_property_set(:controller_to_realm_map, 'sorcery' => 'sorcery')
11
- end
12
-
13
- after(:each) do
14
- logout_user
15
- end
16
-
17
- it 'requests basic authentication when before_action is used' do
18
- get :test_http_basic_auth
19
-
20
- expect(response.status).to eq 401
21
- end
22
-
23
- it 'authenticates from http basic if credentials are sent' do
24
- # dirty hack for rails 4
25
- allow(subject).to receive(:register_last_activity_time_to_db)
26
-
27
- @request.env['HTTP_AUTHORIZATION'] = "Basic #{Base64.encode64("#{user.email}:secret")}"
28
- expect(User).to receive('authenticate').with('bla@bla.com', 'secret').and_return(user)
29
- get :test_http_basic_auth, params: {}, session: { http_authentication_used: true }
30
-
31
- expect(response).to be_successful
32
- end
33
-
34
- it 'fails authentication if credentials are wrong' do
35
- @request.env['HTTP_AUTHORIZATION'] = "Basic #{Base64.encode64("#{user.email}:wrong!")}"
36
- expect(User).to receive('authenticate').with('bla@bla.com', 'wrong!').and_return(nil)
37
- get :test_http_basic_auth, params: {}, session: { http_authentication_used: true }
38
-
39
- expect(response).to redirect_to root_url
40
- end
41
-
42
- it "allows configuration option 'controller_to_realm_map'" do
43
- sorcery_controller_property_set(:controller_to_realm_map, '1' => '2')
44
-
45
- expect(Sorcery::Controller::Config.controller_to_realm_map).to eq('1' => '2')
46
- end
47
-
48
- it 'displays the correct realm name configured for the controller' do
49
- sorcery_controller_property_set(:controller_to_realm_map, 'sorcery' => 'Salad')
50
- get :test_http_basic_auth
51
-
52
- expect(response.headers['WWW-Authenticate']).to eq 'Basic realm="Salad"'
53
- end
54
-
55
- it "signs in the user's session on successful login" do
56
- # dirty hack for rails 4
57
- allow(controller).to receive(:register_last_activity_time_to_db)
58
-
59
- @request.env['HTTP_AUTHORIZATION'] = "Basic #{Base64.encode64("#{user.email}:secret")}"
60
- expect(User).to receive('authenticate').with('bla@bla.com', 'secret').and_return(user)
61
-
62
- get :test_http_basic_auth, params: {}, session: { http_authentication_used: true }
63
-
64
- expect(session[:user_id]).to eq '42'
65
- end
66
- end
67
- end