authlogic 2.0.1 → 2.1.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.
- data/.gitignore +9 -0
- data/CHANGELOG.rdoc +99 -1
- data/{MIT-LICENSE → LICENSE} +1 -1
- data/README.rdoc +136 -159
- data/Rakefile +47 -19
- data/VERSION.yml +4 -0
- data/authlogic.gemspec +205 -0
- data/init.rb +1 -1
- data/lib/authlogic/acts_as_authentic/base.rb +31 -17
- data/lib/authlogic/acts_as_authentic/email.rb +47 -14
- data/lib/authlogic/acts_as_authentic/logged_in_status.rb +20 -14
- data/lib/authlogic/acts_as_authentic/login.rb +84 -8
- data/lib/authlogic/acts_as_authentic/password.rb +207 -88
- data/lib/authlogic/acts_as_authentic/perishable_token.rb +9 -4
- data/lib/authlogic/acts_as_authentic/persistence_token.rb +4 -2
- data/lib/authlogic/acts_as_authentic/restful_authentication.rb +5 -4
- data/lib/authlogic/acts_as_authentic/session_maintenance.rb +16 -4
- data/lib/authlogic/acts_as_authentic/single_access_token.rb +10 -3
- data/lib/authlogic/acts_as_authentic/validations_scope.rb +1 -1
- data/lib/authlogic/controller_adapters/abstract_adapter.rb +13 -1
- data/lib/authlogic/controller_adapters/rails_adapter.rb +1 -1
- data/lib/authlogic/crypto_providers/aes256.rb +2 -2
- data/lib/authlogic/crypto_providers/bcrypt.rb +3 -1
- data/lib/authlogic/crypto_providers/sha1.rb +2 -2
- data/lib/authlogic/i18n.rb +10 -1
- data/lib/authlogic/regex.rb +25 -0
- data/lib/authlogic/session/activation.rb +2 -0
- data/lib/authlogic/session/active_record_trickery.rb +13 -3
- data/lib/authlogic/session/brute_force_protection.rb +26 -11
- data/lib/authlogic/session/callbacks.rb +16 -6
- data/lib/authlogic/session/cookies.rb +15 -11
- data/lib/authlogic/session/existence.rb +4 -2
- data/lib/authlogic/session/foundation.rb +1 -1
- data/lib/authlogic/session/http_auth.rb +46 -11
- data/lib/authlogic/session/magic_columns.rb +25 -6
- data/lib/authlogic/session/magic_states.rb +4 -4
- data/lib/authlogic/session/params.rb +14 -9
- data/lib/authlogic/session/password.rb +86 -24
- data/lib/authlogic/session/priority_record.rb +1 -1
- data/lib/authlogic/session/session.rb +2 -2
- data/lib/authlogic/session/timeout.rb +1 -1
- data/lib/authlogic/session/validation.rb +9 -5
- data/lib/authlogic/test_case/mock_controller.rb +45 -0
- data/lib/authlogic/test_case/mock_cookie_jar.rb +14 -0
- data/lib/authlogic/test_case/mock_logger.rb +10 -0
- data/lib/authlogic/test_case/mock_request.rb +19 -0
- data/lib/authlogic/test_case/rails_request_adapter.rb +30 -0
- data/lib/authlogic/test_case.rb +114 -0
- data/lib/authlogic.rb +1 -1
- data/rails/init.rb +1 -0
- data/shoulda_macros/authlogic.rb +2 -1
- data/test/acts_as_authentic_test/base_test.rb +6 -0
- data/test/acts_as_authentic_test/email_test.rb +25 -7
- data/test/acts_as_authentic_test/login_test.rb +37 -7
- data/test/acts_as_authentic_test/magic_columns_test.rb +4 -4
- data/test/acts_as_authentic_test/password_test.rb +46 -44
- data/test/acts_as_authentic_test/perishable_token_test.rb +36 -2
- data/test/acts_as_authentic_test/restful_authentication_test.rb +40 -0
- data/test/acts_as_authentic_test/session_maintenance_test.rb +26 -18
- data/test/acts_as_authentic_test/single_access_test.rb +6 -1
- data/test/libs/affiliate.rb +7 -0
- data/test/libs/ldaper.rb +3 -0
- data/test/random_test.rb +2 -2
- data/test/session_test/activation_test.rb +1 -1
- data/test/session_test/active_record_trickery_test.rb +2 -1
- data/test/session_test/brute_force_protection_test.rb +34 -9
- data/test/session_test/cookies_test.rb +3 -3
- data/test/session_test/http_auth_test.rb +20 -8
- data/test/session_test/magic_columns_test.rb +7 -4
- data/test/session_test/magic_states_test.rb +3 -3
- data/test/session_test/params_test.rb +4 -4
- data/test/session_test/password_test.rb +8 -0
- data/test/session_test/session_test.rb +9 -9
- data/test/session_test/timeout_test.rb +10 -1
- data/test/test_helper.rb +43 -21
- metadata +38 -27
- data/Manifest.txt +0 -111
- data/lib/authlogic/testing/test_unit_helpers.rb +0 -39
- data/lib/authlogic/version.rb +0 -56
- data/test/libs/mock_controller.rb +0 -35
- data/test/libs/mock_cookie_jar.rb +0 -10
- 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
|
|
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
|
|
60
|
+
assert u.errors[:login].size > 0
|
|
51
61
|
|
|
52
62
|
u.login = "aaaaaaaaaa"
|
|
53
63
|
assert !u.valid?
|
|
54
|
-
assert
|
|
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
|
|
71
|
+
assert u.errors[:login].size > 0
|
|
62
72
|
|
|
63
73
|
u.login = "fdsfdsfdsfdsfs"
|
|
64
74
|
assert !u.valid?
|
|
65
|
-
assert
|
|
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
|
|
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
|
|
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
|
|
9
|
+
assert u.errors[:login_count].size > 0
|
|
10
10
|
|
|
11
11
|
u.login_count = 0
|
|
12
12
|
assert !u.valid?
|
|
13
|
-
assert
|
|
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
|
|
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
|
|
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 = {:
|
|
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
|
|
110
|
+
assert u.errors[:password].size > 0
|
|
126
111
|
|
|
127
112
|
u.password = "test"
|
|
128
113
|
assert !u.valid?
|
|
129
|
-
assert
|
|
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
|
|
122
|
+
assert u.errors[:password].size > 0
|
|
138
123
|
|
|
139
124
|
u.password_confirmation = "test"
|
|
140
125
|
assert !u.valid?
|
|
141
|
-
assert
|
|
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
|
|
135
|
+
assert u.errors[:password_confirmation].size > 0
|
|
154
136
|
|
|
155
137
|
u.password_confirmation = "test"
|
|
156
138
|
assert !u.valid?
|
|
157
|
-
assert
|
|
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
|
|
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
|
|
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 =
|
|
22
|
-
old_cookie_key =
|
|
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
|
|
27
|
-
assert
|
|
28
|
-
assert_not_equal
|
|
29
|
-
assert_not_equal
|
|
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 =
|
|
36
|
-
old_cookie_key =
|
|
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
|
|
40
|
-
assert_equal
|
|
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 =
|
|
47
|
-
old_cookie_key =
|
|
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
|
|
50
|
-
assert_equal
|
|
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 =
|
|
57
|
-
old_cookie_key =
|
|
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
|
|
63
|
-
assert_equal
|
|
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
|
|
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
|
data/test/libs/ldaper.rb
ADDED
data/test/random_test.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '
|
|
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__) + '
|
|
39
|
+
load(File.dirname(__FILE__) + '/../lib/authlogic/random.rb')
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
@@ -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 "
|
|
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
|
|
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
|
|
55
|
-
assert_equal
|
|
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
|
|
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 => "
|
|
66
|
+
session = UserSession.new(:login => ben.login, :password => "badpassword1")
|
|
65
67
|
assert !session.save
|
|
66
|
-
assert session.
|
|
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,
|
|
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
|
|
101
|
+
assert controller.cookies["user_credentials"]
|
|
102
102
|
assert session.destroy
|
|
103
|
-
assert
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
assert_equal
|
|
12
|
-
|
|
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
|
|
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
|
|
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
|