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