Empact-authlogic 2.1.5 → 3.0.3

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 (70) hide show
  1. data/Empact-authlogic.gemspec +190 -187
  2. data/Gemfile +10 -0
  3. data/Gemfile.lock +49 -0
  4. data/LICENSE +1 -1
  5. data/README.rdoc +14 -10
  6. data/Rakefile +5 -5
  7. data/VERSION.yml +3 -3
  8. data/lib/authlogic/acts_as_authentic/base.rb +14 -12
  9. data/lib/authlogic/acts_as_authentic/email.rb +12 -12
  10. data/lib/authlogic/acts_as_authentic/logged_in_status.rb +8 -9
  11. data/lib/authlogic/acts_as_authentic/login.rb +19 -18
  12. data/lib/authlogic/acts_as_authentic/password.rb +3 -3
  13. data/lib/authlogic/acts_as_authentic/perishable_token.rb +15 -15
  14. data/lib/authlogic/acts_as_authentic/persistence_token.rb +1 -1
  15. data/lib/authlogic/authenticates_many/base.rb +3 -4
  16. data/lib/authlogic/controller_adapters/rails_adapter.rb +1 -1
  17. data/lib/authlogic/random.rb +1 -1
  18. data/lib/authlogic/session/active_record_trickery.rb +8 -0
  19. data/lib/authlogic/session/callbacks.rb +2 -2
  20. data/lib/authlogic/session/cookies.rb +54 -2
  21. data/lib/authlogic/session/foundation.rb +17 -3
  22. data/lib/authlogic/session/http_auth.rb +43 -2
  23. data/lib/authlogic/session/scopes.rb +9 -9
  24. data/lib/authlogic/test_case/mock_controller.rb +12 -2
  25. data/lib/generators/authlogic/USAGE +8 -0
  26. data/lib/generators/authlogic/session_generator.rb +14 -0
  27. data/lib/generators/authlogic/templates/session.rb +2 -0
  28. data/test/acts_as_authentic_test/base_test.rb +1 -1
  29. data/test/acts_as_authentic_test/email_test.rb +29 -21
  30. data/test/acts_as_authentic_test/logged_in_status_test.rb +1 -1
  31. data/test/acts_as_authentic_test/login_test.rb +1 -1
  32. data/test/acts_as_authentic_test/magic_columns_test.rb +1 -1
  33. data/test/acts_as_authentic_test/password_test.rb +1 -1
  34. data/test/acts_as_authentic_test/perishable_token_test.rb +1 -1
  35. data/test/acts_as_authentic_test/persistence_token_test.rb +1 -1
  36. data/test/acts_as_authentic_test/restful_authentication_test.rb +1 -1
  37. data/test/acts_as_authentic_test/session_maintenance_test.rb +1 -1
  38. data/test/acts_as_authentic_test/single_access_test.rb +1 -1
  39. data/test/authenticates_many_test.rb +1 -1
  40. data/test/crypto_provider_test/aes256_test.rb +1 -1
  41. data/test/crypto_provider_test/bcrypt_test.rb +1 -1
  42. data/test/crypto_provider_test/sha1_test.rb +1 -1
  43. data/test/crypto_provider_test/sha256_test.rb +1 -1
  44. data/test/crypto_provider_test/sha512_test.rb +1 -1
  45. data/test/i18n_test.rb +1 -1
  46. data/test/random_test.rb +1 -8
  47. data/test/session_test/activation_test.rb +1 -1
  48. data/test/session_test/active_record_trickery_test.rb +12 -2
  49. data/test/session_test/brute_force_protection_test.rb +1 -1
  50. data/test/session_test/callbacks_test.rb +1 -1
  51. data/test/session_test/cookies_test.rb +26 -2
  52. data/test/session_test/existence_test.rb +1 -1
  53. data/test/session_test/http_auth_test.rb +31 -3
  54. data/test/session_test/id_test.rb +1 -1
  55. data/test/session_test/klass_test.rb +1 -1
  56. data/test/session_test/magic_columns_test.rb +1 -1
  57. data/test/session_test/magic_states_test.rb +1 -1
  58. data/test/session_test/params_test.rb +1 -1
  59. data/test/session_test/password_test.rb +1 -1
  60. data/test/session_test/perishability_test.rb +1 -1
  61. data/test/session_test/persistence_test.rb +1 -1
  62. data/test/session_test/scopes_test.rb +12 -12
  63. data/test/session_test/session_test.rb +1 -1
  64. data/test/session_test/timeout_test.rb +1 -1
  65. data/test/session_test/unauthorized_record_test.rb +1 -1
  66. data/test/session_test/validation_test.rb +1 -1
  67. data/test/test_helper.rb +27 -41
  68. metadata +50 -55
  69. data/.gitignore +0 -9
  70. data/CHANGELOG.rdoc +0 -353
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Ben Johnson of Binary Logic
1
+ Copyright (c) 2011 Ben Johnson of Binary Logic
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.rdoc CHANGED
@@ -1,5 +1,7 @@
1
1
  = Authlogic
