class SPF::Result

Constants

ATEXT_PATTERN
DOT_ATOM_PATTERN
RECEIVED_SPF_HEADER_IDENTITY_KEY_NAMES_BY_SCOPE
RECEIVED_SPF_HEADER_NAME
RECEIVED_SPF_HEADER_SCOPE_NAMES_BY_SCOPE
RESULT_CLASSES

Attributes

request[R]
result_text[R]
server[R]

Public Class Methods

new(args = []) click to toggle source
# File lib/spf/result.rb, line 124
def initialize(args = [])
  @server = args.shift if args.any?
  unless self.instance_variable_defined?(:@server)
    raise SPF::OptionRequiredError.new('SPF server object required')
  end
  @request = args.shift if args.any?
  unless self.instance_variable_defined?(:@request)
    raise SPF::OptionRequiredError.new('Request object required')
  end
  @result_text = args.shift if args.any?
end

Public Instance Methods

is_code(code) click to toggle source
# File lib/spf/result.rb, line 155
def is_code(code)
  return self.isa_by_name(code.downcase)
end
isa_by_name(name) click to toggle source
# File lib/spf/result.rb, line 149
def isa_by_name(name)
  suspect_class = self.klass(name.downcase)
  return false unless suspect_class
  return suspect_class === self
end
klass(name=nil) click to toggle source
# File lib/spf/result.rb, line 140
def klass(name=nil)
  if name
    name = name.to_sym if String === name
    return RESULT_CLASSES[name]
  else
    return name
  end
end
local_explanation() click to toggle source
# File lib/spf/result.rb, line 163
def local_explanation
  return @local_explanation if self.instance_variable_defined?(:@local_explanation)

  # Prepare local explanation:
  request = self.request
  local_explanation = request.state(:local_explanation)
  if local_explanation
    local_explanation = sprintf('%s (%s)', local_explanation.expand, @text)
  else
    local_explanation = @text
  end

  # Resolve authority domains of root-request and bottom sub-requests:
  root_request = request.root_request
  local_explanation = (request == root_request or not root_request) ?
    sprintf('%s: %s', request.authority_domain, local_explanation) :
    sprintf('%s ... %s: %s', root_request.authority_domain, request.authority_domain, local_explanation)

  return @local_explanation = SPF::Util.sanitize_string(local_explanation)
end
name() click to toggle source
# File lib/spf/result.rb, line 136
def name
  return self.code
end
received_spf_header() click to toggle source
# File lib/spf/result.rb, line 184
def received_spf_header
  return @received_spf_header if self.instance_variable_defined?(:@received_spf_header)
  scope_name        = self.received_spf_header_scope_names_by_scope[@request.scope]
  identify_key_name = self.received_spf_header_identity_key_names_by_scope[@request.scope]
  info_pairs = [
    :receiver                => @server.hostname || 'unknown',
    :identity                => scope_name,
    identity_key_name.to_sym => @request.identity,
    :client_ip               => SPF::Util.ip_address_to_string(@request.ip_address)
  ]
  if @request.scope != :helo and @request.helo_identity
    info_pairs[:helo] = @request.helo_identity
  end
  info_string = ''
  while info_pairs.any?
    key   = info_pairs.shift
    value = info_pairs.shift
    info_string += '; ' unless info_string.blank?
    if value !~ /^#{DOT_ATOM_PATTERN}$/o
      value.gsub!(/(["\\])/, "\\#{$1}") # Escape '\' and '"' characters.
      value = "\"#{value}\""            # Double-quote value.
    end
    info_string += "#{key}=#{value}"
  end
  return @received_spf_header = sprintf(
    '%s: %s (%s) %s',
    @received_spf_header_name,
    self.code,
    self.local_explanation,
    info_string
  )
end
to_s() click to toggle source
Calls superclass method
# File lib/spf/result.rb, line 159
def to_s
  return sprintf('%s (%s)', self.name, SPF::Util.sanitize_string(super.to_s))
end