class SPF::Term

Constants

DOMAIN_END_PATTERN
DOMAIN_SPEC_PATTERN
HEXWORD_PATTERN
IPV4_ADDRESS_PATTERN
IPV6_ADDRESS_PATTERN
MACRO_DELIMITER
MACRO_EXPAND_PATTERN
MACRO_LITERAL_PATTERN
MACRO_STRING_PATTERN
MACRO_TRANSFORMERS_PATTERN
NAME_PATTERN
QNUM_PATTERN
TOPLABEL_PATTERN
TWO_HEXWORDS_OR_IPV4_ADDRESS_PATTERN

Attributes

domain_spec[R]
errors[R]
ip_address[R]
ip_netblocks[R]
ip_network[R]
ipv4_prefix_length[R]
ipv6_prefix_length[R]
raw_params[R]
record_domain[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/spf/model.rb, line 91
def initialize(options = {})
  @ip_address         = nil
  @ip_network         = nil
  @ipv4_prefix_length = nil
  @ipv6_prefix_length = nil
  @raw_params         = nil
  @errors             = []
  @ip_netblocks       = []
  @text               = options[:text]
  @record_domain      = options[:record_domain]
  @raise_exceptions   = options.has_key?(:raise_exceptions) ? options[:raise_exceptions] : true
end
new_from_string(text, options = {}) click to toggle source
# File lib/spf/model.rb, line 109
def self.new_from_string(text, options = {})
  options[:text] = text
  term = self.new(options)
  term.parse
  return term
end

Public Instance Methods

domain(server, request) click to toggle source
# File lib/spf/model.rb, line 218
def domain(server, request)
  if self.instance_variable_defined?(:@domain_spec) and @domain_spec
    return SPF::MacroString.new({:server => server, :request => request, :text => @domain_spec.text})
  end
  return request.authority_domain
end
error(exception) click to toggle source
# File lib/spf/model.rb, line 104
def error(exception)
  raise exception if @raise_exceptions
  @errors << exception
end
parse_domain_spec(required = false) click to toggle source
# File lib/spf/model.rb, line 116
def parse_domain_spec(required = false)
  if @parse_text.sub!(/^(#{DOMAIN_SPEC_PATTERN})/x, '')
    domain_spec = $1
    domain_spec.sub!(/^(.*?)\.?$/, $1)
    @domain_spec = SPF::MacroString.new({:text => domain_spec})
  elsif record_domain
    @domain_spec = SPF::MacroString.new({:text => record_domain})
  elsif required
    error(SPF::TermDomainSpecExpectedError.new(
      "Missing required domain-spec in '#{@text}'"))
  end
end
parse_ipv4_address(required = false) click to toggle source
# File lib/spf/model.rb, line 129
def parse_ipv4_address(required = false)
  @raw_params = @parse_text.dup
  if @parse_text.sub!(/^(#{IPV4_ADDRESS_PATTERN})/x, '')
    @ip_address = $1
  elsif required
    error(SPF::TermIPv4AddressExpectedError.new(
      "Missing or invalid required IPv4 address in '#{@text}'"))
  end
  @ip_address = @parse_text.dup unless @ip_address

end
parse_ipv4_ipv6_prefix_lengths() click to toggle source
# File lib/spf/model.rb, line 209
def parse_ipv4_ipv6_prefix_lengths
  self.parse_ipv4_prefix_length
  if self.instance_variable_defined?(:@ipv4_prefix_length) and # An IPv4 prefix length has been parsed, and
    @parse_text.sub!(/^\//, '')                           # another slash is following.
    # Parse an IPv6 prefix length:
    self.parse_ipv6_prefix_length(true)
  end
end
parse_ipv4_network(required = false) click to toggle source
# File lib/spf/model.rb, line 159
def parse_ipv4_network(required = false)
  @raw_params = @parse_text.dup
  self.parse_ipv4_address(required)
  self.parse_ipv4_prefix_length
  begin
    @ip_network = IP.new("#{@ip_address}/#{@ipv4_prefix_length}") if @ip_address and @ipv4_prefix_length
  rescue ArgumentError
    @ip_network = @ip_address
  end
end
parse_ipv4_prefix_length(required = false) click to toggle source
# File lib/spf/model.rb, line 141
def parse_ipv4_prefix_length(required = false)
  if @parse_text.sub!(/^\/(\d+)/, '')
    bits = $1.to_i
    unless bits and bits >= 0 and bits <= 32 and $1 !~ /^0./
      error(SPF::TermIPv4PrefixLengthExpectedError.new(
        "Invalid IPv4 prefix length encountered in '#{@text}'"))
      return
    end
    @ipv4_prefix_length = bits
  elsif required
    error(SPF::TermIPv4PrefixLengthExpectedError.new(
      "Missing required IPv4 prefix length in '#{@text}"))
    return
  else
    @ipv4_prefix_length = self.default_ipv4_prefix_length
  end
end
parse_ipv6_address(required = false) click to toggle source
# File lib/spf/model.rb, line 170
def parse_ipv6_address(required = false)
  if @parse_text.sub!(/(#{IPV6_ADDRESS_PATTERN})(?=\/|$)/x, '')
    @ip_address = $1
  elsif required
    error(SPF::TermIPv6AddressExpectedError.new(
      "Missing or invalid required IPv6 address in '#{@text}'"))
  end
  @ip_address = @parse_text.dup unless @ip_address
end
parse_ipv6_network(required = false) click to toggle source
# File lib/spf/model.rb, line 198
def parse_ipv6_network(required = false)
  @raw_params = @parse_text.dup
  self.parse_ipv6_address(required)
  self.parse_ipv6_prefix_length
  begin
    @ip_network = IP.new("#{@ip_address}/#{@ipv6_prefix_length}") if @ip_address and @ipv6_prefix_length
  rescue ArgumentError
    @ip_network = @ip_address
  end
end
parse_ipv6_prefix_length(required = false) click to toggle source
# File lib/spf/model.rb, line 180
def parse_ipv6_prefix_length(required = false)
  if @parse_text.sub!(/^\/(\d+)/, '')
    bits = $1.to_i
    unless bits and bits >= 0 and bits <= 128 and $1 !~ /^0./
      error(SPF::TermIPv6PrefixLengthExpectedError.new(
        "Invalid IPv6 prefix length encountered in '#{@text}'"))
      return
    end
    @ipv6_prefix_length = bits
  elsif required
    error(SPF::TermIPv6PrefixLengthExpectedError.new(
      "Missing required IPv6 prefix length in '#{@text}'"))
    return
  else
    @ipv6_prefix_length = self.default_ipv6_prefix_length
  end
end
text() click to toggle source
# File lib/spf/model.rb, line 225
def text
  if self.instance_variable_defined?(:@text)
    return @text
  else
    raise SPF::NoUnparsedTextError
  end
end