dovecot-2.2-pigeonhole: Adjusted Sieve implementation and testsu...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Wed Feb 29 23:52:02 EET 2012


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/b88a6d76839b
changeset: 1605:b88a6d76839b
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Wed Feb 29 22:51:56 2012 +0100
description:
Adjusted Sieve implementation and testsuite to Dovecot's new smtp_client_open() API.

diffstat:

 src/lib-sieve-tool/mail-raw.c                      |    9 +-
 src/lib-sieve/cmd-redirect.c                       |   42 ++----
 src/lib-sieve/edit-mail.c                          |    2 +-
 src/lib-sieve/plugins/enotify/mailto/ntfy-mailto.c |  151 +++++++++++++-----------
 src/lib-sieve/plugins/notify/cmd-notify.c          |  109 ++++++++++-------
 src/lib-sieve/plugins/vacation/cmd-vacation.c      |   63 +++++----
 src/lib-sieve/rfc2822.c                            |   87 ++++----------
 src/lib-sieve/rfc2822.h                            |   18 +-
 src/lib-sieve/sieve-actions.c                      |  128 +++++++++++----------
 src/lib-sieve/sieve-smtp.c                         |    4 +-
 src/lib-sieve/sieve-smtp.h                         |    2 +-
 src/lib-sieve/sieve-types.h                        |    2 +-
 src/plugins/lda-sieve/lda-sieve-plugin.c           |    5 +-
 src/sieve-tools/sieve-test.c                       |    9 +-
 src/testsuite/testsuite-smtp.c                     |   19 +-
 src/testsuite/testsuite-smtp.h                     |    2 +-
 16 files changed, 335 insertions(+), 317 deletions(-)

diffs (truncated from 1097 to 300 lines):

diff -r 7b8cc0897a79 -r b88a6d76839b src/lib-sieve-tool/mail-raw.c
--- a/src/lib-sieve-tool/mail-raw.c	Wed Feb 29 20:07:24 2012 +0100
+++ b/src/lib-sieve-tool/mail-raw.c	Wed Feb 29 22:51:56 2012 +0100
@@ -189,8 +189,13 @@
 	}
 
 	if ( ret < 0 ) {
-		i_fatal("Can't open delivery mail as raw: %s",
-			mailbox_get_last_error(mailr->box, NULL));
+		if ( mailfile == NULL ) {
+			i_fatal("Can't open delivery mail as raw: %s",
+				mailbox_get_last_error(mailr->box, NULL));
+		} else {
+			i_fatal("Can't open delivery mail as raw (file=%s): %s",
+				mailfile, mailbox_get_last_error(mailr->box, NULL));
+		}
 	}
 
 	mailr->trans = mailbox_transaction_begin(mailr->box, 0);
diff -r 7b8cc0897a79 -r b88a6d76839b src/lib-sieve/cmd-redirect.c
--- a/src/lib-sieve/cmd-redirect.c	Wed Feb 29 20:07:24 2012 +0100
+++ b/src/lib-sieve/cmd-redirect.c	Wed Feb 29 22:51:56 2012 +0100
@@ -5,8 +5,8 @@
 #include "ioloop.h"
 #include "str-sanitize.h"
 #include "istream.h"
-#include "istream-crlf.h"
 #include "istream-header-filter.h"
+#include "ostream.h"
 
 #include "rfc2822.h"
 
@@ -318,12 +318,9 @@
 	const struct sieve_script_env *senv = aenv->scriptenv;
 	const char *sender = sieve_message_get_sender(msgctx);
 	const char *recipient = sieve_message_get_final_recipient(msgctx);
-	struct istream *input, *crlf_input;
+	struct istream *input;
+	struct ostream *output;
 	void *smtp_handle;
