authlogic 5.0.0 → 5.0.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b789e5e05da9b783cccf285591510d9b7d5a30b9
4
- data.tar.gz: 89d480a0525664adbda2943d8b60e3953802835d
2
+ SHA256:
3
+ metadata.gz: d7ee80bf9b23608f9c88971bd8353f1cd1680f25a9d1bc34543a60adc8a6ff0e
4
+ data.tar.gz: 836f688d32e87f503357c530a0a380c3e7ea85c566fcca2d08f1990ee9ed3461
5
5
  SHA512:
6
- metadata.gz: c8f5241263fda34fc5d0043f30673d6fd77e4614d1fb7fef685cb057347ab111e2368f3f71942ae4d9f833d4ad2a5a7376d66ed6399e0ca3f51f8bcf53dba4ea
7
- data.tar.gz: 402631583ab0c18687e9d284bd96c8b539a30f9b331060eaef68a0bb072d0e71499eb62217ea0a6b68708c33a1a9f0078d6bdee7e235ee7789e14df41a766cb2
6
+ metadata.gz: 14ec354abdd25ef960983f64e4d3fc58b764a365f3c419ffc03bc32d43d2824be585e3557162ff4afd70a0eb94cd86b6a08186302f8478f8369fc2dfded46cee
7
+ data.tar.gz: f1bdaba676fdef7a280e3f7063d92551464f4e3eed5c6299ba4f34c9245d39f831c765d43ecfcca4420e31d2acb4079af3abbd180f2babf23281578ff4e4f2b4
@@ -18,6 +18,7 @@ path = File.dirname(__FILE__) + "/authlogic/"
18
18
  "config",
19
19
 
20
20
  "controller_adapters/abstract_adapter",
21
+ "cookie_credentials",
21
22
 
22
23
  "crypto_providers",
23
24
 
@@ -34,17 +34,28 @@ module Authlogic
34
34
 
35
35
  # @api private
36
36
  def insensitive_comparison
37
- @model_class.connection.case_insensitive_comparison(
38
- @model_class.arel_table,
39
- @field,
40
- @model_class.columns_hash[@field],
41
- @value
42
- )
37
+ if AR_GEM_VERSION > Gem::Version.new("5.3")
38
+ @model_class.connection.case_insensitive_comparison(
39
+ @model_class.arel_table[@field], @value
40
+ )
41
+ else
42
+ @model_class.connection.case_insensitive_comparison(
43
+ @model_class.arel_table,
44
+ @field,
45
+ @model_class.columns_hash[@field],
46
+ @value
47
+ )
48
+ end
43
49
  end
44
50
 
45
51
  # @api private
52
+ # rubocop:disable Metrics/AbcSize
46
53
  def sensitive_comparison
