authlogic 2.0.1 → 2.1.1

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 (82) hide show
  1. data/.gitignore +9 -0
  2. data/CHANGELOG.rdoc +105 -1
  3. data/{MIT-LICENSE → LICENSE} +1 -1
  4. data/README.rdoc +137 -160
  5. data/Rakefile +47 -19
  6. data/VERSION.yml +4 -0
  7. data/authlogic.gemspec +205 -0
  8. data/init.rb +1 -1
  9. data/lib/authlogic/acts_as_authentic/base.rb +31 -17
  10. data/lib/authlogic/acts_as_authentic/email.rb +47 -14
  11. data/lib/authlogic/acts_as_authentic/logged_in_status.rb +20 -14
  12. data/lib/authlogic/acts_as_authentic/login.rb +84 -8
  13. data/lib/authlogic/acts_as_authentic/password.rb +207 -88
  14. data/lib/authlogic/acts_as_authentic/perishable_token.rb +9 -4
  15. data/lib/authlogic/acts_as_authentic/persistence_token.rb +4 -2
  16. data/lib/authlogic/acts_as_authentic/restful_authentication.rb +5 -4
  17. data/lib/authlogic/acts_as_authentic/session_maintenance.rb +16 -4
  18. data/lib/authlogic/acts_as_authentic/single_access_token.rb +10 -3
  19. data/lib/authlogic/acts_as_authentic/validations_scope.rb +1 -1
  20. data/lib/authlogic/controller_adapters/abstract_adapter.rb +13 -1
  21. data/lib/authlogic/controller_adapters/rails_adapter.rb +14 -4
  22. data/lib/authlogic/crypto_providers/aes256.rb +2 -2
  23. data/lib/authlogic/crypto_providers/bcrypt.rb +3 -1
  24. data/lib/authlogic/crypto_providers/sha1.rb +2 -2
  25. data/lib/authlogic/i18n.rb +10 -1
  26. data/lib/authlogic/regex.rb +25 -0
  27. data/lib/authlogic/session/activation.rb +2 -0
  28. data/lib/authlogic/session/active_record_trickery.rb +13 -3
  29. data/lib/authlogic/session/brute_force_protection.rb +26 -11
  30. data/lib/authlogic/session/callbacks.rb +16 -6
  31. data/lib/authlogic/session/cookies.rb +16 -12
  32. data/lib/authlogic/session/existence.rb +4 -2
  33. data/lib/authlogic/session/foundation.rb +1 -1
  34. data/lib/authlogic/session/http_auth.rb +46 -11
  35. data/lib/authlogic/session/magic_columns.rb +25 -6
  36. data/lib/authlogic/session/magic_states.rb +4 -4
  37. data/lib/authlogic/session/params.rb +14 -9
  38. data/lib/authlogic/session/password.rb +86 -24
  39. data/lib/authlogic/session/priority_record.rb +1 -1
  40. data/lib/authlogic/session/session.rb +2 -2
  41. data/lib/authlogic/session/timeout.rb +1 -1
  42. data/lib/authlogic/session/validation.rb +9 -5
  43. data/lib/authlogic/test_case/mock_controller.rb +45 -0
  44. data/lib/authlogic/test_case/mock_cookie_jar.rb +14 -0
  45. data/lib/authlogic/test_case/mock_logger.rb +10 -0
  46. data/lib/authlogic/test_case/mock_request.rb +19 -0
  47. data/lib/authlogic/test_case/rails_request_adapter.rb +30 -0
  48. data/lib/authlogic/test_case.rb +114 -0
  49. data/lib/authlogic.rb +1 -1
  50. data/rails/init.rb +1 -0
  51. data/shoulda_macros/authlogic.rb +2 -1
  52. data/test/acts_as_authentic_test/base_test.rb +6 -0
  53. data/test/acts_as_authentic_test/email_test.rb +25 -7
  54. data/test/acts_as_authentic_test/login_test.rb +37 -7
  55. data/test/acts_as_authentic_test/magic_columns_test.rb +4 -4
  56. data/test/acts_as_authentic_test/password_test.rb +46 -44
  57. data/test/acts_as_authentic_test/perishable_token_test.rb +36 -2
  58. data/test/acts_as_authentic_test/restful_authentication_test.rb +40 -0
  59. data/test/acts_as_authentic_test/session_maintenance_test.rb +26 -18
  60. data/test/acts_as_authentic_test/single_access_test.rb +6 -1
  61. data/test/libs/affiliate.rb +7 -0
  62. data/test/libs/ldaper.rb +3 -0
  63. data/test/random_test.rb +2 -2
  64. data/test/session_test/activation_test.rb +1 -1
  65. data/test/session_test/active_record_trickery_test.rb +2 -1
  66. data/test/session_test/brute_force_protection_test.rb +34 -9
  67. data/test/session_test/cookies_test.rb +3 -3
  68. data/test/session_test/http_auth_test.rb +20 -8
  69. data/test/session_test/magic_columns_test.rb +7 -4
  70. data/test/session_test/magic_states_test.rb +3 -3
  71. data/test/session_test/params_test.rb +4 -4
  72. data/test/session_test/password_test.rb +8 -0
  73. data/test/session_test/session_test.rb +9 -9
  74. data/test/session_test/timeout_test.rb +10 -1
  75. data/test/test_helper.rb +43 -21
  76. metadata +38 -27
  77. data/Manifest.txt +0 -111
  78. data/lib/authlogic/testing/test_unit_helpers.rb +0 -39
  79. data/lib/authlogic/version.rb +0 -56
  80. data/test/libs/mock_controller.rb +0 -35
  81. data/test/libs/mock_cookie_jar.rb +0 -10
  82. data/test/libs/mock_request.rb +0 -5
