Module: SPF::Util

Defined in:
lib/spf/util.rb

Class Method Summary collapse

Class Method Details

.hostnameObject



47
48
49
50
51
# File 'lib/spf/util.rb', line 47

def self.hostname
  return @hostname ||= Socket.gethostbyname(Socket.gethostname).first
rescue SocketError
  return @hostname ||= Socket.gethostname
end

.ip_address_reverse(ip_address) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/spf/util.rb', line 78

def self.ip_address_reverse(ip_address)
  unless IP::V4 === ip_address or IP::V6 === ip_address
    raise SPF::InvalidOptionValueError.new('IP::V4 or IP::V6 address expected')
  end
  # Treat IPv4-mapped IPv6 addresses as IPv4 addresses:
  ip_address = ipv6_address_to_ipv4(ip_address) if ip_address.ipv4_mapped?
  case ip_address
  when IP::V4
    octets  = ip_address.to_addr.split('.').first(ip_address.pfxlen / 8)
    return "#{octets .reverse.join('.')}.in-addr.arpa."
  when IP::V6
    nibbles = ip_address.to_hex .split('') .first(ip_address.pfxlen / 4)
    return "#{nibbles.reverse.join('.')}.ip6.arpa."
  end
end

.ip_address_to_string(ip_address) ⇒ Object



71
72
73
74
75
76
# File 'lib/spf/util.rb', line 71

def self.ip_address_to_string(ip_address)
  unless IP::V4 === ip_address or IP::V6 === ip_address
    raise SPF::InvalidOptionValueError.new('IP::V4 or IP::V6 address expected')
  end
  return ip_address.to_addr
end

.ipv4_address_to_ipv6(ipv4_address) ⇒ Object



53
54
55
56
57
58
# File 'lib/spf/util.rb', line 53

def self.ipv4_address_to_ipv6(ipv4_address)
  unless IP::V4 === ipv4_address
    raise SPF::InvalidOptionValueError.new('IP::V4 address expected')
  end
  return IP.new("::ffff:#{ipv4_address.to_addr}/#{ipv4_address.pfxlen - 32 + 128}")
end

.ipv4_mapped_ipv6_address_patternObject



43
44
45
# File 'lib/spf/util.rb', line 43

def self.ipv4_mapped_ipv6_address_pattern
  /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})/i
end

.ipv6_address_is_ipv4_mapped(ipv6_address) ⇒ Object



67
68
69
# File 'lib/spf/util.rb', line 67

def self.ipv6_address_is_ipv4_mapped(ipv6_address)
  return ipv6_address.ipv4_mapped?
end

.ipv6_address_to_ipv4(ipv6_address) ⇒ Object



60
61
62
63
64
65
# File 'lib/spf/util.rb', line 60

def self.ipv6_address_to_ipv4(ipv6_address)
  unless IP::V6 === ipv6_address and ipv6_address.ipv4_mapped?
    raise SPF::InvalidOptionValueError, 'IPv4-mapped IP::V6 address expected'
  end
  return ipv6_address.native
end

.sanitize_string(string) ⇒ Object



102
103
104
105
106
107
108
# File 'lib/spf/util.rb', line 102

def self.sanitize_string(string)
  return \
    string &&
    string.
      gsub(/([\x00-\x1f\x7f-\xff])/) { |c| sprintf('\x%02x',   c.ord) }.
      gsub(/([\u{0100}-\u{ffff}])/)  { |u| sprintf('\x{%04x}', u.ord) }
end

.valid_domain_for_ip_address(sever, request, ip_address, domain, find_best_match = false, accept_any_domain = false) ⇒ Object



94
95
96
97
98
99
100
# File 'lib/spf/util.rb', line 94

def self.valid_domain_for_ip_address(
  sever, request, ip_address, domain,
  find_best_match   = false,
  accept_any_domain = false
)
  # TODO
end