dalli 3.2.2 → 3.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 539a5ec7700d7d96bece70021727ff422d24202ab9e89fd07afc623dc3480502
4
- data.tar.gz: ba9231846477125fd3ed77f5a60f0df3445e3cda12c1736cd71f6b299213accb
3
+ metadata.gz: f0ef39f4ff4e9e465b2522707f3c4eea85a94373ba0d3de4b9d940830001b118
4
+ data.tar.gz: 35cb362ec6075818f062106769481e92c90752936ecaf9a00fae25725ee4ea94
5
5
  SHA512:
6
- metadata.gz: 4039d6ce807dc60351f5781438ae84a0d2a147d5af567607653fcfb943ca3d3e0bcfd231cc67dbf4b761a5f0797ba4e5c99e9441d8d1e738eeb356805d139b89
7
- data.tar.gz: 5c31e6bc0d5b4b35280f7fd6747172838a8b037209d365906830634b32109a16c0301f732418c2ca99480ff3a37d9247a401c61e1d887ecf11a45dd4448d162b
6
+ metadata.gz: 0c6b2b205551fb10fb2e49ab7c3c3eba3c552c0bc4b8132783b51f6cdc7a9ddd4c272bd24ed13f9d78e29353e3b84daec001b2691ad630bdfd517bb7af86fd54
7
+ data.tar.gz: 6ef9f6733d8e6d5f8a6bf8fb7d782e99c450494e03d4e5fe46037b77665682df63eaa9a3eb05007d1720b175564c8e91524c0df92d0856dc1f68066501732a06
@@ -4,10 +4,19 @@ Dalli Changelog
4
4
  Unreleased
5
5
  ==========
6
6
 
7
+ 3.2.3
8
+ ==========
9
+
10
+ - Sanitize CAS inputs to ensure additional commands are not passed to memcached (xhzeem / petergoldstein)
11
+ - Sanitize input to flush command to ensure additional commands are not passed to memcached (xhzeem / petergoldstein)
12
+ - Namespaces passed as procs are now evaluated every time, as opposed to just on initialization (nrw505)
13
+ - Fix missing require of uri in ServerConfigParser (adam12)
14
+ - Fix link to the CHANGELOG.md file in README.md (rud)
15
+
7
16
  3.2.2
8
17
  ==========
9
18
 
10
- - Ensure apps are resilient against old session ids
19
+ - Ensure apps are resilient against old session ids (kbrock)
11
20
 
12
21
  3.2.1
13
22
  ==========
