diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c index 5a90a702d3fd848bb941389559c46cffe3134a32..00b414a419e42a2fdfdb3583c0f2de23d8d0237f 100644 --- a/src/lib-sieve/ext-fileinto.c +++ b/src/lib-sieve/ext-fileinto.c @@ -161,7 +161,7 @@ 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, *folder_utf7; + string_t *folder; const char *mailbox; unsigned int source_line; int ret = 0; @@ -194,19 +194,9 @@ static int ext_fileinto_operation_execute 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_utf7), source_line); + (renv, slist, str_c(folder), source_line); return ( ret >= 0 ); } diff --git a/src/lib-sieve/sieve-actions.c b/src/lib-sieve/sieve-actions.c index c15c7e0ae63a4eeb6c1cf1cdb243d9263df9d5d8..e6b96d4c058ec92708060720173d1648baf8ad30 100644 --- a/src/lib-sieve/sieve-actions.c +++ b/src/lib-sieve/sieve-actions.c @@ -2,10 +2,12 @@ */ #include "lib.h" +#include "str.h" #include "strfuncs.h" #include "str-sanitize.h" #include "mail-storage.h" #include "mail-namespace.h" +#include "imap-utf7.h" #include "sieve-code.h" #include "sieve-extensions.h" @@ -271,15 +273,25 @@ static struct mailbox *act_store_mailbox_open enum mailbox_flags flags = MAILBOX_FLAG_KEEP_RECENT | MAILBOX_FLAG_SAVEONLY | MAILBOX_FLAG_POST_SESSION; + string_t *mailbox_mutf7; struct mailbox *box; enum mail_error error; + /* Deliveries to INBOX must always succeed, regardless of ACLs */ if (strcasecmp(*mailbox, "INBOX") == 0) { - /* Deliveries to INBOX must always succeed, regardless of ACLs */ flags |= MAILBOX_FLAG_IGNORE_ACLS; } - *folder_r = *mailbox; + /* Convert utf-8 folder name to utf-7 + */ + mailbox_mutf7 = t_str_new(256); + if ( imap_utf8_to_utf7(*mailbox, mailbox_mutf7) < 0 ) { + /* FIXME: check utf-8 validity at compiletime/runtime */ + sieve_result_error(aenv, "mailbox name not utf-8: %s", *mailbox); + return NULL; + } + + *folder_r = str_c(mailbox_mutf7); *ns_r = mail_namespace_find(aenv->scriptenv->namespaces, folder_r); if ( *ns_r == NULL) { *storage = NULL; diff --git a/src/lib-sieve/sieve-actions.h b/src/lib-sieve/sieve-actions.h index a8fa62e466452e5ae39e70c8bb62ec071ce3432f..48e6eecf544c7139297ec50644f6450411734889 100644 --- a/src/lib-sieve/sieve-actions.h +++ b/src/lib-sieve/sieve-actions.h @@ -191,7 +191,7 @@ extern const struct sieve_action_def act_discard; */ struct act_store_context { - /* Folder name represented in modified utf-7 */ + /* Folder name represented in utf-8 */ const char *mailbox; }; @@ -203,6 +203,7 @@ struct act_store_transaction { struct mail *dest_mail; const char *folder; + const char *folder_mutf7; const char *error; enum mail_error error_code;