Author: msergeant
Date: Mon Jun 20 07:56:36 2005
New Revision: 438
Added:
trunk/plugins/check_loop
Log:
check_loop plugin by Keith Ivey
Added: trunk/plugins/check_loop
==============================================================================
--- (empty file)
+++ trunk/plugins/check_loop Mon Jun 20 07:56:36 2005
@@ -0,0 +1,53 @@
+#!/usr/bin/perl
+
+=head1 NAME
+
+check_loop - Detect mail loops
+
+=head1 DESCRIPTION
+
+This plugin detects loops by counting "Received" and "Delivered-To"
+header lines. It's a kluge but it duplicates what qmail-smtpd does,
+and it does at least prevent messages from looping forever.
+
+=head1 CONFIGURATION
+
+Takes one optional parameter, the maximum number of "hops" ("Received"
+and lines plus "Delivered-To" lines) allowed. The default is 100, the
+same as in qmail-smtpd.
+
+=head1 AUTHOR
+
+Written by Keith C. Ivey
+
+=head1 LICENSE
+
+Released to the public domain, 17 June 2005.
+
+=cut
+
+sub register {
+ my ($self, $qp, @args) = @_;
+ $self->register_hook("data_post", "check_loop");
+
+ $self->{_max_hops} = $args[0] || 100;
+
+ if ( $self->{_max_hops} !~ /^\d+$/ ) {
+ $self->log(LOGWARN, "Invalid max_hops value -- using default");
+ }
+ $self->log(LOGWARN, "Ignoring additional arguments") if @args > 1;
+}
+
+sub check_loop {
+ my ($self, $transaction) = @_;
+
+ my $hops = 0;
+ $hops++ for $transaction->header->get('Received'),
+ $transaction->header->get('Delivered-To');
+
+ if ( $hops >= $self->{_max_hops} ) {
+ return DENY, "Too many hops. This message is looping.";
+ }
+
+ return DECLINED;
+}