authlogic 3.8.0 → 6.0.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.
Files changed (150) hide show
  1. checksums.yaml +7 -0
  2. data/lib/authlogic/acts_as_authentic/base.rb +33 -36
  3. data/lib/authlogic/acts_as_authentic/email.rb +8 -141
  4. data/lib/authlogic/acts_as_authentic/logged_in_status.rb +17 -10
  5. data/lib/authlogic/acts_as_authentic/login.rb +14 -165
  6. data/lib/authlogic/acts_as_authentic/magic_columns.rb +13 -10
  7. data/lib/authlogic/acts_as_authentic/password.rb +186 -254
  8. data/lib/authlogic/acts_as_authentic/perishable_token.rb +30 -22
  9. data/lib/authlogic/acts_as_authentic/persistence_token.rb +19 -18
  10. data/lib/authlogic/acts_as_authentic/queries/case_sensitivity.rb +53 -0
  11. data/lib/authlogic/acts_as_authentic/queries/find_with_case.rb +83 -0
  12. data/lib/authlogic/acts_as_authentic/session_maintenance.rb +94 -62
  13. data/lib/authlogic/acts_as_authentic/single_access_token.rb +28 -14
  14. data/lib/authlogic/config.rb +29 -10
  15. data/lib/authlogic/controller_adapters/abstract_adapter.rb +43 -13
  16. data/lib/authlogic/controller_adapters/rack_adapter.rb +11 -5
  17. data/lib/authlogic/controller_adapters/rails_adapter.rb +11 -29
  18. data/lib/authlogic/controller_adapters/sinatra_adapter.rb +8 -2
  19. data/lib/authlogic/cookie_credentials.rb +63 -0
  20. data/lib/authlogic/crypto_providers/bcrypt.rb +24 -18
  21. data/lib/authlogic/crypto_providers/md5/v2.rb +35 -0
  22. data/lib/authlogic/crypto_providers/md5.rb +8 -6
  23. data/lib/authlogic/crypto_providers/scrypt.rb +24 -17
  24. data/lib/authlogic/crypto_providers/sha1/v2.rb +41 -0
  25. data/lib/authlogic/crypto_providers/sha1.rb +12 -5
  26. data/lib/authlogic/crypto_providers/sha256/v2.rb +58 -0
  27. data/lib/authlogic/crypto_providers/sha256.rb +18 -9
  28. data/lib/authlogic/crypto_providers/sha512/v2.rb +39 -0
  29. data/lib/authlogic/crypto_providers/sha512.rb +9 -26
  30. data/lib/authlogic/crypto_providers.rb +77 -1
  31. data/lib/authlogic/errors.rb +35 -0
  32. data/lib/authlogic/i18n/translator.rb +4 -1
  33. data/lib/authlogic/i18n.rb +29 -20
  34. data/lib/authlogic/random.rb +12 -28
  35. data/lib/authlogic/session/base.rb +2087 -33
  36. data/lib/authlogic/session/magic_column/assigns_last_request_at.rb +46 -0
  37. data/lib/authlogic/test_case/mock_controller.rb +7 -4
  38. data/lib/authlogic/test_case/mock_cookie_jar.rb +19 -3
  39. data/lib/authlogic/test_case/mock_logger.rb +2 -0
  40. data/lib/authlogic/test_case/mock_request.rb +8 -3
  41. data/lib/authlogic/test_case/rails_request_adapter.rb +5 -2
  42. data/lib/authlogic/test_case.rb +74 -2
  43. data/lib/authlogic/version.rb +22 -0
  44. data/lib/authlogic.rb +33 -54
  45. metadata +208 -234
  46. data/.github/ISSUE_TEMPLATE.md +0 -13
  47. data/.gitignore +0 -14
  48. data/.rubocop.yml +0 -33
  49. data/.rubocop_todo.yml +0 -391
  50. data/.travis.yml +0 -48
  51. data/CHANGELOG.md +0 -5
  52. data/CONTRIBUTING.md +0 -60
  53. data/Gemfile +0 -5
  54. data/LICENSE +0 -20
  55. data/README.md +0 -294
  56. data/Rakefile +0 -21
  57. data/authlogic.gemspec +0 -27
  58. data/lib/authlogic/acts_as_authentic/restful_authentication.rb +0 -70
  59. data/lib/authlogic/acts_as_authentic/validations_scope.rb +0 -32
  60. data/lib/authlogic/authenticates_many/association.rb +0 -50
  61. data/lib/authlogic/authenticates_many/base.rb +0 -65
  62. data/lib/authlogic/crypto_providers/aes256.rb +0 -66
  63. data/lib/authlogic/crypto_providers/wordpress.rb +0 -43
  64. data/lib/authlogic/regex.rb +0 -48
  65. data/lib/authlogic/session/activation.rb +0 -70
  66. data/lib/authlogic/session/active_record_trickery.rb +0 -61
  67. data/lib/authlogic/session/brute_force_protection.rb +0 -120
  68. data/lib/authlogic/session/callbacks.rb +0 -105
  69. data/lib/authlogic/session/cookies.rb +0 -244
  70. data/lib/authlogic/session/existence.rb +0 -93
  71. data/lib/authlogic/session/foundation.rb +0 -55
  72. data/lib/authlogic/session/http_auth.rb +0 -100
  73. data/lib/authlogic/session/id.rb +0 -48
  74. data/lib/authlogic/session/klass.rb +0 -70
  75. data/lib/authlogic/session/magic_columns.rb +0 -116
  76. data/lib/authlogic/session/magic_states.rb +0 -76
  77. data/lib/authlogic/session/params.rb +0 -116
  78. data/lib/authlogic/session/password.rb +0 -308
  79. data/lib/authlogic/session/perishable_token.rb +0 -23
  80. data/lib/authlogic/session/persistence.rb +0 -71
  81. data/lib/authlogic/session/priority_record.rb +0 -35
  82. data/lib/authlogic/session/scopes.rb +0 -119
  83. data/lib/authlogic/session/session.rb +0 -67
  84. data/lib/authlogic/session/timeout.rb +0 -103
  85. data/lib/authlogic/session/unauthorized_record.rb +0 -51
  86. data/lib/authlogic/session/validation.rb +0 -93
  87. data/test/acts_as_authentic_test/base_test.rb +0 -25
  88. data/test/acts_as_authentic_test/email_test.rb +0 -240
  89. data/test/acts_as_authentic_test/logged_in_status_test.rb +0 -62
  90. data/test/acts_as_authentic_test/login_test.rb +0 -156
  91. data/test/acts_as_authentic_test/magic_columns_test.rb +0 -27
  92. data/test/acts_as_authentic_test/password_test.rb +0 -249
  93. data/test/acts_as_authentic_test/perishable_token_test.rb +0 -90
  94. data/test/acts_as_authentic_test/persistence_token_test.rb +0 -56
  95. data/test/acts_as_authentic_test/restful_authentication_test.rb +0 -37
  96. data/test/acts_as_authentic_test/session_maintenance_test.rb +0 -96
  97. data/test/acts_as_authentic_test/single_access_test.rb +0 -44
  98. data/test/authenticates_many_test.rb +0 -31
  99. data/test/config_test.rb +0 -36
  100. data/test/crypto_provider_test/aes256_test.rb +0 -14
  101. data/test/crypto_provider_test/bcrypt_test.rb +0 -14
  102. data/test/crypto_provider_test/scrypt_test.rb +0 -14
  103. data/test/crypto_provider_test/sha1_test.rb +0 -23
  104. data/test/crypto_provider_test/sha256_test.rb +0 -14
  105. data/test/crypto_provider_test/sha512_test.rb +0 -14
  106. data/test/fixtures/companies.yml +0 -5
  107. data/test/fixtures/employees.yml +0 -17
  108. data/test/fixtures/projects.yml +0 -3
  109. data/test/fixtures/users.yml +0 -41
  110. data/test/gemfiles/Gemfile.rails-3.2.x +0 -7
  111. data/test/gemfiles/Gemfile.rails-4.0.x +0 -7
  112. data/test/gemfiles/Gemfile.rails-4.1.x +0 -7
  113. data/test/gemfiles/Gemfile.rails-4.2.x +0 -7
  114. data/test/gemfiles/Gemfile.rails-5.0.x +0 -6
  115. data/test/gemfiles/Gemfile.rails-5.1.x +0 -6
  116. data/test/gemfiles/Gemfile.rails-5.2.x +0 -6
  117. data/test/i18n/lol.yml +0 -4
  118. data/test/i18n_test.rb +0 -33
  119. data/test/libs/affiliate.rb +0 -7
  120. data/test/libs/company.rb +0 -6
  121. data/test/libs/employee.rb +0 -7
  122. data/test/libs/employee_session.rb +0 -2
  123. data/test/libs/ldaper.rb +0 -3
  124. data/test/libs/project.rb +0 -3
  125. data/test/libs/user.rb +0 -7
  126. data/test/libs/user_session.rb +0 -25
  127. data/test/random_test.rb +0 -43
  128. data/test/session_test/activation_test.rb +0 -43
  129. data/test/session_test/active_record_trickery_test.rb +0 -75
  130. data/test/session_test/brute_force_protection_test.rb +0 -108
  131. data/test/session_test/callbacks_test.rb +0 -34
  132. data/test/session_test/cookies_test.rb +0 -201
  133. data/test/session_test/credentials_test.rb +0 -0
  134. data/test/session_test/existence_test.rb +0 -75
  135. data/test/session_test/foundation_test.rb +0 -6
  136. data/test/session_test/http_auth_test.rb +0 -56
  137. data/test/session_test/id_test.rb +0 -17
  138. data/test/session_test/klass_test.rb +0 -40
  139. data/test/session_test/magic_columns_test.rb +0 -62
  140. data/test/session_test/magic_states_test.rb +0 -58
  141. data/test/session_test/params_test.rb +0 -53
  142. data/test/session_test/password_test.rb +0 -105
  143. data/test/session_test/perishability_test.rb +0 -15
  144. data/test/session_test/persistence_test.rb +0 -32
  145. data/test/session_test/scopes_test.rb +0 -60
  146. data/test/session_test/session_test.rb +0 -78
  147. data/test/session_test/timeout_test.rb +0 -82
  148. data/test/session_test/unauthorized_record_test.rb +0 -13
  149. data/test/session_test/validation_test.rb +0 -23
  150. data/test/test_helper.rb +0 -233
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 755961398552a88cf3761088e4521e71e243249b3a131632e281679d723c82fe
4
+ data.tar.gz: 2b739ad482ecdaad8218065a4c03882e730c86825bc7140691e451fc26032815
5
+ SHA512:
6
+ metadata.gz: 52e998e1210ac287f2bc91d01d2afba9416f5b0eee54cff13d89c6c9affdd2ff2a88ac1a80e78ce100c2a43dcbcf777a5f22dd3d72ff3571bc69c5242a89d97c
7
+ data.tar.gz: 6152232cf873d2c9be4fa24584b3d8bf8013f95ae58a8117f4494c3a6632df814e36b85d02c67efc0e2b73849a43333c0b9bcf9cb1d379f10587147aa69f808e
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Authlogic
2
4
  module ActsAsAuthentic
