-----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

Reply via email to