data/README.md CHANGED
@@ -27,7 +27,7 @@ The name is a variant of Salvador Dali for his famous painting [The Persistence
27
27
 
28
28
  ## Contributing
29
29
 
30
- If you have a fix you wish to provide, please fork the code, fix in your local project and then send a pull request on github. Please ensure that you include a test which verifies your fix and update `History.md` with a one sentence description of your fix so you get credit as a contributor.
30
+ If you have a fix you wish to provide, please fork the code, fix in your local project and then send a pull request on github. Please ensure that you include a test which verifies your fix and update the [changelog](CHANGELOG.md) with a one sentence description of your fix so you get credit as a contributor.
31
31
 
32
32
  ## Appreciation
33
33
 
@@ -61,7 +61,7 @@ module Dalli
61
61
  def key_with_namespace(key)
62
62
  return key if namespace.nil?
63
63
 
64
- "#{namespace}#{NAMESPACE_SEPARATOR}#{key}"
64
+ "#{evaluate_namespace}#{NAMESPACE_SEPARATOR}#{key}"
65
65
  end
66
66
 
67
67
  def key_without_namespace(key)
@@ -75,6 +75,8 @@ module Dalli
75
75
  end
76
76
 
77
77
  def namespace_regexp
78
+ return /\A#{Regexp.escape(evaluate_namespace)}:/ if namespace.is_a?(Proc)
79
+
78
80
  @namespace_regexp ||= /\A#{Regexp.escape(namespace)}:/.freeze unless namespace.nil?
79
81
  end
80
82
 
@@ -87,9 +89,15 @@ module Dalli
87
89
  def namespace_from_options
88
90
  raw_namespace = @key_options[:namespace]
89
91
  return nil unless raw_namespace
90
- return raw_namespace.call.to_s if raw_namespace.is_a?(Proc)
92
+ return raw_namespace.to_s unless raw_namespace.is_a?(Proc)
93
+
94
+ raw_namespace
95
+ end
96
+
97
+ def evaluate_namespace
98
+ return namespace.call.to_s if namespace.is_a?(Proc)
91
99
 
92
- raw_namespace.to_s
100
+ namespace
93
101
  end
94
102
 
95
103
  ##
@@ -167,7 +167,7 @@ module Dalli
167
167
  groups = @ring.keys_grouped_by_server(keys)
168
168
  if (unfound_keys = groups.delete(nil))
169
169
  Dalli.logger.debug do
170
- "unable to get keys for #{unfound_keys.length} keys "\
170
+ "unable to get keys for #{unfound_keys.length} keys " \
171
171
  'because no matching server was found'
172
172
  end
173
173
  end
@@ -31,7 +31,7 @@ module Dalli
31
31
  cmd << ' c' unless %i[append prepend].include?(mode)
32
32
  cmd << ' b' if base64
33
33
  cmd << " F#{bitflags}" if bitflags
34
- cmd << " C#{cas}" if cas && !cas.zero?
34
+ cmd << cas_string(cas)
35
35
  cmd << " T#{ttl}" if ttl
36
36
  cmd << " M#{mode_to_token(mode)}"
37
37
  cmd << ' q' if quiet
@@ -43,7 +43,7 @@ module Dalli
43
43
  def self.meta_delete(key:, cas: nil, ttl: nil, base64: false, quiet: false)
44
44
  cmd = "md #{key}"
45
45
  cmd << ' b' if base64
46
- cmd << " C#{cas}" if cas && !cas.zero?
46
+ cmd << cas_string(cas)
47
47
  cmd << " T#{ttl}" if ttl
48
48
  cmd << ' q' if quiet
49
49
  cmd + TERMINATOR
@@ -54,8 +54,9 @@ module Dalli
54
54
  cmd << ' b' if base64
55
55
  cmd << " D#{delta}" if delta
56
56
  cmd << " J#{initial}" if initial
57
- cmd << " C#{cas}" if cas && !cas.zero?
58
- cmd << " N#{ttl}" if ttl
57
+ # Always set a TTL if an initial value is specified
58
+ cmd << " N#{ttl || 0}" if ttl || initial
59
+ cmd << cas_string(cas)
59
60
  cmd << ' q' if quiet
60
61
  cmd << " M#{incr ? 'I' : 'D'}"
61
62
  cmd + TERMINATOR
@@ -75,7 +76,7 @@ module Dalli
75
76
 
76
77
  def self.flush(delay: nil, quiet: false)
77
78
  cmd = +'flush_all'
78
- cmd << " #{delay}" if delay
79
+ cmd << " #{parse_to_64_bit_int(delay, 0)}" if delay
79
80
  cmd << ' noreply' if quiet
80
81
  cmd + TERMINATOR
81
82
  end
@@ -102,6 +103,18 @@ module Dalli
102
103
  end
103
104
  end
104
105
  # rubocop:enable Metrics/MethodLength
106
+
107
+ def self.cas_string(cas)
108
+ cas = parse_to_64_bit_int(cas, nil)
109
+ cas.nil? || cas.zero? ? '' : " C#{cas}"
110
+ end
111
+
112
+ def self.parse_to_64_bit_int(val, default)
113
+ val.nil? ? nil : Integer(val)
114
+ rescue ArgumentError
115
+ # Sanitize to default if it isn't parsable as an integer
116
+ default
117
+ end
105
118
  end
106
119
  end
107
120
  end
@@ -44,6 +44,7 @@ module Dalli
44
44
  end
45
45
 
46
46
  def touch(key, ttl)
47
+ ttl = TtlSanitizer.sanitize(ttl)
47
48
  encoded_key, base64 = KeyRegularizer.encode(key)
48
49
  req = RequestFormatter.meta_get(key: encoded_key, ttl: ttl, value: false, base64: base64)
49
50
  write(req)
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'uri'
4
+
3
5
  module Dalli
4
6
  module Protocol
5
7
  ##
data/lib/dalli/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dalli
4
- VERSION = '3.2.2'
4
+ VERSION = '3.2.3'
5
5
 
6
6
  MIN_SUPPORTED_MEMCACHED_VERSION = '1.4'
7
7
  end
@@ -170,7 +170,7 @@ module Rack
170
170
  def ensure_connection_pool_added!
171
171
  require 'connection_pool'
172
172
  rescue LoadError => e
173
- warn "You don't have connection_pool installed in your application. "\
173
+ warn "You don't have connection_pool installed in your application. " \
174
174
  'Please add it to your Gemfile and run bundle install'
175
175
  raise e
176
176
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dalli
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.2
4
+ version: 3.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter M. Goldstein
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-06-15 00:00:00.000000000 Z
12
+ date: 2022-10-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: connection_pool
@@ -151,8 +151,8 @@ executables: []
151
151
  extensions: []
152
152
  extra_rdoc_files: []
153
153
  files:
154
+ - CHANGELOG.md
154
155
  - Gemfile
155
- - History.md
156
156
  - LICENSE
157
157
  - README.md
158
158
  - lib/dalli.rb
@@ -206,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
206
  - !ruby/object:Gem::Version
207
207
  version: '0'
208
208
  requirements: []
209
- rubygems_version: 3.3.16
209
+ rubygems_version: 3.3.24
210
210
  signing_key:
211
211
  specification_version: 4
212
212
  summary: High performance memcached client for Ruby