authlogic 2.0.1 → 2.1.2
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 +110 -1
- data/{MIT-LICENSE → LICENSE} +1 -1
- data/README.rdoc +138 -161
- data/Rakefile +40 -19
- data/VERSION.yml +4 -0
- data/authlogic.gemspec +212 -0
- data/init.rb +1 -1
- data/lib/authlogic/acts_as_authentic/base.rb +44 -35
- 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 +14 -4
- data/lib/authlogic/controller_adapters/sinatra_adapter.rb +61 -0
- 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/translator.rb +15 -0
- data/lib/authlogic/i18n.rb +43 -14
- data/lib/authlogic/regex.rb +25 -0
- data/lib/authlogic/session/activation.rb +2 -0
- data/lib/authlogic/session/active_record_trickery.rb +26 -5
- data/lib/authlogic/session/brute_force_protection.rb +30 -11
- data/lib/authlogic/session/callbacks.rb +18 -7
- data/lib/authlogic/session/cookies.rb +21 -17
- data/lib/authlogic/session/existence.rb +6 -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 +29 -9
- data/lib/authlogic/session/magic_states.rb +6 -5
- data/lib/authlogic/session/params.rb +16 -10
- data/lib/authlogic/session/password.rb +115 -31
- data/lib/authlogic/session/priority_record.rb +1 -1
- data/lib/authlogic/session/session.rb +5 -3
- data/lib/authlogic/session/timeout.rb +1 -1
- data/lib/authlogic/session/validation.rb +13 -7
- 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 +4 -3
- data/rails/init.rb +1 -0
- data/shoulda_macros/authlogic.rb +3 -2
- 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/i18n_test.rb +33 -0
- 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 +12 -2
- data/test/session_test/brute_force_protection_test.rb +37 -12
- data/test/session_test/cookies_test.rb +3 -3
- data/test/session_test/existence_test.rb +3 -3
- data/test/session_test/http_auth_test.rb +20 -8
- data/test/session_test/magic_columns_test.rb +9 -6
- 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 +23 -1
- data/test/session_test/session_test.rb +9 -9
- data/test/session_test/timeout_test.rb +10 -1
- data/test/test_helper.rb +53 -23
- metadata +42 -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
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Authlogic
|
|
2
|
+
module TestCase
|
|
3
|
+
class MockRequest # :nodoc:
|
|
4
|
+
attr_accessor :controller
|
|
5
|
+
|
|
6
|
+
def initialize(controller)
|
|
7
|
+
self.controller = controller
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def remote_ip
|
|
11
|
+
(controller && controller.respond_to?(:env) && controller.env.is_a?(Hash) && controller.env['REMOTE_ADDR']) || "1.1.1.1"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
def method_missing(*args, &block)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Authlogic
|
|
2
|
+
module TestCase
|
|
3
|
+
# Adapts authlogic to work with the @request object when testing. This way Authlogic can set cookies and what not before
|
|
4
|
+
# a request is made, ultimately letting you log in users in functional tests.
|
|
5
|
+
class RailsRequestAdapter < ControllerAdapters::AbstractAdapter
|
|
6
|
+
def authenticate_with_http_basic(&block)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def cookies
|
|
10
|
+
new_cookies = MockCookieJar.new
|
|
11
|
+
super.each do |key, value|
|
|
12
|
+
new_cookies[key] = value[:value]
|
|
13
|
+
end
|
|
14
|
+
new_cookies
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def cookie_domain
|
|
18
|
+
nil
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def request
|
|
22
|
+
@request ||= MockRequest.new(controller)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def request_content_type
|
|
26
|
+
request.format.to_s
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + "/test_case/rails_request_adapter"
|
|
2
|
+
require File.dirname(__FILE__) + "/test_case/mock_cookie_jar"
|
|
3
|
+
require File.dirname(__FILE__) + "/test_case/mock_controller"
|
|
4
|
+
require File.dirname(__FILE__) + "/test_case/mock_logger"
|
|
5
|
+
require File.dirname(__FILE__) + "/test_case/mock_request"
|
|
6
|
+
|
|
7
|
+
module Authlogic
|
|
8
|
+
# This module is a collection of methods and classes that help you easily test Authlogic. In fact,
|
|
9
|
+
# I use these same tools to test the internals of Authlogic.
|
|
10
|
+
#
|
|
11
|
+
# === The quick and dirty
|
|
12
|
+
#
|
|
13
|
+
# require "authlogic/test_case" # include at the top of test_helper.rb
|
|
14
|
+
# setup :activate_authlogic # run before tests are executed
|
|
15
|
+
# UserSession.create(users(:whomever)) # logs a user in
|
|
16
|
+
#
|
|
17
|
+
# For a more detailed explanation, see below.
|
|
18
|
+
#
|
|
19
|
+
# === Setting up
|
|
20
|
+
#
|
|
21
|
+
# Authlogic comes with some simple testing tools. To get these, you need to first require Authlogic's TestCase. If
|
|
22
|
+
# you are doing this in a rails app, you would require this file at the top of your test_helper.rb file:
|
|
23
|
+
#
|
|
24
|
+
# require "authlogic/test_case"
|
|
25
|
+
#
|
|
26
|
+
# If you are using Test::Unit::TestCase, the standard testing library that comes with ruby, then you can skip this next part.
|
|
27
|
+
# If you are not, you need to include the Authlogic::TestCase into your testing suite as follows:
|
|
28
|
+
#
|
|
29
|
+
# include Authlogic::TestCase
|
|
30
|
+
#
|
|
31
|
+
# Now that everything is ready to go, let's move onto actually testing. Here is the basic idea behind testing:
|
|
32
|
+
#
|
|
33
|
+
# Authlogic requires a "connection" to your controller to activate it. In the same manner that ActiveRecord requires a connection to
|
|
34
|
+
# your database. It can't do anything until it gets connnected. That being said, Authlogic will raise an
|
|
35
|
+
# Authlogic::Session::Activation::NotActivatedError any time you try to instantiate an object without a "connection".
|
|
36
|
+
# So before you do anything with Authlogic, you need to activate / connect Authlogic. Let's walk through how to do this in tests:
|
|
37
|
+
#
|
|
38
|
+
# === Fixtures / Factories
|
|
39
|
+
#
|
|
40
|
+
# Creating users via fixtures / factories is easy. Here's an example of a fixture:
|
|
41
|
+
#
|
|
42
|
+
# ben:
|
|
43
|
+
# email: whatever@whatever.com
|
|
44
|
+
# password_salt: <%= salt = Authlogic::Random.hex_token %>
|
|
45
|
+
# crypted_password: <%= Authlogic::CryptoProviders::Sha512.encrypt("benrocks" + salt) %>
|
|
46
|
+
# persistence_token: <%= Authlogic::Random.hex_token %>
|
|
47
|
+
# single_access_token: <%= Authlogic::Random.friendly_token %>
|
|
48
|
+
# perishable_token: <%= Authlogic::Random.friendly_token %>
|
|
49
|
+
#
|
|
50
|
+
# Notice the crypted_password value. Just supplement that with whatever crypto provider you are using, if you are not using the default.
|
|
51
|
+
#
|
|
52
|
+
# === Functional tests
|
|
53
|
+
#
|
|
54
|
+
# Activating Authlogic isn't a problem here, because making a request will activate Authlogic for you. The problem is
|
|
55
|
+
# logging users in so they can access restricted areas. Solving this is simple, just do this:
|
|
56
|
+
#
|
|
57
|
+
# setup :activate_authlogic
|
|
58
|
+
#
|
|
59
|
+
# For those of you unfamiliar with TestUnit, the setup method bascially just executes a method before any test is ran.
|
|
60
|
+
# It is essentially "setting up" your tests.
|
|
61
|
+
#
|
|
62
|
+
# Once you have done this, just log users in like usual:
|
|
63
|
+
#
|
|
64
|
+
# UserSession.create(users(:whomever))
|
|
65
|
+
# # access my restricted area here
|
|
66
|
+
#
|
|
67
|
+
# Do this before you make your request and it will act as if that user is logged in.
|
|
68
|
+
#
|
|
69
|
+
# === Integration tests
|
|
70
|
+
#
|
|
71
|
+
# Again, just like functional tests, you don't have to do anything. As soon as you make a request, Authlogic will be
|
|
72
|
+
# conntected. If you want to activate Authlogic before making a request follow the same steps described in the
|
|
73
|
+
# "functional tests" section above. It works in the same manner.
|
|
74
|
+
#
|
|
75
|
+
# === Unit tests
|
|
76
|
+
#
|
|
77
|
+
# The only time you need to do any trickiness here is if you want to test Authlogic models. Maybe you added some custom
|
|
78
|
+
# code or methods in your Authlogic models. Maybe you are writing a plugin or a library that extends Authlogic.
|
|
79
|
+
#
|
|
80
|
+
# That being said, in this environment there is no controller. So you need to use a "mock" controller. Something
|
|
81
|
+
# that looks like a controller, acts like a controller, but isn't a "real" controller. You are essentially connecting
|
|
82
|
+
# Authlogic to your "mock" controller, then you can test off of the mock controller to make sure everything is functioning
|
|
83
|
+
# properly.
|
|
84
|
+
#
|
|
85
|
+
# I use a mock controller to test Authlogic myself. It's part of the Authlogic library that you can easily use. It's as simple
|
|
86
|
+
# as functional and integration tests. Just do the following:
|
|
87
|
+
#
|
|
88
|
+
# setup :activate_authlogic
|
|
89
|
+
#
|
|
90
|
+
# You also get a controller method that you can test off of. For example:
|
|
91
|
+
#
|
|
92
|
+
# ben = users(:ben)
|
|
93
|
+
# assert_nil controller.session["user_credentials"]
|
|
94
|
+
# assert UserSession.create(ben)
|
|
95
|
+
# assert_equal controller.session["user_credentials"], ben.persistence_token
|
|
96
|
+
#
|
|
97
|
+
# See how I am checking that Authlogic is interacting with the controller properly? That's the idea here.
|
|
98
|
+
module TestCase
|
|
99
|
+
# Activates authlogic so that you can use it in your tests. You should call this method in your test's setup. Ex:
|
|
100
|
+
#
|
|
101
|
+
# setup :activate_authlogic
|
|
102
|
+
def activate_authlogic
|
|
103
|
+
Authlogic::Session::Base.controller = (@request && Authlogic::TestCase::RailsRequestAdapter.new(@request)) || controller
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# The Authlogic::TestCase::MockController object passed to Authlogic to activate it. You can access this in your test.
|
|
107
|
+
# See the module description for an example.
|
|
108
|
+
def controller
|
|
109
|
+
@controller ||= Authlogic::TestCase::MockController.new
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
::Test::Unit::TestCase.send(:include, TestCase) if defined?(::Test::Unit::TestCase)
|
|
114
|
+
end
|
data/lib/authlogic.rb
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
require "
|
|
1
|
+
require "active_record"
|
|
2
2
|
|
|
3
|
-
require File.dirname(__FILE__) + "/authlogic/version"
|
|
4
3
|
require File.dirname(__FILE__) + "/authlogic/i18n"
|
|
5
4
|
require File.dirname(__FILE__) + "/authlogic/random"
|
|
5
|
+
require File.dirname(__FILE__) + "/authlogic/regex"
|
|
6
6
|
|
|
7
7
|
require File.dirname(__FILE__) + "/authlogic/controller_adapters/abstract_adapter"
|
|
8
8
|
require File.dirname(__FILE__) + "/authlogic/controller_adapters/rails_adapter" if defined?(Rails)
|
|
9
9
|
require File.dirname(__FILE__) + "/authlogic/controller_adapters/merb_adapter" if defined?(Merb)
|
|
10
|
+
require File.dirname(__FILE__) + "/authlogic/controller_adapters/sinatra_adapter" if defined?(Sinatra)
|
|
10
11
|
|
|
11
12
|
require File.dirname(__FILE__) + "/authlogic/crypto_providers/md5"
|
|
12
13
|
require File.dirname(__FILE__) + "/authlogic/crypto_providers/sha1"
|
|
@@ -52,4 +53,4 @@ require File.dirname(__FILE__) + "/authlogic/session/session"
|
|
|
52
53
|
require File.dirname(__FILE__) + "/authlogic/session/timeout"
|
|
53
54
|
require File.dirname(__FILE__) + "/authlogic/session/unauthorized_record"
|
|
54
55
|
require File.dirname(__FILE__) + "/authlogic/session/validation"
|
|
55
|
-
require File.dirname(__FILE__) + "/authlogic/session/base"
|
|
56
|
+
require File.dirname(__FILE__) + "/authlogic/session/base"
|
data/rails/init.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require "authlogic"
|
data/shoulda_macros/authlogic.rb
CHANGED
|
@@ -2,9 +2,10 @@ module Authlogic
|
|
|
2
2
|
module ShouldaMacros
|
|
3
3
|
class Test::Unit::TestCase
|
|
4
4
|
def self.should_be_authentic
|
|
5
|
-
klass = model_class
|
|
5
|
+
klass = described_type rescue model_class
|
|
6
6
|
should "acts as authentic" do
|
|
7
|
-
assert klass.respond_to?(:
|
|
7
|
+
assert klass.new.respond_to?(:password=)
|
|
8
|
+
assert klass.new.respond_to?(:valid_password?)
|
|
8
9
|
end
|
|
9
10
|
end
|
|
10
11
|
end
|
|
@@ -33,7 +33,7 @@ module ActsAsAuthenticTest
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def test_validates_format_of_email_field_options_config
|
|
36
|
-
default = {:with =>
|
|
36
|
+
default = {:with => Authlogic::Regex.email, :message => I18n.t('error_messages.email_invalid', :default => "should look like an email address.")}
|
|
37
37
|
assert_equal default, User.validates_format_of_email_field_options
|
|
38
38
|
assert_equal default, Employee.validates_format_of_email_field_options
|
|
39
39
|
|
|
@@ -43,37 +43,55 @@ module ActsAsAuthenticTest
|
|
|
43
43
|
assert_equal default, User.validates_format_of_email_field_options
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
+
def test_validates_uniqueness_of_email_field_options_config
|
|
47
|
+
default = {:case_sensitive => false, :scope => Employee.validations_scope, :if => "#{Employee.email_field}_changed?".to_sym}
|
|
48
|
+
assert_equal default, Employee.validates_uniqueness_of_email_field_options
|
|
49
|
+
|
|
50
|
+
Employee.validates_uniqueness_of_email_field_options = {:yes => "no"}
|
|
51
|
+
assert_equal({:yes => "no"}, Employee.validates_uniqueness_of_email_field_options)
|
|
52
|
+
Employee.validates_uniqueness_of_email_field_options default
|
|
53
|
+
assert_equal default, Employee.validates_uniqueness_of_email_field_options
|
|
54
|
+
end
|
|
55
|
+
|
|
46
56
|
def test_validates_length_of_email_field
|
|
47
57
|
u = User.new
|
|
48
58
|
u.email = "a@a.a"
|
|
49
59
|
assert !u.valid?
|
|
50
|
-
assert u.errors
|
|
60
|
+
assert u.errors[:email].size > 0
|
|
51
61
|
|
|
52
62
|
u.email = "a@a.com"
|
|
53
63
|
assert !u.valid?
|
|
54
|
-
assert
|
|
64
|
+
assert u.errors[:email].size == 0
|
|
55
65
|
end
|
|
56
66
|
|
|
57
67
|
def test_validates_format_of_email_field
|
|
58
68
|
u = User.new
|
|
59
69
|
u.email = "aaaaaaaaaaaaa"
|
|
60
70
|
assert !u.valid?
|
|
61
|
-
assert u.errors
|
|
71
|
+
assert u.errors[:email].size > 0
|
|
62
72
|
|
|
63
73
|
u.email = "a@a.com"
|
|
64
74
|
assert !u.valid?
|
|
65
|
-
assert
|
|
75
|
+
assert u.errors[:email].size == 0
|
|
76
|
+
|
|
77
|
+
u.email = "dakota.dux+1@gmail.com"
|
|
78
|
+
assert !u.valid?
|
|
79
|
+
assert u.errors[:email].size == 0
|
|
66
80
|
end
|
|
67
81
|
|
|
68
82
|
def test_validates_uniqueness_of_email_field
|
|
69
83
|
u = User.new
|
|
70
84
|
u.email = "bjohnson@binarylogic.com"
|
|
71
85
|
assert !u.valid?
|
|
72
|
-
assert u.errors
|
|
86
|
+
assert u.errors[:email].size > 0
|
|
87
|
+
|
|
88
|
+
u.email = "BJOHNSON@binarylogic.com"
|
|
89
|
+
assert !u.valid?
|
|
90
|
+
assert u.errors[:email].size > 0
|
|
73
91
|
|
|
74
92
|
u.email = "a@a.com"
|
|
75
93
|
assert !u.valid?
|
|
76
|
-
assert
|
|
94
|
+
assert u.errors[:email].size == 0
|
|
77
95
|
end
|
|
78
96
|
end
|
|
79
97
|
end
|
|
@@ -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
|