doveadm-mail-mailbox.c revision c43bfb802ccb82e3855253bd8cb2233e3b061dd7
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2010-2012 Dovecot authors, see the included COPYING file */
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
08d6658a4e2ec8104cd1307f6baa75fdb07a24f8Mark Washenberger#include "lib.h"
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen#include "array.h"
44fc0a34c39f1ddb3a776918630010867a5dd04eTimo Sirainen#include "str.h"
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen#include "unichar.h"
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen#include "imap-utf7.h"
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen#include "mail-namespace.h"
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen#include "mail-storage.h"
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen#include "mail-search-build.h"
63cde222abaaa2a9bdaa9a143698dbc8b23bd742Timo Sirainen#include "doveadm-print.h"
d1f0acc7fc722e13e8296228703adfe8a884d59eTimo Sirainen#include "doveadm-mailbox-list-iter.h"
eaa9884158bc0cf98379939f72061e31c359cf39Timo Sirainen#include "doveadm-mail.h"
f8464772990b52cb8de4553bc1135adcf72813b8Timo Sirainen
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen#include <stdio.h>
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
e714eed72515794c46c6712a611e5ab924d903daTimo Sirainenstruct doveadm_mailbox_cmd_context {
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen struct doveadm_mail_cmd_context ctx;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen bool subscriptions;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen};
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainenstruct mailbox_cmd_context {
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen struct doveadm_mailbox_cmd_context ctx;
d8c2d988a913d1aae9abf2dd50c611c87d81d72aTimo Sirainen ARRAY_TYPE(const_string) mailboxes;
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen};
d8c2d988a913d1aae9abf2dd50c611c87d81d72aTimo Sirainen
d8c2d988a913d1aae9abf2dd50c611c87d81d72aTimo Sirainenstruct delete_cmd_context {
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen struct doveadm_mailbox_cmd_context ctx;
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen ARRAY_TYPE(const_string) mailboxes;
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen bool recursive;
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainen};
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainen
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainenstruct rename_cmd_context {
d8c2d988a913d1aae9abf2dd50c611c87d81d72aTimo Sirainen struct doveadm_mailbox_cmd_context ctx;
d8c2d988a913d1aae9abf2dd50c611c87d81d72aTimo Sirainen const char *oldname, *newname;
d8c2d988a913d1aae9abf2dd50c611c87d81d72aTimo Sirainen};
dd2d3ef41dc407afb8afc49e18ff53640e4b4e02Timo Sirainen
594d203bdcbd160688bce5d5a6d65783b919ad49Timo Sirainenstruct list_cmd_context {
594d203bdcbd160688bce5d5a6d65783b919ad49Timo Sirainen struct doveadm_mailbox_cmd_context ctx;
594d203bdcbd160688bce5d5a6d65783b919ad49Timo Sirainen struct mail_search_args *search_args;
594d203bdcbd160688bce5d5a6d65783b919ad49Timo Sirainen bool mutf7;
a8fc29f19ea6e2d472ba779b2dd5ca4e1f3dac79Timo Sirainen};
a8fc29f19ea6e2d472ba779b2dd5ca4e1f3dac79Timo Sirainen
3e1ded79bbc9166aa221bcf62d8eb2bee179c557Timo Sirainenvoid doveadm_mailbox_args_check(const char *const args[])
3e1ded79bbc9166aa221bcf62d8eb2bee179c557Timo Sirainen{
3e1ded79bbc9166aa221bcf62d8eb2bee179c557Timo Sirainen unsigned int i;
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainen
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainen for (i = 0; args[i] != NULL; i++) {
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainen if (!uni_utf8_str_is_valid(args[i])) {
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainen i_fatal_status(EX_DATAERR,
48559742084e98049335c21c53dfd1ff95f11cd8Timo Sirainen "Mailbox name not valid UTF-8: %s", args[i]);
14b495a09db7aea6b68146fd6427229e75d2bb39Timo Sirainen }
14b495a09db7aea6b68146fd6427229e75d2bb39Timo Sirainen }
14b495a09db7aea6b68146fd6427229e75d2bb39Timo Sirainen}
14b495a09db7aea6b68146fd6427229e75d2bb39Timo Sirainen
14b495a09db7aea6b68146fd6427229e75d2bb39Timo Sirainenstatic bool cmd_mailbox_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen{
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen struct doveadm_mailbox_cmd_context *ctx =
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen (struct doveadm_mailbox_cmd_context *)_ctx;
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen switch (c) {
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen case 's':
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen ctx->subscriptions = TRUE;
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen break;
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen default:
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen return FALSE;
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen }
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen return TRUE;
678d0463849ba777106eb7875f27db07a5d8e3dfTimo Sirainen}
678d0463849ba777106eb7875f27db07a5d8e3dfTimo Sirainen
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen#define doveadm_mailbox_cmd_alloc(type) \
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen (type *)doveadm_mailbox_cmd_alloc_size(sizeof(type))
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainenstatic struct doveadm_mail_cmd_context *
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainendoveadm_mailbox_cmd_alloc_size(size_t size)
190ba2ebc899bd114e1e4ab9ee119be10f0cc0ecTimo Sirainen{
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen struct doveadm_mail_cmd_context *ctx;
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen
4261a8b43792dc4db4b39e6910319835b7450e84Timo Sirainen ctx = doveadm_mail_cmd_alloc_size(size);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->getopt_args = "s";
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->v.parse_arg = cmd_mailbox_parse_arg;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen return ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen}
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenstatic bool
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainencmd_mailbox_list_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen{
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen switch (c) {
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen case '7':
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen ctx->mutf7 = TRUE;
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen break;
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen case '8':
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen ctx->mutf7 = FALSE;
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen break;
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen case 's':
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen ctx->ctx.subscriptions = TRUE;
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen break;
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen default:
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen return FALSE;
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen }
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainen return TRUE;
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainen}
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainen
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainenstatic int
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainencmd_mailbox_list_run(struct doveadm_mail_cmd_context *_ctx,
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainen struct mail_user *user)
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen{
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen enum mailbox_list_iter_flags iter_flags =
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen MAILBOX_LIST_ITER_RAW_LIST |
f4a19b0cf11cdff437571708d9d788d02a906a00Timo Sirainen MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
f8464772990b52cb8de4553bc1135adcf72813b8Timo Sirainen struct doveadm_mailbox_list_iter *iter;
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen const struct mailbox_info *info;
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen string_t *str = t_str_new(256);
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen if (ctx->ctx.subscriptions)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen iter_flags |= MAILBOX_LIST_ITER_SELECT_SUBSCRIBED;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen iter = doveadm_mailbox_list_iter_full_init(_ctx, user, ctx->search_args,
964c86de7158ccafdfe665853579d71232e2634eTimo Sirainen iter_flags);
e153e1205bc686fac815ce7bb534adcb36dfb722Timo Sirainen while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) {
e25885d4c7c4b392c66bbf26a9b892362d90f001Timo Sirainen if (!ctx->mutf7)
e25885d4c7c4b392c66bbf26a9b892362d90f001Timo Sirainen doveadm_print(info->name);
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen else {
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen str_truncate(str, 0);
ab0d9eecd85f74acae18fe88529302e0776cc500Timo Sirainen if (imap_utf8_to_utf7(info->name, str) < 0)
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen i_unreached();
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen doveadm_print(str_c(str));
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen }
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen }
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen if (doveadm_mailbox_list_iter_deinit(&iter) < 0)
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen return -1;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen return 0;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen}
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainenstruct mail_search_args *
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainendoveadm_mail_mailbox_search_args_build(const char *const args[])
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen{
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen struct mail_search_args *search_args;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen struct mail_search_arg *arg;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen unsigned int i;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen doveadm_mailbox_args_check(args);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen search_args = mail_search_build_init();
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen for (i = 0; args[i] != NULL; i++) {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen arg = mail_search_build_add(search_args, SEARCH_MAILBOX_GLOB);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen arg->value.str = p_strdup(search_args->pool, args[i]);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen }
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen if (i > 1) {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen struct mail_search_arg *subargs = search_args->args;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen search_args->args = NULL;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen arg = mail_search_build_add(search_args, SEARCH_OR);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen arg->value.subargs = subargs;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen }
964c86de7158ccafdfe665853579d71232e2634eTimo Sirainen return search_args;
e153e1205bc686fac815ce7bb534adcb36dfb722Timo Sirainen}
e153e1205bc686fac815ce7bb534adcb36dfb722Timo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainenstatic void cmd_mailbox_list_init(struct doveadm_mail_cmd_context *_ctx,
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen const char *const args[])
c4457e497e01b57565d24da624968699b166e02aTimo Sirainen{
c4457e497e01b57565d24da624968699b166e02aTimo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
16133a719ce8b6a5b8cedd721340cc1607c43433Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen doveadm_print_header("mailbox", "mailbox",
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen ctx->search_args = doveadm_mail_mailbox_search_args_build(args);
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen}
190ba2ebc899bd114e1e4ab9ee119be10f0cc0ecTimo Sirainen
190ba2ebc899bd114e1e4ab9ee119be10f0cc0ecTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_list_alloc(void)
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen{
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen struct list_cmd_context *ctx;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct list_cmd_context);
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_list_init;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_list_run;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_list_parse_arg;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen ctx->ctx.ctx.getopt_args = "78s";
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen doveadm_print_init(DOVEADM_PRINT_TYPE_FLOW);
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen return &ctx->ctx.ctx;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen}
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainenstatic int
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainencmd_mailbox_create_run(struct doveadm_mail_cmd_context *_ctx,
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen struct mail_user *user)
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen{
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
e82af44fe25ca9b88210f313548dc08538e4a677Timo Sirainen struct mail_namespace *ns;
e82af44fe25ca9b88210f313548dc08538e4a677Timo Sirainen struct mailbox *box;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen const char *const *namep;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen int ret = 0;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen array_foreach(&ctx->mailboxes, namep) {
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen const char *name = *namep;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen unsigned int len;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen bool directory = FALSE;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen
e82af44fe25ca9b88210f313548dc08538e4a677Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
e82af44fe25ca9b88210f313548dc08538e4a677Timo Sirainen if (ns == NULL) {
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainen i_fatal_status(DOVEADM_EX_NOTFOUND,
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen "Can't find namespace for: %s", name);
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainen }
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainen
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen len = strlen(name);
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen if (len > 0 && name[len-1] == mail_namespace_get_sep(ns)) {
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen name = t_strndup(name, len-1);
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen directory = TRUE;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen }
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen box = mailbox_alloc(ns->list, name, 0);
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen if (mailbox_create(box, NULL, directory) < 0) {
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen i_error("Can't create mailbox %s: %s", name,
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen mailbox_get_last_error(box, NULL));
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen ret = -1;
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainen }
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainen if (ctx->ctx.subscriptions) {
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainen if (mailbox_set_subscribed(box, TRUE) < 0) {
78361883c67c58e339697c167ca285731f50287bTimo Sirainen i_error("Can't subscribe to mailbox %s: %s", name,
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen mailbox_get_last_error(box, NULL));
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen ret = -1;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen }
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen }
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen mailbox_free(&box);
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen }
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen return ret;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen}
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen
78361883c67c58e339697c167ca285731f50287bTimo Sirainenstatic void cmd_mailbox_create_init(struct doveadm_mail_cmd_context *_ctx,
78361883c67c58e339697c167ca285731f50287bTimo Sirainen const char *const args[])
78361883c67c58e339697c167ca285731f50287bTimo Sirainen{
78361883c67c58e339697c167ca285731f50287bTimo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
78361883c67c58e339697c167ca285731f50287bTimo Sirainen const char *name;
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen unsigned int i;
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen if (args[0] == NULL)
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen doveadm_mail_help_name("mailbox create");
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen doveadm_mailbox_args_check(args);
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen for (i = 0; args[i] != NULL; i++) {
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen name = p_strdup(ctx->ctx.ctx.pool, args[i]);
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen array_append(&ctx->mailboxes, &name, 1);
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen }
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen}
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_create_alloc(void)
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen{
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen struct mailbox_cmd_context *ctx;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct mailbox_cmd_context);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_create_init;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_create_run;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen return &ctx->ctx.ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen}
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainenstatic int i_strcmp_reverse_p(const void *p1, const void *p2)
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen{
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen const char *const *s1 = p1, *const *s2 = p2;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen return -strcmp(*s1, *s2);
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen}
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainenstatic int
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainenget_child_mailboxes(struct mail_user *user, ARRAY_TYPE(const_string) *mailboxes,
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen const char *name)
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen{
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen struct mailbox_list_iterate_context *iter;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen struct mail_namespace *ns;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen const struct mailbox_info *info;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen const char *pattern, *child_name;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen if (ns == NULL)
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen return 0;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen pattern = t_strdup_printf("%s%c*", name, mail_namespace_get_sep(ns));
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen iter = mailbox_list_iter_init(ns->list, pattern,
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen MAILBOX_LIST_ITER_RETURN_NO_FLAGS);
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen while ((info = mailbox_list_iter_next(iter)) != NULL) {
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen child_name = t_strdup(info->name);
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen array_append(mailboxes, &child_name, 1);
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen }
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen return mailbox_list_iter_deinit(&iter);
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen}
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen
4f93b5ab69b9a6420827f540742883efbb35f063Timo Sirainenstatic int
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainencmd_mailbox_delete_run(struct doveadm_mail_cmd_context *_ctx,
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen struct mail_user *user)
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen{
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen struct mail_namespace *ns;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen struct mailbox *box;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen struct mail_storage *storage;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *const *namep;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ARRAY_TYPE(const_string) recursive_mailboxes;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen const ARRAY_TYPE(const_string) *mailboxes = &ctx->mailboxes;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen int ret = 0;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (ctx->recursive) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen t_array_init(&recursive_mailboxes, 32);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen array_foreach(&ctx->mailboxes, namep) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (get_child_mailboxes(user, &recursive_mailboxes,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen *namep) < 0) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen doveadm_mail_failed_error(_ctx, MAIL_ERROR_TEMP);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ret = -1;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen array_append(&recursive_mailboxes, namep, 1);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen array_sort(&recursive_mailboxes, i_strcmp_reverse_p);
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen mailboxes = &recursive_mailboxes;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen array_foreach(mailboxes, namep) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *name = *namep;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (ns == NULL) {
16133a719ce8b6a5b8cedd721340cc1607c43433Timo Sirainen i_error("Can't find namespace for: %s", name);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen doveadm_mail_failed_error(_ctx, MAIL_ERROR_NOTFOUND);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ret = -1;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen continue;
16133a719ce8b6a5b8cedd721340cc1607c43433Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen box = mailbox_alloc(ns->list, name, 0);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen storage = mailbox_get_storage(box);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (mailbox_delete(box) < 0) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen i_error("Can't delete mailbox %s: %s", name,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen mailbox_get_last_error(box, NULL));
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ret = -1;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (ctx->ctx.subscriptions) {
2219b375f50f9af1f3e69b7b38aab733ea174c24Timo Sirainen if (mailbox_set_subscribed(box, FALSE) < 0) {
2219b375f50f9af1f3e69b7b38aab733ea174c24Timo Sirainen i_error("Can't unsubscribe mailbox %s: %s", name,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen mail_storage_get_last_error(storage, NULL));
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen ret = -1;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen mailbox_free(&box);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen return ret;
1a59321a1116f9819e7b2899379a44de339ce802Timo Sirainen}
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenstatic void cmd_mailbox_delete_init(struct doveadm_mail_cmd_context *_ctx,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *const args[])
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen{
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *name;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen unsigned int i;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (args[0] == NULL)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen doveadm_mail_help_name("mailbox delete");
89676692402d8a58415b2c11256652322091ebabTimo Sirainen doveadm_mailbox_args_check(args);
89676692402d8a58415b2c11256652322091ebabTimo Sirainen
89676692402d8a58415b2c11256652322091ebabTimo Sirainen for (i = 0; args[i] != NULL; i++) {
89676692402d8a58415b2c11256652322091ebabTimo Sirainen name = p_strdup(ctx->ctx.ctx.pool, args[i]);
d779da03fd24e13b0c6fbfa9a93ad0e4132c9f47Timo Sirainen array_append(&ctx->mailboxes, &name, 1);
42ec694fb0f2e1fb1d8afcfb441382daea487bd9Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen array_sort(&ctx->mailboxes, i_strcmp_reverse_p);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen}
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
42ec694fb0f2e1fb1d8afcfb441382daea487bd9Timo Sirainenstatic bool
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainencmd_mailbox_delete_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen{
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
1a59321a1116f9819e7b2899379a44de339ce802Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen switch (c) {
63cde222abaaa2a9bdaa9a143698dbc8b23bd742Timo Sirainen case 'r':
63cde222abaaa2a9bdaa9a143698dbc8b23bd742Timo Sirainen ctx->recursive = TRUE;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen break;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen case 's':
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->ctx.subscriptions = TRUE;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen break;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen default:
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen return FALSE;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen return TRUE;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen}
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_delete_alloc(void)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen{
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct delete_cmd_context *ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct delete_cmd_context);
0c822051bb9a910ee588fd97f7ec6f9df3d1b3c6Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_delete_init;
0c822051bb9a910ee588fd97f7ec6f9df3d1b3c6Timo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_delete_run;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_delete_parse_arg;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->ctx.ctx.getopt_args = "rs";
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen return &ctx->ctx.ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen}
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenstatic int
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainencmd_mailbox_rename_run(struct doveadm_mail_cmd_context *_ctx,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct mail_user *user)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen{
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct mail_namespace *oldns, *newns;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct mailbox *oldbox, *newbox;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *oldname = ctx->oldname;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *newname = ctx->newname;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen int ret = 0;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen oldns = mail_namespace_find(user->namespaces, oldname);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (oldns == NULL) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen i_fatal_status(DOVEADM_EX_NOTFOUND,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen "Can't find namespace for: %s", oldname);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen newns = mail_namespace_find(user->namespaces, newname);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (newns == NULL) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen i_fatal_status(DOVEADM_EX_NOTFOUND,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen "Can't find namespace for: %s", newname);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
63cde222abaaa2a9bdaa9a143698dbc8b23bd742Timo Sirainen oldbox = mailbox_alloc(oldns->list, oldname, 0);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen newbox = mailbox_alloc(newns->list, newname, 0);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (mailbox_rename(oldbox, newbox, TRUE) < 0) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen i_error("Can't rename mailbox %s to %s: %s", oldname, newname,
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen mailbox_get_last_error(oldbox, NULL));
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen doveadm_mail_failed_mailbox(_ctx, oldbox);
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen ret = -1;
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen }
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen if (ctx->ctx.subscriptions) {
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen if (mailbox_set_subscribed(oldbox, FALSE) < 0) {
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen i_error("Can't unsubscribe mailbox %s: %s", ctx->oldname,
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen mailbox_get_last_error(oldbox, NULL));
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen doveadm_mail_failed_mailbox(_ctx, oldbox);
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen ret = -1;
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen }
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen if (mailbox_set_subscribed(newbox, TRUE) < 0) {
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen i_error("Can't subscribe to mailbox %s: %s", ctx->newname,
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen mailbox_get_last_error(newbox, NULL));
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen doveadm_mail_failed_mailbox(_ctx, newbox);
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen ret = -1;
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen }
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen }
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen mailbox_free(&oldbox);
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen mailbox_free(&newbox);
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen return ret;
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen}
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainenstatic void cmd_mailbox_rename_init(struct doveadm_mail_cmd_context *_ctx,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *const args[])
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen{
ed5e91e58dfc372c2135c55427bf6f25a7725042Timo Sirainen struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
d95ef05d0c6ea5fdc8bc877dcf8f3b8fff6d8fb4Timo Sirainen
d95ef05d0c6ea5fdc8bc877dcf8f3b8fff6d8fb4Timo Sirainen if (str_array_length(args) != 2)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen doveadm_mail_help_name("mailbox rename");
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen doveadm_mailbox_args_check(args);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen ctx->oldname = p_strdup(ctx->ctx.ctx.pool, args[0]);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->newname = p_strdup(ctx->ctx.ctx.pool, args[1]);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen}
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
ed5e91e58dfc372c2135c55427bf6f25a7725042Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_rename_alloc(void)
63cde222abaaa2a9bdaa9a143698dbc8b23bd742Timo Sirainen{
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct rename_cmd_context *ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
ed5e91e58dfc372c2135c55427bf6f25a7725042Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct rename_cmd_context);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_rename_init;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_rename_run;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen return &ctx->ctx.ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen}
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenstatic int
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainencmd_mailbox_subscribe_run(struct doveadm_mail_cmd_context *_ctx,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct mail_user *user)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen{
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct mail_namespace *ns;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct mailbox *box;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *const *namep;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen int ret = 0;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
2d0a002723dac5c58c250f6566efb1f5e474c169Timo Sirainen array_foreach(&ctx->mailboxes, namep) {
2d0a002723dac5c58c250f6566efb1f5e474c169Timo Sirainen const char *name = *namep;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (ns == NULL) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen i_fatal_status(DOVEADM_EX_NOTFOUND,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen "Can't find namespace for: %s", name);
ed5e91e58dfc372c2135c55427bf6f25a7725042Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
14b495a09db7aea6b68146fd6427229e75d2bb39Timo Sirainen box = mailbox_alloc(ns->list, name, 0);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (mailbox_set_subscribed(box, ctx->ctx.subscriptions) < 0) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen i_error("Can't %s mailbox %s: %s", name,
ed5e91e58dfc372c2135c55427bf6f25a7725042Timo Sirainen ctx->ctx.subscriptions ? "subscribe to" :
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen "unsubscribe",
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen mailbox_get_last_error(box, NULL));
ed5e91e58dfc372c2135c55427bf6f25a7725042Timo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
14b495a09db7aea6b68146fd6427229e75d2bb39Timo Sirainen ret = -1;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen mailbox_free(&box);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
ed5e91e58dfc372c2135c55427bf6f25a7725042Timo Sirainen return ret;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen}
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenstatic void cmd_mailbox_subscribe_init(struct doveadm_mail_cmd_context *_ctx,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *const args[])
3cff7935d606a75357472a3e4269e0b06ac1bef2Timo Sirainen{
3cff7935d606a75357472a3e4269e0b06ac1bef2Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *name;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen unsigned int i;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
16133a719ce8b6a5b8cedd721340cc1607c43433Timo Sirainen if (args[0] == NULL) {
63cde222abaaa2a9bdaa9a143698dbc8b23bd742Timo Sirainen doveadm_mail_help_name(ctx->ctx.subscriptions ?
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen "mailbox subscribe" :
63cde222abaaa2a9bdaa9a143698dbc8b23bd742Timo Sirainen "mailbox unsubscribe");
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
e023e3c2677ab66d7a7445eae9caf3d739e199cbTimo Sirainen doveadm_mailbox_args_check(args);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen for (i = 0; args[i] != NULL; i++) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen name = p_strdup(ctx->ctx.ctx.pool, args[i]);
e023e3c2677ab66d7a7445eae9caf3d739e199cbTimo Sirainen array_append(&ctx->mailboxes, &name, 1);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen }
63cde222abaaa2a9bdaa9a143698dbc8b23bd742Timo Sirainen}
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenstatic struct doveadm_mail_cmd_context *
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainencmd_mailbox_subscriptions_alloc(bool subscriptions)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen{
e023e3c2677ab66d7a7445eae9caf3d739e199cbTimo Sirainen struct mailbox_cmd_context *ctx;
3cff7935d606a75357472a3e4269e0b06ac1bef2Timo Sirainen
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen ctx = doveadm_mail_cmd_alloc(struct mailbox_cmd_context);
3cff7935d606a75357472a3e4269e0b06ac1bef2Timo Sirainen ctx->ctx.subscriptions = subscriptions;
3cff7935d606a75357472a3e4269e0b06ac1bef2Timo Sirainen
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_parse_arg;
3cff7935d606a75357472a3e4269e0b06ac1bef2Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_subscribe_init;
3cff7935d606a75357472a3e4269e0b06ac1bef2Timo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_subscribe_run;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen return &ctx->ctx.ctx;
e023e3c2677ab66d7a7445eae9caf3d739e199cbTimo Sirainen}
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
e023e3c2677ab66d7a7445eae9caf3d739e199cbTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_subscribe_alloc(void)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen{
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen return cmd_mailbox_subscriptions_alloc(TRUE);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen}
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_unsubscribe_alloc(void)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen{
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen return cmd_mailbox_subscriptions_alloc(FALSE);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen}
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstruct doveadm_mail_cmd cmd_mailbox_list = {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen cmd_mailbox_list_alloc, "mailbox list",
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "[-7|-8] [-s] [<mailbox mask> [...]]"
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen};
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstruct doveadm_mail_cmd cmd_mailbox_create = {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen cmd_mailbox_create_alloc, "mailbox create",
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "[-s] <mailbox> [...]"
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen};
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstruct doveadm_mail_cmd cmd_mailbox_delete = {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen cmd_mailbox_delete_alloc, "mailbox delete",
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "[-s] <mailbox> [...]"
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen};
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstruct doveadm_mail_cmd cmd_mailbox_rename = {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen cmd_mailbox_rename_alloc, "mailbox rename",
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "[-s] <old name> <new name>"
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen};
b6df44e31bf9d54669b5903dfb5dd3fbbe896accTimo Sirainenstruct doveadm_mail_cmd cmd_mailbox_subscribe = {
14b495a09db7aea6b68146fd6427229e75d2bb39Timo Sirainen cmd_mailbox_subscribe_alloc, "mailbox subscribe",
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen "<mailbox> [...]"
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen};
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainenstruct doveadm_mail_cmd cmd_mailbox_unsubscribe = {
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen cmd_mailbox_unsubscribe_alloc, "mailbox unsubscribe",
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen "<mailbox> [...]"
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen};
14b495a09db7aea6b68146fd6427229e75d2bb39Timo Sirainen