Empact-authlogic 2.1.5 → 3.0.3

Sign up to get free protection for your applications and to get access to all the features.
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?