From 56956c0bba7b2bf734699ed198a1b2ad84a494cf Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 9 Sep 2011 12:57:36 +0300 Subject: [PATCH] imapc: Use mUTF-7 for mailbox names. --- src/lib-storage/index/imapc/imapc-list.c | 20 ++++++++++++++++---- src/lib-storage/index/imapc/imapc-save.c | 3 ++- src/lib-storage/index/imapc/imapc-storage.c | 19 +++++++++++++++---- src/lib-storage/index/imapc/imapc-storage.h | 1 + 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/lib-storage/index/imapc/imapc-list.c b/src/lib-storage/index/imapc/imapc-list.c index 93c02136c8..5779f109d7 100644 --- a/src/lib-storage/index/imapc/imapc-list.c +++ b/src/lib-storage/index/imapc/imapc-list.c @@ -1,8 +1,10 @@ /* Copyright (c) 2011 Dovecot authors, see the included COPYING file */ #include "lib.h" +#include "str.h" #include "imap-arg.h" #include "imap-match.h" +#include "imap-utf7.h" #include "mailbox-tree.h" #include "mailbox-list-subscriptions.h" #include "imapc-client.h" @@ -82,10 +84,20 @@ imapc_list_update_tree(struct mailbox_tree_context *tree, flags++; } - if ((info_flags & MAILBOX_NONEXISTENT) != 0) - node = mailbox_tree_lookup(tree, name); - else - node = mailbox_tree_get(tree, name, &created); + T_BEGIN { + string_t *utf8_name = t_str_new(64); + + if (imap_utf7_to_utf8(name, utf8_name)) { + str_truncate(utf8_name, 0); + str_append(utf8_name, name); + } + if ((info_flags & MAILBOX_NONEXISTENT) != 0) + node = mailbox_tree_lookup(tree, str_c(utf8_name)); + else { + node = mailbox_tree_get(tree, str_c(utf8_name), + &created); + } + } T_END; if (node != NULL) node->flags = info_flags; return node; diff --git a/src/lib-storage/index/imapc/imapc-save.c b/src/lib-storage/index/imapc/imapc-save.c index 59bd569f81..c130b4e3ae 100644 --- a/src/lib-storage/index/imapc/imapc-save.c +++ b/src/lib-storage/index/imapc/imapc-save.c @@ -335,7 +335,8 @@ int imapc_copy(struct mail_save_context *_ctx, struct mail *mail) imapc_client_mailbox_cmdf(src_mbox->client_box, imapc_copy_callback, &sctx, "UID COPY %u %s", - mail->uid, _t->box->name); + mail->uid, + imapc_mutf7_mailbox_name(_t->box)); while (sctx.ret == -2) imapc_storage_run(src_mbox->storage); ctx->finished = TRUE; diff --git a/src/lib-storage/index/imapc/imapc-storage.c b/src/lib-storage/index/imapc/imapc-storage.c index e87d348061..e5d5361aec 100644 --- a/src/lib-storage/index/imapc/imapc-storage.c +++ b/src/lib-storage/index/imapc/imapc-storage.c @@ -5,6 +5,7 @@ #include "str.h" #include "imap-arg.h" #include "imap-resp-code.h" +#include "imap-utf7.h" #include "imapc-mail.h" #include "imapc-client-private.h" #include "imapc-connection.h" @@ -362,6 +363,15 @@ imapc_mailbox_open_callback(const struct imapc_command_reply *reply, imapc_client_stop(ctx->mbox->storage->client); } +const char *imapc_mutf7_mailbox_name(struct mailbox *box) +{ + const char *mutf7_name; + + if (t_imap_utf8_to_utf7(box->name, &mutf7_name) < 0) + i_unreached(); + return mutf7_name; +} + static int imapc_mailbox_open(struct mailbox *box) { struct imapc_mailbox *mbox = (struct imapc_mailbox *)box; @@ -383,8 +393,8 @@ static int imapc_mailbox_open(struct mailbox *box) ctx.ret = -2; mbox->client_box = imapc_client_mailbox_open(mbox->storage->client, - box->name, examine, - imapc_mailbox_open_callback, + imapc_mutf7_mailbox_name(box), + examine, imapc_mailbox_open_callback, &ctx, mbox); while (ctx.ret == -2) imapc_storage_run(mbox->storage); @@ -424,7 +434,7 @@ imapc_mailbox_create(struct mailbox *box, { struct imapc_mailbox *mbox = (struct imapc_mailbox *)box; struct imapc_simple_context sctx; - const char *name = box->name; + const char *name = imapc_mutf7_mailbox_name(box); if (directory) { name = t_strdup_printf("%s%c", name, @@ -544,7 +554,8 @@ static int imapc_mailbox_get_status(struct mailbox *box, mbox->storage->cur_status = status_r; imapc_client_cmdf(mbox->storage->client, imapc_simple_callback, &sctx, - "STATUS %s (%1s)", box->name, str_c(str)+1); + "STATUS %s (%1s)", imapc_mutf7_mailbox_name(box), + str_c(str)+1); imapc_simple_run(&sctx); mbox->storage->cur_status_box = NULL; mbox->storage->cur_status = NULL; diff --git a/src/lib-storage/index/imapc/imapc-storage.h b/src/lib-storage/index/imapc/imapc-storage.h index 141d2a7ebc..f0526e936a 100644 --- a/src/lib-storage/index/imapc/imapc-storage.h +++ b/src/lib-storage/index/imapc/imapc-storage.h @@ -90,6 +90,7 @@ void imapc_transaction_save_rollback(struct mail_save_context *ctx); void imapc_storage_run(struct imapc_storage *storage); +const char *imapc_mutf7_mailbox_name(struct mailbox *box); void imapc_copy_error_from_reply(struct imapc_storage *storage, enum mail_error default_error, const struct imapc_command_reply *reply); -- 2.47.3