@@ -33,7 +33,7 @@ module ActsAsAuthenticTest
33
33
  end
34
34
 
35
35
  def test_validates_format_of_login_field_options_config
36
- default = {:with => /\A\w[\w\.\-_@ ]+\z/, :message => I18n.t('error_messages.login_invalid', :default => "should use only letters, numbers, spaces, and .-_@ please.")}
36
+ default = {:with => /\A\w[\w\.+\-_@ ]+\z/, :message => I18n.t('error_messages.login_invalid', :default => "should use only letters, numbers, spaces, and .-_@ please.")}
37
37
  assert_equal default, User.validates_format_of_login_field_options
38
38
  assert_equal default, Employee.validates_format_of_login_field_options
39
39
 
@@ -43,37 +43,67 @@ module ActsAsAuthenticTest
43
43
  assert_equal default, User.validates_format_of_login_field_options
44
44
  end
45
45
 
46
+ def test_validates_uniqueness_of_login_field_options_config
47
+ default = {:case_sensitive => false, :scope => User.validations_scope, :if => "#{User.login_field}_changed?".to_sym}
48
+ assert_equal default, User.validates_uniqueness_of_login_field_options
49
+
50
+ User.validates_uniqueness_of_login_field_options = {:yes => "no"}
51
+ assert_equal({:yes => "no"}, User.validates_uniqueness_of_login_field_options)
52
+ User.validates_uniqueness_of_login_field_options default
53
+ assert_equal default, User.validates_uniqueness_of_login_field_options
54
+ end
55
+
46
56
  def test_validates_length_of_login_field
47
57
  u = User.new
48
58
  u.login = "a"
49
59
  assert !u.valid?
50
- assert u.errors.on(:login)
60
+ assert u.errors[:login].size > 0
51
61
 
52
62
  u.login = "aaaaaaaaaa"
53
63
  assert !u.valid?
54
- assert !u.errors.on(:login)
64
+ assert u.errors[:login].size == 0
55
65
  end
56
66
 
57
67
  def test_validates_format_of_login_field
58
68
  u = User.new
59
69
  u.login = "fdsf@^&*"
60
70
  assert !u.valid?
61
- assert u.errors.on(:login)
71
+ assert u.errors[:login].size > 0
62
72
 
63
73
  u.login = "fdsfdsfdsfdsfs"
64
74
  assert !u.valid?
65
- assert !u.errors.on(:login)
75
+ assert u.errors[:login].size == 0
76
+
77
+ u.login = "dakota.dux+1@gmail.com"
78
+ assert !u.valid?
79
+ assert u.errors[:login].size == 0
66
80
  end
67
81
 
68
82
  def test_validates_uniqueness_of_login_field
69
83
  u = User.new
70
84
  u.login = "bjohnson"
71
85
  assert !u.valid?
72
- assert u.errors.on(:login)
86
+ assert u.errors[:login].size > 0
87
+
88
+ u.login = "BJOHNSON"
89
+ assert !u.valid?
90
+ assert u.errors[:login].size > 0
73
91
 
74
92
  u.login = "fdsfdsf"