2
2
 
3
+ ** Please note the latest version is compatible with rails 3 only. Rails 2 should use version 2.X.X **
4
+
3
5
  Authlogic is a clean, simple, and unobtrusive ruby authentication solution.
4
6
 
5
7
  A code example can replace a thousand words...
@@ -67,8 +69,12 @@ If you find a bug or a problem please post it in the issues section. If you need
67
69
  * <b>Authlogic OpenID addon:</b> http://github.com/binarylogic/authlogic_openid
68
70
  * <b>Authlogic LDAP addon:</b> http://github.com/binarylogic/authlogic_ldap
69
71
  * <b>Authlogic Facebook Connect:</b> http://github.com/kalasjocke/authlogic_facebook_connect
72
+ * <b>Authlogic Facebook Connect (New JS API):</b> http://github.com/studybyte/authlogic_facebook_connect
73
+ * <b>Authlogic Facebook Shim</b> http://github.com/james2m/authlogic_facebook_shim
70
74
  * <b>Authlogic OAuth (Twitter):</b> http://github.com/jrallison/authlogic_oauth
75
+ * <b>Authlogic Oauth and OpenID:</b> http://github.com/viatropos/authlogic-connect
71
76
  * <b>Authlogic PAM:</b> http://github.com/nbudin/authlogic_pam
77
+ * <b>Authlogic x509:</b> http://github.com/auth-scc/authlogic_x509
72
78
 
73
79
  If you create one of your own, please let me know about it so I can add it to this list. Or just fork the project, add your link, and send me a pull request.
74
80
 
@@ -150,7 +156,7 @@ What if your user sessions controller could look just like your other controller
150
156
  def new
151
157
  @user_session = UserSession.new
152
158
  end
153
-
159
+
154
160
  def create
155
161
  @user_session = UserSession.new(params[:user_session])
156
162
  if @user_session.save
@@ -159,7 +165,7 @@ What if your user sessions controller could look just like your other controller
159
165
  render :action => :new
160
166
  end
161
167
  end
162
-
168
+
163
169
  def destroy
164
170
  current_user_session.destroy
165
171
  redirect_to new_user_session_url
@@ -183,13 +189,13 @@ Or how about persisting the session...
183
189
 
184
190
  class ApplicationController
185
191
  helper_method :current_user_session, :current_user
186
-
192
+
187
193
  private
188
194
  def current_user_session
189
195
  return @current_user_session if defined?(@current_user_session)
190
196
  @current_user_session = UserSession.find
191
197
  end
192
-
198
+
193
199
  def current_user
194
200
  return @current_user if defined?(@current_user)
195
201
  @current_user = current_user_session && current_user_session.user
@@ -200,17 +206,15 @@ Or how about persisting the session...
200
206
 
201
207
  Install the gem / plugin (recommended)
202
208
 
203
- From rubyforge:
209
+ Rails 3:
204
210
 
205
211
  $ sudo gem install authlogic
206
212
 
207
- Or from github:
208
-
209
- $ sudo gem install binarylogic-authlogic
213
+ Rails 2:
210
214
 
211
- Now just add the gem dependency in your projects configuration.
215
+ $ sudo gem install authlogic --version=2.1.6
212
216
 
213
- Or you can install this as a plugin:
217
+ Or install as a plugin:
214
218
 
215
219
  script/plugin install git://github.com/binarylogic/authlogic.git
216
220
 
data/Rakefile CHANGED
@@ -1,5 +1,8 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
+ require 'bundler'
4
+
5
+ Bundler.setup
3
6
 
4
7
  begin
5
8
  require 'jeweler'
@@ -9,10 +12,9 @@ begin
9
12
  gem.email = "bjohnson@binarylogic.com"
10
13
  gem.homepage = "http://github.com/binarylogic/authlogic"
11
14
  gem.authors = ["Ben Johnson of Binary Logic", "Ben Woosley"]
