]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/sieve/serv_sieve.c
/* If the last item in a list of recipients was truncated to a partial address,
[citadel.git] / citadel / modules / sieve / serv_sieve.c
index 46957b5971740a6f02ee7c06962eef7cc9b53841..473a8dcf9cc7e8860f54f48b548cb3db46473298 100644 (file)
@@ -116,7 +116,7 @@ int ctdl_redirect(sieve2_context_t *s, void *my)
                return SIEVE2_ERROR_BADARGS;
        }
 
-       CtdlSubmitMsg(msg, valid, NULL);
+       CtdlSubmitMsg(msg, valid, NULL, 0);
        cs->cancel_implicit_keep = 1;
        free_recipients(valid);
        CtdlFreeMessage(msg);
@@ -508,9 +508,9 @@ void sieve_do_msg(long msgnum, void *userdata) {
        size_t headers_len = 0;
        int len = 0;
 
-       if (userdata == NULL)
+       if (u == NULL)
        {
-               CtdlLogPrintf(CTDL_EMERG, "Cant process Message <%ld>without Userdata!\n", msgnum);
+               CtdlLogPrintf(CTDL_EMERG, "Can't process message <%ld> without userdata!\n", msgnum);
                return;
        }
 
@@ -523,17 +523,24 @@ void sieve_do_msg(long msgnum, void *userdata) {
 
        /*
         * Grab the message headers so we can feed them to libSieve.
+        * Use HEADERS_ONLY rather than HEADERS_FAST in order to include second-level headers.
         */
        CC->redirect_buffer = malloc(SIZ);
        CC->redirect_len = 0;
        CC->redirect_alloc = SIZ;
-       CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_ONLY, 0, 1);
+       CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_ONLY, 0, 1, 0);
        my.rfc822headers = CC->redirect_buffer;
        headers_len = CC->redirect_len;
        CC->redirect_buffer = NULL;
        CC->redirect_len = 0;
        CC->redirect_alloc = 0;
 
+       if (u == NULL)
+       {
+               CtdlLogPrintf(CTDL_EMERG, "userdata got clobbz0red!  aaaaaaaaghhh!!!!\n");
+               abort();
+       }
+
        /*
         * libSieve clobbers the stack if it encounters badly formed
         * headers.  Sanitize our headers by stripping nonprintable
@@ -626,14 +633,35 @@ void sieve_do_msg(long msgnum, void *userdata) {
 
        CtdlFreeMessage(msg);
 
+       if (u == NULL)
+       {
+               CtdlLogPrintf(CTDL_EMERG, "userdata got clobbz0red!  aaaaaaaaghhh!!!!\n");
+               abort();
+       }
+
+
+       CtdlLogPrintf(CTDL_DEBUG, "HEADERS-------\n\e[31m%s\e[0m\n", my.rfc822headers);
+
        sieve2_setvalue_string(sieve2_context, "allheaders", my.rfc822headers);
        
+       if (u == NULL)
+       {
+               CtdlLogPrintf(CTDL_EMERG, "userdata got clobbz0red!  aaaaaaaaghhh!!!!\n");
+               abort();
+       }
+
        CtdlLogPrintf(CTDL_DEBUG, "Calling sieve2_execute()\n");
        res = sieve2_execute(sieve2_context, &my);
        if (res != SIEVE2_OK) {
                CtdlLogPrintf(CTDL_CRIT, "sieve2_execute() returned %d: %s\n", res, sieve2_errstr(res));
        }
 
+       if (u == NULL)
+       {
+               CtdlLogPrintf(CTDL_EMERG, "userdata got clobbz0red!  aaaaaaaaghhh!!!!\n");
+               abort();
+       }
+
        free(my.rfc822headers);
        my.rfc822headers = NULL;
 
@@ -646,6 +674,12 @@ void sieve_do_msg(long msgnum, void *userdata) {
                CtdlDeleteMessages(CC->room.QRname, &msgnum, 1, "");
        }
 
+       if (u == NULL)
+       {
+               CtdlLogPrintf(CTDL_EMERG, "userdata got clobbz0red!  aaaaaaaaghhh!!!!\n");
+               abort();
+       }
+
        CtdlLogPrintf(CTDL_DEBUG, "Completed sieve processing on msg <%ld>\n", msgnum);
        u->lastproc = msgnum;
 
@@ -988,6 +1022,15 @@ void msiv_load(struct sdm_userdata *u) {
 }
 
 void msiv_store(struct sdm_userdata *u, int yes_write_to_disk) {
+/*
+ * Initialise the sieve configs last processed message number.
+ * We don't need to get the highest message number for the users inbox since the systems
+ * highest message number will be higher than that and loer than this scripts message number
+ * This prevents this new script from processing any old messages in the inbox.
+ * Most importantly it will prevent vacation messages being sent to lots of old messages
+ * in the inbox.
+ */
+       u->lastproc = CtdlGetCurrentMessageNumber();
        rewrite_ctdl_sieve_config(u, yes_write_to_disk);
 }