authlogic 3.5.0 → 3.8.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 (64) hide show
  1. data/.github/ISSUE_TEMPLATE.md +13 -0
  2. data/.rubocop_todo.yml +1 -37
  3. data/.travis.yml +15 -6
  4. data/CHANGELOG.md +2 -130
  5. data/CONTRIBUTING.md +13 -2
  6. data/README.md +2 -3
  7. data/authlogic.gemspec +4 -5
  8. data/lib/authlogic/acts_as_authentic/base.rb +4 -2
  9. data/lib/authlogic/acts_as_authentic/email.rb +8 -3
  10. data/lib/authlogic/acts_as_authentic/logged_in_status.rb +21 -3
  11. data/lib/authlogic/acts_as_authentic/login.rb +44 -25
  12. data/lib/authlogic/acts_as_authentic/password.rb +28 -12
  13. data/lib/authlogic/acts_as_authentic/perishable_token.rb +21 -12
  14. data/lib/authlogic/acts_as_authentic/restful_authentication.rb +16 -9
  15. data/lib/authlogic/acts_as_authentic/session_maintenance.rb +5 -3
  16. data/lib/authlogic/authenticates_many/association.rb +11 -4
  17. data/lib/authlogic/authenticates_many/base.rb +5 -4
  18. data/lib/authlogic/controller_adapters/rack_adapter.rb +6 -2
  19. data/lib/authlogic/controller_adapters/rails_adapter.rb +11 -8
  20. data/lib/authlogic/crypto_providers/aes256.rb +21 -2
  21. data/lib/authlogic/crypto_providers/bcrypt.rb +4 -1
  22. data/lib/authlogic/crypto_providers/sha512.rb +15 -10
  23. data/lib/authlogic/regex.rb +7 -6
  24. data/lib/authlogic/session/activation.rb +19 -10
  25. data/lib/authlogic/session/cookies.rb +3 -1
  26. data/lib/authlogic/session/id.rb +13 -7
  27. data/lib/authlogic/session/magic_columns.rb +19 -10
  28. data/lib/authlogic/session/magic_states.rb +7 -1
  29. data/lib/authlogic/session/password.rb +82 -35
  30. data/lib/authlogic/session/perishable_token.rb +7 -3
  31. data/lib/authlogic/session/validation.rb +13 -11
  32. data/lib/authlogic/test_case.rb +52 -32
  33. data/lib/authlogic.rb +6 -0
  34. data/test/acts_as_authentic_test/email_test.rb +33 -27
  35. data/test/acts_as_authentic_test/logged_in_status_test.rb +2 -2
  36. data/test/acts_as_authentic_test/login_test.rb +50 -37
  37. data/test/acts_as_authentic_test/magic_columns_test.rb +8 -8
  38. data/test/acts_as_authentic_test/password_test.rb +14 -14
  39. data/test/acts_as_authentic_test/perishable_token_test.rb +5 -5
  40. data/test/acts_as_authentic_test/persistence_token_test.rb +4 -4
  41. data/test/acts_as_authentic_test/restful_authentication_test.rb +6 -6
  42. data/test/acts_as_authentic_test/session_maintenance_test.rb +15 -10
  43. data/test/acts_as_authentic_test/single_access_test.rb +6 -6
  44. data/test/authenticates_many_test.rb +21 -6
  45. data/test/gemfiles/Gemfile.rails-5.1.x +6 -0
  46. data/test/gemfiles/Gemfile.rails-5.2.x +6 -0
  47. data/test/libs/company.rb +1 -1
  48. data/test/session_test/activation_test.rb +1 -1
  49. data/test/session_test/active_record_trickery_test.rb +3 -3
  50. data/test/session_test/brute_force_protection_test.rb +19 -14
  51. data/test/session_test/cookies_test.rb +21 -12
  52. data/test/session_test/existence_test.rb +15 -10
  53. data/test/session_test/http_auth_test.rb +2 -2
  54. data/test/session_test/magic_columns_test.rb +7 -4
  55. data/test/session_test/magic_states_test.rb +7 -9
  56. data/test/session_test/params_test.rb +6 -6
  57. data/test/session_test/password_test.rb +2 -2
  58. data/test/session_test/perishability_test.rb +1 -1
  59. data/test/session_test/persistence_test.rb +2 -2
  60. data/test/session_test/timeout_test.rb +7 -5
  61. data/test/session_test/validation_test.rb +1 -1
  62. data/test/test_helper.rb +37 -6
  63. metadata +57 -36
  64. checksums.yaml +0 -7
