Courier::Filter::Util - Utility class used by the Courier::Filter framework


Courier-Filter documentation Contained in the Courier-Filter distribution.

Index


Code Index:

NAME

Top

Courier::Filter::Util - Utility class used by the Courier::Filter framework

SYNOPSIS

Top

    use Courier::Filter::Util qw(
        ipv4_address_pattern
        ipv6_address_pattern
        loopback_address_pattern
    );

    $message->remote_host =~ / ^ (?: ::ffff: )? $(\ipv4_address_pattern} $ /x;
    $message->remote_host =~ / ^ $(\ipv6_address_pattern} $ /x;
    $message->remote_host =~ / ^ ${\loopback_address_pattern} $ /x;

DESCRIPTION

Top

Courier::Filter::Util is Courier::Filter's utility class.

Constants

The following constants are provided:

ipv4_address_pattern

A regular expression matching an IPv4 address in "dotted decimal" notation.

ipv6_address_pattern

A regular expression matching an IPv6 address in full RFC 4291 syntax.

loopback_address_pattern

A regular expression matching an IPv4 or IPv6 loopback address (127.n.n.n, ::ffff:127.n.n.n.n, ::1).

SEE ALSO

Top

Courier::Filter.

For AVAILABILITY, SUPPORT, and LICENSE information, see Courier::Filter::Overview.

AUTHOR

Top

Julian Mehnle <julian@mehnle.net>


Courier-Filter documentation Contained in the Courier-Filter distribution.
#
# Courier::Filter::Util
# Utility class for the Courier::Filter framework.
#
# (C) 2003-2008 Julian Mehnle <julian@mehnle.net>
# $Id: Util.pm 210 2008-03-21 19:30:31Z julian $
#
###############################################################################

package Courier::Filter::Util;

use warnings;
use strict;

use base 'Exporter';

use Error ':try';

use Courier::Error;

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

our @EXPORT_OK = qw(
    ipv4_address_pattern
    ipv6_address_pattern
    loopback_address_pattern
);

# Implementation:
###############################################################################

use constant octet_decimal_pattern      => qr/ 0*? \d | \d\d | [01]\d\d | 2[0-4]\d | 25[0-5] /x;

use constant ipv4_address_pattern       => qr/ ${\octet_decimal_pattern} (?: \. ${\octet_decimal_pattern} ){3} /x;

use constant hexword_pattern            => qr/\p{IsXDigit}{1,4}/;
use constant two_hexwords_or_ipv4_address_pattern => qr/
        ${\hexword_pattern} : ${\hexword_pattern} | ${\ipv4_address_pattern}
/x;

use constant ipv6_address_pattern       => qr/
        #                x:x:x:x:x:x:x:x |     x:x:x:x:x:x:n.n.n.n
        (?: ${\hexword_pattern} : ){6}                                    ${\two_hexwords_or_ipv4_address_pattern} |
        #                 x::x:x:x:x:x:x |      x::x:x:x:x:n.n.n.n
        (?: ${\hexword_pattern} : ){1}   : (?: ${\hexword_pattern} : ){4} ${\two_hexwords_or_ipv4_address_pattern} |
        #               x[:x]::x:x:x:x:x |    x[:x]::x:x:x:n.n.n.n
        (?: ${\hexword_pattern} : ){1,2} : (?: ${\hexword_pattern} : ){3} ${\two_hexwords_or_ipv4_address_pattern} |
        #               x[:...]::x:x:x:x |    x[:...]::x:x:n.n.n.n
        (?: ${\hexword_pattern} : ){1,3} : (?: ${\hexword_pattern} : ){2} ${\two_hexwords_or_ipv4_address_pattern} |
        #                 x[:...]::x:x:x |      x[:...]::x:n.n.n.n
        (?: ${\hexword_pattern} : ){1,4} : (?: ${\hexword_pattern} : ){1} ${\two_hexwords_or_ipv4_address_pattern} |
        #                   x[:...]::x:x |        x[:...]::n.n.n.n
        (?: ${\hexword_pattern} : ){1,5} :                                ${\two_hexwords_or_ipv4_address_pattern} |
        #                     x[:...]::x |                       -
        (?: ${\hexword_pattern} : ){1,6} :     ${\hexword_pattern}                                                 |
        #                      x[:...]:: |                       -
        (?: ${\hexword_pattern} : ){1,7} :                                                                         |
        #                      ::[...:]x |                       -
  :: (?: ${\hexword_pattern} : ){0,6}       ${\hexword_pattern}                                                 |
        #                              - |         ::[...:]n.n.n.n
  :: (?: ${\hexword_pattern} : ){0,5}                                  ${\two_hexwords_or_ipv4_address_pattern} |
        #                             :: |                       -
  ::
/x;

use constant loopback_address_pattern   => qr/ (?: ::ffff: )? 127 (?: \.\d{1,3} ){3} | ::1 /x;

TRUE;