Exception: SPF::Result

Inherits:
Exception
  • Object
show all
Defined in:
lib/spf/result.rb

Direct Known Subclasses

Error, Fail, Neutral, None, Pass, SoftFail

Defined Under Namespace

Classes: Error, Fail, Neutral, NeutralByDefault, None, Pass, PermError, SoftFail, TempError

Constant Summary collapse

RESULT_CLASSES =
{
  :pass       => SPF::Result::Pass,
  :fail       => SPF::Result::Fail,
  :softfail   => SPF::Result::SoftFail,
  :neutral    => SPF::Result::Neutral,
  :neutral_by_default => SPF::Result::NeutralByDefault,
  :none       => SPF::Result::None,
  :error      => SPF::Result::Error,
  :permerror  => SPF::Result::PermError,
  :temperror  => SPF::Result::TempError
}
RECEIVED_SPF_HEADER_NAME =
'Received-SPF'
RECEIVED_SPF_HEADER_SCOPE_NAMES_BY_SCOPE =
{
  :helo       => 'helo',
  :mfrom      => 'envelope-from',
  :pra        => 'pra'
}
RECEIVED_SPF_HEADER_IDENTITY_KEY_NAMES_BY_SCOPE =
{
  :helo       => 'helo',
  :mfrom      => 'envelope-from',
  :pra        => 'pra'
}
ATEXT_PATTERN =
/[[:alnum:]!#\$%&'*+\-\/=?^_`{|}~]/
DOT_ATOM_PATTERN =
/
  (#{ATEXT_PATTERN})+ ( \. (#{ATEXT_PATTERN})+ )*
/x

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args = []) ⇒ Result

Returns a new instance of Result.



124
125
126
127
128
129
130
131
132
133
134
# 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

Instance Attribute Details

#requestObject (readonly)

Returns the value of attribute request.



7
8
9
# File 'lib/spf/result.rb', line 7

def request
  @request
end

#result_textObject (readonly)

Returns the value of attribute result_text.



7
8
9
# File 'lib/spf/result.rb', line 7

def result_text
  @result_text
end

#serverObject (readonly)

Returns the value of attribute server.



7
8
9
# File 'lib/spf/result.rb', line 7

def server
  @server
end

Instance Method Details

#is_code(code) ⇒ Object



155
156
157
# File 'lib/spf/result.rb', line 155

def is_code(code)
  return self.isa_by_name(code.downcase)
end

#isa_by_name(name) ⇒ Object



149
150
151
152
153
# 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) ⇒ Object



140
141
142
143
144
145
146
147
# 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_explanationObject



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# 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

#nameObject



136
137
138
# File 'lib/spf/result.rb', line 136

def name
  return self.code
end

#received_spf_headerObject



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# 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_sObject



159
160
161
# File 'lib/spf/result.rb', line 159

def to_s
  return sprintf('%s (%s)', self.name, SPF::Util.sanitize_string(super.to_s))
end