@@ -89,11 +89,11 @@ module SessionTest
89
89
  def test_remember_me
90
90
  session = UserSession.new
91
91
  assert_equal false, session.remember_me
92
- assert !session.remember_me?
92
+ refute session.remember_me?
93
93
 
94
94
  session.remember_me = false
95
95
  assert_equal false, session.remember_me
96
- assert !session.remember_me?
96
+ refute session.remember_me?
97
97
 
98
98
  session.remember_me = true
99
99
  assert_equal true, session.remember_me
@@ -101,7 +101,7 @@ module SessionTest
101
101
 
102
102
  session.remember_me = nil
103
103
  assert_nil session.remember_me
104
- assert !session.remember_me?
104
+ refute session.remember_me?
105
105
 
106
106
  session.remember_me = "1"
107
107
  assert_equal "1", session.remember_me
@@ -122,7 +122,7 @@ module SessionTest
122
122
 
123
123
  def test_persist_persist_by_cookie
124
124
  ben = users(:ben)
125
- assert !UserSession.find
125
+ refute UserSession.find
126
126
  set_cookie_for(ben)
127
127
  assert session = UserSession.find
128
128
  assert_equal ben, session.record
@@ -131,9 +131,9 @@ module SessionTest
131
131
  def test_persist_persist_by_cookie_with_blank_persistence_token
132
132
  ben = users(:ben)
133
133
  ben.update_column(:persistence_token, "")
134
- assert !UserSession.find
134
+ refute UserSession.find
135
135
  set_cookie_for(ben)
136
- assert !UserSession.find
136
+ refute UserSession.find
137
137
  end
138
138
 
139
139
  def test_remember_me_expired
@@ -141,19 +141,22 @@ module SessionTest
141
141
  session = UserSession.new(ben)
142
142
  session.remember_me = true
143
143
  assert session.save
144
- assert !session.remember_me_expired?
144
+ refute session.remember_me_expired?
145
145
 
146
146
  session = UserSession.new(ben)
147
147
  session.remember_me = false
148
148
  assert session.save
149
- assert !session.remember_me_expired?
149
+ refute session.remember_me_expired?
150
150
  end
151
151
 
152
152
  def test_after_save_save_cookie
153
153
  ben = users(:ben)
154
154
  session = UserSession.new(ben)
155
155
  assert session.save
156
- assert_equal "#{ben.persistence_token}::#{ben.id}", controller.cookies["user_credentials"]
156
+ assert_equal(
157
+ "#{ben.persistence_token}::#{ben.id}",
158
+ controller.cookies["user_credentials"]
159
+ )
157
160
  end
158
161
 
159
162
  def test_after_save_save_cookie_signed
@@ -166,7 +169,10 @@ module SessionTest
166
169
  session.sign_cookie = true
167
170
  assert session.save
168
171
  assert_equal payload, controller.cookies.signed["user_credentials"]
169
- assert_equal "#{payload}--#{Digest::SHA1.hexdigest payload}", controller.cookies.signed.parent_jar["user_credentials"]
172
+ assert_equal(
173
+ "#{payload}--#{Digest::SHA1.hexdigest payload}",
174
+ controller.cookies.signed.parent_jar["user_credentials"]
175
+ )
170
176
  end
171
177
 
172
178
  def test_after_save_save_cookie_with_remember_me
@@ -175,7 +181,10 @@ module SessionTest
175
181
  session = UserSession.new(ben)
176
182
  session.remember_me = true
177
183
  assert session.save
178
- assert_equal "#{ben.persistence_token}::#{ben.id}::#{session.remember_me_until.iso8601}", controller.cookies["user_credentials"]
184
+ assert_equal(
185
+ "#{ben.persistence_token}::#{ben.id}::#{session.remember_me_until.iso8601}",
186
+ controller.cookies["user_credentials"]
187
+ )
179
188
  end
180
189
  end
181
190
 
@@ -185,7 +194,7 @@ module SessionTest
185
194
  session = UserSession.find
186
195
  assert controller.cookies["user_credentials"]
187
196
  assert session.destroy
188
- assert !controller.cookies["user_credentials"]
197
+ refute controller.cookies["user_credentials"]
189
198
  end
190
199
  end
191
200
  end
@@ -3,10 +3,15 @@ require 'test_helper'
3
3
  module SessionTest
4
4
  module ExistenceTest
5
5
  class ClassMethodsTest < ActiveSupport::TestCase
6
- def test_create
6
+ def test_create_with_good_credentials
7
7
  ben = users(:ben)