12
- gem.rubyforge_project = "authlogic"
13
- gem.add_dependency "activesupport"
15
+ gem.add_bundler_dependencies
14
16
  end
15
- Jeweler::RubyforgeTasks.new
17
+ Jeweler::GemcutterTasks.new
16
18
  rescue LoadError
17
19
  puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
18
20
  end
@@ -37,6 +39,4 @@ rescue LoadError
37
39
  end
38
40
  end
39
41
 
40
- task :test => :check_dependencies
41
-
42
42
  task :default => :test
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- :major: 2
2
+ :major: 3
3
+ :minor: 0
4
+ :patch: 3
3
5
  :build:
4
- :minor: 1
5
- :patch: 5
@@ -4,6 +4,9 @@ module Authlogic
4
4
  module Base
5
5
  def self.included(klass)
6
6
  klass.class_eval do
7
+ class_attribute :acts_as_authentic_modules, :acts_as_authentic_config
8
+ self.acts_as_authentic_modules ||= []
9
+ self.acts_as_authentic_config ||= {}
7
10
  extend Config
8
11
  end
9
12
  end
@@ -41,7 +44,7 @@ module Authlogic
41
44
  #
42
45
  # That being said, this is your tool for extending Authlogic and "hooking" into the acts_as_authentic call.
43
46
  def add_acts_as_authentic_module(mod, action = :append)
44
- modules = acts_as_authentic_modules
47
+ modules = acts_as_authentic_modules.clone
45
48
  case action
46
49
  when :append
47
50
  modules << mod
@@ -49,21 +52,17 @@ module Authlogic
49
52
  modules = [mod] + modules
50
53
  end
51
54
  modules.uniq!
52
- write_inheritable_attribute(:acts_as_authentic_modules, modules)
55
+ self.acts_as_authentic_modules = modules
53
56
  end
54
57
 
55
58
  # This is the same as add_acts_as_authentic_module, except that it removes the module from the list.
56
59
  def remove_acts_as_authentic_module(mod)
57
- acts_as_authentic_modules.delete(mod)
58
- acts_as_authentic_modules
60
+ modules = acts_as_authentic_modules.clone
61
+ modules.delete(mod)
62
+ self.acts_as_authentic_modules = modules
59
63
  end
60
-
64
+
61
65
  private
62
- def acts_as_authentic_modules
63
- key = :acts_as_authentic_modules
64
- inheritable_attributes.include?(key) ? read_inheritable_attribute(key) : []
65
- end
66
-
67
66
  def db_setup?
68
67
  begin
69
68
  column_names
@@ -75,9 +74,12 @@ module Authlogic
75
74
 
76
75
  def rw_config(key, value, default_value = nil, read_value = nil)
77
76
  if value == read_value
78
- inheritable_attributes.include?(key) ? read_inheritable_attribute(key) : default_value
77
+ acts_as_authentic_config.include?(key) ? acts_as_authentic_config[key] : default_value
79
78
  else
80
- write_inheritable_attribute(key, value)
79
+ config = acts_as_authentic_config.clone
80
+ config[key] = value
81
+ self.acts_as_authentic_config = config
82
+ value
81
83
  end
82
84
  end
83
85
 
@@ -11,7 +11,7 @@ module Authlogic
11
11
  add_acts_as_authentic_module(Methods)
12
12
  end
13
13
  end
14
-
14
+
15
15
  # Configuration to modify how Authlogic handles the email field.
16
16
  module Config
17
17
  # The name of the field that stores email addresses.
@@ -22,7 +22,7 @@ module Authlogic
22
22
  rw_config(:email_field, value, first_column_to_exist(nil, :email, :email_address))
23
23
  end
24
24
  alias_method :email_field=, :email_field
25
-
25
+
26
26
  # Toggles validating the email field or not.
27
27
  #
28
28
  # * <tt>Default:</tt> true
@@ -31,20 +31,20 @@ module Authlogic
31
31
  rw_config(:validate_email_field, value, true)
32
32
  end
33
33
  alias_method :validate_email_field=, :validate_email_field
34
-
34
+
35
35
  # A hash of options for the validates_length_of call for the email field. Allows you to change this however you want.
36
36
  #
37
37
  # <b>Keep in mind this is ruby. I wanted to keep this as flexible as possible, so you can completely replace the hash or
38
38
  # merge options into it. Checkout the convenience function merge_validates_length_of_email_field_options to merge
39
39
  # options.</b>
40
40
  #
