Skip to content

Commit 5907cd9

Browse files
authored
🔀 Merge pull request #319 from ruby/sequence-set-input-validation
💥 SequenceSet input validation for Set, Array, and enumerables
2 parents c198fcc + b01d864 commit 5907cd9

File tree

3 files changed

+15
-13
lines changed

3 files changed

+15
-13
lines changed

lib/net/imap/data_encoding.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,23 +186,23 @@ def valid_mod_sequence_value?(num)
186186

187187
# Ensure argument is 'number' or raise DataFormatError
188188
def ensure_number(num)
189-
return if valid_number?(num)
189+
return num if valid_number?(num)
190190

191191
msg = "number must be unsigned 32-bit integer: #{num}"
192192
raise DataFormatError, msg
193193
end
194194

195195
# Ensure argument is 'nz_number' or raise DataFormatError
196196
def ensure_nz_number(num)
197-
return if valid_nz_number?(num)
197+
return num if valid_nz_number?(num)
198198

199199
msg = "nz_number must be non-zero unsigned 32-bit integer: #{num}"
200200
raise DataFormatError, msg
201201
end
202202

203203
# Ensure argument is 'mod_sequence_value' or raise DataFormatError
204204
def ensure_mod_sequence_value(num)
205-
return if valid_mod_sequence_value?(num)
205+
return num if valid_mod_sequence_value?(num)
206206

207207
msg = "mod_sequence_value must be unsigned 64-bit integer: #{num}"
208208
raise DataFormatError, msg

lib/net/imap/sequence_set.rb

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ class IMAP
3737
#
3838
# SequenceSet.new may receive a single optional argument: a non-zero 32 bit
3939
# unsigned integer, a range, a <tt>sequence-set</tt> formatted string,
40-
# another sequence set, or an enumerable containing any of these.
40+
# another sequence set, a Set (containing only numbers), or an Array
41+
# containing any of these (array inputs may be nested).
4142
#
4243
# set = Net::IMAP::SequenceSet.new(1)
4344
# set.valid_string #=> "1"
@@ -289,8 +290,7 @@ class SequenceSet
289290
private_constant :STAR_INT, :STARS
290291

291292
COERCIBLE = ->{ _1.respond_to? :to_sequence_set }
292-
ENUMABLE = ->{ _1.respond_to?(:each) && _1.respond_to?(:empty?) }
293-
private_constant :COERCIBLE, :ENUMABLE
293+
private_constant :COERCIBLE
294294

295295
class << self
296296

@@ -1271,7 +1271,8 @@ def input_to_tuples(obj)
12711271
when *STARS, Integer, Range then [input_to_tuple(obj)]
12721272
when String then str_to_tuples obj
12731273
when SequenceSet then obj.tuples
1274-
when ENUMABLE then obj.flat_map { input_to_tuples _1 }
1274+
when Set then obj.map { to_tuple_int _1 }
1275+
when Array then obj.flat_map { input_to_tuples _1 }
12751276
when nil then []
12761277
else
12771278
raise DataFormatError,
@@ -1406,12 +1407,11 @@ def range_gte_to(num)
14061407
end
14071408

14081409
def nz_number(num)
1409-
case num
1410-
when Integer, /\A[1-9]\d*\z/ then num = Integer(num)
1411-
else raise DataFormatError, "%p is not a valid nz-number" % [num]
1412-
end
1413-
NumValidator.ensure_nz_number(num)
1414-
num
1410+
String === num && !/\A[1-9]\d*\z/.match?(num) and
1411+
raise DataFormatError, "%p is not a valid nz-number" % [num]
1412+
NumValidator.ensure_nz_number Integer num
1413+
rescue TypeError # To catch errors from Integer()
1414+
raise DataFormatError, $!.message
14151415
end
14161416

14171417
# intentionally defined after the class implementation

test/net/imap/test_sequence_set.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ def compare_to_reference_set(nums, set, seqset)
9999
assert_raise DataFormatError do SequenceSet.new "2 " end
100100
assert_raise DataFormatError do SequenceSet.new "2," end
101101
assert_raise DataFormatError do SequenceSet.new Time.now end
102+
assert_raise DataFormatError do SequenceSet.new Set[1, [2]] end
103+
assert_raise DataFormatError do SequenceSet.new Set[1..20] end
102104
end
103105

104106
test ".new, input may be empty" do

0 commit comments

Comments
 (0)