Files
metasploit-gs/lib/msf/core/opt_int_range.rb
T
2025-07-16 15:34:14 -04:00

71 lines
1.7 KiB
Ruby

# -*- coding: binary -*-
module Msf
###
#
# Integer range option. A maximum value can be specified. Negative numbers are
# not supported due to - being used for ranges. Numbers can be excluded by
# using the ! prefix.
#
###
class OptIntRange < OptBase
attr_reader :maximum
def initialize(in_name, attrs = [],
required: true, **kwargs)
super
@maximum = kwargs.fetch(:maximum, nil)
end
def type
'integer range'
end
def normalize(value)
value.to_s.gsub(/\s/, '')
end
def valid?(value, check_empty: true, datastore: nil)
return false if check_empty && empty_required_value?(value)
if value.present?
value = value.to_s.gsub(/\s/, '')
return false unless value =~ /\A(!?\d+|!?\d+-\d+)(,(!?\d+|!?\d+-\d+))*\Z/
end
super
end
def self.parse(value)
include = []
exclude = []
value.split(',').each do |range_str|
destination = range_str.start_with?('!') ? exclude : include
range_str.delete_prefix!('!')
if range_str.include?('-')
start_range, end_range = range_str.split('-').map(&:to_i)
range = (start_range..end_range)
else
single_value = range_str.to_i
range = (single_value..single_value)
end
destination << range
end
Enumerator.new do |yielder|
include.each do |include_range|
include_range.each do |num|
break if @maximum && num > @maximum
next if exclude.any? { |exclude_range| exclude_range.cover?(num) }
yielder << num
end
end
end
end
end
end