75
93
  assert !u.valid?
76
- assert !u.errors.on(:login)
94
+ assert u.errors[:login].size == 0
95
+ end
96
+
97
+ def test_find_by_smart_case_login_field
98
+ ben = users(:ben)
99
+ assert_equal ben, User.find_by_smart_case_login_field("bjohnson")
100
+ assert_equal ben, User.find_by_smart_case_login_field("BJOHNSON")
101
+ assert_equal ben, User.find_by_smart_case_login_field("Bjohnson")
102
+
103
+ drew = employees(:drew)
104
+ assert_equal drew, Employee.find_by_smart_case_login_field("dgainor@binarylogic.com")
105
+ assert_equal drew, Employee.find_by_smart_case_login_field("Dgainor@binarylogic.com")
106
+ assert_equal drew, Employee.find_by_smart_case_login_field("DGAINOR@BINARYLOGIC.COM")
77
107
  end
78
108
  end
79
109
  end
@@ -6,22 +6,22 @@ module ActsAsAuthenticTest
6
6
  u = User.new
7
7
  u.login_count = -1
8
8
  assert !u.valid?
9
- assert u.errors.on(:login_count)
9
+ assert u.errors[:login_count].size > 0
10
10
 
11
11
  u.login_count = 0
12
12
  assert !u.valid?
13
- assert !u.errors.on(:login_count)
13
+ assert u.errors[:login_count].size == 0
14
14
  end
15
15
 
16
16
  def test_validates_numericality_of_failed_login_count
17
17
  u = User.new
18
18
  u.failed_login_count = -1
19
19
  assert !u.valid?
20
- assert u.errors.on(:failed_login_count)
20
+ assert u.errors[:failed_login_count].size > 0
21
21
 
22
22
  u.failed_login_count = 0
23
23
  assert !u.valid?
24
- assert !u.errors.on(:failed_login_count)
24
+ assert u.errors[:failed_login_count].size == 0
25
25
  end
26
26
  end
27
27
  end
@@ -22,6 +22,24 @@ module ActsAsAuthenticTest
22
22
  assert_equal :password_salt, User.password_salt_field
23
23
  end
24
24
 
25
+ def test_ignore_blank_passwords_config
26
+ assert User.ignore_blank_passwords
27
+ assert Employee.ignore_blank_passwords
28
+
29
+ User.ignore_blank_passwords = false
30
+ assert !User.ignore_blank_passwords
31
+ User.ignore_blank_passwords true
32
+ assert User.ignore_blank_passwords
33
+ end
34
+
35
+ def test_check_passwords_against_database
36
+ assert User.check_passwords_against_database
37
+ User.check_passwords_against_database = false
38
+ assert !User.check_passwords_against_database
39
+ User.check_passwords_against_database true
40
+ assert User.check_passwords_against_database
41
+ end
42
+
25
43
  def test_validate_password_field_config
26
44
  assert User.validate_password_field
27
45
  assert Employee.validate_password_field
@@ -44,7 +62,7 @@ module ActsAsAuthenticTest
44
62
  end
45
63
 
46
64
  def test_validates_confirmation_of_password_field_options_config
47
- default = {:minimum => 4, :if => "#{User.password_salt_field}_changed?".to_sym}
65
+ default = {:if => :require_password?}
48
66
  assert_equal default, User.validates_confirmation_of_password_field_options
49
67
  assert_equal default, Employee.validates_confirmation_of_password_field_options
50
68
 
@@ -85,48 +103,15 @@ module ActsAsAuthenticTest
85
103
  assert_equal [], User.transition_from_crypto_providers
86
104
  end
87
105
 
88
- def test_act_like_restful_authentication_config
89
- assert !User.act_like_restful_authentication
90
- assert !Employee.act_like_restful_authentication
91
-
92
- User.act_like_restful_authentication = true
93
- assert User.act_like_restful_authentication
94
- assert_equal Authlogic::CryptoProviders::Sha1, User.crypto_provider
95
- assert defined?(::REST_AUTH_SITE_KEY)
96
- assert_equal 1, Authlogic::CryptoProviders::Sha1.stretches
97
-
98
- User.act_like_restful_authentication false
99
- assert !User.act_like_restful_authentication
100
-
101
- User.crypto_provider = Authlogic::CryptoProviders::Sha512
102
- User.transition_from_crypto_providers = []
103
- end
104
-
105
- def test_transition_from_restful_authentication_config
106
- assert !User.transition_from_restful_authentication
107
- assert !Employee.transition_from_restful_authentication
108
-
109
- User.transition_from_restful_authentication = true
110
- assert User.transition_from_restful_authentication
111
- assert defined?(::REST_AUTH_SITE_KEY)
112
- assert_equal 1, Authlogic::CryptoProviders::Sha1.stretches
113
-
114
- User.transition_from_restful_authentication false
115
- assert !User.transition_from_restful_authentication
116
-
117
- User.crypto_provider = Authlogic::CryptoProviders::Sha512
118
- User.transition_from_crypto_providers = []
119
- end
120
-
121
106
  def test_validates_length_of_password
