X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fspam%2Fserv_spam.c;h=479ea5fecf93be76c2edd76668bcabba212b2877;hb=7a9b0685e406cc83597171cc39d008c7e5459ca8;hp=235b0caa318e1e67b788ffdde885186f64eaa7f2;hpb=0eea6dcc234e0f524bbf2a1d909455d41ed02314;p=citadel.git diff --git a/citadel/modules/spam/serv_spam.c b/citadel/modules/spam/serv_spam.c index 235b0caa3..479ea5fec 100644 --- a/citadel/modules/spam/serv_spam.c +++ b/citadel/modules/spam/serv_spam.c @@ -1,26 +1,18 @@ /* - * $Id$ - * * This module allows Citadel to use SpamAssassin to filter incoming messages * arriving via SMTP. For more information on SpamAssassin, visit * http://www.spamassassin.org (the SpamAssassin project is not in any way * affiliated with the Citadel project). * - * Copyright (c) 1998-2009 by the citadel.org team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. + * Copyright (c) 1998-2015 by the citadel.org team * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ #define SPAMASSASSIN_PORT "783" @@ -34,18 +26,7 @@ #include #include #include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - +#include #include #include #include @@ -72,7 +53,7 @@ /* * Connect to the SpamAssassin server and scan a message. */ -int spam_assassin(struct CtdlMessage *msg) { +int spam_assassin(struct CtdlMessage *msg, recptypes *recp) { int sock = (-1); char sahosts[SIZ]; int num_sahosts; @@ -94,9 +75,9 @@ int spam_assassin(struct CtdlMessage *msg) { /* Try them one by one until we get a working one */ for (sa=0; sa\n", buf); - sock = sock_connect(buf, SPAMASSASSIN_PORT, "tcp"); - if (sock >= 0) CtdlLogPrintf(CTDL_DEBUG, "Connected!\n"); + syslog(LOG_INFO, "Connecting to SpamAssassin at <%s>\n", buf); + sock = sock_connect(buf, SPAMASSASSIN_PORT); + if (sock >= 0) syslog(LOG_DEBUG, "Connected!\n"); } if (sock < 0) { @@ -106,12 +87,12 @@ int spam_assassin(struct CtdlMessage *msg) { return(0); } - CCC->sReadBuf = NewStrBuf(); + CCC->SBuf.Buf = NewStrBuf(); CCC->sMigrateBuf = NewStrBuf(); - CCC->sPos = NULL; + CCC->SBuf.ReadWritePointer = NULL; /* Command */ - CtdlLogPrintf(CTDL_DEBUG, "Transmitting command\n"); + syslog(LOG_DEBUG, "Transmitting command\n"); sprintf(buf, "CHECK SPAMC/1.2\r\n\r\n"); sock_write(&sock, buf, strlen(buf)); @@ -131,66 +112,59 @@ int spam_assassin(struct CtdlMessage *msg) { sock_shutdown(sock, SHUT_WR); /* Response */ - CtdlLogPrintf(CTDL_DEBUG, "Awaiting response\n"); + syslog(LOG_DEBUG, "Awaiting response\n"); if (sock_getln(&sock, buf, sizeof buf) < 0) { goto bail; } - CtdlLogPrintf(CTDL_DEBUG, "<%s\n", buf); + syslog(LOG_DEBUG, "<%s\n", buf); if (strncasecmp(buf, "SPAMD", 5)) { goto bail; } if (sock_getln(&sock, buf, sizeof buf) < 0) { goto bail; } - CtdlLogPrintf(CTDL_DEBUG, "<%s\n", buf); - CtdlLogPrintf(CTDL_DEBUG, "c_spam_flag_only setting %d\n", config.c_spam_flag_only); - if (config.c_spam_flag_only) { - CtdlLogPrintf(CTDL_DEBUG, "flag spam code used"); + syslog(LOG_DEBUG, "<%s\n", buf); + syslog(LOG_DEBUG, "c_spam_flag_only setting %d\n", CtdlGetConfigInt("c_spam_flag_only")); + if (CtdlGetConfigInt("c_spam_flag_only")) { int headerlen; - int newmsgsize; - int oldmsgsize; - + char *cur; char sastatus[10]; char sascore[10]; char saoutof[10]; int numscore; + syslog(LOG_DEBUG, "flag spam code used"); + extract_token(sastatus, buf, 1, ' ', sizeof sastatus); extract_token(sascore, buf, 3, ' ', sizeof sascore); extract_token(saoutof, buf, 5, ' ', sizeof saoutof); - sprintf(buf,"X-Spam-Level: "); - char *cur = buf + 14; + memcpy(buf, HKEY("X-Spam-Level: ")); + cur = buf + 14; for (numscore = atoi(sascore); numscore>0; numscore--) *(cur++) = '*'; *cur = '\0'; - sprintf(cur,"\r\nX-Spam-Status: %s, score=%s required=%s\r\n", sastatus, sascore, saoutof); - headerlen = strlen(buf); - oldmsgsize = strlen(msg->cm_fields['M']) + 1; - newmsgsize = headerlen + oldmsgsize; - - msg->cm_fields['M'] = realloc(msg->cm_fields['M'], newmsgsize); + headerlen = cur - buf; + headerlen += snprintf(cur, (sizeof(buf) - headerlen), + "\r\nX-Spam-Status: %s, score=%s required=%s\r\n", + sastatus, sascore, saoutof); - memmove(msg->cm_fields['M']+headerlen,msg->cm_fields['M'],oldmsgsize); - memcpy(msg->cm_fields['M'],buf,headerlen); + CM_PrependToField(msg, eMesageText, buf, headerlen); } else { - CtdlLogPrintf(CTDL_DEBUG, "reject spam code used"); + syslog(LOG_DEBUG, "reject spam code used"); if (!strncasecmp(buf, "Spam: True", 10)) { is_spam = 1; } if (is_spam) { - if (msg->cm_fields['0'] != NULL) { - free(msg->cm_fields['0']); - } - msg->cm_fields['0'] = strdup("message rejected by spam filter"); + CM_SetField(msg, eErrorMsg, HKEY("message rejected by spam filter")); } } bail: close(sock); - FreeStrBuf(&CCC->sReadBuf); + FreeStrBuf(&CCC->SBuf.Buf); FreeStrBuf(&CCC->sMigrateBuf); return(is_spam); } @@ -204,6 +178,6 @@ CTDL_MODULE_INIT(spam) CtdlRegisterMessageHook(spam_assassin, EVT_SMTPSCAN); } - /* return our Subversion id for the Log */ - return "$Id$"; + /* return our module name for the log */ + return "spam"; }