Added possibility to refuse messages with no Received: hop
authorMatthew Mondor <mmondor@pulsar-zone.net>
Wed, 4 Feb 2009 09:02:25 +0000 (09:02 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Wed, 4 Feb 2009 09:02:25 +0000 (09:02 +0000)
mmsoftware/mmmail/etc/mmsmtpd.conf
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.c
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.conf.5
mmsoftware/mmmail/src/mmsmtpd/mmsmtpd.h

index af5f005..4778766 100644 (file)
@@ -1,4 +1,4 @@
-; $Id: mmsmtpd.conf,v 1.7 2007/03/16 17:24:10 mmondor Exp $
+; $Id: mmsmtpd.conf,v 1.8 2009/02/04 09:02:22 mmondor Exp $
 ;
 ; mmsmtpd configuration file (/etc/mmsmtpd.conf)
 ; and # are considered comments, and can happen at start or end of line.
@@ -117,6 +117,10 @@ RESOLVE_MX_MAIL    FALSE
 ; Is client required to HELO before being allowed to use MAIL?
 REQUIRE_HELO   FALSE
 ;
+; Must at least one Received: line be provided as part of message headers
+; for a message to be accepted?
+REQUIRE_HOP    FALSE
+;
 ; Maximum number of allowed destination recipients per message
 MAX_RCPTS      16
 ;
index 6bbfa09..4950480 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.c,v 1.101 2009/01/16 12:54:49 mmondor Exp $ */
+/* $Id: mmsmtpd.c,v 1.102 2009/02/04 09:02:25 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2008, Matthew Mondor
@@ -86,7 +86,7 @@
 
 MMCOPYRIGHT("@(#) Copyright (c) 2001-2007\n\
 \tMatthew Mondor. All rights reserved.\n");
-MMRCSID("$Id: mmsmtpd.c,v 1.101 2009/01/16 12:54:49 mmondor Exp $");
+MMRCSID("$Id: mmsmtpd.c,v 1.102 2009/02/04 09:02:25 mmondor Exp $");
 
 
 
@@ -309,6 +309,7 @@ main(int argc, char **argv)
        {CAT_BOOL, CAF_NONE, 0, 0, "RESOLVE_MX_MAIL", &CONF.RESOLVE_MX_MAIL},
        {CAT_BOOL, CAF_NONE, 0, 0, "RESOLVE_MX_RCPT", &CONF.RESOLVE_MX_RCPT},
        {CAT_BOOL, CAF_NONE, 0, 0, "REQUIRE_HELO", &CONF.REQUIRE_HELO},
+       {CAT_BOOL, CAF_NONE, 0, 0, "REQUIRE_HOP", &CONF.REQUIRE_HOP},
        {CAT_BOOL, CAF_NONE, 0, 0, "FLOOD_PROTECTION", &CONF.FLOOD_PROTECTION},
        {CAT_BOOL, CAF_NONE, 0, 0, "STATFAIL_HELO", &CONF.STATFAIL_HELO},
        {CAT_BOOL, CAF_NONE, 0, 0, "STATFAIL_NOHELO", &CONF.STATFAIL_NOHELO},
@@ -385,6 +386,7 @@ main(int argc, char **argv)
     CONF.RESOLVE_MX_MAIL = FALSE;
     CONF.RESOLVE_MX_RCPT = FALSE;
     CONF.REQUIRE_HELO = FALSE;
+    CONF.REQUIRE_HOP = FALSE;
     CONF.FLOOD_PROTECTION = TRUE;
     CONF.STATFAIL_HELO = TRUE;
     CONF.STATFAIL_NOHELO = TRUE;
@@ -1733,6 +1735,12 @@ endheader:
     /* We reached end of headers */
     ud->header = FALSE;
 
+    /* Drop if we require at least one hop but got none */
+    if (CONF.REQUIRE_HOP && ud->hops == 0) {
+       *res = CFDBRB_NOHOP;
+       return FDBRB_STOP;
+    }
+
     {
        char    tline[1024], tdata[64], *cptr, *tptr;
 
@@ -1865,6 +1873,11 @@ do_data(clientenv *clenv)
        err = DATA_HEADER;
        REGISTER_ERROR(clenv);
        break;
+    case CFDBRB_NOHOP:
+       mmsyslog(0, LOGLEVEL, "%08lX * No hop", clenv->id);
+       err = DATA_HEADER;
+       REGISTER_ERROR(clenv);
+       break;
     case FDBRB_OK:
        ok = TRUE;
        break;
index b365f5b..054ebdf 100644 (file)
@@ -1,4 +1,4 @@
-.\" $Id: mmsmtpd.conf.5,v 1.15 2008/01/11 00:46:49 mmondor Exp $
+.\" $Id: mmsmtpd.conf.5,v 1.16 2009/02/04 09:02:25 mmondor Exp $
 .\"
 .\" Copyright (C) 2001-2004, Matthew Mondor
 .\" All rights reserved.
@@ -344,6 +344,12 @@ command before being allowed to use the
 .Sy MAIL
 command? Should be TRUE or FALSE.
 .Pp
+.It Nm REQUIRE_HOP Ar "boolean"
+Must at least one
+.Sy Received:
+line be provided as part of a message's header for the message to be allowed?
+Should be TRUE or FALSE.
+.Pp
 .It Nm STATFAIL_ADDRESS Ar "boolean"
 If TRUE, instructs
 .Nm mmsmtpd
index 4d21fa2..ac5f4cc 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mmsmtpd.h,v 1.49 2009/01/17 03:48:20 mmondor Exp $ */
+/* $Id: mmsmtpd.h,v 1.50 2009/02/04 09:02:25 mmondor Exp $ */
 
 /*
  * Copyright (C) 2001-2008, Matthew Mondor
@@ -112,6 +112,7 @@ enum data_reason {
 /* Custom fdbreadbuf() return result */
 #define CFDBRB_HOPS    -1
 #define CFDBRB_HEADER  -2
+#define CFDBRB_NOHOP   -3
 
 /* Asynchroneous functions we attach */
 #define ASYNC_RESQUERY 1
@@ -144,10 +145,10 @@ typedef struct config {
        MAX_DATA_LINES, MAX_DATA_SIZE, MAX_HOPS, FLOOD_MESSAGES,
        FLOOD_EXPIRES, FLOOD_CACHE, ASYNC_PROCESSES;
     bool RESOLVE_HOSTS, RESOLVE_HELO, RESOLVE_MX_MAIL, RESOLVE_MX_RCPT,
-       REQUIRE_HELO, FLOOD_PROTECTION, STATFAIL_HELO, STATFAIL_NOHELO,
-       STATFAIL_NOFROM, STATFAIL_ADDRESS, STATFAIL_RELAY, STATFAIL_FLOOD,
-       STATFAIL_FULL, STATFAIL_TIMEOUT, STATFAIL_EOF, STATFAIL_FILTER,
-       DELAY_ON_ERROR, RELAYING;
+       REQUIRE_HELO, REQUIRE_HOP, FLOOD_PROTECTION, STATFAIL_HELO,
+       STATFAIL_NOHELO, STATFAIL_NOFROM, STATFAIL_ADDRESS, STATFAIL_RELAY,
+       STATFAIL_FLOOD, STATFAIL_FULL, STATFAIL_TIMEOUT, STATFAIL_EOF,
+       STATFAIL_FILTER, DELAY_ON_ERROR, RELAYING;
 } CONFIG;