47
- if AR_GEM_VERSION >= Gem::Version.new("5.0")
54
+ if AR_GEM_VERSION > Gem::Version.new("5.3")
55
+ @model_class.connection.case_sensitive_comparison(
56
+ @model_class.arel_table[@field], @value
57
+ )
58
+ elsif AR_GEM_VERSION >= Gem::Version.new("5.0")
48
59
  @model_class.connection.case_sensitive_comparison(
49
60
  @model_class.arel_table,
50
61
  @field,
@@ -56,6 +67,7 @@ module Authlogic
56
67
  @model_class.arel_table[@field].eq(value)
57
68
  end
58
69
  end
70
+ # rubocop:enable Metrics/AbcSize
59
71
  end
60
72
  end
61
73
  end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authlogic
4
+ # Represents the credentials *in* the cookie. The value of the cookie.
5
+ # This is primarily a data object. It doesn't interact with controllers.
6
+ # It doesn't know about eg. cookie expiration.
7
+ #
8
+ # @api private
9
+ class CookieCredentials
10
+ # @api private
11
+ class ParseError < RuntimeError
12
+ end
13
+
14
+ DELIMITER = "::"
15
+
16
+ attr_reader :persistence_token, :record_id, :remember_me_until
17
+
18
+ # @api private
19
+ # @param persistence_token [String]
20
+ # @param record_id [String, Numeric]
21
+ # @param remember_me_until [ActiveSupport::TimeWithZone]
22
+ def initialize(persistence_token, record_id, remember_me_until)
23
+ @persistence_token = persistence_token
24
+ @record_id = record_id
25
+ @remember_me_until = remember_me_until
26
+ end
27
+
28
+ class << self
29
+ # @api private
30
+ def parse(string)
31
+ parts = string.split(DELIMITER)
32
+ unless (1..3).cover?(parts.length)
33
+ raise ParseError, format("Expected 1..3 parts, got %d", parts.length)
34
+ end
35
+ new(parts[0], parts[1], parse_time(parts[2]))
36
+ end
37
+
38
+ private
39
+
40
+ # @api private
41
+ def parse_time(string)
42
+ return if string.nil?
43
+ ::Time.parse(string)
44
+ rescue ::ArgumentError => e
45
+ raise ParseError, format("Found cookie, cannot parse remember_me_until: #{e}")
46
+ end
47
+ end
48
+
49
+ # @api private
50
+ def remember_me?
51
+ !@remember_me_until.nil?
52
+ end
53
+
54
+ # @api private
55
+ def to_s
56
+ [
57
+ @persistence_token,
58
+ @record_id.to_s,
59
+ @remember_me_until&.iso8601
60
+ ].compact.join(DELIMITER)
61
+ end
62
+ end
63
+ end
@@ -1322,7 +1322,7 @@ module Authlogic
1322
1322
  def persisting?
1323
1323
  return true unless record.nil?
1324
1324
  self.attempted_record = nil
1325
- self.remember_me = cookie_credentials_remember_me?
1325
+ self.remember_me = cookie_credentials&.remember_me?
1326
1326
  run_callbacks :before_persisting
1327
1327
  run_callbacks :persist
1328
1328
  ensure_authentication_attempted
@@ -1380,7 +1380,7 @@ module Authlogic
1380
1380
  # Has the cookie expired due to current time being greater than remember_me_until.
1381
1381
  def remember_me_expired?
1382
1382
  return unless remember_me?
1383
- (Time.parse(cookie_credentials[2]) < Time.now)
1383
+ cookie_credentials.remember_me_until < ::Time.now
1384
1384
  end
1385
1385
 
1386
1386
  # How long to remember the user if remember_me is true. This is based on the class
@@ -1610,18 +1610,16 @@ module Authlogic
1610
1610
  build_key(self.class.cookie_key)
1611
1611
  end
1612
1612
 
1613
- # Returns an array of cookie elements. See cookie format in
1614
- # `generate_cookie_for_saving`. If no cookie is found, returns nil.
1613
+ # Look in the `cookie_jar`, find the cookie that contains authlogic
1614
+ # credentials (`cookie_key`).
1615
+ #
1616
+ # @api private
1617
+ # @return ::Authlogic::CookieCredentials or if no cookie is found, nil
1615
1618
  def cookie_credentials
1616
- cookie = cookie_jar[cookie_key]
1617
- cookie&.split("::")
1618
- end
1619
-
1620
- # The third element of the cookie indicates whether the user wanted
1621
- # to be remembered (Actually, it's a timestamp, `remember_me_until`)
1622
- # See cookie format in `generate_cookie_for_saving`.
1623
- def cookie_credentials_remember_me?
1624
- !cookie_credentials.nil? && !cookie_credentials[2].nil?
1619
+ cookie_value = cookie_jar[cookie_key]
1620
+ unless cookie_value.nil?
1621
+ ::Authlogic::CookieCredentials.parse(cookie_value)
1622
+ end
1625
1623
  end
1626
1624
 
1627
1625
  def cookie_jar
@@ -1705,15 +1703,15 @@ module Authlogic
1705
1703
  self.class.generalize_credentials_error_messages
1706
1704
  end
1707
1705
 
1706
+ # @api private
1708
1707
  def generate_cookie_for_saving
1709
- value = format(
1710
- "%s::%s%s",
1708
+ creds = ::Authlogic::CookieCredentials.new(
1711
1709
  record.persistence_token,
1712
1710
  record.send(record.class.primary_key),
1713
- remember_me? ? "::#{remember_me_until.iso8601}" : ""
1711
+ remember_me? ? remember_me_until : nil
1714
1712
  )
1715
1713
  {
1716
- value: value,
1714
+ value: creds.to_s,
1717
1715
  expires: remember_me_until,
1718
1716
  secure: secure,
1719
1717
  httponly: httponly,
@@ -1809,10 +1807,10 @@ module Authlogic
1809
1807
 
1810
1808
  # Tries to validate the session from information in the cookie
1811
1809
  def persist_by_cookie
1812
- persistence_token, record_id = cookie_credentials
1813
- if persistence_token.present?
1814
- record = search_for_record("find_by_#{klass.primary_key}", record_id)
1815
- if record && record.persistence_token == persistence_token
1810
+ creds = cookie_credentials
1811
+ if creds&.persistence_token.present?
1812
+ record = search_for_record("find_by_#{klass.primary_key}", creds.record_id)
1813
+ if record && record.persistence_token == creds.persistence_token
1816
1814
  self.unauthorized_record = record
1817
1815
  end
1818
1816
  valid?
@@ -17,6 +17,6 @@ module Authlogic
17
17
  #
18
18
  # @api public
19
19
  def self.gem_version
20
- ::Gem::Version.new("5.0.0")
20
+ ::Gem::Version.new("5.0.1")
21
21
  end
22
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authlogic
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0
4
+ version: 5.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Johnson
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-01-04 00:00:00.000000000 Z
13
+ date: 2019-02-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
@@ -162,6 +162,20 @@ dependencies:
162
162
  - - "~>"
163
163
  - !ruby/object:Gem::Version
164
164
  version: 0.62.0
165
+ - !ruby/object:Gem::Dependency
166
+ name: sqlite3
167
+ requirement: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - "~>"
170
+ - !ruby/object:Gem::Version
171
+ version: 1.3.13
172
+ type: :development
173
+ prerelease: false
174
+ version_requirements: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - "~>"
177
+ - !ruby/object:Gem::Version
178
+ version: 1.3.13
165
179
  - !ruby/object:Gem::Dependency
166
180
  name: timecop
167
181
  requirement: !ruby/object:Gem::Requirement
@@ -203,6 +217,7 @@ files:
203
217
  - lib/authlogic/controller_adapters/rack_adapter.rb
204
218
  - lib/authlogic/controller_adapters/rails_adapter.rb
205
219
  - lib/authlogic/controller_adapters/sinatra_adapter.rb
220
+ - lib/authlogic/cookie_credentials.rb
206
221
  - lib/authlogic/crypto_providers.rb
207
222
  - lib/authlogic/crypto_providers/bcrypt.rb
208
223
  - lib/authlogic/crypto_providers/md5.rb
@@ -242,7 +257,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
242
257
  version: '0'
243
258
  requirements: []
244
259
  rubyforge_project:
245
- rubygems_version: 2.5.2.3
260
+ rubygems_version: 2.7.6
246
261
  signing_key:
247
262
  specification_version: 4
248
263
  summary: An unobtrusive ruby authentication library based on ActiveRecord.