3
5
  # Provides the base functionality for acts_as_authentic
@@ -11,11 +13,13 @@ module Authlogic
11
13
  end
12
14
  end
13
15
 
16
+ # The primary configuration of a model (often, `User`) for use with
17
+ # authlogic. These methods become class methods of ::ActiveRecord::Base.
14
18
  module Config
15
- # This includes a lot of helpful methods for authenticating records which The Authlogic::Session module relies on.
16
- # To use it just do:
19
+ # This includes a lot of helpful methods for authenticating records
20
+ # which the Authlogic::Session module relies on. To use it just do:
17
21
  #
18
- # class User < ActiveRecord::Base
22
+ # class User < ApplicationRecord
19
23
  # acts_as_authentic
20
24
  # end
21
25
  #
@@ -26,29 +30,21 @@ module Authlogic
26
30
  # end
27
31
  #
28
32
  # See the various sub modules for the configuration they provide.
29
- def acts_as_authentic(unsupported_options = nil, &block)
30
- # Stop all configuration if the DB is not set up
31
- return if !db_setup?
32
-
33
- if !unsupported_options.nil?
34
- raise ArgumentError.new(
35
- "You are using the old v1.X.X configuration method for " \
36
- "Authlogic. Instead of passing a hash of configuration " \
37
- "options to acts_as_authentic, pass a block: " \
38
- "acts_as_authentic { |c| c.my_option = my_value }"
39
- )
40
- end
41
-
33
+ def acts_as_authentic
34
+ return unless db_setup?
42
35
  yield self if block_given?
