doveadm-mail-mailbox.c revision e09c7dc961cb9cab04ec7cc79215c2f6318fbde0
7cb128dc4cae2a03a742f63ba7afee23c78e3af0Phil Carmody/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainenstatic const char *const *
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainendoveadm_mailbox_args_to_mutf7(const char *const args[])
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen unsigned int i;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen i_fatal("Mailbox name not valid UTF-8: %s", args[i]);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainendoveadm_mailbox_args_validate_mutf7(const char *const *args)
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen unsigned int i;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_fatal("Mailbox name not valid mUTF-7: %s", args[i]);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic bool cmd_mailbox_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen (type *)doveadm_mailbox_cmd_alloc_size(sizeof(type))
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainendoveadm_mailbox_translate_args(struct doveadm_mailbox_cmd_context *ctx,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen const char *const *args[])
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainencmd_mailbox_list_run(struct doveadm_mail_cmd_context *_ctx,
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen const enum mailbox_list_iter_flags iter_flags =
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen iter = doveadm_mail_list_iter_init(user, ctx->search_args, iter_flags);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen while ((info = doveadm_mail_list_iter_next(iter)) != NULL) {
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen if (ctx->ctx.mutf7 || imap_utf7_to_utf8(info->name, str) < 0)
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainenstatic void cmd_mailbox_list_init(struct doveadm_mail_cmd_context *_ctx,
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen const char *const args[])
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen unsigned int i;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen doveadm_mailbox_translate_args(&ctx->ctx, &args);
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen arg->value.str = p_strdup(ctx->search_args->pool, args[i]);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen struct mail_search_arg *subargs = ctx->search_args->args;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen arg = mail_search_build_add(ctx->search_args, SEARCH_OR);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_list_alloc(void)
755aea84bbe2b15ed7fe991f6462a93333ff571fTimo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct list_cmd_context);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainencmd_mailbox_create_run(struct doveadm_mail_cmd_context *_ctx,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen const char *const *namep;
15b5076a239682277b44880e33ea23b55fff7e71Timo Sirainen unsigned int len;
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen ns = mail_namespace_find(user->namespaces, &storage_name);
e5fd6dfd0a492e4708d4dbb7971d7fc5d7b8fd85Timo Sirainen i_fatal("Can't find namespace for: %s", *namep);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (len > 0 && storage_name[len-1] == ns->real_sep) {
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen storage_name = t_strndup(storage_name, len-1);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen box = mailbox_alloc(ns->list, storage_name, 0);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (mailbox_create(box, NULL, directory) < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen struct mail_storage *storage = mailbox_get_storage(box);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen i_error("Can't create mailbox %s: %s", *namep,
074055dadbca01626437cc4724853a374acab6a8Timo Sirainenstatic void cmd_mailbox_create_init(struct doveadm_mail_cmd_context *_ctx,
074055dadbca01626437cc4724853a374acab6a8Timo Sirainen const char *const args[])
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen unsigned int i;
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen doveadm_mailbox_translate_args(&ctx->ctx, &args);
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_create_alloc(void)
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct mailbox_cmd_context);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
e10d8b1291090c26b9ef499637e6e632485ca5beTimo Sirainencmd_mailbox_delete_run(struct doveadm_mail_cmd_context *_ctx,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const char *const *namep;
18ccd19c244f49665fe03cda785efa066d2c38dfTimo Sirainen ns = mail_namespace_find(user->namespaces, &storage_name);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_fatal("Can't find namespace for: %s", *namep);
c529313e1cbc22244d4528e80aa3e485f8806cd3Timo Sirainen box = mailbox_alloc(ns->list, storage_name, 0);
d22301419109ed4a38351715e6760011421dadecTimo Sirainen struct mail_storage *storage = mailbox_get_storage(box);
d22301419109ed4a38351715e6760011421dadecTimo Sirainen i_error("Can't delete mailbox %s: %s", *namep,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void cmd_mailbox_delete_init(struct doveadm_mail_cmd_context *_ctx,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen const char *const args[])
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen unsigned int i;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen doveadm_mailbox_translate_args(&ctx->ctx, &args);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_delete_alloc(void)
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct mailbox_cmd_context);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainencmd_mailbox_rename_run(struct doveadm_mail_cmd_context *_ctx,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen oldns = mail_namespace_find(user->namespaces, &oldname);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen i_fatal("Can't find namespace for: %s", oldname);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen newns = mail_namespace_find(user->namespaces, &newname);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen i_fatal("Can't find namespace for: %s", newname);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen oldbox = mailbox_alloc(oldns->list, oldname, 0);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen newbox = mailbox_alloc(newns->list, newname, 0);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen if (mailbox_rename(oldbox, newbox, TRUE) < 0) {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen struct mail_storage *storage = mailbox_get_storage(oldbox);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen i_error("Can't rename mailbox %s to %s: %s", oldname, newname,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstatic void cmd_mailbox_rename_init(struct doveadm_mail_cmd_context *_ctx,
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen const char *const args[])
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen doveadm_mailbox_translate_args(&ctx->ctx, &args);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen ctx->oldname = p_strdup(ctx->ctx.ctx.pool, args[0]);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen ctx->newname = p_strdup(ctx->ctx.ctx.pool, args[1]);
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_rename_alloc(void)
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct rename_cmd_context);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen "[-7|-8] [<mailbox> [...]]"
9cb0fe28ae6f59b9f075e1edfc30f417e846c4a2Timo Sirainen "[-7|-8] <mailbox> [...]"
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen "[-7|-8] <mailbox> [...]"
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen "[-7|-8] <old name> <new name>"