]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/sieve/serv_sieve.c
* sanitize parameters, check pointers for NULL
[citadel.git] / citadel / modules / sieve / serv_sieve.c
index 010e76b43de4a8936bcfeca943173f4fb1b6d684..aeb977bbb9d15c1eff647c6245bdc4c15c66301d 100644 (file)
@@ -386,9 +386,34 @@ int ctdl_getenvelope(sieve2_context_t *s, void *my)
 {
        struct ctdl_sieve *cs = (struct ctdl_sieve *)my;
 
-       lprintf(CTDL_DEBUG, "Action is GETENVELOPE\n");
-       sieve2_setvalue_string(s, "to", cs->envelope_to);
-       sieve2_setvalue_string(s, "from", cs->envelope_from);
+       lprintf(CTDL_DEBUG, "Action is GETENVELOPE\nEnvFrom: %s\n  EnvTo: %s\n",
+               cs->envelope_from, cs->envelope_to);
+
+       if (cs->envelope_from != NULL) {
+               if ((cs->envelope_from[0] != '@')&&(cs->envelope_from[strlen(cs->envelope_from)-1] != '@')) {
+                       sieve2_setvalue_string(s, "from", cs->envelope_from);
+               }
+               else {
+                       sieve2_setvalue_string(s, "from", "invalid_envelope_from@example.org");
+               }
+       }
+       else {
+               sieve2_setvalue_string(s, "from", "null_envelope_from@example.org");
+       }
+
+
+       if (cs->envelope_to != NULL) {
+               if ((cs->envelope_to[0] != '@') && (cs->envelope_to[strlen(cs->envelope_to)-1] != '@')) {
+                       sieve2_setvalue_string(s, "to", cs->envelope_to);
+               }
+               else {
+                       sieve2_setvalue_string(s, "to", "invalid_envelope_to@example.org");
+               }
+       }
+       else {
+               sieve2_setvalue_string(s, "to", "null_envelope_to@example.org");
+       }
+
        return SIEVE2_OK;
 }
 
@@ -489,6 +514,12 @@ void sieve_do_msg(long msgnum, void *userdata) {
        size_t headers_len = 0;
        int len = 0;
 
+       if (userdata == NULL)
+       {
+               lprintf(CTDL_EMERG, "Cant process Message <%ld>without Userdata!\n", msgnum);
+               return;
+       }
+
        lprintf(CTDL_DEBUG, "Performing sieve processing on msg <%ld>\n", msgnum);
 
        msg = CtdlFetchMessage(msgnum, 0);
@@ -552,9 +583,11 @@ void sieve_do_msg(long msgnum, void *userdata) {
        /* Keep track of the envelope-from address (use body-from if not found) */
        if (msg->cm_fields['P'] != NULL) {
                safestrncpy(my.envelope_from, msg->cm_fields['P'], sizeof my.envelope_from);
+               stripallbut(my.envelope_from, '<', '>');
        }
        else if (msg->cm_fields['F'] != NULL) {
                safestrncpy(my.envelope_from, msg->cm_fields['F'], sizeof my.envelope_from);
+               stripallbut(my.envelope_from, '<', '>');
        }
        else {
                strcpy(my.envelope_from, "");
@@ -572,6 +605,7 @@ void sieve_do_msg(long msgnum, void *userdata) {
        /* Keep track of the envelope-to address (use body-to if not found) */
        if (msg->cm_fields['V'] != NULL) {
                safestrncpy(my.envelope_to, msg->cm_fields['V'], sizeof my.envelope_to);
+               stripallbut(my.envelope_to, '<', '>');
        }
        else if (msg->cm_fields['R'] != NULL) {
                safestrncpy(my.envelope_to, msg->cm_fields['R'], sizeof my.envelope_to);
@@ -579,6 +613,7 @@ void sieve_do_msg(long msgnum, void *userdata) {
                        strcat(my.envelope_to, "@");
                        strcat(my.envelope_to, msg->cm_fields['D']);
                }
+               stripallbut(my.envelope_to, '<', '>');
        }
        else {
                strcpy(my.envelope_to, "");
@@ -1114,7 +1149,7 @@ void cmd_msiv(char *argbuf) {
                extract_token(script_name, argbuf, 1, '|', sizeof script_name);
                if (!IsEmptyStr(script_name)) {
                        cprintf("%d Transmit script now\n", SEND_LISTING);
-                       script_content = CtdlReadMessageBody("000", config.c_maxmsglen, NULL, 0);
+                       script_content = CtdlReadMessageBody("000", config.c_maxmsglen, NULL, 0, 0);
                        msiv_putscript(&u, script_name, script_content);
                        changes_made = 1;
                }