X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fdspam%2Fserv_dspam.c;h=7454634f780cd040d428ae9e9543fa9da0d41aa7;hb=b26e3e79fcb15dc1b46f4c7710a6bafdc6472950;hp=90de7191476302e8c84a832d6a49ab542e691567;hpb=c6696c37e50f7c75adcf79e561ba97f55977b072;p=citadel.git diff --git a/citadel/modules/dspam/serv_dspam.c b/citadel/modules/dspam/serv_dspam.c index 90de71914..7454634f7 100644 --- a/citadel/modules/dspam/serv_dspam.c +++ b/citadel/modules/dspam/serv_dspam.c @@ -1,10 +1,22 @@ /* - * $Id: serv_dspam.c 5876 2007-12-10 23:22:03Z dothebart $ - * * This module glues libDSpam to the Citadel server in order to implement * DSPAM Spamchecking * - * This code is released under the terms of the GNU General Public License. + * Copyright (c) 2012 by the citadel.org team + * + * 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. + * + * + * + * 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. + * + * + * + * */ #include "sysdep.h" @@ -37,8 +49,6 @@ #include "citserver.h" #include "support.h" #include "config.h" -#include "room_ops.h" -#include "policy.h" #include "database.h" #include "msgbase.h" #include "internet_addressing.h" @@ -48,33 +58,81 @@ #ifdef HAVE_LIBDSPAM +#define CONFIG_DEFAULT file_dpsam_conf +#define LOGDIR file_dspam_log + -#undef HAVE_CONFIG_H +//#define HAVE_CONFIG_H #include -#define HAVE_CONFIG_H +//#define HAVE_CONFIG_H + +typedef struct stringlist stringlist; + +struct stringlist { + char *Str; + long len; + stringlist *Next; +}; + + /* * Citadel protocol to manage sieve scripts. * This is basically a simplified (read: doesn't resemble IMAP) version * of the 'managesieve' protocol. */ void cmd_tspam(char *argbuf) { - - + char buf[SIZ]; + long len; + long count; + stringlist *Messages; + stringlist *NextMsg; + + Messages = NULL; + NextMsg = NULL; + count = 0; + if (CtdlAccessCheck(ac_room_aide)) return; + if (atoi(argbuf) == 0) { + cprintf("%d Ok.\n", CIT_OK); + return; + } + cprintf("%d Send info...\n", SEND_LISTING); + + do { + len = client_getln(buf, sizeof buf); + if (strcmp(buf, "000")) { + if (Messages == NULL) { + Messages = malloc (sizeof (stringlist)); + NextMsg = Messages; + } + else { + Messages->Next = malloc (sizeof (stringlist)); + NextMsg = NextMsg->Next; + } + NextMsg->Next = NULL; + NextMsg->Str = malloc (len+1); + NextMsg->len = len; + memcpy (NextMsg->Str, buf, len + 1);/// maybe split spam /ham per line? + count++; + } + } while (strcmp(buf, "000")); +/// is there a way to filter foreachmessage by a list? /* tag mails as spam or Ham */ /* probably do: dspam_init(ctdl_dspam_dir); dspam_process dspam_addattribute; dspam_destroy*/ // extract DSS_ERROR or DSS_CORPUS from the commandline. error->ham; corpus -> spam? + /// todo: send answer listing... } void ctdl_dspam_init(void) { - libdspam_init("bdb");/* redirect_buffer = malloc(SIZ); + CC->redirect_len = 0; + CC->redirect_alloc = SIZ; + CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_ALL, 0, 1, 0); + msgtext = CC->redirect_buffer; +// don't need? msglen = CC->redirect_len; + CC->redirect_buffer = NULL; + CC->redirect_len = 0; + CC->redirect_alloc = 0; /* Call DSPAM's processor with the message text */ - if (dspam_process (CTX, msg->cm_fields['A']) != 0) + if (dspam_process (CTX, msgtext) != 0) { - lprintf(CTDL_CRIT, "ERROR: dspam_process failed"); + free(msgtext); + syslog(LOG_CRIT, "ERROR: dspam_process failed"); return; } if (CTX->signature == NULL) { - lprintf(CTDL_CRIT,"No signature provided\n"); + syslog(LOG_CRIT,"No signature provided\n"); } else { /* Copy to a safe place */ + // TODO: len -> cm_fields? + msg->cm_fields[eErrorMsg] = malloc (CTX->signature->length * 2); + size_t len = CtdlEncodeBase64(msg->cm_fields[eErrorMsg], CTX->signature->data, CTX->signature->length, 0); - SIG.data = malloc (CTX->signature->length); - if (SIG.data != NULL) - memcpy (SIG.data, CTX->signature->data, CTX->signature->length); + if (msg->cm_fields[eErrorMsg][len - 1] == '\n') { + msg->cm_fields[eErrorMsg][len - 1] = '\0'; + } } + free(msgtext); + SIG.length = CTX->signature->length; /* Print processing results */ - printf ("Probability: %2.4f Confidence: %2.4f, Result: %s\n", + syslog(LOG_DEBUG, "Probability: %2.4f Confidence: %2.4f, Result: %s\n", CTX->probability, CTX->confidence, (CTX->result == DSR_ISSPAM) ? "Spam" : "Innocent"); @@ -125,22 +200,25 @@ int serv_dspam_room(struct ctdlroom *room) // dspam_init (cc->username, NULL, ctdl_dspam_home, DSM_PROCESS, // DSF_SIGNATURE | DSF_NOISE); /// todo: if roomname = spam / ham -> learn! - if (room->QRflags & QR_PRIVATE) /* Are we sending to a private mailbox? */ + if ((room->QRflags & QR_PRIVATE) &&/* Are we sending to a private mailbox? */ + (strstr(room->QRname, ".Mail")!=NULL)) + { char User[64]; // maybe we should better get our realname here? snprintf(User, 64, "%ld", room->QRroomaide); - + extract_token(User, room->QRname, 0, '.', sizeof(User)); CTX = dspam_init(User, NULL, ctdl_dspam_dir, DSM_PROCESS, DSF_SIGNATURE | DSF_NOISE); } + else return 0;//// /// else -> todo: global user for public rooms etc. if (CTX == NULL) { - lprintf(CTDL_CRIT, "ERROR: dspam_init failed!\n"); + syslog(LOG_CRIT, "ERROR: dspam_init failed!\n"); return ERROR + INTERNAL_ERROR; } /* Use graham and robinson algorithms, graham's p-values */ @@ -149,7 +227,7 @@ int serv_dspam_room(struct ctdlroom *room) /* Use CHAIN tokenizer */ CTX->tokenizer = DSZ_CHAIN; - CtdlForEachMessage(MSGS_GT, NULL, NULL, NULL, NULL, + CtdlForEachMessage(MSGS_GT, 1, NULL, NULL, NULL, dspam_do_msg, (void *) &CTX); @@ -164,6 +242,7 @@ void serv_dspam_shutdown (void) CTDL_MODULE_INIT(dspam) { + return "disabled."; if (!threading) { #ifdef HAVE_LIBDSPAM @@ -178,12 +257,12 @@ CTDL_MODULE_INIT(dspam) #else /* HAVE_LIBDSPAM */ - lprintf(CTDL_INFO, "This server is missing libdspam Spam filtering will be disabled.\n"); + syslog(LOG_INFO, "This server is missing libdspam Spam filtering will be disabled.\n"); #endif /* HAVE_LIBDSPAM */ } - /* return our Subversion id for the Log */ - return "$Id: serv_dspam.c 5876 2007-12-10 23:22:03Z dothebart $"; + /* return our module name for the log */ + return "dspam"; }