122
107
  u = User.new
123
108
  u.password_confirmation = "test2"
124
109
  assert !u.valid?
125
- assert u.errors.on(:password)
110
+ assert u.errors[:password].size > 0
126
111
 
127
112
  u.password = "test"
128
113
  assert !u.valid?
129
- assert !u.errors.on(:password_confirmation)
114
+ assert u.errors[:password_confirmation].size == 0
130
115
  end
131
116
 
132
117
  def test_validates_confirmation_of_password
@@ -134,34 +119,31 @@ module ActsAsAuthenticTest
134
119
  u.password = "test"
135
120
  u.password_confirmation = "test2"
136
121
  assert !u.valid?
137
- assert u.errors.on(:password)
122
+ assert u.errors[:password].size > 0
138
123
 
139
124
  u.password_confirmation = "test"
140
125
  assert !u.valid?
141
- assert !u.errors.on(:password)
126
+ assert u.errors[:password].size == 0
142
127
  end
143
128
 
144
129
  def test_validates_length_of_password_confirmation
145
130
  u = User.new
146
131
 
147
- assert !u.valid?
148
- assert u.errors.on(:password_confirmation)
149
-
150
132
  u.password = "test"
151
133
  u.password_confirmation = ""
152
134
  assert !u.valid?
153
- assert u.errors.on(:password_confirmation)
135
+ assert u.errors[:password_confirmation].size > 0
154
136
 
155
137
  u.password_confirmation = "test"
156
138
  assert !u.valid?
157
- assert !u.errors.on(:password_confirmation)
139
+ assert u.errors[:password_confirmation].size == 0
158
140
 
159
141
  ben = users(:ben)
160
142
  assert ben.valid?
161
143
 
162
144
  ben.password = "newpass"
163
145
  assert !ben.valid?
164
- assert ben.errors.on(:password_confirmation)
146
+ assert ben.errors[:password_confirmation].size > 0
165
147
 
166
148
  ben.password_confirmation = "newpass"
167
149
  assert ben.valid?
@@ -183,6 +165,26 @@ module ActsAsAuthenticTest
183
165
  transition_password_to(Authlogic::CryptoProviders::Sha512, ben, [Authlogic::CryptoProviders::Sha1, Authlogic::CryptoProviders::BCrypt])
184
166
  end
185
167
 
168
+ def test_checks_password_against_database
169
+ ben = users(:ben)
170
+ ben.password = "new pass"
171
+ assert !ben.valid_password?("new pass")
172
+ assert ben.valid_password?("benrocks")
173
+ end
174
+
175
+ def test_checks_password_against_database_and_always_fails_on_new_records
176
+ user = User.new
177
+ user.password = "new pass"
178
+ assert !user.valid_password?("new pass")
179
+ end
180
+
181
+ def test_checks_password_against_object
182
+ ben = users(:ben)
183
+ ben.password = "new pass"
184
+ assert ben.valid_password?("new pass", false)
185
+ assert !ben.valid_password?("benrocks", false)
186
+ end
187
+
186
188
  def test_reset_password
187
189
  ben = users(:ben)
188
190
  old_crypted_password = ben.crypted_password
@@ -26,7 +26,7 @@ module ActsAsAuthenticTest
26
26
  u = User.new
27
27
  u.perishable_token = users(:ben).perishable_token
28
28
  assert !u.valid?
29
- assert u.errors.on(:perishable_token)
29
+ assert u.errors[:perishable_token].size > 0
30
30
  end
31
31
 
32
32
  def test_before_save_reset_perishable_token
@@ -52,5 +52,39 @@ module ActsAsAuthenticTest
52
52
  ben.reload
53
53
  assert_not_equal old_perishable_token, ben.perishable_token
54
54
  end
