/*
- * $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"
#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"
#ifdef HAVE_LIBDSPAM
+#define CONFIG_DEFAULT file_dpsam_conf
+#define LOGDIR file_dspam_log
+
-#undef HAVE_CONFIG_H
+//#define HAVE_CONFIG_H
#include <dspam/libdspam.h>
-#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");/* <which database backend do we prefer? */
+/// libdspam_init("bdb");/* <which database backend do we prefer? */
}
void dspam_do_msg(long msgnum, void *userdata)
{
+ char *msgtext;
DSPAM_CTX *CTX; /* DSPAM Context */
struct CtdlMessage *msg;
struct _ds_spam_signature SIG; /* signature */
CTX = *(DSPAM_CTX**) userdata;
msg = CtdlFetchMessage(msgnum, 0);
if (msg == NULL) return;
- CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_ALL, 0, 1);
+
+
+ /* Message */
+ CC->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");
// 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 */
/* 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);
CTDL_MODULE_INIT(dspam)
{
+ return "disabled.";
if (!threading)
{
#ifdef HAVE_LIBDSPAM
#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";
}