Module: Itsi::Server::CidrToRegex

Included in:
Config, Itsi::Server::Config::AllowList
Defined in:
lib/itsi/server/config/middleware/cidr_to_regex.rb

Instance Method Summary collapse

Instance Method Details

#build_regex_from_parts(start_parts, end_parts) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/itsi/server/config/middleware/cidr_to_regex.rb', line 29

def build_regex_from_parts(start_parts, end_parts)
  # Build regex for each octet
  parts = []
  (0..3).each do |i|
    if start_parts[i] == end_parts[i]
      parts << Regexp.escape(start_parts[i].to_s)
    else
      parts << part_to_range_regex(start_parts[i], end_parts[i])
    end
  end

  /^#{parts.join('\.')}$/
end

#cidr_to_regex(cidr) ⇒ Object



43
44
45
46
# File 'lib/itsi/server/config/middleware/cidr_to_regex.rb', line 43

def cidr_to_regex(cidr)
  ip_range = IPAddr.new(cidr).to_range
  range_to_regex(ip_range)
end

#part_to_range_regex(start_val, end_val) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/itsi/server/config/middleware/cidr_to_regex.rb', line 16

def part_to_range_regex(start_val, end_val)
  return start_val.to_s if start_val == end_val

  ranges = []
  (start_val..end_val).each do |val|
    ranges << val.to_s
  end

  # Group similar patterns for compact regex
  ranges.map! { |v| Regexp.escape(v) }
  "(#{ranges.join('|')})"
end

#range_to_regex(range) ⇒ Object



6
7
8
9
10
11
12
13
14
# File 'lib/itsi/server/config/middleware/cidr_to_regex.rb', line 6

def range_to_regex(range)
  # Convert an IP range to regex by component
  start_ip, end_ip = range.begin, range.end

  start_parts = start_ip.to_s.split('.').map(&:to_i)
  end_parts   = end_ip.to_s.split('.').map(&:to_i)

  build_regex_from_parts(start_parts, end_parts)
end