-	FILE *f;
-	const unsigned char *data;
-	size_t size;
-	int ret;
 	
 	/* Just to be sure */
 	if ( !sieve_smtp_available(senv) ) {
@@ -336,30 +333,25 @@
 		return FALSE;
 		
 	/* Open SMTP transport */
-	smtp_handle = sieve_smtp_open(senv, ctx->to_address, sender, &f);
+	smtp_handle = sieve_smtp_open(senv, ctx->to_address, sender, &output);
 
 	/* Remove unwanted headers */
 	input = i_stream_create_header_filter
-		(input, HEADER_FILTER_EXCLUDE, hide_headers,
-			N_ELEMENTS(hide_headers), null_header_filter_callback, NULL);
-	
-	/* Make sure the message contains CRLF consistently */
-	crlf_input = i_stream_create_crlf(input);
+		(input, HEADER_FILTER_EXCLUDE | HEADER_FILTER_NO_CR, hide_headers,
+			N_ELEMENTS(hide_headers), null_header_filter_callback, NULL);	
 
-	/* Prepend sieve headers (should not affect signatures) */
-	rfc2822_header_field_write(f, "X-Sieve", SIEVE_IMPLEMENTATION);
-	if ( recipient != NULL )
-		rfc2822_header_field_write(f, "X-Sieve-Redirected-From", recipient);
+	T_BEGIN {
+		string_t *hdr = t_str_new(256);
+		
+		/* Prepend sieve headers (should not affect signatures) */
+		rfc2822_header_write(hdr, "X-Sieve", SIEVE_IMPLEMENTATION);
+		if ( recipient != NULL )
+			rfc2822_header_write(hdr, "X-Sieve-Redirected-From", recipient);
+	  o_stream_send(output, str_data(hdr), str_len(hdr));
+	} T_END;
 
-	/* Pipe the message to the outgoing SMTP transport */
-	while ((ret = i_stream_read_data(crlf_input, &data, &size, 0)) > 0) {	
-		if (fwrite(data, size, 1, f) == 0)
-			break;
-		i_stream_skip(crlf_input, size);
-	}
-
-	i_stream_unref(&crlf_input);
-	i_stream_unref(&input);
+	o_stream_send_istream(output, input);
+  i_stream_unref(&input);
 
 	/* Close SMTP transport */
 	if ( !sieve_smtp_close(senv, smtp_handle) ) {
diff -r 7b8cc0897a79 -r b88a6d76839b src/lib-sieve/edit-mail.c
--- a/src/lib-sieve/edit-mail.c	Wed Feb 29 20:07:24 2012 +0100
+++ b/src/lib-sieve/edit-mail.c	Wed Feb 29 22:51:56 2012 +0100
@@ -762,7 +762,7 @@
 
 		message_header_encode(value, enc_value);
 
-		lines = rfc2822_header_field_append
+		lines = rfc2822_header_append
 			(data, field_name, str_c(enc_value), edmail->crlf, &field->body_offset);
 
 		/* Copy to new field */
diff -r 7b8cc0897a79 -r b88a6d76839b src/lib-sieve/plugins/enotify/mailto/ntfy-mailto.c
--- a/src/lib-sieve/plugins/enotify/mailto/ntfy-mailto.c	Wed Feb 29 20:07:24 2012 +0100
+++ b/src/lib-sieve/plugins/enotify/mailto/ntfy-mailto.c	Wed Feb 29 22:51:56 2012 +0100
@@ -23,6 +23,7 @@
 #include "str.h"
 #include "ioloop.h"
 #include "str-sanitize.h"
+#include "ostream.h"
 #include "message-date.h"
 #include "mail-storage.h"
 
@@ -386,9 +387,11 @@
 	const char *body = mtctx->uri->body;
 	string_t *to, *cc;
 	const struct uri_mailto_recipient *recipients;
+	const struct uri_mailto_header_field *headers;
 	void *smtp_handle;
-	unsigned int count, i;
-	FILE *f;
+	struct ostream *output;
+	string_t *msg;
+	unsigned int count, i, hcount, h;
 	const char *outmsgid;
 
 	/* Get recipients */
@@ -461,74 +464,81 @@
 		}
 	}
 
