[Mimedefang] MIMEDefang 2.72-BETA-1 is available

Philip Prindeville philipp_subx at redfish-solutions.com
Wed Nov 3 18:26:46 EDT 2010


Actually, I realized that the filter_helo() and filter_relay() signatures don't need to change.

70% of the patch is just moving stuff around to make functionality available earlier.

-------------- next part --------------
--- mimedefang-2.72-BETA-1/mimedefang.c.ports	2010-10-12 11:27:39.000000000 -0600
+++ mimedefang-2.72-BETA-1/mimedefang.c	2010-11-02 23:11:56.000000000 -0600
@@ -162,7 +162,7 @@ static char *StandardSendmailMacros[] = 
     "_", "auth_authen", "auth_author", "auth_ssf", "auth_type",
     "cert_issuer", "cert_subject", "cipher", "cipher_bits", "daemon_name",
     "i", "if_addr", "if_name", "j", "mail_addr", "mail_host", "mail_mailer",
-    "tls_version", "verify",
+    "tls_version", "verify", "daemon_port",
     /* End of macros MUST be marked with NULL! */
     NULL
 };
@@ -172,6 +172,7 @@ struct privdata {
     char *hostname;		/* Name of connecting host */
     char *hostip;		/* IP address of connecting host */
     unsigned int hostport;      /* Port of connecting host */
+    unsigned int myport;	/* My port number, from Sendmail macro  */
     char *myip;                 /* My IP address, from Sendmail macro */
     char *sender;		/* Envelope sender */
     char *firstRecip;		/* Address of first recipient */
@@ -500,6 +501,8 @@ mfconnect(SMFICTX *ctx, char *hostname, 
 #if defined(AF_INET6) && defined(HAVE_INET_NTOP)
     struct sockaddr_in6 *in6sa = (struct sockaddr_in6 *) sa;
 #endif
+    char *me;
+    unsigned int u;
 
     DEBUG_ENTER("mfconnect");
 
@@ -553,6 +556,7 @@ mfconnect(SMFICTX *ctx, char *hostname, 
     data->hostip   = NULL;
     data->hostport = 0;
     data->myip     = NULL;
+    data->myport   = 0;
     data->sender   = NULL;
     data->firstRecip = NULL;
     data->dir      = NULL;
@@ -667,6 +671,23 @@ mfconnect(SMFICTX *ctx, char *hostname, 
 	strcpy(data->hostip, "127.0.0.1");
     }
 
+    /* Get my IP address */
+    me = smfi_getsymval(ctx, "{if_addr}");
+    if (me && *me && MyIPAddress && !strcmp(me, MyIPAddress)) {
+	data->myip = MyIPAddress;
+    } else if (me && *me && strcmp(me, "127.0.0.1")) {
+	data->myip = strdup_with_log(me);
+    } else {
+	/* Sigh... use our computed address */
+	data->myip = MyIPAddress;
+    }
+
+    /* get our local port */
+    me = smfi_getsymval(ctx, "{daemon_port}");
+    if (me && *me && (sscanf(me, "%u", &u) == 1)) {
+       data->myport = u;
+    }
+ 
     data->dir = NULL;
     data->fd = -1;
     data->headerFD = -1;
@@ -677,7 +698,8 @@ mfconnect(SMFICTX *ctx, char *hostname, 
     if (doRelayCheck) {
 	char buf2[SMALLBUF];
 	int n = MXRelayOK(MultiplexorSocketName, buf2, data->hostip,
-			  data->hostname, data->hostport);
+			  data->hostname, data->hostport,
+			  data->myip, data->myport);
 	if (n == MD_REJECT) {
 	    /* Can't call smfi_setreply from connect callback */
 	    /* set_dsn(ctx, buf2, 5); */
@@ -740,7 +762,8 @@ helo(SMFICTX *ctx, char *helohost)
     if (doHeloCheck) {
 	char buf2[SMALLBUF];
 	int n = MXHeloOK(MultiplexorSocketName, buf2, data->hostip,
-			 data->hostname, data->heloArg, data->hostport);
+			 data->hostname, data->heloArg, data->hostport,
+			 data->myip, data->myport);
 	if (n == MD_REJECT) {
 	    set_dsn(ctx, buf2, 5);
 	    cleanup(ctx);
@@ -793,7 +816,6 @@ envfrom(SMFICTX *ctx, char **from)
     char buffer[SMALLBUF];
     char buf2[SMALLBUF];
     char *queueid;
-    char *me;
     char **macro;
     dynamic_buffer dbuf;
 
@@ -937,12 +959,6 @@ envfrom(SMFICTX *ctx, char **from)
 	append_macro_value(&dbuf, ctx, AdditionalMacros[i]);
     }
 
-    /* Clear out any old myip address */
-    if (data->myip && (data->myip != MyIPAddress)) {
-	free(data->myip);
-	data->myip = NULL;
-    }
-
     if (queueid) {
 	append_mx_command(&dbuf, 'Q', queueid);
 	data->qid_written = 1;
@@ -976,18 +992,6 @@ envfrom(SMFICTX *ctx, char **from)
     data->cmdFD = put_fd(data->cmdFD);
 
 
-    /* Get my IP address */
-    me = smfi_getsymval(ctx, "{if_addr}");
-    if (me && *me && MyIPAddress && !strcmp(me, MyIPAddress)) {
-	data->myip = MyIPAddress;
-    } else if (me && *me && strcmp(me, "127.0.0.1")) {
-	data->myip = strdup_with_log(me);
-    } else {
-	/* Sigh... use our computed address */
-	data->myip = MyIPAddress;
-    }
-
-
     if (doSenderCheck) {
 	int n = MXSenderOK(MultiplexorSocketName, buf2,
 			   (char const **) from, data->hostip, data->hostname,
--- mimedefang-2.72-BETA-1/utils.c.ports	2010-10-12 11:26:42.000000000 -0600
+++ mimedefang-2.72-BETA-1/utils.c	2010-11-02 23:11:00.000000000 -0600
@@ -548,6 +548,8 @@ munch_mx_return(char *ans, char *msg)
 *  ip -- relay IP address
 *  name -- relay name
 *  port -- client port number
+*  myip -- server IP address
+*  myport -- server port number
 * %RETURNS:
 *  1 if it's OK to accept connections from this host; 0 if not, -1 if error.
 *  If connection is rejected, error message *may* be set.
@@ -557,21 +559,25 @@ MXRelayOK(char const *sockname,
 	  char *msg,
 	  char const *ip,
 	  char const *name,
-	  unsigned int port)
+	  unsigned int port,
+	  char const *myip,
+	  unsigned int myport)
 {
     char cmd[SMALLBUF];
     char ans[SMALLBUF];
+    char ans2[SMALLBUF];
 
     *msg = 0;
 
     snprintf(ans, sizeof(ans), "%u", port);
+    snprintf(ans2, sizeof(ans2), "%u", myport);
     if (!ip || !*ip) {
 	ip = "UNKNOWN";
     }
     if (!name || !*name) {
 	name = ip;
     }
-    if (percent_encode_command(1, cmd, sizeof(cmd), "relayok", ip, name, ans, NULL) < 0) {
+    if (percent_encode_command(1, cmd, sizeof(cmd), "relayok", ip, name, ans, myip, ans2, NULL) < 0) {
 	return MD_TEMPFAIL;
     }
     if (MXCommand(sockname, cmd, ans, SMALLBUF-1) < 0) return MD_TEMPFAIL;
@@ -587,6 +593,8 @@ MXRelayOK(char const *sockname,
 *  name -- resolved name of client
 *  helo -- the helo string
 *  port -- client port number
+*  myip -- IP address of server
+*  myport -- server port number
 * %RETURNS:
 *  1 if it's OK to accept messages from this sender; 0 if not, -1 if error or
 *  we should tempfail.
@@ -597,10 +605,13 @@ MXHeloOK(char const *sockname,
 	 char const *ip,
 	 char const *name,
 	 char const *helo,
-	 unsigned int port)
+	 unsigned int port,
+	 char const *myip,
+	 unsigned int myport)
 {
     char cmd[SMALLBUF];
     char ans[SMALLBUF];
+    char ans2[SMALLBUF];
 
     *msg = 0;
 
@@ -614,8 +625,9 @@ MXHeloOK(char const *sockname,
 	helo = "UNKNOWN";
     }
     snprintf(ans, sizeof(ans), "%u", port);
+    snprintf(ans2, sizeof(ans2), "%u", myport);
 
-    if (percent_encode_command(1, cmd, sizeof(cmd), "helook", ip, name, helo, ans, NULL) < 0) {
+    if (percent_encode_command(1, cmd, sizeof(cmd), "helook", ip, name, helo, ans, myip, ans2, NULL) < 0) {
 	return MD_TEMPFAIL;
     }
     if (MXCommand(sockname, cmd, ans, SMALLBUF-1) < 0) return MD_TEMPFAIL;
--- mimedefang-2.72-BETA-1/mimedefang.pl.in.ports	2010-10-14 10:08:39.000000000 -0600
+++ mimedefang-2.72-BETA-1/mimedefang.pl.in	2010-11-02 23:11:00.000000000 -0600
@@ -38,6 +38,7 @@ use vars qw($AddWarningsInline @StatusTa
 	    $QuarantineSubdir $QueueID $MsgID $MIMEDefangID
 	    $RelayAddr $RelayPort $WasResent $RelayHostname
 	    $RealRelayAddr $RealRelayHostname
+	    $OurAddr $OurPort
 	    $ReplacementEntity $Sender $ServerMode $Subject $SubjectCount
 	    $ClamdSock $SophieSock $TrophieSock
 	    $SuspiciousCharsInHeaders
@@ -5636,20 +5637,24 @@ sub do_main_loop () {
 	    next;
 	}
 
-	if ($_ =~ /^relayok (\S*)\s+(\S*)\s+(\S*)/) {
+	if ($_ =~ /^relayok (\S*)\s+(\S*)\s+(\S*)\s+(\S*)\s+(\S*)/) {
 	    $RelayAddr = percent_decode($1);
 	    $RelayHostname = percent_decode($2);
 	    $RelayPort = percent_decode($3);
+	    $OurAddr = percent_decode($4);
+	    $OurPort = percent_decode($5);
 	    relay_ok($RelayAddr, $RelayHostname, $RelayPort);
 	    chdir($Features{'Path:SPOOLDIR'});
 	    next;
 	}
-	if ($_ =~ /^helook (\S*)\s+(\S*)\s+(\S*)\s+(\S*)/) {
+	if ($_ =~ /^helook (\S*)\s+(\S*)\s+(\S*)\s+(\S*)\s+(\S*)\s+(\S*)/) {
 	    $RelayAddr = percent_decode($1);
 	    $RelayHostname = percent_decode($2);
 	    $Helo = percent_decode($3);
 	    $RelayPort = percent_decode($4);
+	    $OurAddr = percent_decode($5);
+	    $OurPort = percent_decode($6);
 	    helo_ok($RelayAddr, $RelayHostname, $Helo, $RelayPort);
 	    chdir($Features{'Path:SPOOLDIR'});
 	    next;
 	}
@@ -5775,12 +5780,15 @@ sub init_globals () {
     $MsgID = "NOQUEUE";
     $MessageID = "NOQUEUE";
     $Helo = "";
+    $OurAddr = "";
+    $OurPort = 0;
     $QueueID = "NOQUEUE";
     $QuarantineCount = 0;
     $Rebuild = 0;
     $EntireMessageQuarantined = 0;
     $QuarantineSubdir = "";
     $RelayAddr = "";
+    $RelayPort = 0;
     $RealRelayAddr = "";
     $WasResent = 0;
     $RelayHostname = "";
--- mimedefang-2.72-BETA-1/mimedefang.h.ports	2010-10-12 11:27:06.000000000 -0600
+++ mimedefang-2.72-BETA-1/mimedefang.h	2010-11-02 23:11:00.000000000 -0600
@@ -29,10 +29,11 @@ extern int MXCheckFreeSlaves(char const 
 extern int MXScanDir(char const *sockname, char const *dir);
 extern int MXCommand(char const *sockname, char const *cmd, char *buf, int len);
 extern int MXRelayOK(char const *sockname, char *msg,
-		     char const *ip, char const *name, unsigned int port);
+		     char const *ip, char const *name, unsigned int port,
+		     char const *myip, unsigned int myport);
 extern int MXHeloOK(char const *sockname, char *msg,
 		    char const *helo, char const *ip, char const *name,
-		    unsigned int port);
+		    unsigned int port, char const *myip, unsigned int myport);
 extern int MXSenderOK(char const *sockname, char *msg,
 		      char const **sender_argv, char const *ip, char const *name,
 		      char const *helo, char const *dir, char const *qid, unsigned int port);


More information about the MIMEDefang mailing list