43
36
  acts_as_authentic_modules.each { |mod| include mod }
44
37
  end
45
38
 
46
- # Since this part of Authlogic deals with another class, ActiveRecord, we can't just start including things
47
- # in ActiveRecord itself. A lot of these module includes need to be triggered by the acts_as_authentic method
48
- # call. For example, you don't want to start adding in email validations and what not into a model that has
49
- # nothing to do with Authlogic.
39
+ # Since this part of Authlogic deals with another class, ActiveRecord,
40
+ # we can't just start including things in ActiveRecord itself. A lot of
41
+ # these module includes need to be triggered by the acts_as_authentic
42
+ # method call. For example, you don't want to start adding in email
43
+ # validations and what not into a model that has nothing to do with
44
+ # Authlogic.
50
45
  #
51
- # That being said, this is your tool for extending Authlogic and "hooking" into the acts_as_authentic call.
46
+ # That being said, this is your tool for extending Authlogic and
47
+ # "hooking" into the acts_as_authentic call.
52
48
  def add_acts_as_authentic_module(mod, action = :append)
53
49
  modules = acts_as_authentic_modules.clone
54
50
  case action
@@ -61,7 +57,8 @@ module Authlogic
61
57
  self.acts_as_authentic_modules = modules
62
58
  end
63
59
 
