X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fspam%2Fserv_spam.c;h=2b9331f93c0e1cd9a823d8fcf18f41c3ff28c830;hb=882ff5a53c3b4e440520a073cf07dc60b2671876;hp=840fd749f330b03fb635c2b9484d53cb39f5e084;hpb=02862316ec5cf51e9153aef6c2e3622494735d3b;p=citadel.git diff --git a/citadel/modules/spam/serv_spam.c b/citadel/modules/spam/serv_spam.c index 840fd749f..2b9331f93 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 @@ -58,7 +39,6 @@ #include "config.h" #include "control.h" #include "user_ops.h" -#include "policy.h" #include "database.h" #include "msgbase.h" #include "internet_addressing.h" @@ -73,15 +53,15 @@ /* * Connect to the SpamAssassin server and scan a message. */ -int spam_assassin(struct CtdlMessage *msg) { +int spam_assassin(struct CtdlMessage *msg, struct recptypes *recp) { int sock = (-1); char sahosts[SIZ]; int num_sahosts; char buf[SIZ]; int is_spam = 0; int sa; - char *msgtext; - size_t msglen; + StrBuf *msgtext; + CitContext *CCC=CC; /* For users who have authenticated to this server we never want to * apply spam filtering, because presumably they're trustworthy. @@ -95,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) { @@ -107,24 +87,23 @@ int spam_assassin(struct CtdlMessage *msg) { return(0); } + CCC->SBuf.Buf = NewStrBuf(); + CCC->sMigrateBuf = NewStrBuf(); + 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)); /* Message */ - CC->redirect_buffer = malloc(SIZ); - CC->redirect_len = 0; - CC->redirect_alloc = SIZ; + CCC->redirect_buffer = NewStrBufPlain(NULL, SIZ); CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_ALL, 0, 1, 0); msgtext = CC->redirect_buffer; - msglen = CC->redirect_len; CC->redirect_buffer = NULL; - CC->redirect_len = 0; - CC->redirect_alloc = 0; - sock_write(&sock, msgtext, msglen); - free(msgtext); + sock_write(&sock, SKEY(msgtext)); + FreeStrBuf(&msgtext); /* Close one end of the socket connection; this tells SpamAssassin * that we're done. @@ -133,65 +112,60 @@ 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->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"; }