41
- # * <tt>Default:</tt> {:within => 6..100}
41
+ # * <tt>Default:</tt> {:maximum => 100}
42
42
  # * <tt>Accepts:</tt> Hash of options accepted by validates_length_of
43
43
  def validates_length_of_email_field_options(value = nil)
44
- rw_config(:validates_length_of_email_field_options, value, {:within => 6..100})
44
+ rw_config(:validates_length_of_email_field_options, value, {:maximum => 100})
45
45
  end
46
46
  alias_method :validates_length_of_email_field_options=, :validates_length_of_email_field_options
47
-
47
+
48
48
  # A convenience function to merge options into the validates_length_of_email_field_options. So intead of:
49
49
  #
50
50
  # self.validates_length_of_email_field_options = validates_length_of_email_field_options.merge(:my_option => my_value)
@@ -55,25 +55,25 @@ module Authlogic
55
55
  def merge_validates_length_of_email_field_options(options = {})
56
56
  self.validates_length_of_email_field_options = validates_length_of_email_field_options.merge(options)
57
57
  end
58
-
58
+
59
59
  # A hash of options for the validates_format_of call for the email field. Allows you to change this however you want.
60
60
  #
61
61
  # <b>Keep in mind this is ruby. I wanted to keep this as flexible as possible, so you can completely replace the hash or
62
62
  # merge options into it. Checkout the convenience function merge_validates_format_of_email_field_options to merge
63
63
  # options.</b>
64
64
  #
65
- # * <tt>Default:</tt> {:with => Authlogic::Regex.email, :message => I18n.t('error_messages.email_invalid', :default => "should look like an email address.")}
65
+ # * <tt>Default:</tt> {:with => Authlogic::Regex.email, :message => lambda {I18n.t('error_messages.email_invalid', :default => "should look like an email address.")}}
66
66
  # * <tt>Accepts:</tt> Hash of options accepted by validates_format_of
67
67
  def validates_format_of_email_field_options(value = nil)
68
68
  rw_config(:validates_format_of_email_field_options, value, {:with => Authlogic::Regex.email, :message => I18n.t('error_messages.email_invalid', :default => "should look like an email address.")})
69
69
  end
70
70
  alias_method :validates_format_of_email_field_options=, :validates_format_of_email_field_options
71
-
71
+
72
72
  # See merge_validates_length_of_email_field_options. The same thing except for validates_format_of_email_field_options.
73
73
  def merge_validates_format_of_email_field_options(options = {})
74
74
  self.validates_format_of_email_field_options = validates_format_of_email_field_options.merge(options)
75
75
  end
76
-
76
+
77
77
  # A hash of options for the validates_uniqueness_of call for the email field. Allows you to change this however you want.
78
78
  #
79
79
  # <b>Keep in mind this is ruby. I wanted to keep this as flexible as possible, so you can completely replace the hash or
@@ -86,13 +86,13 @@ module Authlogic
86
86
  rw_config(:validates_uniqueness_of_email_field_options, value, {:case_sensitive => false, :scope => validations_scope, :if => "#{email_field}_changed?".to_sym})
87
87
  end
88
88
  alias_method :validates_uniqueness_of_email_field_options=, :validates_uniqueness_of_email_field_options
89
-
89
+
90
90
  # See merge_validates_length_of_email_field_options. The same thing except for validates_uniqueness_of_email_field_options.
91
91
  def merge_validates_uniqueness_of_email_field_options(options = {})
92
92
  self.validates_uniqueness_of_email_field_options = validates_uniqueness_of_email_field_options.merge(options)
93
93
  end
94
94
  end
95
-
95
+
96
96
  # All methods relating to the email field
97
97
  module Methods
98
98
  def self.included(klass)
@@ -11,7 +11,7 @@ module Authlogic
11
11
  add_acts_as_authentic_module(Methods)
12
12
  end
13
13
  end
14
-
14
+
15
15
  # All configuration for the logged in status feature set.
16
16
  module Config
17
17
  # The timeout to determine when a user is logged in or not.
@@ -23,32 +23,31 @@ module Authlogic
23
23
  end
24
24
  alias_method :logged_in_timeout=, :logged_in_timeout
25
25
  end
26
-
26
+
27
27
  # All methods for the logged in status feature seat.
28
28
  module Methods
29
29
  def self.included(klass)
30
30
  return if !klass.column_names.include?("last_request_at")
31
-
31
+
32
32
  klass.class_eval do