64
- # This is the same as add_acts_as_authentic_module, except that it removes the module from the list.
60
+ # This is the same as add_acts_as_authentic_module, except that it
61
+ # removes the module from the list.
65
62
  def remove_acts_as_authentic_module(mod)
66
63
  modules = acts_as_authentic_modules.clone
67
64
  modules.delete(mod)
@@ -70,21 +67,23 @@ module Authlogic
70
67
 
71
68
  private
72
69
 
73
- def db_setup?
74
- begin
75
- column_names
76
- true
77
- rescue StandardError
78
- false
79
- end
80
- end
70
+ def db_setup?
71
+ column_names
72
+ true
73
+ rescue StandardError
74
+ false
75
+ end
81
76
 
82
- def first_column_to_exist(*columns_to_check)
83
- if db_setup?
84
- columns_to_check.each { |column_name| return column_name.to_sym if column_names.include?(column_name.to_s) }
77
+ def first_column_to_exist(*columns_to_check)
78
+ if db_setup?
79
+ columns_to_check.each do |column_name|
80
+ if column_names.include?(column_name.to_s)
81
+ return column_name.to_sym
82
+ end
85
83
  end
86
- columns_to_check.first && columns_to_check.first.to_sym
87
84
  end
85
+ columns_to_check.first&.to_sym
86
+ end
88
87
  end
89
88
  end
90
89
  end
@@ -98,7 +97,5 @@ end
98
97
  ::ActiveRecord::Base.send :include, Authlogic::ActsAsAuthentic::Password
99
98
  ::ActiveRecord::Base.send :include, Authlogic::ActsAsAuthentic::PerishableToken
100
99
  ::ActiveRecord::Base.send :include, Authlogic::ActsAsAuthentic::PersistenceToken
101
- ::ActiveRecord::Base.send :include, Authlogic::ActsAsAuthentic::RestfulAuthentication
102
100
  ::ActiveRecord::Base.send :include, Authlogic::ActsAsAuthentic::SessionMaintenance
103
101
  ::ActiveRecord::Base.send :include, Authlogic::ActsAsAuthentic::SingleAccessToken
104
- ::ActiveRecord::Base.send :include, Authlogic::ActsAsAuthentic::ValidationsScope
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Authlogic
2
4
  module ActsAsAuthentic
3
- # Sometimes models won't have an explicit "login" or "username" field. Instead they want to use the email field.
4
- # In this case, authlogic provides validations to make sure the email submited is actually a valid email. Don't worry,
5
- # if you do have a login or username field, Authlogic will still validate your email field. One less thing you have to
6
- # worry about.
5
+ # Sometimes models won't have an explicit "login" or "username" field.
6
+ # Instead they want to use the email field. In this case, authlogic provides
7
+ # validations to make sure the email submited is actually a valid email.
8
+ # Don't worry, if you do have a login or username field, Authlogic will
9
+ # still validate your email field. One less thing you have to worry about.
7
10
  module Email
8
11
  def self.included(klass)
9
12
  klass.class_eval do
10
13
  extend Config
11
- add_acts_as_authentic_module(Methods)
12
14
  end
13
15
  end
14
16
 
@@ -21,142 +23,7 @@ module Authlogic
21
23
  def email_field(value = nil)
22
24
  rw_config(:email_field, value, first_column_to_exist(nil, :email, :email_address))
23
25
  end