+	msg = t_str_new(512);
+	outmsgid = sieve_message_get_new_id(senv);
+	
+	rfc2822_header_write(msg, "X-Sieve", SIEVE_IMPLEMENTATION);
+	rfc2822_header_write(msg, "Message-ID", outmsgid);
+	rfc2822_header_write(msg, "Date", message_date_create(ioloop_time));
+	rfc2822_header_utf8_printf(msg, "Subject", "%s", subject);
+
+	rfc2822_header_utf8_printf(msg, "From", "%s", from);
+
+	if ( to != NULL )
+		rfc2822_header_utf8_printf(msg, "To", "%s", str_c(to));
+	
+	if ( cc != NULL )
+		rfc2822_header_utf8_printf(msg, "Cc", "%s", str_c(cc));
+		
+	rfc2822_header_printf(msg, "Auto-Submitted", 
+		"auto-notified; owner-email=\"%s\"", recipient);
+	rfc2822_header_write(msg, "Precedence", "bulk");
+
+	/* Set importance */
+	switch ( nact->importance ) {
+	case 1:
+		rfc2822_header_write(msg, "X-Priority", "1 (Highest)");
+		rfc2822_header_write(msg, "Importance", "High");
+		break;
+	case 3:
+		rfc2822_header_write(msg, "X-Priority", "5 (Lowest)");
+		rfc2822_header_write(msg, "Importance", "Low");
+		break;
+	case 2:
+	default:
+		rfc2822_header_write(msg, "X-Priority", "3 (Normal)");
+		rfc2822_header_write(msg, "Importance", "Normal");
+		break;
+	}
+	
+	/* Add custom headers */
+	
+	headers = array_get(&mtctx->uri->headers, &hcount);
+	for ( h = 0; h < hcount; h++ ) {
+		const char *name = rfc2822_header_field_name_sanitize(headers[h].name);
+	
+		rfc2822_header_write(msg, name, headers[h].body);
+	}
+		
+	/* Generate message body */
+
+	rfc2822_header_write(msg, "MIME-Version", "1.0");
+	if ( body != NULL ) {
+		if (_contains_8bit(body)) {
+			rfc2822_header_write
+				(msg, "Content-Type", "text/plain; charset=utf-8");
+			rfc2822_header_write(msg, "Content-Transfer-Encoding", "8bit");
+		} else {
+			rfc2822_header_write
+				(msg, "Content-Type", "text/plain; charset=us-ascii");
+			rfc2822_header_write(msg, "Content-Transfer-Encoding", "7bit");
+		}		
+		str_printfa(msg, "\r\n%s\r\n", body);
+		
+	} else {
+		rfc2822_header_write
+			(msg, "Content-Type", "text/plain; charset=US-ASCII");
+		rfc2822_header_write(msg, "Content-Transfer-Encoding", "7bit");
+
+		str_append(msg, "\r\nNotification of new message.\r\n");
+	}
+
 	/* Send message to all recipients */
 	for ( i = 0; i < count; i++ ) {
-		const struct uri_mailto_header_field *headers;
-		unsigned int h, hcount;
+		smtp_handle = sieve_smtp_open
+			(senv, recipients[i].normalized, from_smtp, &output);
 
-        smtp_handle = sieve_smtp_open
-            (senv, recipients[i].normalized, from_smtp, &f);
-		outmsgid = sieve_message_get_new_id(senv);
-	
-		rfc2822_header_field_write(f, "X-Sieve", SIEVE_IMPLEMENTATION);
-		rfc2822_header_field_write(f, "Message-ID", outmsgid);
-		rfc2822_header_field_write(f, "Date", message_date_create(ioloop_time));
-		rfc2822_header_field_utf8_printf(f, "Subject", "%s", subject);
-
-		rfc2822_header_field_utf8_printf(f, "From", "%s", from);
-
-		if ( to != NULL )
-			rfc2822_header_field_utf8_printf(f, "To", "%s", str_c(to));
-		
-		if ( cc != NULL )
-			rfc2822_header_field_utf8_printf(f, "Cc", "%s", str_c(cc));
-			
-		rfc2822_header_field_printf(f, "Auto-Submitted", 
-			"auto-notified; owner-email=\"%s\"", recipient);
-		rfc2822_header_field_write(f, "Precedence", "bulk");
-
-		/* Set importance */
-		switch ( nact->importance ) {
-		case 1:
-			rfc2822_header_field_write(f, "X-Priority", "1 (Highest)");
-			rfc2822_header_field_write(f, "Importance", "High");
-			break;
-		case 3:
-			rfc2822_header_field_write(f, "X-Priority", "5 (Lowest)");
-			rfc2822_header_field_write(f, "Importance", "Low");
-			break;
-		case 2:
-		default:
-			rfc2822_header_field_write(f, "X-Priority", "3 (Normal)");
-			rfc2822_header_field_write(f, "Importance", "Normal");
-			break;
-		}
-		
-		/* Add custom headers */
-		
-		headers = array_get(&mtctx->uri->headers, &hcount);
-		for ( h = 0; h < hcount; h++ ) {
-			const char *name = rfc2822_header_field_name_sanitize(headers[h].name);
-		
-			rfc2822_header_field_write(f, name, headers[h].body);
-		}
-			
-		/* Generate message body */
-		if ( body != NULL ) {
-			if (_contains_8bit(body)) {
-				rfc2822_header_field_write(f, "MIME-Version", "1.0");
-				rfc2822_header_field_write
-					(f, "Content-Type", "text/plain; charset=UTF-8");
-				rfc2822_header_field_write(f, "Content-Transfer-Encoding", "8bit");
-			}
-			
-			fprintf(f, "\r\n");
-			fprintf(f, "%s\r\n", body);
-			
-		} else {
-			fprintf(f, "\r\n");
-			fprintf(f, "Notification of new message.\r\n");
-		}
+		o_stream_send(output, str_data(msg), str_len(msg));
 	
 		if ( sieve_smtp_close(senv, smtp_handle) ) {
 			sieve_enotify_global_info(nenv, 
@@ -552,6 +562,7 @@
 	const char *const *headers;
 	const char *sender = sieve_message_get_sender(nenv->msgctx);
 	const char *recipient = sieve_message_get_final_recipient(nenv->msgctx);
+	bool result;
 
 	/* Is the recipient unset? 
 	 */
@@ -578,7 +589,11 @@
 		}
 	}
 
-	return ntfy_mailto_send(nenv, nact, recipient);
+	T_BEGIN {
+		result = ntfy_mailto_send(nenv, nact, recipient);
+	} T_END;
+	
+	return result;
 }
 
 
diff -r 7b8cc0897a79 -r b88a6d76839b src/lib-sieve/plugins/notify/cmd-notify.c
--- a/src/lib-sieve/plugins/notify/cmd-notify.c	Wed Feb 29 20:07:24 2012 +0100
+++ b/src/lib-sieve/plugins/notify/cmd-notify.c	Wed Feb 29 22:51:56 2012 +0100


More information about the dovecot-cvs mailing list