33
33
  include InstanceMethods
34
-
35
- named_scope :logged_in, lambda { {:conditions => ["last_request_at > ?", logged_in_timeout.seconds.ago]} }
36
- named_scope :logged_out, lambda { {:conditions => ["last_request_at is NULL or last_request_at <= ?", logged_in_timeout.seconds.ago]} }
34
+ scope :logged_in, where("last_request_at > ?", logged_in_timeout.seconds.ago)
35
+ scope :logged_out, where("last_request_at is NULL or last_request_at <= ?", logged_in_timeout.seconds.ago)
37
36
  end
38
37
  end
39
-
38
+
40
39
  module InstanceMethods
41
40
  # Returns true if the last_request_at > logged_in_timeout.
42
41
  def logged_in?
43
42
  raise "Can not determine the records login state because there is no last_request_at column" if !respond_to?(:last_request_at)
44
43
  !last_request_at.nil? && last_request_at > logged_in_timeout.seconds.ago
45
44
  end
46
-
45
+
47
46
  # Opposite of logged_in?
48
47
  def logged_out?
49
48
  !logged_in?
50
49
  end
51
-
50
+
52
51
  private
53
52
  def logged_in_timeout
54
53
  self.class.logged_in_timeout
@@ -8,8 +8,8 @@ module Authlogic
8
8
  add_acts_as_authentic_module(Methods)
9
9
  end
10
10
  end
11
-
12
- # Confguration for the login field.
11
+
12
+ # Configuration for the login field.
13
13
  module Config
14
14
  # The name of the login field in the database.
15
15
  #
@@ -19,8 +19,8 @@ module Authlogic
19
19
  rw_config(:login_field, value, first_column_to_exist(nil, :login, :username))
20
20
  end
21
21
  alias_method :login_field=, :login_field
22
-
23
- # Whether or not the validate the login field
22
+
23
+ # Whether or not to validate the login field
24
24
  #
25
25
  # * <tt>Default:</tt> true
26
26
  # * <tt>Accepts:</tt> Boolean
@@ -28,7 +28,7 @@ module Authlogic
28
28
  rw_config(:validate_login_field, value, true)
29
29
  end
30
30
  alias_method :validate_login_field=, :validate_login_field
31
-
31
+
32
32
  # A hash of options for the validates_length_of call for the login field. Allows you to change this however you want.
33
33
  #
34
34
  # <b>Keep in mind this is ruby. I wanted to keep this as flexible as possible, so you can completely replace the hash or
@@ -41,8 +41,8 @@ module Authlogic
41
41
  rw_config(:validates_length_of_login_field_options, value, {:within => 3..100})
42
42
  end
43
43
  alias_method :validates_length_of_login_field_options=, :validates_length_of_login_field_options
44
-
45
- # A convenience function to merge options into the validates_length_of_login_field_options. So intead of:
44
+
45
+ # A convenience function to merge options into the validates_length_of_login_field_options. So instead of:
46
46
  #
47
47
  # self.validates_length_of_login_field_options = validates_length_of_login_field_options.merge(:my_option => my_value)
48
48
  #
@@ -52,25 +52,25 @@ module Authlogic
52
52
  def merge_validates_length_of_login_field_options(options = {})
53
53
  self.validates_length_of_login_field_options = validates_length_of_login_field_options.merge(options)
54
54
  end
55
-
55
+
56
56
  # A hash of options for the validates_format_of call for the login field. Allows you to change this however you want.
57
57
  #
58
58
  # <b>Keep in mind this is ruby. I wanted to keep this as flexible as possible, so you can completely replace the hash or
59
59
  # merge options into it. Checkout the convenience function merge_validates_format_of_login_field_options to merge
60
60
  # options.</b>
61
61
  #
62
- # * <tt>Default:</tt> {:with => Authlogic::Regex.login, :message => I18n.t('error_messages.login_invalid', :default => "should use only letters, numbers, spaces, and .-_@ please.")}
62
+ # * <tt>Default:</tt> {:with => Authlogic::Regex.login, :message => lambda {I18n.t('error_messages.login_invalid', :default => "should use only letters, numbers, spaces, and .-_@ please.")}}
63
63
  # * <tt>Accepts:</tt> Hash of options accepted by validates_format_of
64
64
  def validates_format_of_login_field_options(value = nil)
65
65
  rw_config(:validates_format_of_login_field_options, value, {:with => Authlogic::Regex.login, :message => I18n.t('error_messages.login_invalid', :default => "should use only letters, numbers, spaces, and .-_@ please.")})