24
- alias_method :email_field=, :email_field
25
-
26
- # Toggles validating the email field or not.
27
- #
28
- # * <tt>Default:</tt> true
29
- # * <tt>Accepts:</tt> Boolean
30
- def validate_email_field(value = nil)
31
- rw_config(:validate_email_field, value, true)
32
- end
33
- alias_method :validate_email_field=, :validate_email_field
34
-
35
- # A hash of options for the validates_length_of call for the email field. Allows you to change this however you want.
36
- #
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
- # merge options into it. Checkout the convenience function merge_validates_length_of_email_field_options to merge
39
- # options.</b>
40
- #
41
- # * <tt>Default:</tt> {:maximum => 100}
42
- # * <tt>Accepts:</tt> Hash of options accepted by validates_length_of
43
- def validates_length_of_email_field_options(value = nil)
44
- rw_config(:validates_length_of_email_field_options, value, { :maximum => 100 })
45
- end
46
- alias_method :validates_length_of_email_field_options=, :validates_length_of_email_field_options
47
-
48
- # A convenience function to merge options into the validates_length_of_email_field_options. So instead of:
49
- #
50
- # self.validates_length_of_email_field_options = validates_length_of_email_field_options.merge(:my_option => my_value)
51
- #
52
- # You can do this:
53
- #
54
- # merge_validates_length_of_email_field_options :my_option => my_value
55
- def merge_validates_length_of_email_field_options(options = {})
56
- self.validates_length_of_email_field_options = validates_length_of_email_field_options.merge(options)
57
- end
58
-
59
- # A hash of options for the validates_format_of call for the email
60
- # field. Allows you to change this however you want.
61
- #
62
- # <b>Keep in mind this is ruby. I wanted to keep this as flexible as
63
- # possible, so you can completely replace the hash or merge options into
64
- # it. Checkout the convenience function
65
- # merge_validates_format_of_email_field_options to merge options.</b>
66
- #
67
- # To validate international email addresses, enable the provided
68
- # alternate regex:
69
- #
70
- # * <tt>validates_format_of_email_field_options({:with => Authlogic::Regex.email_nonascii})</tt>
71
- #
72
- # * <tt>Default:</tt>
73
- #
74
- # {
75
- # :with => Authlogic::Regex.email,
76
- # :message => Proc.new {
77
- # I18n.t(
78
- # 'error_messages.email_invalid',
79
- # :default => "should look like an email address."
80
- # )
81
- # }
82
- # }
83
- #
84
- # * <tt>Accepts:</tt> Hash of options accepted by validates_format_of
85
- def validates_format_of_email_field_options(value = nil)
86
- rw_config(
87
- :validates_format_of_email_field_options,
88
- value,
89
- {
90
- :with => Authlogic::Regex.email,
91
- :message => Proc.new do
92
- I18n.t(
93
- 'error_messages.email_invalid',
94
- :default => "should look like an email address."
95
- )
96
- end
97
- }
98
- )
99
- end
100
- alias_method :validates_format_of_email_field_options=, :validates_format_of_email_field_options
101
-
102
- # See merge_validates_length_of_email_field_options. The same thing except for validates_format_of_email_field_options.
103
- def merge_validates_format_of_email_field_options(options = {})
104
- self.validates_format_of_email_field_options = validates_format_of_email_field_options.merge(options)
105
- end
106
-
107
- # A hash of options for the validates_uniqueness_of call for the email
108
- # field. Allows you to change this however you want.
109
- #
110
- # <b>Keep in mind this is ruby. I wanted to keep this as flexible as
111
- # possible, so you can completely replace the hash or merge options into
112
- # it. Checkout the convenience function
113
- # merge_validates_uniqueness_of_email_field_options to merge
114
- # options.</b>
115
- #
116
- # * <tt>Default:</tt>
117
- #
118
- # {
119
- # :case_sensitive => false,
120
- # :scope => validations_scope,
121
- # :if => "#{email_field}_changed?".to_sym
122
- # }
123
- #
124
- # * <tt>Accepts:</tt> Hash of options accepted by validates_uniqueness_of
125
- def validates_uniqueness_of_email_field_options(value = nil)
126
- rw_config(
127
- :validates_uniqueness_of_email_field_options,
128
- value,
129
- {
130
- :case_sensitive => false,
131
- :scope => validations_scope,
132
- :if => "#{email_field}_changed?".to_sym
133
- }
134
- )
135
- end
136
- alias_method(
137
- :validates_uniqueness_of_email_field_options=,
138
- :validates_uniqueness_of_email_field_options
139
- )
140
-
141
- # See merge_validates_length_of_email_field_options. The same thing
142
- # except for validates_uniqueness_of_email_field_options.
143
- def merge_validates_uniqueness_of_email_field_options(options = {})
144
- self.validates_uniqueness_of_email_field_options =
145
- validates_uniqueness_of_email_field_options.merge(options)
146
- end
147
- end
148
-
149
- # All methods relating to the email field
150
- module Methods
151
- def self.included(klass)
152
- klass.class_eval do
153
- if validate_email_field && email_field
154
- validates_length_of email_field, validates_length_of_email_field_options
155
- validates_format_of email_field, validates_format_of_email_field_options
156
- validates_uniqueness_of email_field, validates_uniqueness_of_email_field_options
157
- end
158
- end
159
- end
26
+ alias email_field= email_field
160
27
  end
