changeset 179:8b86a894514d

embedded dcc filtering
author carl
date Sat, 06 Oct 2007 10:56:35 -0700
parents d6531c702be3
children 7a722f482bfb
files ChangeLog Makefile.am NEWS dnsbl.conf sendmail.st src/context.h src/dnsbl.cpp xml/dnsbl.in
diffstat 8 files changed, 48 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Thu Oct 04 22:45:21 2007 -0700
+++ b/ChangeLog	Sat Oct 06 10:56:35 2007 -0700
@@ -1,6 +1,6 @@
     $Id$
 
-6.11 2007-10-04
+6.11 2007-10-06
     Add DCC filtering via dccifd. Drop to 60 seconds the time we will
     keep idle smtp verify sockets around. This needs to be about half
     the value of confTO_COMMAND configured on the verify targets.
--- a/Makefile.am	Thu Oct 04 22:45:21 2007 -0700
+++ b/Makefile.am	Sat Oct 06 10:56:35 2007 -0700
@@ -1,7 +1,7 @@
 SUBDIRS = src man html info
 hackdir = $(sysconfdir)/dnsbl
 hack_SCRIPTS = dnsbl
-hack_DATA = dnsbl.conf hosts-ignore.conf html-tags.conf tld.conf cctld.conf
+hack_DATA = dnsbl.conf hosts-ignore.conf html-tags.conf tld.conf cctld.conf dnsblnogrey
 CLEANFILES = dnsbl xml/dnsbl xml/Makefile
 EXTRA_DIST = $(hack_DATA) dnsbl.spec $(wildcard xml/h*) $(wildcard xml/M*) $(wildcard xml/d*)
 
@@ -19,4 +19,5 @@
 	   chown dnsbl:root $(sysconfdir)/dnsbl/.spamassassin
 	   /sbin/chkconfig --del dnsbl
 	   /sbin/chkconfig --add dnsbl
+	   if [ -d /var/dcc/userdirs/local ]; then mv -f $(sysconfdir)/dnsbl/dnsblnogrey /var/dcc/userdirs/local ; fi
 
--- a/NEWS	Thu Oct 04 22:45:21 2007 -0700
+++ b/NEWS	Sat Oct 06 10:56:35 2007 -0700
@@ -1,6 +1,6 @@
     $Id$
 
-6.11 2007-10-04 Add DCC filtering via dccifd. Fix static buffer referenced by multiple threads.
+6.11 2007-10-06 Add DCC filtering via dccifd. Fix static buffer referenced by multiple threads.
 6.10 2007-09-23 Don't whitelist addresses with embedded blanks, or the empty path.
 6.09 2007-09-06 Fix memory leak. Update timestamps when receiving from auto-whitelisted sender.
 6.08 2007-08-30 Don't do generic reverse dns filtering on authenticated connections.
--- a/dnsbl.conf	Thu Oct 04 22:45:21 2007 -0700
+++ b/dnsbl.conf	Sat Oct 06 10:56:35 2007 -0700
@@ -64,6 +64,7 @@
     env_to {
         # !! replace this with your domain names
         # child contexts are not allowed to specify recipient addresses outside these domains
+        # if this is a backup-mx, you need to include here domains for which you relay to the primary mx
         include "/etc/mail/local-host-names";
     };
 
Binary file sendmail.st has changed
--- a/src/context.h	Thu Oct 04 22:45:21 2007 -0700
+++ b/src/context.h	Sat Oct 06 10:56:35 2007 -0700
@@ -218,11 +218,11 @@
 	void		set_bulk(int b) 							{dcc_bulk_threshold = b; };
 
 	bool			get_content_filtering() 				{return content_filtering; };
-	bool			get_require()							{return require_match;	   };
-	bool			get_grey()								{return dcc_greylist;	   };
-	int 			get_bulk()								{return dcc_bulk_threshold;};
-	int 			get_host_limit()						{return host_limit; 	   };
-	bool			get_host_random()						{return host_random;	   };
+	bool			get_require()							{return content_filtering && require_match; 	};
+	bool			get_grey()								{return content_filtering && dcc_greylist;		};
+	int 			get_bulk()								{return (content_filtering) ? dcc_bulk_threshold : 0;};
+	int 			get_host_limit()						{return (content_filtering) ? host_limit		 : 0;};
+	bool			get_host_random()						{return (content_filtering) ? host_random		 : 0;};
 	int 			get_spamassassin_limit()				{return (content_filtering) ? spamassassin_limit : 0;};
 	char*			get_content_suffix();
 	char*			get_content_message();
--- a/src/dnsbl.cpp	Thu Oct 04 22:45:21 2007 -0700
+++ b/src/dnsbl.cpp	Sat Oct 06 10:56:35 2007 -0700
@@ -782,6 +782,7 @@
 		if ((src[0] == 172) && (16 <= src[1]) && (src[1] <= 31)) return false;
 		char adr[sizeof "255.255.255.255   "];
 		snprintf(adr, sizeof(adr), "%u.%u.%u.%u", src[3], src[2], src[1], src[0]);
+		// cannot use inet_ntop here since we want the octets reversed.
 		return (uriblookup(priv, hosts, adr, NULL, found));
 	}
 