8
- assert UserSession.create(:login => "somelogin", :password => "badpw2").new_session?
9
- refute UserSession.create(:login => ben.login, :password => "benrocks").new_session?
8
+ session = UserSession.create(:login => ben.login, :password => "benrocks")
9
+ refute session.new_session?
10
+ end
11
+
12
+ def test_create_with_bad_credentials
13
+ session = UserSession.create(:login => "somelogin", :password => "badpw2")
14
+ assert session.new_session?
10
15
  end
11
16
 
12
17
  def test_create_bang
@@ -26,21 +31,21 @@ module SessionTest
26
31
 
27
32
  set_session_for(users(:ben))
28
33
  session = UserSession.find
29
- assert !session.new_session?
34
+ refute session.new_session?
30
35
  end
31
36
 
32
37
  def test_save_with_nothing
33
38
  session = UserSession.new
34
- assert !session.save
39
+ refute session.save
35
40
  assert session.new_session?
36
41
  end
37
42
 
38
43
  def test_save_with_block
39
44
  session = UserSession.new
40
45
  block_result = session.save do |result|
41
- assert !result
46
+ refute result
42
47
  end
43
- assert !block_result
48
+ refute block_result
44
49
  assert session.new_session?
45
50
  end
46
51
 
@@ -55,15 +60,15 @@ module SessionTest
55
60
  def test_destroy
56
61
  ben = users(:ben)
57
62
  session = UserSession.new
58
- assert !session.valid?
59
- assert !session.errors.empty?
63
+ refute session.valid?
64
+ refute session.errors.empty?
60
65
  assert session.destroy
61
66
  assert session.errors.empty?
62
67
  session.unauthorized_record = ben
63
68
  assert session.save
64
69
  assert session.record
65
70
  assert session.destroy
66
- assert !session.record
71
+ refute session.record
67
72
  end
68
73
  end
69
74
  end
@@ -30,14 +30,14 @@ module SessionTest
30
30
  def test_persist_persist_by_http_auth
31
31
  aaron = users(:aaron)
32
32
  http_basic_auth_for do
33
- assert !UserSession.find
33
+ refute UserSession.find
34
34
  end
35
35
  http_basic_auth_for(aaron) do
36
36
  assert session = UserSession.find
37
37
  assert_equal aaron, session.record
38
38
  assert_equal aaron.login, session.login
39
39
  assert_equal "aaronrocks", session.send(:protected_password)
40
- assert !controller.http_auth_requested?
40
+ refute controller.http_auth_requested?
41
41
  end
42
42
  unset_session
43
43
  UserSession.request_http_basic_auth = true
@@ -15,7 +15,7 @@ module SessionTest
15
15
  class InstanceMethodsTest < ActiveSupport::TestCase
16
16
  def test_after_persisting_set_last_request_at
17
17
  ben = users(:ben)
18
- assert !UserSession.create(ben).new_session?
18
+ refute UserSession.create(ben).new_session?
19
19
 
20
20
  set_cookie_for(ben)
21
21
  old_last_request_at = ben.last_request_at
@@ -27,7 +27,8 @@ module SessionTest
27
27
  def test_valid_increase_failed_login_count
28
28
  ben = users(:ben)
29
29
  old_failed_login_count = ben.failed_login_count
30
- assert UserSession.create(:login => ben.login, :password => "wrong").new_session?
30
+ session = UserSession.create(:login => ben.login, :password => "wrong")
31
+ assert session.new_session?
31
32
  ben.reload
32
33
  assert_equal old_failed_login_count + 1, ben.failed_login_count
33
34
  end
@@ -36,7 +37,8 @@ module SessionTest
36
37
  aaron = users(:aaron)
37
38
 
38
39
  # increase failed login count
39
- assert UserSession.create(:login => aaron.login, :password => "wrong").new_session?
40
+ session = UserSession.create(:login => aaron.login, :password => "wrong")
41
+ assert session.new_session?
40
42
  aaron.reload
41
43
 
42
44
  # grab old values
@@ -44,7 +46,8 @@ module SessionTest
44
46
  old_current_login_at = aaron.current_login_at
45
47
  old_current_login_ip = aaron.current_login_ip
46
48
 
47
- assert UserSession.create(:login => aaron.login, :password => "aaronrocks").valid?
49
+ session = UserSession.create(:login => aaron.login, :password => "aaronrocks")
50
+ assert session.valid?
48
51
 
49
52
  aaron.reload
50
53
  assert_equal old_login_count + 1, aaron.login_count
@@ -15,11 +15,9 @@ module SessionTest
15
15
  class InstanceMethodsTest < ActiveSupport::TestCase
16
16
  def test_disabling_magic_states
17
17
  UserSession.disable_magic_states = true
18
-
19
18
  ben = users(:ben)
20
19
  ben.update_attribute(:active, false)
21
- assert UserSession.create(ben)
22
-
20
+ refute UserSession.create(ben).new_session?
23
21
  UserSession.disable_magic_states = false
24
22
  end
25
23
 
@@ -30,8 +28,8 @@ module SessionTest
30
28
  assert session.valid?
31
29
 
32
30
  ben.update_attribute(:active, false)
33
- assert !session.valid?
34
- assert session.errors[:base].size > 0
31
+ refute session.valid?
32
+ refute session.errors[:base].empty?
35
33
  end
36
34
 
37
35
  def test_validate_validate_magic_states_approved
@@ -41,8 +39,8 @@ module SessionTest
41
39
  assert session.valid?
42
40
 
43
41
  ben.update_attribute(:approved, false)
44
- assert !session.valid?
45
- assert session.errors[:base].size > 0
42
+ refute session.valid?
43
+ refute session.errors[:base].empty?
46
44
  end
47
45
 
48
46
  def test_validate_validate_magic_states_confirmed
@@ -52,8 +50,8 @@ module SessionTest
52
50
  assert session.valid?
53
51
 
54
52
  ben.update_attribute(:confirmed, false)
55
- assert !session.valid?
56
- assert session.errors[:base].size > 0
53
+ refute session.valid?
54
+ refute session.errors[:base].empty?
57
55
  end
58
56
  end
59
57
  end
@@ -25,17 +25,17 @@ module SessionTest
25
25
  ben = users(:ben)
26
26
  session = UserSession.new
27
27
 
28
- assert !session.persisting?
28
+ refute session.persisting?
29
29
  set_params_for(ben)
30
30
 
31
- assert !session.persisting?
32
- assert !session.unauthorized_record
33
- assert !session.record
31
+ refute session.persisting?
32
+ refute session.unauthorized_record
33
+ refute session.record
34
34
  assert_nil controller.session["user_credentials"]
35
35
 
36
36
  set_request_content_type("text/plain")
37
- assert !session.persisting?
38
- assert !session.unauthorized_record
37
+ refute session.persisting?
38
+ refute session.unauthorized_record
39
39
  assert_nil controller.session["user_credentials"]
40
40
 
41
41
  set_request_content_type("application/atom+xml")
@@ -21,7 +21,7 @@ module SessionTest
21
21
 
22
22
  def test_generalize_credentials_error_mesages_set_to_false
23
23
  UserSession.generalize_credentials_error_messages false
24
- assert !UserSession.generalize_credentials_error_messages
24
+ refute UserSession.generalize_credentials_error_messages
25
25
  session = UserSession.create(:login => users(:ben).login, :password => "invalud-password")
26
26
  assert_equal ["Password is not valid"], session.errors.full_messages
27
27
  end
@@ -95,7 +95,7 @@ module SessionTest
95
95
  aaron = users(:aaron)
96
96
  session = UserSession.new(:login => aaron.login, :password => "aaronrocks")
97
97
  assert session.save
98
- assert !session.new_session?
98
+ refute session.new_session?
99
99
  assert_equal 1, session.record.login_count
100
100
  assert Time.now >= session.record.current_login_at
101
101
  assert_equal "1.1.1.1", session.record.current_login_ip
@@ -9,7 +9,7 @@ module SessionTest
9
9
  assert_not_equal old_perishable_token, ben.perishable_token
10
10
 
11
11
  drew = employees(:drew)
12
- assert UserSession.create(drew)
12
+ refute UserSession.create(drew).new_session?
13
13
  end
14
14
  end
15
15
  end
@@ -4,7 +4,7 @@ module SessionTest
4
4
  class PersistenceTest < ActiveSupport::TestCase
5
5
  def test_find
6
6
  aaron = users(:aaron)
7
- assert !UserSession.find
7
+ refute UserSession.find
8
8
  http_basic_auth_for(aaron) { assert UserSession.find }
9
9
  set_cookie_for(aaron)
10
10
  assert UserSession.find
@@ -22,7 +22,7 @@ module SessionTest
22
22
  aaron = users(:aaron)
23
23
  session = UserSession.new(aaron)
24
24
  session.remember_me = true
25
- assert !UserSession.remember_me
25
+ refute UserSession.remember_me
26
26
  assert session.save
27
27
  assert session.remember_me?
28
28
  session = UserSession.find(aaron)
@@ -8,7 +8,7 @@ module SessionTest
8
8
  assert UserSession.logout_on_timeout
