Applied dtx's patch which adds the option to flag spam
authorArt Cancro <ajc@citadel.org>
Thu, 9 Oct 2008 14:08:27 +0000 (14:08 +0000)
committerArt Cancro <ajc@citadel.org>
Thu, 9 Oct 2008 14:08:27 +0000 (14:08 +0000)
with an extra header instead of rejecting it.

citadel/control.c
citadel/include/dtds/config-defs.h
citadel/modules/spam/serv_spam.c
citadel/tuiconfig.c
webcit/siteconfig.c
webcit/static/t/tab_siteconfig_network.html

index 989e36c9f4564b54c37360a1f150387d14700ca2..305ed3d2332c2f0ee2b1a9b6b459ec452b8731ca 100644 (file)
@@ -383,6 +383,7 @@ void cmd_conf(char *argbuf)
                cprintf("%d\n", config.c_xmpp_s2s_port);
                cprintf("%ld\n", config.c_pop3_fetch);
                cprintf("%ld\n", config.c_pop3_fastest);
+               cprintf("%d\n", config.c_spam_flag_only);
                cprintf("000\n");
        }
 
@@ -636,6 +637,9 @@ void cmd_conf(char *argbuf)
                        case 65:
                                config.c_pop3_fastest = atol(buf);
                                break;
+                       case 66:
+                               config.c_spam_flag_only = atoi(buf);
+                               break;
                        }
                        ++a;
                }
index a71510faab0d3d17cef32bbf07119635c626e740..d14b3b4f49b242b46939fdb998313754ac6a6cbc 100644 (file)
@@ -88,3 +88,4 @@ CFG_VALUE(INTEGER(c_xmpp_c2s_port),           " XMPP client-to-server port (usually 5222)
 CFG_VALUE(INTEGER(c_xmpp_s2s_port),            " XMPP server-to-server port (usually 5269)");
 CFG_VALUE(TIME(c_pop3_fetch),          " How often to fetch POP3 messages");
 CFG_VALUE(TIME(c_pop3_fastest),                " Users can specify POP3 fetching this often");
+CFG_VALUE(INTEGER(c_spam_flag_only),   " 1 = flag instead of reject spam");
index 249f52e3e23e1269ca82db29dedce793bd40548d..b8ccfb8d69517b2acd76564acddb602c0e1145fa 100644 (file)
@@ -129,15 +129,50 @@ int spam_assassin(struct CtdlMessage *msg) {
                 goto bail;
         }
         CtdlLogPrintf(CTDL_DEBUG, "<%s\n", buf);
-       if (!strncasecmp(buf, "Spam: True", 10)) {
-               is_spam = 1;
-       }
+        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");
+               int headerlen;
+               int newmsgsize;
+               int oldmsgsize;
+
+               char sastatus[10];
+               char sascore[10];
+               char saoutof[10];
+               int numscore;
+
+                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;
+               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);
+
+               memmove(msg->cm_fields['M']+headerlen,msg->cm_fields['M'],oldmsgsize);
+               memcpy(msg->cm_fields['M'],buf,headerlen);
+
+       } else {
+                CtdlLogPrintf(CTDL_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']);
+               if (is_spam) {
+                       if (msg->cm_fields['0'] != NULL) {
+                               free(msg->cm_fields['0']);
+                       }
+                       msg->cm_fields['0'] = strdup("message rejected by spam filter");
                }
-               msg->cm_fields['0'] = strdup("message rejected by spam filter");
        }
 
 bail:  close(sock);
index 15461953e83da2e54421dfd4964611daa49fa163..5197abeae8e662f819a03fd42cf5df7b54cc541a 100644 (file)
@@ -63,7 +63,7 @@ extern int screenwidth;
 void do_system_configuration(CtdlIPC *ipc)
 {
 
-#define NUM_CONFIGS 65
+#define NUM_CONFIGS 67
 
        char buf[256];
        char sc[NUM_CONFIGS][256];
@@ -186,6 +186,10 @@ void do_system_configuration(CtdlIPC *ipc)
        a = (a ? 0 : 1);
        snprintf(sc[25], sizeof sc[25], "%d", a);
 
+       snprintf(sc[66], sizeof sc[66], "%d", (boolprompt(
+               "Flag messages as spam instead of rejecting",
+               atoi(&sc[66][0]))));
+
        /* This logic flips the question around, because it's one of those
         * situations where 0=yes and 1=no
         */
index 3022304adb98672bdf9b0128bcd269e72ba1c686..27271e334cc8d5aea21b38a0cff75ba23283da71 100644 (file)
@@ -679,6 +679,14 @@ void display_siteconfig(void)
                        sprintf(&pop3[strlen(pop3)], "<input type=\"text\" name=\"c_pop3_fastest\" MAXLENGTH=\"5\" value=\"%s\">\n", buf);
                        sprintf(&pop3[strlen(pop3)], "</TD></TR>\n");
                        break;
+               case 66: /* Flag spam */
+                       sprintf(&network[strlen(network)], "<TR><TD>");
+                       sprintf(&network[strlen(network)], _("Flag message as spam, instead of rejecting it"));
+                       sprintf(&network[strlen(network)], "</TD><TD>");
+                       sprintf(&network[strlen(network)], "<input type=\"checkbox\" NAME=\"c_spam_flag_only\" VALUE=\"yes\" %s>",
+                               (atoi(buf) ? "CHECKED" : ""));
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
                        
                }
        
@@ -857,7 +865,8 @@ CfgMapping ServerConfig[] = {
        {CFG_STR, HKEY("c_xmpp_c2s_port")},
        {CFG_STR, HKEY("c_xmpp_s2s_port")},
        {CFG_STR, HKEY("c_pop3_fetch")},
-       {CFG_STR, HKEY("c_pop3_fastest")}
+       {CFG_STR, HKEY("c_pop3_fastest")},
+       {CFG_YES , HKEY("c_spam_flag_only")}
 };
 
 
index 4380663b204ab99102dc6ddbfbfad0e967bf7576..061a1d672eb7b617e1bcf9877e85022a725c0dd7 100644 (file)
@@ -10,6 +10,9 @@
 <tr><td><?_("Correct forged From: lines during authenticated SMTP")></td><td>
 <input type="checkbox" NAME="c_rfc822_strict_from" VALUE="yes" <?%("COND:SERVCFG", 1, "c_rfc822_strict_from", 1, "", "CHECKED")>></td></tr>
 
+<tr><td><?_("Flag message as spam, instead of rejecting it")></td><td>
+<input type="checkbox" NAME="c_spam_flag_only" VALUE="yes" <?%("COND:SERVCFG", 1, "c_spam_flag_only", 1, "CHECKED", "")>></td></tr>
+
 <tr><td><?_("IMAP listener port (-1 to disable)")></td><td>
 <input type="text" NAME="c_imap_port" MAXLENGTH="5" VALUE='<?SERV:CFG("c_imap_port")>'></td></tr>