@@ -988,7 +989,7 @@
 		priv.assassin  = new SpamAssassin(&priv, priv.ip, priv.helo, priv.mailaddr, priv.queueid);
 	}
 	if (dccifd_port) {
-		priv.dccifd = new DccInterface(dccifd_port, &priv, priv.ip, priv.helo, priv.mailaddr, priv.queueid);
+		priv.dccifd = new DccInterface(dccifd_port, &priv, priv.ip, priv.helo, priv.mailaddr);
 	}
 	return SMFIS_CONTINUE;
 }
@@ -1006,13 +1007,13 @@
 		smfi_setreply(ctx, "550", "5.7.1", "bogus recipient");
 		return SMFIS_REJECT;
 	}
-
-	if (priv.assassin) priv.assassin->mlfi_envrcpt(ctx, loto);
-	if (priv.dccifd)   priv.dccifd->mlfi_envrcpt(loto);
 	// priv.mailaddr sending original message to loto
 	CONTEXT 	&con = *(dc.find_context(loto)->find_context(priv.mailaddr));
 	VERIFYP 	 ver = con.find_verify(loto);
 	char  *fromvalue = con.find_from(priv.mailaddr, true);
+	// tell spam assassin and dccifd about this recipient
+	if (priv.assassin) priv.assassin->mlfi_envrcpt(ctx, loto);
+	if (priv.dccifd)   priv.dccifd->mlfi_envrcpt(loto, con.get_grey());
 	// loto sending a reply back to priv.mailaddr
 	CONTEXT    &con2 = *(dc.find_context(priv.mailaddr)->find_context(loto));
 	char *replyvalue = con2.find_from(loto);
@@ -1104,6 +1105,11 @@
 	else {
 		free(loto);
 	}
+
+	// accept the recipient
+	if (!con.get_content_filtering()) st = white;
+
+	if (st == oksofar) {
 	// remember first content filtering context
 	if (con.get_content_filtering()) {
 		if (!priv.content_context) priv.content_context = &con;
@@ -1112,10 +1118,7 @@
 			return SMFIS_TEMPFAIL;
 		}
 	}
-	// accept the recipient
-	if (!con.get_content_filtering()) st = white;
-	if (st == oksofar) {
-		// but remember the non-whites
+		// remember the non-whites
 		priv.need_content_filter(rcptaddr, con);
 		priv.only_whites = false;
 		priv.want_spamassassin |= (priv.assassin) &&					// have spam assassin available and
--- a/xml/dnsbl.in	Thu Oct 04 22:45:21 2007 -0700
+++ b/xml/dnsbl.in	Sat Oct 06 10:56:35 2007 -0700
@@ -34,6 +34,7 @@
                 <arg><option>-s</option></arg>
                 <arg><option>-d <replaceable class="parameter">n</replaceable></option></arg>
                 <arg><option>-e <replaceable class="parameter">from|to</replaceable></option></arg>
+                <arg><option>-b <replaceable class="parameter">local-domain-socket</replaceable></option></arg>
                 <arg><option>-r <replaceable class="parameter">local-domain-socket</replaceable></option></arg>
                 <arg><option>-p <replaceable class="parameter">sendmail-socket</replaceable></option></arg>
                 <arg><option>-t <replaceable class="parameter">timeout</replaceable></option></arg>
@@ -72,7 +73,14 @@
                     </para></listitem>
                 </varlistentry>
                 <varlistentry>
-                    <term>-r <replaceable class="parameter">local-domain-socket</replaceable></term>
+                    <term>-b <replaceable class="parameter">local-domain-socket-file-name</replaceable></term>
+                    <listitem><para>
+                        Set the local socket used for the connection to the dccifd daemon.
+                        This is typically /var/dcc/dccifd.
+                    </para></listitem>
+                </varlistentry>
+                <varlistentry>
+                    <term>-r <replaceable class="parameter">local-domain-socket-file-name</replaceable></term>
                     <listitem><para>
                         Set the local socket used for the connection to our own dns resolver processes.
                     </para></listitem>
@@ -248,6 +256,18 @@
                 be appropriately tagged and used only for the domains controlled by each
                 of those clients.
             </para>
+            <para>
+                You can now use (via dccifd) different dcc filtering parameters on a per
+                context basis.  See the dcc_greylist and dcc_bulk_threshold statements
+                in the <citerefentry> <refentrytitle>@PACKAGE@.conf</refentrytitle>
+                <manvolnum>5</manvolnum> </citerefentry> configuration.  Those
+                statements are only active if you supply the <option>-b</option> option
+                on the dnsbl command line.  If you use the dcc via the standard dcc
+                milter (dccm), then connections from clients that use SMTP AUTH are
+                still subject to greylisting.  If you use the dcc via dccifd and this
+                milter, then connections from clients that use SMTP AUTH are never
+                subject to greylisting.
+            </para>
         </refsect1>
 
         <refsect1 id='definitions.1'>
@@ -704,6 +724,7 @@
     env_to {
         # !! replace this with your domain names
         # child contexts are not allowed to specify recipient addresses outside these domains
+        # if this is a backup-mx, you need to include here domains for which you relay to the primary mx
         include "/etc/mail/local-host-names";
     };