*snip* Fixed infinite loop where sender = recipient
Eric
diff -Naur dbmail-1.2.8a/pipe.c dbmail-1.2.8a-efung/pipe.c --- dbmail-1.2.8a/pipe.c 2004-06-09 00:01:35.000000000 +1000 +++ dbmail-1.2.8a-efung/pipe.c 2004-06-11 15:01:07.000000000 +1000 @@ -150,6 +150,8 @@ char *reply_body, *notify_address; FILE *instream = stdin; field_t val; + struct mime_record *delivered_to; + struct element *delivered_to_el; /* step 1. inserting first message @@ -468,7 +470,56 @@ trace(TRACE_DEBUG, "insert_messages(): no reply body specified, skipping auto-reply"); else { + /* + * Requires: + * userid = full realm email address + * + * Assumptions: + * MIME_VALUE_MAX > column size of users.userid + * + * Thoughts: + * Added Delivered-To Mime block into mime list as a temporary fix for + * missing Auto Reply From: Fields + * Delivered-to: header should be supplied by MDA which this is + * There isn't an easy way to do this in the current architecture + * As Alias->Username is many-to-one + * No memory is non fatal for this code. + * + * Suggested Future Implementation: + * Add Delivered-To for each message inserted + * However this will probably require a re-write of insert-messages() + * Due to alias information being lost during insertion of each message + * Then re-read each message header to regenerate headerfields + */ + delivered_to = (struct mime_record *)my_malloc(sizeof(struct mime_record)); + + if (!delivered_to) + { + trace(TRACE_ERROR, "insert_messages(): out of memory for delivered-to\n"); + } + else + { + strcpy(delivered_to->field, "Delivered-To"); + strcpy(delivered_to->value, auth_get_userid(&bounce_userid)); + if ( !list_nodeadd(headerfields,delivered_to,sizeof (*delivered_to))) + { + trace(TRACE_ERROR, "insert_messages(): cannot add element to list\n"); + my_free(delivered_to); + delivered_to = NULL; + } + } send_reply(headerfields, reply_body); + + if (!delivered_to) + { + delivered_to_el = list_nodepop(headerfields); + delivered_to = delivered_to_el->data; + my_free(delivered_to); + delivered_to = NULL; + my_free(delivered_to_el); + delivered_to_el = NULL; + } + my_free(reply_body); } } @@ -649,7 +700,19 @@ subject = record->value; trace(TRACE_DEBUG, "send_reply(): found SUBJECT [%s]", subject); } - else if (strcasecmp(record->field, "deliver-to") == 0) + /* + * Multiple Delivered-To Headers + * If a Delivered-To address is already in place, ignore. + * Internal mime record will always be popped first + * But old record kept in place in case of non-fatal error adding + * Internal record + */ + else if (strcasecmp(record->field, "delivered-to") == 0 && to == NULL) + { + to = record->value; + trace(TRACE_DEBUG, "send_reply(): found DELIVERED-TO [%s]", to); + } + else if (strcasecmp(record->field, "deliver-to") == 0 && to == NULL) { to = record->value; trace(TRACE_DEBUG, "send_reply(): found TO [%s]", to); @@ -664,6 +727,11 @@ my_free(sendmail); return 0; } + else if ( (replyto && strcasecmp(replyto, to) == 0) || (from && strcasecmp(from, to) == 0) ) + { + trace(TRACE_DEBUG, "send_reply(): recipient is the same as sender, aborting"); + return 0; + } trace(TRACE_DEBUG, "send_reply(): header fields scanned; opening pipe to sendmail");