161
28
  end
162
29
  end
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Authlogic
2
4
  module ActsAsAuthentic
3
- # Since web applications are stateless there is not sure fire way to tell if a user is logged in or not,
4
- # from the database perspective. The best way to do this is to provide a "timeout" based on inactivity.
5
- # So if that user is inactive for a certain amount of time we assume they are logged out. That's what this
6
- # module is all about.
5
+ # Since web applications are stateless there is not sure fire way to tell if
6
+ # a user is logged in or not, from the database perspective. The best way to
7
+ # do this is to provide a "timeout" based on inactivity. So if that user is
8
+ # inactive for a certain amount of time we assume they are logged out.
9
+ # That's what this module is all about.
7
10
  module LoggedInStatus
8
11
  def self.included(klass)
9
12
  klass.class_eval do
@@ -21,13 +24,13 @@ module Authlogic
21
24
  def logged_in_timeout(value = nil)
22
25
  rw_config(:logged_in_timeout, (!value.nil? && value.to_i) || value, 10.minutes.to_i)
23
26
  end
24
- alias_method :logged_in_timeout=, :logged_in_timeout
27
+ alias logged_in_timeout= logged_in_timeout
25
28
  end
26
29
 
27
30
  # All methods for the logged in status feature seat.
28
31
  module Methods
29
32
  def self.included(klass)
30
- return if !klass.column_names.include?("last_request_at")
33
+ return unless klass.column_names.include?("last_request_at")
31
34
 
32
35
  klass.class_eval do
33
36
  include InstanceMethods
@@ -52,11 +55,15 @@ module Authlogic
52
55
  end
53
56
  end
54
57
 
58
+ # :nodoc:
55
59
  module InstanceMethods
56
60
  # Returns true if the last_request_at > logged_in_timeout.
57
61
  def logged_in?
58
62
  unless respond_to?(:last_request_at)
59
- raise "Can not determine the records login state because there is no last_request_at column"
63
+ raise(
64
+ "Can not determine the records login state because " \
65
+ "there is no last_request_at column"
66
+ )
60
67
  end
61
68
  !last_request_at.nil? && last_request_at > logged_in_timeout.seconds.ago
62
69
  end
@@ -68,9 +75,9 @@ module Authlogic
68
75
 
69
76
  private
70
77
 
71
- def logged_in_timeout
72
- self.class.logged_in_timeout
73
- end
78
+ def logged_in_timeout
79
+ self.class.logged_in_timeout
80
+ end
74
81
  end
75
82
  end
76
83
  end
@@ -1,3 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "authlogic/acts_as_authentic/queries/case_sensitivity"
4
+ require "authlogic/acts_as_authentic/queries/find_with_case"
5
+
1
6
  module Authlogic
2
7
  module ActsAsAuthentic
3
8
  # Handles everything related to the login field.
@@ -5,7 +10,6 @@ module Authlogic
5
10
  def self.included(klass)
6
11
  klass.class_eval do
7
12
  extend Config
8
- add_acts_as_authentic_module(Methods)
9
13
  end
10
14
  end
11
15
 
@@ -18,128 +22,7 @@ module Authlogic
18
22
  def login_field(value = nil)
19
23
  rw_config(:login_field, value, first_column_to_exist(nil, :login, :username))
20
24
  end
