trAvis - MANAGER
Edit File: Milter.pm
# $Id: Milter.pm,v 1.10 2004/08/04 17:07:51 tvierling Exp $ # # Copyright (c) 2002-2004 Todd Vierling <tv@pobox.com> <tv@duh.org> # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the author nor the names of contributors may be used # to endorse or promote products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. package Sendmail::Milter; use base Exporter; use strict; use warnings; ##### Symbols exported to the caller our @EXPORT = qw( SMFIS_CONTINUE SMFIS_REJECT SMFIS_DISCARD SMFIS_ACCEPT SMFIS_TEMPFAIL SMFIF_ADDHDRS SMFIF_CHGBODY SMFIF_ADDRCPT SMFIF_DELRCPT SMFIF_CHGHDRS SMFIF_MODBODY SMFI_V1_ACTS SMFI_V2_ACTS SMFI_CURR_ACTS ); our @EXPORT_OK = ( @EXPORT ); our %EXPORT_TAGS = ( 'all' => [ @EXPORT_OK ] ); ##### Protocol constants # SMFIS_ are not the same as the standard, in order to keep "0" and "1" # from being valid response codes by mistake. use constant SMFIS_CONTINUE => 100; use constant SMFIS_REJECT => 101; use constant SMFIS_DISCARD => 102; use constant SMFIS_ACCEPT => 103; use constant SMFIS_TEMPFAIL => 104; use constant SMFIF_ADDHDRS => 0x01; use constant SMFIF_CHGBODY => 0x02; use constant SMFIF_ADDRCPT => 0x04; use constant SMFIF_DELRCPT => 0x08; use constant SMFIF_CHGHDRS => 0x10; use constant SMFIF_MODBODY => SMFIF_CHGBODY; use constant SMFI_V1_ACTS => SMFIF_ADDHDRS|SMFIF_CHGBODY|SMFIF_ADDRCPT|SMFIF_DELRCPT; use constant SMFI_V2_ACTS => SMFI_V1_ACTS|SMFIF_CHGHDRS; use constant SMFI_CURR_ACTS => SMFI_V2_ACTS; ##### Callback function names my @callback_names = qw(close connect helo abort envfrom envrcpt header eoh body eom); our %DEFAULT_CALLBACKS = map { $_ => $_.'_callback' } @callback_names; ##### Version of "official" Sendmail::Milter emulated here our $VERSION = '0.18'; ##### Global instance of PMilter engine my $milter; ##### Function subroutines sub auto_getconn ($;$) { require Sendmail::PMilter; unshift(@_, get_milter()); goto &Sendmail::PMilter::auto_getconn; } sub auto_setconn ($;$) { require Sendmail::PMilter; unshift(@_, get_milter()); goto &Sendmail::PMilter::auto_setconn; } sub get_milter () { require Sendmail::PMilter; $milter = new Sendmail::PMilter unless defined($milter); $milter; } sub main (;$$) { require Sendmail::PMilter; unshift(@_, get_milter()); goto &Sendmail::PMilter::main; } sub register ($$;$) { require Sendmail::PMilter; unshift(@_, get_milter()); goto &Sendmail::PMilter::register; } sub setconn ($) { require Sendmail::PMilter; unshift(@_, get_milter()); goto &Sendmail::PMilter::setconn; } sub setdbg ($) { # no-op } sub settimeout ($) { # no-op } 1; __END__ =pod =head1 SYNOPSIS use Sendmail::Milter; Sendmail::Milter::auto_setconn(NAME); Sendmail::Milter::register(NAME, { CALLBACKS }, FLAGS); Sendmail::Milter::main(); =head1 DESCRIPTION This is a compatibility interface which emulates the "standard" Sendmail::Milter API. =head1 FUNCTIONS The following functions are available in this module. Unlike C<Sendmail::PMilter>, this interface involves a single, global instance of milter data, so these functions are called without an object reference. For each function, see the description of its object-based counterpart in L<Sendmail::PMilter>. =over 4 =item Sendmail::Milter::auto_getconn(NAME[, CONFIG]) =item Sendmail::Milter::auto_setconn(NAME[, CONFIG]) =item Sendmail::Milter::main([MAXCHILDREN[, MAXREQ]]) =item Sendmail::Milter::register(NAME, CALLBACKS[, FLAGS]) =item Sendmail::Milter::setconn(DESC) =back One extension function is provided by this implementation. =over 4 =item Sendmail::Milter::get_milter() Returns the C<Sendmail::PMilter> instance underlying this emulation layer. This allows mostly-unmodified milter scripts to set PMilter extensions (such as dispatcher and sendmail.cf values). It is recommended, however, that new code use the object instance methods described in L<Sendmail::PMilter>. =back =head1 EXPORTS In order to preserve compatibility with the standard C<Sendmail::Milter> interface, all SMFI* constants described in L<Sendmail::PMilter> are exported into the caller's namespace by default. (Note that C<Sendmail::PMilter> itself does not export these symbols by default.) =cut