55
+
56
+ def test_find_using_perishable_token
57
+ ben = users(:ben)
58
+ assert_equal ben, User.find_using_perishable_token(ben.perishable_token)
59
+ end
60
+
61
+ def test_find_using_perishable_token_when_perished
62
+ ben = users(:ben)
63
+ ActiveRecord::Base.connection.execute("UPDATE users set updated_at = '#{1.week.ago.to_s(:db)}' where id = #{ben.id}")
64
+ assert_nil User.find_using_perishable_token(ben.perishable_token)
65
+ end
66
+
67
+ def test_find_using_perishable_token_when_perished
68
+ User.perishable_token_valid_for = 1.minute
69
+ ben = users(:ben)
70
+ ActiveRecord::Base.connection.execute("UPDATE users set updated_at = '#{2.minutes.ago.to_s(:db)}' where id = #{ben.id}")
71
+ assert_nil User.find_using_perishable_token(ben.perishable_token)
72
+ User.perishable_token_valid_for = 10.minutes
73
+ end
74
+
75
+ def test_find_using_perishable_token_when_passing_threshold
76
+ User.perishable_token_valid_for = 1.minute
77
+ ben = users(:ben)
78
+ ActiveRecord::Base.connection.execute("UPDATE users set updated_at = '#{10.minutes.ago.to_s(:db)}' where id = #{ben.id}")
79
+ assert_nil User.find_using_perishable_token(ben.perishable_token, 5.minutes)
80
+ assert_equal ben, User.find_using_perishable_token(ben.perishable_token, 20.minutes)
81
+ User.perishable_token_valid_for = 10.minutes
82
+ end
83
+
84
+ def test_find_perishable_token_with_bang
85
+ assert_raises ActiveRecord::RecordNotFound do
86
+ User.find_using_perishable_token!('some_bad_value')
87
+ end
88
+ end
55
89
  end
56
- end
90
+ end
@@ -0,0 +1,40 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ module ActsAsAuthenticTest
4
+ class RestfulAuthenticationTest < ActiveSupport::TestCase
5
+ def test_act_like_restful_authentication_config
6
+ assert !User.act_like_restful_authentication
7
+ assert !Employee.act_like_restful_authentication
8
+
9
+ User.act_like_restful_authentication = true
10
+ assert User.act_like_restful_authentication
11
+ assert_equal Authlogic::CryptoProviders::Sha1, User.crypto_provider
12
+ assert defined?(::REST_AUTH_SITE_KEY)
13
+ assert_equal '', ::REST_AUTH_SITE_KEY
14
+ assert_equal 1, Authlogic::CryptoProviders::Sha1.stretches
15
+
16
+ User.act_like_restful_authentication false
17
+ assert !User.act_like_restful_authentication
18
+
19
+ User.crypto_provider = Authlogic::CryptoProviders::Sha512
20
+ User.transition_from_crypto_providers = []
21
+ end
22
+
23
+ def test_transition_from_restful_authentication_config
24
+ assert !User.transition_from_restful_authentication
25
+ assert !Employee.transition_from_restful_authentication
26
+
27
+ User.transition_from_restful_authentication = true
28
+ assert User.transition_from_restful_authentication
29
+ assert defined?(::REST_AUTH_SITE_KEY)
30
+ assert_equal '', ::REST_AUTH_SITE_KEY
31
+ assert_equal 1, Authlogic::CryptoProviders::Sha1.stretches
32
+
33
+ User.transition_from_restful_authentication false
34
+ assert !User.transition_from_restful_authentication
35
+
36
+ User.crypto_provider = Authlogic::CryptoProviders::Sha512
37
+ User.transition_from_crypto_providers = []
38
+ end
39
+ end
40
+ end
@@ -2,6 +2,14 @@ require File.dirname(__FILE__) + '/../test_helper.rb'
2
2
 
3
3
  module ActsAsAuthenticTest
4
4
  class SessionMaintenanceTest < ActiveSupport::TestCase
5
+ def test_maintain_sessions_config
6
+ assert User.maintain_sessions
7
+ User.maintain_sessions = false
8
+ assert !User.maintain_sessions
9
+ User.maintain_sessions true
10
+ assert User.maintain_sessions
11
+ end
12
+
5
13
  def test_login_after_create
6
14
  assert User.create(:login => "awesome", :password => "saweet", :password_confirmation => "saweet", :email => "awesome@awesome.com")
7
15
  assert UserSession.find