9
9
 
10
10
  UserSession.logout_on_timeout false
11
- assert !UserSession.logout_on_timeout
11
+ refute UserSession.logout_on_timeout
12
12
  end
13
13
  end
14
14
 
@@ -33,7 +33,7 @@ module SessionTest
33
33
  ben.save
34
34
 
35
35
  assert session.persisting?
36
- assert !session.stale?
36
+ refute session.stale?
37
37
  assert_nil session.stale_record
38
38
 
39
39
  UserSession.logout_on_timeout = false
@@ -63,15 +63,17 @@ module SessionTest
63
63
  assert session.save
64
64
  Timecop.freeze(Time.now + 2.months)
65
65
  assert session.persisting?
66
- assert !session.stale?
66
+ refute session.stale?
67
67
  UserSession.remember_me = false
68
68
  end
69
69
 
70
70
  def test_successful_login
71
71
  UserSession.logout_on_timeout = true
72
72
  ben = users(:ben)
73
- assert UserSession.create(:login => ben.login, :password => "benrocks")
74
- assert session = UserSession.find
73
+ session = UserSession.create(:login => ben.login, :password => "benrocks")
74
+ refute session.new_session?
75
+ session = UserSession.find
76
+ assert session
75
77
  assert_equal ben, session.record
76
78
  UserSession.logout_on_timeout = false
77
79
  end
@@ -9,7 +9,7 @@ module SessionTest
9
9
 
10
10
  def test_valid
11
11
  session = UserSession.new
12
- assert !session.valid?
12
+ refute session.valid?
13
13
  assert_nil session.record
14
14
  assert session.errors.count > 0
15
15
 
data/test/test_helper.rb CHANGED
@@ -114,13 +114,25 @@ require_relative 'libs/user'
114
114
  require_relative 'libs/user_session'
115
115
  require_relative 'libs/company'
116
116
 
117
- Authlogic::CryptoProviders::AES256.key = "myafdsfddddddddddddddddddddddddddddddddddddddddddddddd"
117
+ # Recent change, 2017-10-23: We had used a 54-letter string here. In the default
118
+ # encoding, UTF-8, that's 54 bytes, which is clearly incorrect for an algorithm
119
+ # with a 256-bit key, but I guess it worked. With the release of ruby 2.4 (and
120
+ # thus openssl gem 2.0), it is more strict, and must be exactly 32 bytes.
121
+ Authlogic::CryptoProviders::AES256.key = ::OpenSSL::Random.random_bytes(32)
118
122
 
119
123
  class ActiveSupport::TestCase
120
124
  include ActiveRecord::TestFixtures
121
125
  self.fixture_path = File.dirname(__FILE__) + "/fixtures"
122
- self.use_transactional_fixtures = false
123
- self.use_instantiated_fixtures = false
126
+
127
+ # use_transactional_fixtures= is deprecated and will be removed from Rails 5.1
128
+ # (use use_transactional_tests= instead)
129
+ if respond_to?(:use_transactional_tests=)
130
+ self.use_transactional_tests = false
131
+ else
132
+ self.use_transactional_fixtures = false
133
+ end
134
+
135
+ self.use_instantiated_fixtures = false
124
136
  self.pre_loaded_fixtures = false
125
137
  fixtures :all
126
138
  setup :activate_authlogic
@@ -191,9 +203,28 @@ class ActiveSupport::TestCase
191
203
  controller.request_content_type = nil
192
204
  end
193
205
 
194
- def set_session_for(user)
195
- controller.session["user_credentials"] = user.persistence_token
196
- controller.session["user_credentials_id"] = user.id
206
+ def session_credentials_prefix(scope_record)
207
+ if scope_record.nil?
208
+ ""
209
+ else
210
+ format(
211
+ "%s_%d_",
212
+ scope_record.class.model_name.name.underscore,
213
+ scope_record.id
214
+ )
215
+ end
216
+ end
217
+
218
+ # Sets the session variables that `record` (eg. a `User`) would have after
219
+ # logging in.
220
+ #
221
+ # If `record` belongs to an `authenticates_many` association that uses the
222
+ # `scope_cookies` option, then a `scope_record` can be provided.
223
+ def set_session_for(record, scope_record = nil)
224
+ prefix = session_credentials_prefix(scope_record)
225
+ record_class_name = record.class.model_name.name.underscore
226
+ controller.session["#{prefix}#{record_class_name}_credentials"] = record.persistence_token
227
+ controller.session["#{prefix}#{record_class_name}_credentials_id"] = record.id
197
228
  end
198
229
 
199
230
  def unset_session