21
- alias_method :login_field=, :login_field
22
-
23
- # Whether or not to validate the login field
24
- #
25
- # * <tt>Default:</tt> true
26
- # * <tt>Accepts:</tt> Boolean
27
- def validate_login_field(value = nil)
28
- rw_config(:validate_login_field, value, true)
29
- end
30
- alias_method :validate_login_field=, :validate_login_field
31
-
32
- # A hash of options for the validates_length_of call for the login
33
- # field. Allows you to change this however you want.
34
- #
35
- # <b>Keep in mind this is ruby. I wanted to keep this as flexible as
36
- # possible, so you can completely replace the hash or merge options into
37
- # it. Checkout the convenience function
38
- # merge_validates_length_of_login_field_options to merge options.</b>
39
- #
40
- # * <tt>Default:</tt> {:within => 3..100}
41
- # * <tt>Accepts:</tt> Hash of options accepted by validates_length_of
42
- def validates_length_of_login_field_options(value = nil)
43
- rw_config(:validates_length_of_login_field_options, value, { :within => 3..100 })
44
- end
45
- alias_method :validates_length_of_login_field_options=, :validates_length_of_login_field_options
46
-
47
- # A convenience function to merge options into the
48
- # validates_length_of_login_field_options. So instead of:
49
- #
50
- # self.validates_length_of_login_field_options =
51
- # validates_length_of_login_field_options.merge(:my_option => my_value)
52
- #
53
- # You can do this:
54
- #
55
- # merge_validates_length_of_login_field_options :my_option => my_value
56
- def merge_validates_length_of_login_field_options(options = {})
57
- self.validates_length_of_login_field_options = validates_length_of_login_field_options.merge(options)
58
- end
59
-
60
- # A hash of options for the validates_format_of call for the login
61
- # field. Allows you to change this however you want.
62
- #
63
- # <b>Keep in mind this is ruby. I wanted to keep this as flexible as
64
- # possible, so you can completely replace the hash or merge options into
65
- # it. Checkout the convenience function
66
- # merge_validates_format_of_login_field_options to merge options.</b>
67
- #
68
- # * <tt>Default:</tt>
69
- #
70
- # {
71
- # :with => Authlogic::Regex.login,
72
- # :message => lambda {
73
- # I18n.t(
74
- # 'error_messages.login_invalid',
75
- # :default => "should use only letters, numbers, spaces, and .-_@+ please."
76
- # )
77
- # }
78
- # }
79
- #
80
- # * <tt>Accepts:</tt> Hash of options accepted by validates_format_of
81
- def validates_format_of_login_field_options(value = nil)
82
- rw_config(
83
- :validates_format_of_login_field_options,
84
- value,
85
- {
86
- :with => Authlogic::Regex.login,
87
- :message => proc do
88
- I18n.t(
89
- 'error_messages.login_invalid',
90
- :default => "should use only letters, numbers, spaces, and .-_@+ please."
91
- )
92
- end
93
- }
94
- )
95
- end
96
- alias_method :validates_format_of_login_field_options=, :validates_format_of_login_field_options
97
-
98
- # See merge_validates_length_of_login_field_options. The same thing,
99
- # except for validates_format_of_login_field_options
100
- def merge_validates_format_of_login_field_options(options = {})
101
- self.validates_format_of_login_field_options = validates_format_of_login_field_options.merge(options)
102
- end
103
-
104
- # A hash of options for the validates_uniqueness_of call for the login
105
- # field. Allows you to change this however you want.
106
- #
107
- # <b>Keep in mind this is ruby. I wanted to keep this as flexible as
108
- # possible, so you can completely replace the hash or merge options into
109
- # it. Checkout the convenience function
110
- # merge_validates_format_of_login_field_options to merge options.</b>
111
- #
112
- # * <tt>Default:</tt>
113
- #
114
- # {
115
- # :case_sensitive => false,
116
- # :scope => validations_scope,
117
- # :if => "#{login_field}_changed?".to_sym
118
- # }
119
- #
120
- # * <tt>Accepts:</tt> Hash of options accepted by validates_uniqueness_of
121
- def validates_uniqueness_of_login_field_options(value = nil)
122
- rw_config(
123
- :validates_uniqueness_of_login_field_options,
124
- value,
125
- {
126
- :case_sensitive => false,
127
- :scope => validations_scope,
128
- :if => "#{login_field}_changed?".to_sym
129
- }
130
- )
131
- end
132
- alias_method(
133
- :validates_uniqueness_of_login_field_options=,
134
- :validates_uniqueness_of_login_field_options
135
- )
136
-
137
- # See merge_validates_length_of_login_field_options. The same thing,
138
- # except for validates_uniqueness_of_login_field_options
139
- def merge_validates_uniqueness_of_login_field_options(options = {})
140
- self.validates_uniqueness_of_login_field_options =
141
- validates_uniqueness_of_login_field_options.merge(options)
142
- end
25
+ alias login_field= login_field
143
26
 