@@ -18,49 +26,49 @@ module ActsAsAuthenticTest
18
26
  def test_update_session_after_password_modify
19
27
  ben = users(:ben)
20
28
  UserSession.create(ben)
21
- old_session_key = @controller.session["user_credentials"]
22
- old_cookie_key = @controller.cookies["user_credentials"]
29
+ old_session_key = controller.session["user_credentials"]
30
+ old_cookie_key = controller.cookies["user_credentials"]
23
31
  ben.password = "newpass"
24
32
  ben.password_confirmation = "newpass"
25
33
  assert ben.save
26
- assert @controller.session["user_credentials"]
27
- assert @controller.cookies["user_credentials"]
28
- assert_not_equal @controller.session["user_credentials"], old_session_key
29
- assert_not_equal @controller.cookies["user_credentials"], old_cookie_key
34
+ assert controller.session["user_credentials"]
35
+ assert controller.cookies["user_credentials"]
36
+ assert_not_equal controller.session["user_credentials"], old_session_key
37
+ assert_not_equal controller.cookies["user_credentials"], old_cookie_key
30
38
  end
31
39
 
32
40
  def test_no_session_update_after_modify
33
41
  ben = users(:ben)
34
42
  UserSession.create(ben)
35
- old_session_key = @controller.session["user_credentials"]
36
- old_cookie_key = @controller.cookies["user_credentials"]
43
+ old_session_key = controller.session["user_credentials"]
44
+ old_cookie_key = controller.cookies["user_credentials"]
37
45
  ben.first_name = "Ben"
38
46
  assert ben.save
39
- assert_equal @controller.session["user_credentials"], old_session_key
40
- assert_equal @controller.cookies["user_credentials"], old_cookie_key
47
+ assert_equal controller.session["user_credentials"], old_session_key
48
+ assert_equal controller.cookies["user_credentials"], old_cookie_key
41
49
  end
42
50
 
43
51
  def test_creating_other_user
44
52
  ben = users(:ben)
45
53
  UserSession.create(ben)
46
- old_session_key = @controller.session["user_credentials"]
47
- old_cookie_key = @controller.cookies["user_credentials"]
54
+ old_session_key = controller.session["user_credentials"]
55
+ old_cookie_key = controller.cookies["user_credentials"]
48
56
  assert User.create(:login => "awesome", :password => "saweet", :password_confirmation => "saweet", :email => "awesome@saweet.com")
49
- assert_equal @controller.session["user_credentials"], old_session_key
50
- assert_equal @controller.cookies["user_credentials"], old_cookie_key
57
+ assert_equal controller.session["user_credentials"], old_session_key
58
+ assert_equal controller.cookies["user_credentials"], old_cookie_key
51
59
  end
52
60
 
53
61
  def test_updating_other_user
54
62
  ben = users(:ben)
55
63
  UserSession.create(ben)
56
- old_session_key = @controller.session["user_credentials"]
57
- old_cookie_key = @controller.cookies["user_credentials"]
64
+ old_session_key = controller.session["user_credentials"]
65
+ old_cookie_key = controller.cookies["user_credentials"]
58
66
  zack = users(:zack)
59
67
  zack.password = "newpass"
60
68
  zack.password_confirmation = "newpass"
61
69
  assert zack.save
62
- assert_equal @controller.session["user_credentials"], old_session_key
63
- assert_equal @controller.cookies["user_credentials"], old_cookie_key
70
+ assert_equal controller.session["user_credentials"], old_session_key
71
+ assert_equal controller.cookies["user_credentials"], old_cookie_key
64
72
  end
65
73
 
66
74
  def test_resetting_password_when_logged_out
@@ -16,7 +16,7 @@ module ActsAsAuthenticTest
16
16
  u = User.new
17
17
  u.single_access_token = users(:ben).single_access_token
18
18
  assert !u.valid?
19
- assert u.errors.on(:single_access_token)
19
+ assert u.errors[:single_access_token].size > 0
20
20
  end
21
21
 
22
22
  def test_before_validation_reset_single_access_token
@@ -35,5 +35,10 @@ module ActsAsAuthenticTest
35
35
 
36
36
  User.change_single_access_token_with_password = false
37
37
  end
38
+
39
+ def test_after_password_set_is_not_called
40
+ ldaper = Ldaper.new
41
+ assert ldaper.save
42
+ end
38
43
  end
39
44
  end
