The helo plugin fails to match any entries in badhelo, as the is_regex_match sub returns after the first (usually unsuccessful) test.

This works for me:

--- a/plugins/helo
+++ b/plugins/helo
@@ -301,40 +301,27 @@

 sub is_in_badhelo {
     my ($self, $host) = @_;
-
-    my $error = "I do not believe you are $host.";
+    my $error = "Your HELO hostname is not allowed";

     $host = lc $host;
     foreach my $bad ($self->qp->config('badhelo')) {
         if ($bad =~ /[\{\}\[\]\(\)\^\$\|\*\+\?\\\!]/) {    # it's a regexp
-            return $self->is_regex_match($host, $bad);
+            #$self->log( LOGDEBUG, "is regex ($bad)");
+            if (substr($bad, 0, 1) eq '!') {
+                $bad = substr $bad, 1;
+                if ($host !~ /$bad/) {
+ #$self->log( LOGDEBUG, "matched negative pattern (\!$bad)"); + return $error, "badhelo negative pattern match (\!$bad)";
         }
-        if ($host eq lc $bad) {
-            return $error, "in badhelo";
         }
+            elsif ($host =~ /$bad/) {
+                #$self->log( LOGDEBUG, "matched ($bad)");
+                return $error, "badhelo pattern match ($bad)";
     }
-    return;
 }
-
-sub is_regex_match {
-    my ($self, $host, $pattern) = @_;
-
-    my $error = "Your HELO hostname is not allowed";
-
-    #$self->log( LOGDEBUG, "is regex ($pattern)");
-    if (substr($pattern, 0, 1) eq '!') {
-        $pattern = substr $pattern, 1;
-        if ($host !~ /$pattern/) {
-
-            #$self->log( LOGDEBUG, "matched ($pattern)");
-            return $error, "badhelo pattern match ($pattern)";
+        elsif ($host eq lc $bad) {
+            return $error, "($bad) in badhelo";
         }
-        return;
-    }
-    if ($host =~ /$pattern/) {
-
-        #$self->log( LOGDEBUG, "matched ($pattern)");
-        return $error, "badhelo pattern match ($pattern)";
     }
     return;
 }

Reply via email to