From e18b475b6aad99478f9e275cce78f0d869b40b8b Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Sun, 2 Nov 2008 11:36:28 +0100
Subject: [PATCH] Added UTF-8 to modified UTF-7 folder name conversion for
 compatibility with IMAP.

---
 src/lib-sieve/Makefile.am     |  3 ++-
 src/lib-sieve/cmd-keep.c      |  5 ++++-
 src/lib-sieve/ext-fileinto.c  | 41 ++++++++++++++++++++++++++++-------
 src/lib-sieve/sieve-actions.h |  3 ++-
 4 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/src/lib-sieve/Makefile.am b/src/lib-sieve/Makefile.am
index e77e6c318..0ef8ae684 100644
--- a/src/lib-sieve/Makefile.am
+++ b/src/lib-sieve/Makefile.am
@@ -6,7 +6,8 @@ AM_CPPFLAGS = \
 	-I$(dovecot_incdir) \
 	-I$(dovecot_incdir)/src/lib \
 	-I$(dovecot_incdir)/src/lib-mail \
-	-I$(dovecot_incdir)/src/lib-storage 
+	-I$(dovecot_incdir)/src/lib-storage \ 
+	-I$(dovecot_incdir)/src/lib-imap
 
 tests = \
 	tst-not.c \
diff --git a/src/lib-sieve/cmd-keep.c b/src/lib-sieve/cmd-keep.c
index 77c6ad5db..e0d8b7a98 100644
--- a/src/lib-sieve/cmd-keep.c
+++ b/src/lib-sieve/cmd-keep.c
@@ -114,7 +114,10 @@ static int cmd_keep_operation_execute
 
 	sieve_runtime_trace(renv, "KEEP action");
 	
-	/* Add store action (sieve-actions.h) to result */
+	/* Add store action (sieve-actions.h) to result
+	 *   ==> Default mailbox is expected to be represented in modified utf-7
+	 *       already. 
+	 */
 	ret = sieve_act_store_add_to_result
 		(renv, slist, SIEVE_SCRIPT_DEFAULT_MAILBOX(renv->scriptenv), source_line);
 	
diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c
index 9d37b5daa..a21799541 100644
--- a/src/lib-sieve/ext-fileinto.c
+++ b/src/lib-sieve/ext-fileinto.c
@@ -13,6 +13,7 @@
 
 #include "lib.h"
 #include "str-sanitize.h"
+#include "imap-utf7.h"
 
 #include "sieve-common.h"
 #include "sieve-extensions.h"
@@ -172,28 +173,52 @@ static int ext_fileinto_operation_execute
 	const struct sieve_runtime_env *renv, sieve_size_t *address)
 {
 	struct sieve_side_effects_list *slist = NULL; 
-	string_t *folder;
+	string_t *folder, *folder_utf7;
+	const char *mailbox;
 	unsigned int source_line;
 	int ret = 0;
+	
+	/*
+	 * Read operands
+	 */
 
 	/* Source line */
-    if ( !sieve_code_source_line_read(renv, address, &source_line) ) {
+	if ( !sieve_code_source_line_read(renv, address, &source_line) ) {
 		sieve_runtime_trace_error(renv, "invalid source line");
-        return SIEVE_EXEC_BIN_CORRUPT;
+		return SIEVE_EXEC_BIN_CORRUPT;
 	}
 	
-	if ( (ret=sieve_interpreter_handle_optional_operands(renv, address, &slist)) <= 0 )
+	/* Optional operands */
+	if ( (ret=sieve_interpreter_handle_optional_operands(renv, address, &slist)) 
+		<= 0 )
 		return ret;
 
+	/* Folder operand */
 	if ( !sieve_opr_string_read(renv, address, &folder) ) {
 		sieve_runtime_trace_error(renv, "invalid folder operand");
 		return SIEVE_EXEC_BIN_CORRUPT;
 	}
-
-	sieve_runtime_trace(renv, "FILEINTO action (\"%s\")", str_sanitize(str_c(folder), 64));
-
+	
+	/*
+	 * Perform operation
+	 */
+
+	mailbox = str_sanitize(str_c(folder), 64);
+	sieve_runtime_trace(renv, "FILEINTO action (\"%s\")", mailbox);
+		
+	/* Convert utf-8 folder name to utf-7
+	 *   FIXME: perform this at compile time when possible.
+	 */
+	folder_utf7 = t_str_new(256);
+	if ( imap_utf8_to_utf7(str_c(folder), folder_utf7) < 0 ) {
+		sieve_runtime_error
+			(renv, sieve_error_script_location(renv->script, source_line),
+				"mailbox name not utf-8: %s", mailbox);
+	}	
+		
+	/* Add action to result */	
 	ret = sieve_act_store_add_to_result
-		(renv, slist, str_c(folder), source_line);
+		(renv, slist, str_c(folder_utf7), source_line);
 
 	return ( ret >= 0 );
 }
diff --git a/src/lib-sieve/sieve-actions.h b/src/lib-sieve/sieve-actions.h
index ad6208f0d..71e33c160 100644
--- a/src/lib-sieve/sieve-actions.h
+++ b/src/lib-sieve/sieve-actions.h
@@ -169,7 +169,8 @@ extern const struct sieve_action act_discard;
  */
 
 struct act_store_context {
-	const char *folder;
+	/* Folder name represented in modified utf-7 */
+	const char *folder; 
 };
 
 struct act_store_transaction {
-- 
GitLab