@@ -0,0 +1,7 @@
1
+ class Affiliate < ActiveRecord::Base
2
+ acts_as_authentic do |c|
3
+ c.crypted_password_field = :pw_hash
4
+ end
5
+
6
+ belongs_to :company
7
+ end
@@ -0,0 +1,3 @@
1
+ class Ldaper < ActiveRecord::Base
2
+ acts_as_authentic
3
+ end
data/test/random_test.rb CHANGED
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../test_helper.rb'
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
2
 
3
3
  class RandomTest < ActiveSupport::TestCase
4
4
  def test_random_tokens_have_consisten_length
@@ -36,7 +36,7 @@ class RandomTest < ActiveSupport::TestCase
36
36
  def reload_authlogic_with_sec_random!(secure_random, enabled = true)
37
37
  silence_warnings do
38
38
  secure_random.parent.const_set(secure_random.name.sub("#{secure_random.parent}::", ''), enabled ? secure_random : nil)
39
- load(File.dirname(__FILE__) + '/../../lib/authlogic/random.rb')
39
+ load(File.dirname(__FILE__) + '/../lib/authlogic/random.rb')
40
40
  end
41
41
  end
42
42
 
@@ -36,7 +36,7 @@ module SessionTest
36
36
  def test_init
37
37
  UserSession.controller = nil
38
38
  assert_raise(Authlogic::Session::Activation::NotActivatedError) { UserSession.new }
39
- UserSession.controller = @controller
39
+ UserSession.controller = controller
40
40
  end
41
41
  end
42
42
  end
@@ -5,10 +5,11 @@ module SessionTest
5
5
  class ClassMethodsTest < ActiveSupport::TestCase
6
6
  def test_human_attribute_name
7
7
  assert_equal "Some attribute", UserSession.human_attribute_name("some_attribute")
8
+ assert_equal "Some attribute", UserSession.human_attribute_name(:some_attribute)
8
9
  end
9
10
 
10
11
  def test_human_name
11
- assert_equal "User", UserSession.human_name
12
+ assert_equal "Usersession", UserSession.human_name
12
13
  end
13
14
 
14
15
  def test_self_and_descendents_from_active_record
@@ -45,31 +45,56 @@ module SessionTest
45
45
  2.times do |i|
46
46
  session = UserSession.new(:login => ben.login, :password => "badpassword1")
47
47
  assert !session.save
48
- assert session.errors.on(:password)
48
+ assert session.errors[:password].size > 0
49
49
  assert_equal i + 1, ben.reload.failed_login_count
50
50
  end
51
-
51
+
52
52
  session = UserSession.new(:login => ben.login, :password => "badpassword2")
53
53
  assert !session.save
54
- assert !session.errors.on(:password)
55
- assert_equal 2, ben.reload.failed_login_count
54
+ assert session.errors[:password].size == 0
55
+ assert_equal 3, ben.reload.failed_login_count
56
56
 
57
57
  UserSession.consecutive_failed_logins_limit = 50
58
58
  end
59
-
60
- def test_resetting_failed_logins_count
59
+
60
+ def test_exceeded_ban_for
61
+ UserSession.consecutive_failed_logins_limit = 2
62
+ UserSession.generalize_credentials_error_messages true
61
63
  ben = users(:ben)
62
64
 
63
65
  2.times do |i|
64
- session = UserSession.new(:login => ben.login, :password => "badpassword")
66
+ session = UserSession.new(:login => ben.login, :password => "badpassword1")
65
67
  assert !session.save
66
- assert session.errors.on(:password)
68
+ assert session.invalid_password?
67
69
  assert_equal i + 1, ben.reload.failed_login_count
68
70
  end
69
-
71
+
72
+ ActiveRecord::Base.connection.execute("update users set updated_at = '#{1.day.ago.to_s(:db)}' where login = '#{ben.login}'")
70
73
  session = UserSession.new(:login => ben.login, :password => "benrocks")
71
74
  assert session.save
72
75
  assert_equal 0, ben.reload.failed_login_count