66
66
  end
67
67
  alias_method :validates_format_of_login_field_options=, :validates_format_of_login_field_options
68
-
68
+
69
69
  # See merge_validates_length_of_login_field_options. The same thing, except for validates_format_of_login_field_options
70
70
  def merge_validates_format_of_login_field_options(options = {})
71
71
  self.validates_format_of_login_field_options = validates_format_of_login_field_options.merge(options)
72
72
  end
73
-
73
+
74
74
  # A hash of options for the validates_uniqueness_of call for the login field. Allows you to change this however you want.
75
75
  #
76
76
  # <b>Keep in mind this is ruby. I wanted to keep this as flexible as possible, so you can completely replace the hash or
@@ -83,18 +83,18 @@ module Authlogic
83
83
  rw_config(:validates_uniqueness_of_login_field_options, value, {:case_sensitive => false, :scope => validations_scope, :if => "#{login_field}_changed?".to_sym})
84
84
  end
85
85
  alias_method :validates_uniqueness_of_login_field_options=, :validates_uniqueness_of_login_field_options
86
-
86
+
87
87
  # See merge_validates_length_of_login_field_options. The same thing, except for validates_uniqueness_of_login_field_options
88
88
  def merge_validates_uniqueness_of_login_field_options(options = {})
89
89
  self.validates_uniqueness_of_login_field_options = validates_uniqueness_of_login_field_options.merge(options)
90
90
  end
91
-
92
- # This method allows you to find a record with the given login. If you notice, with ActiveRecord you have the
91
+
92
+ # This method allows you to find a record with the given login. If you notice, with Active Record you have the
93
93
  # validates_uniqueness_of validation function. They give you a :case_sensitive option. I handle this in the same
94
94
  # manner that they handle that. If you are using the login field and set false for the :case_sensitive option in
95
95
  # validates_uniqueness_of_login_field_options this method will modify the query to look something like:
96
96
  #
97
- # first(:conditions => ["LOWER(#{quoted_table_name}.#{login_field}) = ?", login.downcase])
97
+ # where("LOWER(#{quoted_table_name}.#{login_field}) = ?", login.downcase).first
98
98
  #
99
99
  # If you don't specify this it calls the good old find_by_* method:
100
100
  #
@@ -112,17 +112,18 @@ module Authlogic
112
112
  find_with_case(email_field, login, validates_uniqueness_of_email_field_options[:case_sensitive] != false)
113
113
  end
114
114
  end
115
-
115
+
116
116
  private
117
117
  def find_with_case(field, value, sensitivity = true)
118
118
  if sensitivity
119
119
  send("find_by_#{field}", value)
120
120
  else
121
- first(:conditions => ["LOWER(#{quoted_table_name}.#{field}) = ?", value.mb_chars.downcase])
121
+ like_word = ::ActiveRecord::Base.connection.adapter_name == "PostgreSQL" ? "ILIKE" : "LIKE"
122
+ where("#{quoted_table_name}.#{field} #{like_word} ?", value.mb_chars).first
122
123
  end
123
124
  end
124
125
  end
125
-
126
+
126
127
  # All methods relating to the login field
127
128
  module Methods
128
129
  # Adds in various validations, modules, etc.
@@ -182,7 +182,7 @@ module Authlogic
182
182
  klass.define_callbacks *METHODS
183
183
 
184
184
  # If Rails 3, support the new callback syntax
185
- if klass.singleton_class.method_defined?(:set_callback)
185
+ if klass.send(klass.respond_to?(:singleton_class) ? :singleton_class : :metaclass).method_defined?(:set_callback)
186
186
  METHODS.each do |method|
187
187
  klass.class_eval <<-"end_eval", __FILE__, __LINE__
188
188
  def self.#{method}(*methods, &block)
@@ -277,7 +277,7 @@ module Authlogic
277
277
  # Resets the password to a random friendly token and then saves the record.
278
278
  def reset_password!
279
279
  reset_password
280
- save_without_session_maintenance(false)
280
+ save_without_session_maintenance(:validate => false)
281
281
  end
282
282
  alias_method :randomize_password!, :reset_password!
283
283
 
@@ -314,7 +314,7 @@ module Authlogic
314
314
 
315
315
  def transition_password(attempted_password)
316
316
  self.password = attempted_password
317
- save(false)
317
+ save(:validate => false)
318
318
  end
319
319
 
320
320
  def require_password?