144
27
  # This method allows you to find a record with the given login. If you
145
28
  # notice, with Active Record you have the UniquenessValidator class.
@@ -160,53 +43,19 @@ module Authlogic
160
43
  # The above also applies for using email as your login, except that you
161
44
  # need to set the :case_sensitive in
162
45
  # validates_uniqueness_of_email_field_options to false.
46
+ #
47
+ # @api public
163
48
  def find_by_smart_case_login_field(login)
164
- if login_field
165
- find_with_case(login_field, login, validates_uniqueness_of_login_field_options[:case_sensitive] != false)
166
- else
167
- find_with_case(email_field, login, validates_uniqueness_of_email_field_options[:case_sensitive] != false)
168
- end
49
+ field = login_field || email_field
50
+ sensitive = Queries::CaseSensitivity.new(self, field).sensitive?
51
+ find_with_case(field, login, sensitive)
169
52
  end
170
53
 
171
54
  private
172
55
 
173
- def find_with_case(field, value, sensitivity = true)
174
- ar_gem_version = Gem::Version.new(ActiveRecord::VERSION::STRING)
175
-
176
- relation = if not sensitivity
177
- connection.case_insensitive_comparison(arel_table, field.to_s, columns_hash[field.to_s], value)
178
- elsif ar_gem_version >= Gem::Version.new('5.0')
179
- connection.case_sensitive_comparison(arel_table, field.to_s, columns_hash[field.to_s], value)
180
- else
181
- if ar_gem_version < Gem::Version.new('4.2')
182
- value = connection.case_sensitive_modifier(value)
183
- else
184
- value = connection.case_sensitive_modifier(value, field.to_s)
185
- end
186
- arel_table[field.to_s].eq(value)
187
- end
188
-
189
- # bind value in rails 5
190
- if ar_gem_version >= Gem::Version.new('5')
191
- bind = ActiveRecord::Relation::QueryAttribute.new(field.to_s, value, ActiveRecord::Type::Value.new)
192
- where(relation, bind).first
193
- else
194
- where(relation).first
195
- end
196
- end
197
- end
198
-
199
- # All methods relating to the login field
200
- module Methods
201
- # Adds in various validations, modules, etc.
202
- def self.included(klass)
203
- klass.class_eval do
204
- if validate_login_field && login_field
205
- validates_length_of login_field, validates_length_of_login_field_options
206
- validates_format_of login_field, validates_format_of_login_field_options
207
- validates_uniqueness_of login_field, validates_uniqueness_of_login_field_options
208
- end
209
- end
56
+ # @api private
57
+ def find_with_case(field, value, sensitive)
58
+ Queries::FindWithCase.new(self, field, value, sensitive).execute
210
59
  end
211
60
  end
212
61
  end
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Authlogic
2
4
  module ActsAsAuthentic
3
- # Magic columns are like ActiveRecord's created_at and updated_at columns. They are
4
- # "magically" maintained for you. Authlogic has the same thing, but these are
5
- # maintained on the session side. Please see Authlogic::Session::MagicColumns for more
6
- # details. This module merely adds validations for the magic columns if they exist.
5
+ # Magic columns are like ActiveRecord's created_at and updated_at columns.
6
+ # They are "magically" maintained for you. Authlogic has the same thing, but
7
+ # these are maintained on the session side. Please see "Magic Columns" in
8
+ # `Session::Base` for more details. This module merely adds validations for
9
+ # the magic columns if they exist.
7
10
  module MagicColumns
8
11
  def self.included(klass)
9
12
  klass.class_eval do
@@ -17,15 +20,15 @@ module Authlogic
17
20
  klass.class_eval do
18
21
  if column_names.include?("login_count")
19
22
  validates_numericality_of :login_count,
20
- :only_integer => true,
21
- :greater_than_or_equal_to => 0,
22
- :allow_nil => true
23
+ only_integer: true,
24
+ greater_than_or_equal_to: 0,
25
+ allow_nil: true
23
26
  end
24
27
  if column_names.include?("failed_login_count")
25
28
  validates_numericality_of :failed_login_count,
26
- :only_integer => true,
27
- :greater_than_or_equal_to => 0,
28
- :allow_nil => true
29
+ only_integer: true,
30
+ greater_than_or_equal_to: 0,
31
+ allow_nil: true
29
32
  end
30
33
  end
31
34
  end