doveadm-mail-mailbox.c revision e09c7dc961cb9cab04ec7cc79215c2f6318fbde0
7cb128dc4cae2a03a742f63ba7afee23c78e3af0Phil Carmody/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "lib.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "array.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "str.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "imap-utf7.h"
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen#include "mail-namespace.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "mail-storage.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "mail-search-build.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "doveadm-mail-list-iter.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen#include "doveadm-mail.h"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
7a7d2aa11e46195e2d92d6c337d7e78052a5ce67Timo Sirainen#include <stdio.h>
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainenstruct doveadm_mailbox_cmd_context {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct doveadm_mail_cmd_context ctx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen bool mutf7;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct mailbox_cmd_context {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct doveadm_mailbox_cmd_context ctx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ARRAY_TYPE(const_string) mailboxes;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen};
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstruct rename_cmd_context {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct doveadm_mailbox_cmd_context ctx;
499fec3443374cc89fb8c83b8027c1614097d7a3Timo Sirainen const char *oldname, *newname;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen};
f5a7396b31762a1f876517e13ce9065820139f7cTimo Sirainen
f5a7396b31762a1f876517e13ce9065820139f7cTimo Sirainenstruct list_cmd_context {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct doveadm_mailbox_cmd_context ctx;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen struct mail_search_args *search_args;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen};
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainenstatic const char *const *
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainendoveadm_mailbox_args_to_mutf7(const char *const args[])
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen{
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen ARRAY_TYPE(const_string) dest;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen string_t *str;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen const char *mutf7;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen unsigned int i;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen str = t_str_new(128);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen t_array_init(&dest, 8);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen for (i = 0; args[i] != NULL; i++) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen str_truncate(str, 0);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen if (imap_utf8_to_utf7(args[i], str) < 0)
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen i_fatal("Mailbox name not valid UTF-8: %s", args[i]);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen mutf7 = t_strdup(str_c(str));
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen array_append(&dest, &mutf7, 1);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen }
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen (void)array_append_space(&dest);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen return array_idx(&dest, 0);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen}
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen
11352dc3e4b29f3d2763c82f8ea4f99e8daf4fa3Timo Sirainenstatic void
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainendoveadm_mailbox_args_validate_mutf7(const char *const *args)
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen{
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen string_t *str = t_str_new(128);
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen unsigned int i;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen for (i = 0; args[i] != NULL; i++) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (imap_utf7_to_utf8(args[i], str) < 0)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_fatal("Mailbox name not valid mUTF-7: %s", args[i]);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen str_truncate(str, 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
cd8507179823de33d6e8242e10dbc15d136245b5Timo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic bool cmd_mailbox_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen struct doveadm_mailbox_cmd_context *ctx =
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen (struct doveadm_mailbox_cmd_context *)_ctx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen switch (c) {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen case '7':
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen ctx->mutf7 = TRUE;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen break;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen case '8':
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen ctx->mutf7 = FALSE;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen break;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen default:
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen return FALSE;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen }
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen return TRUE;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen}
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen#define doveadm_mailbox_cmd_alloc(type) \
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen (type *)doveadm_mailbox_cmd_alloc_size(sizeof(type))
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstatic struct doveadm_mail_cmd_context *
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainendoveadm_mailbox_cmd_alloc_size(size_t size)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen{
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen struct doveadm_mail_cmd_context *ctx;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen ctx = doveadm_mail_cmd_alloc_size(size);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen ctx->getopt_args = "78";
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen ctx->parse_arg = cmd_mailbox_parse_arg;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen return ctx;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen}
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenstatic void
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainendoveadm_mailbox_translate_args(struct doveadm_mailbox_cmd_context *ctx,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen const char *const *args[])
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen{
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen if (!ctx->mutf7)
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen *args = doveadm_mailbox_args_to_mutf7(*args);
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen else
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen doveadm_mailbox_args_validate_mutf7(*args);
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen}
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainenstatic void
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainencmd_mailbox_list_run(struct doveadm_mail_cmd_context *_ctx,
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen struct mail_user *user)
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen{
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen const enum mailbox_list_iter_flags iter_flags =
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen MAILBOX_LIST_ITER_RAW_LIST |
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen MAILBOX_LIST_ITER_VIRTUAL_NAMES |
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen MAILBOX_LIST_ITER_NO_AUTO_INBOX |
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct doveadm_mail_list_iter *iter;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const struct mailbox_info *info;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen string_t *str = t_str_new(256);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
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) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen str_truncate(str, 0);
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen if (ctx->ctx.mutf7 || imap_utf7_to_utf8(info->name, str) < 0)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen printf("%s\n", info->name);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen else
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen printf("%s\n", str_c(str));
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen }
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen doveadm_mail_list_iter_deinit(&iter);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainenstatic void cmd_mailbox_list_init(struct doveadm_mail_cmd_context *_ctx,
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen const char *const args[])
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen{
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen struct mail_search_arg *arg;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen unsigned int i;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen doveadm_mailbox_translate_args(&ctx->ctx, &args);
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen ctx->search_args = mail_search_build_init();
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen for (i = 0; args[i] != NULL; i++) {
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen arg = mail_search_build_add(ctx->search_args,
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen SEARCH_MAILBOX_GLOB);
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen arg->value.str = p_strdup(ctx->search_args->pool, args[i]);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen }
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen if (i > 1) {
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen struct mail_search_arg *subargs = ctx->search_args->args;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen ctx->search_args->args = NULL;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen arg = mail_search_build_add(ctx->search_args, SEARCH_OR);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen arg->value.subargs = subargs;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen }
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen}
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_list_alloc(void)
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen{
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen struct list_cmd_context *ctx;
755aea84bbe2b15ed7fe991f6462a93333ff571fTimo Sirainen
755aea84bbe2b15ed7fe991f6462a93333ff571fTimo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct list_cmd_context);
755aea84bbe2b15ed7fe991f6462a93333ff571fTimo Sirainen ctx->ctx.ctx.init = cmd_mailbox_list_init;
8305127d1074cf9a1e25dec9be2735276462079dTimo Sirainen ctx->ctx.ctx.run = cmd_mailbox_list_run;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen return &ctx->ctx.ctx;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen}
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstatic void
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainencmd_mailbox_create_run(struct doveadm_mail_cmd_context *_ctx,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen struct mail_user *user)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mail_namespace *ns;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen struct mailbox *box;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen const char *const *namep;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
596433ccbca59ce2328dc1d029586154cd937155Timo Sirainen array_foreach(&ctx->mailboxes, namep) {
596433ccbca59ce2328dc1d029586154cd937155Timo Sirainen const char *storage_name = *namep;
15b5076a239682277b44880e33ea23b55fff7e71Timo Sirainen unsigned int len;
15b5076a239682277b44880e33ea23b55fff7e71Timo Sirainen bool directory = FALSE;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen ns = mail_namespace_find(user->namespaces, &storage_name);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen if (ns == NULL)
e5fd6dfd0a492e4708d4dbb7971d7fc5d7b8fd85Timo Sirainen i_fatal("Can't find namespace for: %s", *namep);
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen len = strlen(storage_name);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (len > 0 && storage_name[len-1] == ns->real_sep) {
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen storage_name = t_strndup(storage_name, len-1);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen directory = TRUE;
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen }
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen
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
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen i_error("Can't create mailbox %s: %s", *namep,
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen mail_storage_get_last_error(storage, NULL));
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen }
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen mailbox_free(&box);
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen }
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen}
074055dadbca01626437cc4724853a374acab6a8Timo Sirainen
074055dadbca01626437cc4724853a374acab6a8Timo Sirainenstatic void cmd_mailbox_create_init(struct doveadm_mail_cmd_context *_ctx,
074055dadbca01626437cc4724853a374acab6a8Timo Sirainen const char *const args[])
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen{
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen const char *name;
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen unsigned int i;
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen if (args[0] == NULL)
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen doveadm_mail_help_name("mailbox create");
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen doveadm_mailbox_translate_args(&ctx->ctx, &args);
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen for (i = 0; args[i] != NULL; i++) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen name = p_strdup(ctx->ctx.ctx.pool, args[i]);
7f3b826a89bcb7a72759912e99f574b28309fe1bTimo Sirainen array_append(&ctx->mailboxes, &name, 1);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen }
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen}
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_create_alloc(void)
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen{
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen struct mailbox_cmd_context *ctx;
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct mailbox_cmd_context);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx->ctx.ctx.init = cmd_mailbox_create_init;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx->ctx.ctx.run = cmd_mailbox_create_run;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen return &ctx->ctx.ctx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void
e10d8b1291090c26b9ef499637e6e632485ca5beTimo Sirainencmd_mailbox_delete_run(struct doveadm_mail_cmd_context *_ctx,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mail_user *user)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mail_namespace *ns;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mailbox *box;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const char *const *namep;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen array_foreach(&ctx->mailboxes, namep) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen const char *storage_name = *namep;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
18ccd19c244f49665fe03cda785efa066d2c38dfTimo Sirainen ns = mail_namespace_find(user->namespaces, &storage_name);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (ns == NULL)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_fatal("Can't find namespace for: %s", *namep);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
c529313e1cbc22244d4528e80aa3e485f8806cd3Timo Sirainen box = mailbox_alloc(ns->list, storage_name, 0);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (mailbox_delete(box) < 0) {
d22301419109ed4a38351715e6760011421dadecTimo Sirainen struct mail_storage *storage = mailbox_get_storage(box);
d22301419109ed4a38351715e6760011421dadecTimo Sirainen
d22301419109ed4a38351715e6760011421dadecTimo Sirainen i_error("Can't delete mailbox %s: %s", *namep,
d22301419109ed4a38351715e6760011421dadecTimo Sirainen mail_storage_get_last_error(storage, NULL));
d22301419109ed4a38351715e6760011421dadecTimo Sirainen }
499fec3443374cc89fb8c83b8027c1614097d7a3Timo Sirainen mailbox_free(&box);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen }
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainen}
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void cmd_mailbox_delete_init(struct doveadm_mail_cmd_context *_ctx,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen const char *const args[])
d22301419109ed4a38351715e6760011421dadecTimo Sirainen{
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const char *name;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen unsigned int i;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen if (args[0] == NULL)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen doveadm_mail_help_name("mailbox delete");
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen doveadm_mailbox_translate_args(&ctx->ctx, &args);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen for (i = 0; args[i] != NULL; i++) {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen name = p_strdup(ctx->ctx.ctx.pool, args[i]);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen array_append(&ctx->mailboxes, &name, 1);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen }
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen}
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_delete_alloc(void)
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen{
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen struct mailbox_cmd_context *ctx;
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct mailbox_cmd_context);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen ctx->ctx.ctx.init = cmd_mailbox_delete_init;
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen ctx->ctx.ctx.run = cmd_mailbox_delete_run;
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen return &ctx->ctx.ctx;
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen}
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainenstatic void
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainencmd_mailbox_rename_run(struct doveadm_mail_cmd_context *_ctx,
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen struct mail_user *user)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen{
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen struct mail_namespace *oldns, *newns;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen struct mailbox *oldbox, *newbox;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen const char *oldname = ctx->oldname;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen const char *newname = ctx->newname;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen oldns = mail_namespace_find(user->namespaces, &oldname);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen if (oldns == NULL)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen i_fatal("Can't find namespace for: %s", oldname);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen newns = mail_namespace_find(user->namespaces, &newname);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen if (newns == NULL)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen i_fatal("Can't find namespace for: %s", newname);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
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
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen i_error("Can't rename mailbox %s to %s: %s", oldname, newname,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen mail_storage_get_last_error(storage, NULL));
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen }
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen mailbox_free(&oldbox);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen mailbox_free(&newbox);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen}
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstatic void cmd_mailbox_rename_init(struct doveadm_mail_cmd_context *_ctx,
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen const char *const args[])
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen{
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen if (str_array_length(args) != 2)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen doveadm_mail_help_name("mailbox rename");
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen doveadm_mailbox_translate_args(&ctx->ctx, &args);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
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 Sirainen}
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_rename_alloc(void)
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen{
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen struct rename_cmd_context *ctx;
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct rename_cmd_context);
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen ctx->ctx.ctx.init = cmd_mailbox_rename_init;
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen ctx->ctx.ctx.run = cmd_mailbox_rename_run;
9cb0fe28ae6f59b9f075e1edfc30f417e846c4a2Timo Sirainen return &ctx->ctx.ctx;
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen}
9cb0fe28ae6f59b9f075e1edfc30f417e846c4a2Timo Sirainen
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstruct doveadm_mail_cmd cmd_mailbox_list = {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen cmd_mailbox_list_alloc, "mailbox list",
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen "[-7|-8] [<mailbox> [...]]"
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen};
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstruct doveadm_mail_cmd cmd_mailbox_create = {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen cmd_mailbox_create_alloc, "mailbox create",
9cb0fe28ae6f59b9f075e1edfc30f417e846c4a2Timo Sirainen "[-7|-8] <mailbox> [...]"
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen};
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstruct doveadm_mail_cmd cmd_mailbox_delete = {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen cmd_mailbox_delete_alloc, "mailbox delete",
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen "[-7|-8] <mailbox> [...]"
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen};
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstruct doveadm_mail_cmd cmd_mailbox_rename = {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen cmd_mailbox_rename_alloc, "mailbox rename",
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen "[-7|-8] <old name> <new name>"
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen};
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen