|
| 1 | +# -*- coding: binary -*- |
| 2 | + |
| 3 | +module Msf |
| 4 | + ### |
| 5 | + # |
| 6 | + # Integer range option. A maximum value can be specified. Negative numbers are |
| 7 | + # not supported due to - being used for ranges. Numbers can be excluded by |
| 8 | + # using the ! prefix. |
| 9 | + # |
| 10 | + ### |
| 11 | + class OptIntRange < OptBase |
| 12 | + attr_reader :maximum |
| 13 | + |
| 14 | + def initialize(in_name, attrs = [], |
| 15 | + required: true, **kwargs) |
| 16 | + super |
| 17 | + @maximum = kwargs.fetch(:maximum, nil) |
| 18 | + end |
| 19 | + |
| 20 | + def type |
| 21 | + 'integer range' |
| 22 | + end |
| 23 | + |
| 24 | + def normalize(value) |
| 25 | + value.to_s.gsub(/\s/, '') |
| 26 | + end |
| 27 | + |
| 28 | + def valid?(value, check_empty: true) |
| 29 | + return false if check_empty && empty_required_value?(value) |
| 30 | + |
| 31 | + if value.present? |
| 32 | + value = value.to_s.gsub(/\s/, '') |
| 33 | + return false unless value =~ /\A(!?\d+|!?\d+-\d+)(,(!?\d+|!?\d+-\d+))*\Z/ |
| 34 | + end |
| 35 | + |
| 36 | + super |
| 37 | + end |
| 38 | + |
| 39 | + def self.parse(value) |
| 40 | + include = [] |
| 41 | + exclude = [] |
| 42 | + |
| 43 | + value.split(',').each do |range_str| |
| 44 | + destination = range_str.start_with?('!') ? exclude : include |
| 45 | + |
| 46 | + range_str.delete_prefix!('!') |
| 47 | + if range_str.include?('-') |
| 48 | + start_range, end_range = range_str.split('-').map(&:to_i) |
| 49 | + range = (start_range..end_range) |
| 50 | + else |
| 51 | + single_value = range_str.to_i |
| 52 | + range = (single_value..single_value) |
| 53 | + end |
| 54 | + |
| 55 | + destination << range |
| 56 | + end |
| 57 | + |
| 58 | + Enumerator.new do |yielder| |
| 59 | + include.each do |include_range| |
| 60 | + include_range.each do |num| |
| 61 | + break if @maximum && num > @maximum |
| 62 | + next if exclude.any? { |exclude_range| exclude_range.cover?(num) } |
| 63 | + |
| 64 | + yielder << num |
| 65 | + end |
| 66 | + end |
| 67 | + end |
| 68 | + end |
| 69 | + end |
| 70 | +end |
0 commit comments