-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 I made an updated patch to dbmail for sieve notify, which adds some configuration variables to dbmail.conf
# Defaults to "NEW MAIL NOTIFICATION" # #SIEVE_NOTIFY_SUBJECT = # # Sender address for sieve notifications. Can be one of: fixed script recipient # Defaults to recipient. # If fixed, sieve notification will be from SIEVE_NOTIFY_SENDER, fallback to recipient # If script, sieve notifications are from the address specified in the script, fallback to recipient # If recipient, sieve notifications are from the Delivered-to header or envelope recipient address of the email # #SIEVE_NOTIFY_SENDER_TYPE = recipient # # Defaults to undefined # #SIEVE_NOTIFY_SENDER = Additionally to this, the revised patch will also subsitute some sieve script variables which were working with cyrus ($from$, $env-from$, $subject$).For forward compatibility it also substitutes the new formats with curly brackets too (e.g. ${subject}). Maybe in the end these substitutions will end up in libsieve and can be removed from dbmail? John -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org iD8DBQFHveqcd4I3jTtt9EIRAgZVAJ9PhmQz+7CV+wm0MbcTWIVPGnndvQCfdyjC 34XpJ1XtEGGAnF7o755CIPA= =OdzG -----END PGP SIGNATURE-----
diff -ur dbmail-2.2.9/modules/sortsieve.c dbmail-2.2.9-patch/modules/sortsieve.c --- dbmail-2.2.9/modules/sortsieve.c 2008-02-09 13:08:28.000000000 +0100 +++ dbmail-2.2.9-patch/modules/sortsieve.c 2008-02-21 20:45:22.000000000 +0100 @@ -172,6 +172,8 @@ const char *rc_to, *rc_from; int importance; char * const * options; + field_t val; + field_t fixed_sender; fromaddr = sieve2_getvalue_string(s, "fromaddr"); method = sieve2_getvalue_string(s, "method"); @@ -179,22 +181,37 @@ importance = sieve2_getvalue_int(s, "importance"); options = sieve2_getvalue_stringlist(s, "options"); - // FIXME: should be validated as a user might try - // to forge an address from their script. - rc_from = fromaddr; - if (!rc_from) - rc_from = dbmail_message_get_header(m->message, "Delivered-To"); + // initialize rc_from to the recipient address (default value) + rc_from = dbmail_message_get_header(m->message, "Delivered-To"); if (!rc_from) rc_from = m->message->envelope_recipient->str; - rc_to = dbmail_message_get_header(m->message, "Reply-To"); - if (!rc_to) - rc_to = dbmail_message_get_header(m->message, "Return-Path"); - -// send_notification(m->message, rc_to, rc_from, method, message); + config_get_value("SIEVE_NOTIFY_SENDER_TYPE", "DELIVERY", val); + // use script value for sender address + if (strcasecmp(val, "script") == 0) { + if(fromaddr) + rc_from = fromaddr; + } + // fixed sender address for notifications + if (strcasecmp(val, "fixed") == 0) { + config_get_value("SIEVE_NOTIFY_SENDER", "DELIVERY", val); + if (strlen(val)) + { + g_strlcpy(fixed_sender,val,FIELDSIZE); + rc_from = fixed_sender; + } + } - TRACE(TRACE_INFO, "Notification from [%s] to [%s] was not sent as notify is not supported in this release.", rc_from, rc_to); + // squirrelmail avelsieve 1.9.7 uses options to store destination address for notification + // the new ietf draft will use a URI e.g. "mailto:[EMAIL PROTECTED]" - this codes does not yet support it + rc_to = options[0]; + if (!rc_to) + { + TRACE(TRACE_ERROR, "Notification from [%s] was not sent. No destination address specified in script.", rc_from); + return SIEVE2_OK; + } + send_sieve_notification(m->message, rc_to, rc_from, method, message); return SIEVE2_OK; } @@ -660,7 +677,7 @@ } } if (sieve_config.notify) { - TRACE(TRACE_ERROR, "Sieve notify is not supported in this release."); + TRACE(TRACE_DEBUG, "Sieve notify enabled."); res = sieve2_callbacks(sieve2_context, notify_callbacks); if (res != SIEVE2_OK) { TRACE(TRACE_ERROR, "Error [%d] when calling sieve2_callbacks: [%s]", @@ -715,7 +732,7 @@ sieve2_callbacks(sieve2_context, vacation_callbacks); } if (sieve_config.notify) { - TRACE(TRACE_ERROR, "Sieve notify is not supported in this release."); + TRACE(TRACE_DEBUG, "Sieve notify enabled."); sieve2_callbacks(sieve2_context, notify_callbacks); } if (sieve_config.debug) { diff -ur dbmail-2.2.9/pipe.c dbmail-2.2.9-patch/pipe.c --- dbmail-2.2.9/pipe.c 2008-02-09 13:08:28.000000000 +0100 +++ dbmail-2.2.9-patch/pipe.c 2008-02-21 20:43:28.000000000 +0100 @@ -31,6 +31,33 @@ #define MAX_COMM_SIZE 512 #define RING_SIZE 6 +int str_replace(const char *search, const char *replace, char ** p_subject) +{ + char * position,*new_subject,*temp_str; + + if (!search) return 0; + if (!replace) return 0; + if (!(*p_subject)) return 0; + TRACE(TRACE_INFO, "trying to replace [%s] with [%s] in [%s]",search,replace,*p_subject); + temp_str = g_strdup(*p_subject); + if (!temp_str) + TRACE(TRACE_ERROR, "out of memory in str_replace"); + position = g_strstr_len(temp_str,strlen(temp_str),search); + if (position) + { + *position = '\0'; + new_subject = g_strconcat(temp_str,replace,position+strlen(search), NULL); + g_free(*p_subject); + *p_subject = new_subject; + g_free(temp_str); + return 1; + } + g_free(temp_str); + return 0; +} + + + static int valid_sender(const char *addr) { int ret = 1; @@ -331,6 +358,81 @@ return result; } + +/* + * Send a notification from sieve. + */ + +int send_sieve_notification(struct DbmailMessage *message, const char *to, const char *from, const char *method, const char *body) +{ + const char * subject; + const char * autosubheader, *msg_subject, *msg_from, *msg_env_from; + char * new_body; + int result; + field_t val; + + autosubheader = dbmail_message_get_header(message, "Auto-Submitted"); + if (autosubheader && strcasecmp(autosubheader, "sieve-notify") == 0) + { + TRACE(TRACE_MESSAGE, "Notification from [%s] to [%s] was not sent. Notify loop detected.", from, to); + return 1; + } + + if (!method) + { + TRACE(TRACE_ERROR, "Notification from [%s] to [%s] was not sent. No method specified in script.", from, to); + return 1; + } + + if (strcasecmp(method, "mailto") == 0) + { + config_get_value("SIEVE_NOTIFY_SUBJECT", "DELIVERY", val); + if (! strlen(val)) + subject = g_strdup(DEFAULT_SIEVE_NOTIFY_SUBJECT); + else + subject = g_strdup(val); + + // do variable substitutions in the notify message body + // format $variable$ is used by squirrelmail avelsieve v.1.9.7 + // but also can manage newer format ${variable} + msg_subject = dbmail_message_get_header(message, "Subject"); + msg_from = dbmail_message_get_header(message, "From"); + msg_env_from = message->envelope_recipient->str; + new_body = g_strdup(body); + // if (!new_body) + if (msg_subject) + { + str_replace("$subject$",msg_subject,&new_body); + str_replace("${subject}",msg_subject,&new_body); + } + if (msg_from) + { + str_replace("$from$",msg_from,&new_body); + str_replace("${from}",msg_from,&new_body); + } + if (msg_env_from) + { + str_replace("$env-from$",msg_env_from,&new_body); + str_replace("${env-from}",msg_env_from,&new_body); + } + + struct DbmailMessage *new_message = dbmail_message_new(); + new_message = dbmail_message_construct(new_message, to, from, subject, new_body); + dbmail_message_set_header(new_message, "Auto-Submitted", "sieve-notify"); + result = send_mail(new_message, to, from, NULL, SENDMESSAGE, SENDMAIL); + dbmail_message_free(new_message); + + if(result) + TRACE(TRACE_ERROR, "Notification from [%s] to [%s] was not sent. Error in sending message.", from, to); + + g_free(subject); + g_free(new_body); + return result; + } + + TRACE(TRACE_ERROR, "Notification from [%s] to [%s] was not sent. Unsupported method [%s].", from, to, method); + return 1; +} /* * Send an automatic reply. diff -ur dbmail-2.2.9/pipe.h dbmail-2.2.9-patch/pipe.h --- dbmail-2.2.9/pipe.h 2008-02-09 13:08:28.000000000 +0100 +++ dbmail-2.2.9-patch/pipe.h 2008-02-20 18:22:27.000000000 +0100 @@ -51,5 +51,7 @@ int send_forward_list(struct DbmailMessage *message, struct dm_list *targets, const char *from); int send_alert(u64_t user_idnr, char *subject, char *body); +int send_sieve_notification(struct DbmailMessage *message, + const char *to, const char *from, const char *method, const char *body); #endif
_______________________________________________ Dbmail-dev mailing list Dbmail-dev@dbmail.org http://twister.fastxs.net/mailman/listinfo/dbmail-dev