76
+
77
+ UserSession.consecutive_failed_logins_limit = 50
78
+ UserSession.generalize_credentials_error_messages false
79
+ end
80
+
81
+ def test_exceeded_ban_and_failed_doesnt_ban_again
82
+ UserSession.consecutive_failed_logins_limit = 2
83
+ ben = users(:ben)
84
+
85
+ 2.times do |i|
86
+ session = UserSession.new(:login => ben.login, :password => "badpassword1")
87
+ assert !session.save
88
+ assert session.errors[:password].size > 0
89
+ assert_equal i + 1, ben.reload.failed_login_count
90
+ end
91
+
92
+ ActiveRecord::Base.connection.execute("update users set updated_at = '#{1.day.ago.to_s(:db)}' where login = '#{ben.login}'")
93
+ session = UserSession.new(:login => ben.login, :password => "badpassword1")
94
+ assert !session.save
95
+ assert_equal 1, ben.reload.failed_login_count
96
+
97
+ UserSession.consecutive_failed_logins_limit = 50
73
98
  end
74
99
  end
75
100
  end
@@ -91,16 +91,16 @@ module SessionTest
91
91
  ben = users(:ben)
92
92
  session = UserSession.new(ben)
93
93
  assert session.save
94
- assert_equal ben.persistence_token, @controller.cookies["user_credentials"]
94
+ assert_equal "#{ben.persistence_token}::#{ben.id}", controller.cookies["user_credentials"]
95
95
  end
96
96
 
97
97
  def test_after_destroy_destroy_cookie
98
98
  ben = users(:ben)
99
99
  set_cookie_for(ben)
100
100
  session = UserSession.find
101
- assert @controller.cookies["user_credentials"]
101
+ assert controller.cookies["user_credentials"]
102
102
  assert session.destroy
103
- assert !@controller.cookies["user_credentials"]
103
+ assert !controller.cookies["user_credentials"]
104
104
  end
105
105
  end
106
106
  end
@@ -2,14 +2,26 @@ require File.dirname(__FILE__) + '/../test_helper.rb'
2
2
 
3
3
  module SessionTest
4
4
  class HttpAuthTest < ActiveSupport::TestCase
5
- def test_persist_persist_by_http_auth
6
- ben = users(:ben)
7
- http_basic_auth_for { assert !UserSession.find }
8
- http_basic_auth_for(ben) do
9
- assert session = UserSession.find
10
- assert_equal ben, session.record
11
- assert_equal ben.login, session.login
12
- assert_equal "benrocks", session.send(:protected_password)
5
+ class ConfiTest < ActiveSupport::TestCase
6
+ def test_allow_http_basic_auth
7
+ UserSession.allow_http_basic_auth = false
8
+ assert_equal false, UserSession.allow_http_basic_auth
9
+
10
+ UserSession.allow_http_basic_auth true
11
+ assert_equal true, UserSession.allow_http_basic_auth
12
+ end
13
+ end
14
+
15
+ class InstanceMethodsTest < ActiveSupport::TestCase
16
+ def test_persist_persist_by_http_auth
17
+ ben = users(:ben)
18
+ http_basic_auth_for { assert !UserSession.find }
19
+ http_basic_auth_for(ben) do
20
+ assert session = UserSession.find
21
+ assert_equal ben, session.record
22
+ assert_equal ben.login, session.login
23
+ assert_equal "benrocks", session.send(:protected_password)
24
+ end
13
25
  end
14
26
  end
15
27
  end
@@ -15,6 +15,8 @@ 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)
19
+
18
20
  set_cookie_for(ben)
19
21
  old_last_request_at = ben.last_request_at
20
22
  assert UserSession.find
@@ -22,7 +24,7 @@ module SessionTest
22
24
  assert ben.last_request_at != old_last_request_at
23
25
  end
24
26
 
25
- def test_valide_increase_failed_login_count
27
+ def test_valid_increase_failed_login_count
26
28
  ben = users(:ben)
27
29
  old_failed_login_count = ben.failed_login_count
28
30
  assert !UserSession.create(:login => ben.login, :password => "wrong")
@@ -45,10 +47,11 @@ module SessionTest
45
47
  old_last_login_ip = ben.last_login_ip
46
48
  old_current_login_ip = ben.current_login_ip
47
49
 
48
- assert UserSession.create(ben)
49
-
50
+ assert UserSession.create(:login => ben.login, :password => "benrocks")
51
+
52
+ ben.reload
50
53
  assert_equal old_login_count + 1, ben.login_count
51
- assert_equal old_failed_login_count - 1, ben.failed_login_count
54
+ assert_equal 0, ben.failed_login_count
52
55
  assert_equal old_current_login_at, ben.last_login_at
53
56
  assert ben.current_login_at != old_current_login_at
54
57
  assert_equal old_current_login_ip, ben.last_login_ip