Mail::SPF::Mod::Exp - SPF record C<exp> modifier class


Mail-SPF documentation Contained in the Mail-SPF distribution.

Index


Code Index:

NAME

Top

Mail::SPF::Mod::Exp - SPF record exp modifier class

DESCRIPTION

Top

An object of class Mail::SPF::Mod::Exp represents an SPF record modifier of type exp.

Constructors

The following constructors are provided:

new(%options): returns Mail::SPF::Mod::Exp

Creates a new SPF record exp modifier object.

%options is a list of key/value pairs representing any of the following options:

domain_spec

See new in Mail::SPF::Mod.

new_from_string($text, %options): returns Mail::SPF::Mod::Exp; throws Mail::SPF::ENothingToParse, Mail::SPF::EInvalidMod

Creates a new SPF record exp modifier object by parsing the string and any options given.

Class methods

The following class methods are provided:

name: returns string

Returns 'exp'.

name_pattern: returns Regexp

Returns a regular expression that matches a modifier name of 'exp'.

precedence: returns real

Returns a precedence value of 0.2. See precedence in Mail::SPF::Mod.

Instance methods

The following instance methods are provided:

params

See params in Mail::SPF::Mod.

domain_spec: returns Mail::SPF::MacroString

Returns the domain-spec parameter of the modifier.

process($server, $request, $result)

If the given SPF result is a fail result, retrieves the authority domain's explanation string from the modifier's target domain and attaches it to the SPF result. If an error occurs during the retrieval of the explanation string, does nothing, as if the modifier was not present. See RFC 4408, 6.2, for details.

See Mail::SPF::Mod for other supported instance methods.

SEE ALSO

Top

Mail::SPF, Mail::SPF::Mod, Mail::SPF::Term, Mail::SPF::Record

http://www.ietf.org/rfc/rfc4408.txt

For availability, support, and license information, see the README file included with Mail::SPF.

AUTHORS

Top

Julian Mehnle <julian@mehnle.net>, Shevek <cpan@anarres.org>


Mail-SPF documentation Contained in the Mail-SPF distribution.
#
# Mail::SPF::Mod::Exp
# SPF record "exp" modifier class.
#
# (C) 2005-2008 Julian Mehnle <julian@mehnle.net>
#     2005      Shevek <cpan@anarres.org>
# $Id: Exp.pm 50 2008-08-17 21:28:15Z Julian Mehnle $
#
##############################################################################

package Mail::SPF::Mod::Exp;

use warnings;
use strict;

use Mail::SPF::Mod;
use base 'Mail::SPF::GlobalMod';

use Error ':try';

use Mail::SPF::MacroString;

use constant TRUE   => (0 == 0);
use constant FALSE  => not TRUE;

use constant name           => 'exp';
use constant name_pattern   => qr/${\name}/i;

use constant precedence     => 0.2;

sub parse_params {
    my ($self) = @_;
    $self->parse_domain_spec(TRUE);
    return;
}

sub params {
    my ($self) = @_;
    return $self->{domain_spec};
}

# Make read-only accessor:
__PACKAGE__->make_accessor('domain_spec', TRUE);

sub process {
    my ($self, $server, $request, $result) = @_;
    
    try {
        my $exp_domain = $self->{domain_spec}->new(server => $server, request => $request);
        my $txt_packet = $server->dns_lookup($exp_domain, 'TXT');
        my @txt_rrs = grep($_->type eq 'TXT', $txt_packet->answer);
        @txt_rrs > 0
            or $server->throw_result('permerror', $request,
                "No authority explanation string available at domain '$exp_domain'");  # RFC 4408, 6.2/4
        @txt_rrs == 1
            or $server->throw_result('permerror', $request,
                "Redundant authority explanation strings found at domain '$exp_domain'");  # RFC 4408, 6.2/4
        my $explanation = Mail::SPF::MacroString->new(
            text            => join('', $txt_rrs[0]->char_str_list),
            server          => $server,
            request         => $request,
            is_explanation  => TRUE
        );
        $request->state('authority_explanation', $explanation);
    }
    # Ignore DNS and other errors:
    catch Mail::SPF::EDNSError with {}
    catch Mail::SPF::Result::Error with {};
    
    return;
}

TRUE;