From owner-freebsd-ports-bugs@FreeBSD.ORG Sat Nov 1 06:10:30 2003 Return-Path: Delivered-To: freebsd-ports-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 8696416A4CF for ; Sat, 1 Nov 2003 06:10:30 -0800 (PST) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 67E5643FE0 for ; Sat, 1 Nov 2003 06:10:25 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.9/8.12.9) with ESMTP id hA1EAPFY095303 for ; Sat, 1 Nov 2003 06:10:25 -0800 (PST) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.9/8.12.9/Submit) id hA1EAPCS095302; Sat, 1 Nov 2003 06:10:25 -0800 (PST) (envelope-from gnats) Resent-Date: Sat, 1 Nov 2003 06:10:25 -0800 (PST) Resent-Message-Id: <200311011410.hA1EAPCS095302@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-ports-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Alex Dupre Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 9322016A4CE; Sat, 1 Nov 2003 06:07:46 -0800 (PST) Received: from relay.gufi.org (civetta.gufi.org [212.110.23.10]) by mx1.FreeBSD.org (Postfix) with ESMTP id 080A443F75; Sat, 1 Nov 2003 06:07:45 -0800 (PST) (envelope-from alex@armada.alexdupre.com) Received: from armada.alexdupre.com (host245-49.pool8288.interbusiness.it [82.88.49.245]) by relay.gufi.org (Postfix) with ESMTP id 7C68A20FDE; Sat, 1 Nov 2003 15:07:42 +0100 (CET) Received: from armada.alexdupre.com (localhost [127.0.0.1]) hA1E86ME032951; Sat, 1 Nov 2003 15:08:06 +0100 (CET) (envelope-from alex@armada.alexdupre.com) Received: (from alex@localhost) by armada.alexdupre.com (8.12.10/8.12.10/Submit) id hA1E86Xe032950; Sat, 1 Nov 2003 15:08:06 +0100 (CET) (envelope-from alex) Message-Id: <200311011408.hA1E86Xe032950@armada.alexdupre.com> Date: Sat, 1 Nov 2003 15:08:06 +0100 (CET) From: Alex Dupre To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 cc: roam@FreeBSD.org Subject: ports/58805: [Update Feature] SpamAssassin and vpopmail X-BeenThere: freebsd-ports-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Alex Dupre List-Id: Ports bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 01 Nov 2003 14:10:30 -0000 >Number: 58805 >Category: ports >Synopsis: [Update Feature] SpamAssassin and vpopmail >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: update >Submitter-Id: current-users >Arrival-Date: Sat Nov 01 06:10:24 PST 2003 >Closed-Date: >Last-Modified: >Originator: Alex Dupre >Release: FreeBSD 5.1-CURRENT i386 >Organization: >Environment: System: FreeBSD armada.alexdupre.com 5.1-CURRENT FreeBSD 5.1-CURRENT #0: Sat Oct 25 14:49:52 CEST 2003 alex@armada.alexdupre.com:/usr/obj/usr/src/sys/ARMADA i386 >Description: Update the spamassassin support for vpopmail. Add SPAM_THRESHOLD as minimum score required to automatically delete spam messages. >How-To-Repeat: >Fix: --- vpopmail.diff begins here --- diff -ruN vpopmail.orig/Makefile vpopmail/Makefile --- vpopmail.orig/Makefile Sat Nov 1 14:38:25 2003 +++ vpopmail/Makefile Sat Nov 1 11:26:14 2003 @@ -61,6 +61,7 @@ # # HARDQUOTA - size of hard quota, or 'n' for no hard quota # RELAYCLEAR - time in minutes before clearing relay hole (requires roaming) +# SPAM_THRESHOLD - minimum score required to delete spam messages (requires spamassassin) # DEFAULT_DOMAIN - default domain for non-vhost lookups # WITH_SINGLE_DOMAIN - optimize for a site with many users in a single domain # LOGLEVEL - n - no logging, y - log all, @@ -115,6 +116,7 @@ HARDQUOTA?= 10000000 RELAYCLEAR?= 30 +SPAM_THRESHOLD?=15 LOGLEVEL?= y .if defined(WITH_MYSQL) @@ -243,7 +245,8 @@ .if defined(WITH_SPAMASSASSIN) BUILD_DEPENDS= spamc:${PORTSDIR}/mail/p5-Mail-SpamAssassin -CONFIGURE_ARGS+= --enable-spamassassin=${LOCALBASE}/bin/spamc +CONFIGURE_ARGS+= --enable-spamassassin=${LOCALBASE}/bin/spamc \ + --enable-spam-threshold=${SPAM_THRESHOLD} .endif # autoconf and automake can remove our patches to the configure scripts. diff -ruN vpopmail.orig/files/patch-config.h.in vpopmail/files/patch-config.h.in --- vpopmail.orig/files/patch-config.h.in Fri Oct 31 18:24:01 2003 +++ vpopmail/files/patch-config.h.in Sat Nov 1 10:59:51 2003 @@ -1,10 +1,13 @@ ---- config.h.in.orig Fri Oct 24 18:43:20 2003 -+++ config.h.in Fri Oct 24 18:43:45 2003 -@@ -89,6 +89,9 @@ +--- config.h.in.orig Tue Oct 7 03:25:53 2003 ++++ config.h.in Sat Nov 1 10:59:26 2003 +@@ -89,6 +89,12 @@ #undef QMAILNEWU /* */ +#undef SPAMC ++ ++/* */ ++#undef SPAM_THRESHOLD + +/* */ #undef QMAILINJECT diff -ruN vpopmail.orig/files/patch-configure vpopmail/files/patch-configure --- vpopmail.orig/files/patch-configure Fri Oct 31 18:24:01 2003 +++ vpopmail/files/patch-configure Sat Nov 1 14:01:44 2003 @@ -1,15 +1,17 @@ --- configure.orig Fri Oct 17 01:12:22 2003 -+++ configure Sat Oct 25 01:18:27 2003 -@@ -20,6 +20,8 @@ ++++ configure Sat Nov 1 14:01:27 2003 +@@ -20,6 +20,10 @@ ac_help="$ac_help --enable-qmail-newmrh=path Full path to qmail-newmrh program" ac_help="$ac_help + --enable-spamassassin=path Enable SpamAssassin. Full path to spamc program. default /usr/local/bin/spamc" +ac_help="$ac_help ++ --enable-spam-threshold=# or n Automatically delete messages that score more than # spam hits" ++ac_help="$ac_help --enable-vpopuser=vpopmail user vchkpw was installed as." ac_help="$ac_help --enable-vpopgroup=vchkpw group vchkpw was installed as." -@@ -1317,7 +1319,7 @@ +@@ -1317,7 +1321,7 @@ ;; esac @@ -18,7 +20,7 @@ then echo "configure: warning: === vpopmail must be configured as root. ===" 1>&2 echo "configure: warning: === please switch to the root user and ===" 1>&2 -@@ -1446,6 +1448,27 @@ +@@ -1446,6 +1450,49 @@ EOF @@ -41,12 +43,34 @@ + cat >> confdefs.h <> confdefs.h < 0) ++ while ((file_count = read(0, msgbuf, MSG_BUF_SIZE)) > 0) + write(1, msgbuf, file_count); + _exit(0); + } @@ -44,7 +63,144 @@ + dup2(pim[0], 0); + close(pim[0]); + } ++#ifdef SPAM_THRESHOLD ++ /* silently delete message if spam level > SPAM_THRESHOLD */ ++ if (is_spam(SPAM_THRESHOLD) == 1) { ++ close(write_fd); ++ if (unlink(local_file) != 0) { ++ printf("unlink failed %s errno = %d\n", local_file, errno); ++ return(errno); ++ } ++ return(0); ++ } ++ ++#ifdef MAKE_SEEKABLE ++ if (!Seekable(0)) ++ MakeSeekable(stdin); ++#endif ++ ++ if (lseek(0, 0L, SEEK_SET) < 0) { ++ printf("lseek errno=%d\n", errno); ++ return(errno); ++ } ++#endif +#endif /* read it in chunks and write it to the new file */ while((file_count=read(0,msgbuf,MSG_BUF_SIZE))>0) { +@@ -881,6 +932,9 @@ + if (strncmp(loop_buf, "Delivered-To: ", 14) == 0 && + is_loop_match(loop_buf, address)==1 ) { + ++ /* seek to the end of stdin */ ++ fseek(stdin, 0L, SEEK_END); ++ + /* return the loop found */ + return(1); + +@@ -919,6 +973,8 @@ + * looping not found value + */ + if ( found == 0 ) { ++ /* seek to the end of stdin */ ++ fseek(stdin, 0L, SEEK_END); + /* return not found looping message value */ + return(0); + } +@@ -1335,3 +1391,96 @@ + return(1); + } + ++#ifdef SPAM_THRESHOLD ++/* Check for a spam message ++ * This is done by checking for a matching line ++ * in the email headers for X-Spam-Level: which ++ * we put in each spam email ++ * ++ * Return 1 if spam ++ * Return 0 if not spam ++ * Return -1 on error ++ */ ++int is_spam(int threshold) ++{ ++ int i; ++ int found; ++ ++#ifdef MAKE_SEEKABLE ++ if (!Seekable(0)) ++ MakeSeekable(stdin); ++#endif ++ ++ if ( lseek(0, 0L, SEEK_SET) < 0 ) { ++ printf("lseek errno=%d\n", errno); ++ return(errno); ++ } ++ ++ while (fgets(spam_buf, sizeof(spam_buf), stdin) != NULL){ ++ ++ /* if we find the line, return error (looping) */ ++ if (strncmp(spam_buf, "X-Spam-Level: ", 14) == 0 && ++ is_spam_match(spam_buf, threshold) ==1) { ++ ++ /* seek to the end of stdin */ ++ fseek(stdin, 0L, SEEK_END); ++ ++ /* return the spam found */ ++ return(1); ++ ++ /* check for the start of the body, we only need ++ * to check the headers. ++ */ ++ } else { ++ ++ /* walk through the charaters in the body */ ++ for (i = 0, found = 0; spam_buf[i] != 0 && found == 0; ++i) { ++ switch(spam_buf[i]) { ++ ++ /* skip blank spaces and new lines */ ++ case ' ': ++ case '\n': ++ case '\t': ++ case '\r': ++ break; ++ ++ /* found a non blank, so we are still ++ * in the headers ++ */ ++ default: ++ ++ /* set the found non blank char flag */ ++ found = 1; ++ break; ++ } ++ } ++ ++ /* if the line only had blanks, then it is the ++ * delimiting line between the headers and the ++ * body. We don't need to check the body for ++ * the X-Spam-Level: line. Hence, we ++ * are done with our search and can return the ++ * spam not found value ++ */ ++ if (found == 0) { ++ /* seek to the end of stdin */ ++ fseek(stdin, 0L, SEEK_END); ++ /* return not found spam message value */ ++ return(0); ++ } ++ } ++ } ++ ++ /* if we get here then the there is either no body ++ * or the logic above failed and we scanned ++ * the whole email, headers and body. ++ */ ++ return(0); ++} ++ ++int is_spam_match(char *xsl, int threshold) ++{ ++ if (strlen(xsl) - strlen("X-Spam-Level: ") > threshold) return(1); ++ else return(0); ++} ++#endif --- vpopmail.diff ends here --- >Release-Note: >Audit-Trail: >Unformatted: