doveadm-mail-mailbox.c revision 4b5a2e923b61c3512dec0fcb32653fbd652bdc32
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen#include "lib.h"
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen#include "array.h"
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen#include "str.h"
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen#include "unichar.h"
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen#include "imap-utf7.h"
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen#include "mail-namespace.h"
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen#include "mail-storage.h"
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen#include "mail-search-build.h"
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen#include "doveadm-print.h"
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen#include "doveadm-mailbox-list-iter.h"
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen#include "doveadm-mail.h"
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen#include <stdio.h>
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainenstruct doveadm_mailbox_cmd_context {
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct doveadm_mail_cmd_context ctx;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen bool subscriptions;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen};
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainenstruct mailbox_cmd_context {
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen struct doveadm_mailbox_cmd_context ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen ARRAY_TYPE(const_string) mailboxes;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen};
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
bada94029be451d716948d6e03a4fc329447486aTimo Sirainenstruct create_cmd_context {
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen struct doveadm_mailbox_cmd_context ctx;
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen ARRAY_TYPE(const_string) mailboxes;
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen struct mailbox_update update;
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen};
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainenstruct delete_cmd_context {
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen struct doveadm_mailbox_cmd_context ctx;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen ARRAY_TYPE(const_string) mailboxes;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen bool recursive;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen};
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainenstruct rename_cmd_context {
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen struct doveadm_mailbox_cmd_context ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen const char *oldname, *newname;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen};
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainenstruct list_cmd_context {
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen struct doveadm_mailbox_cmd_context ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct mail_search_args *search_args;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen bool mutf7;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen};
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomistruct update_cmd_context {
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi struct doveadm_mailbox_cmd_context ctx;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi const char *mailbox;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi struct mailbox_update update;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi};
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainenvoid doveadm_mailbox_args_check(const char *const args[])
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen{
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen unsigned int i;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen for (i = 0; args[i] != NULL; i++) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (!uni_utf8_str_is_valid(args[i])) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen i_fatal_status(EX_DATAERR,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen "Mailbox name not valid UTF-8: %s", args[i]);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen }
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen }
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen}
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainenstatic bool cmd_mailbox_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen{
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen struct doveadm_mailbox_cmd_context *ctx =
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen (struct doveadm_mailbox_cmd_context *)_ctx;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen switch (c) {
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen case 's':
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen ctx->subscriptions = TRUE;
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen break;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen default:
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen return FALSE;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen }
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen return TRUE;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen}
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen#define doveadm_mailbox_cmd_alloc(type) \
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen (type *)doveadm_mailbox_cmd_alloc_size(sizeof(type))
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainenstatic struct doveadm_mail_cmd_context *
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainendoveadm_mailbox_cmd_alloc_size(size_t size)
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen{
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen struct doveadm_mail_cmd_context *ctx;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen ctx = doveadm_mail_cmd_alloc_size(size);
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen ctx->getopt_args = "s";
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->v.parse_arg = cmd_mailbox_parse_arg;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen return ctx;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen}
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainenstatic bool
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainencmd_mailbox_list_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen{
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen switch (c) {
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen case '7':
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen ctx->mutf7 = TRUE;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen break;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen case '8':
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen ctx->mutf7 = FALSE;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen break;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen case 's':
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen ctx->ctx.subscriptions = TRUE;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen break;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen default:
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen return FALSE;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen }
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen return TRUE;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen}
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainenstatic int
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainencmd_mailbox_list_run(struct doveadm_mail_cmd_context *_ctx,
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct mail_user *user)
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen{
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen enum mailbox_list_iter_flags iter_flags =
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen struct doveadm_mailbox_list_iter *iter;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen const struct mailbox_info *info;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen string_t *str = t_str_new(256);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen if (ctx->ctx.subscriptions)
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen iter_flags |= MAILBOX_LIST_ITER_SELECT_SUBSCRIBED;
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen iter = doveadm_mailbox_list_iter_full_init(_ctx, user, ctx->search_args,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen iter_flags);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) {
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen if (!ctx->mutf7)
402e999a878e0cc41a0afb830fea0a93afc75f0dTimo Sirainen doveadm_print(info->vname);
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen else {
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen str_truncate(str, 0);
402e999a878e0cc41a0afb830fea0a93afc75f0dTimo Sirainen if (imap_utf8_to_utf7(info->vname, str) < 0)
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen i_unreached();
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print(str_c(str));
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen }
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen }
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (doveadm_mailbox_list_iter_deinit(&iter) < 0)
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return -1;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return 0;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen}
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstruct mail_search_args *
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainendoveadm_mail_mailbox_search_args_build(const char *const args[])
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen{
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct mail_search_args *search_args;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct mail_search_arg *arg;
b1e46e840dae172f61140dc260eede4f124ebb31Timo Sirainen enum mail_search_arg_type type;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen unsigned int i;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen doveadm_mailbox_args_check(args);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen search_args = mail_search_build_init();
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen for (i = 0; args[i] != NULL; i++) {
b1e46e840dae172f61140dc260eede4f124ebb31Timo Sirainen if (strchr(args[i], '*') != NULL ||
b1e46e840dae172f61140dc260eede4f124ebb31Timo Sirainen strchr(args[i], '%') != NULL)
b1e46e840dae172f61140dc260eede4f124ebb31Timo Sirainen type = SEARCH_MAILBOX_GLOB;
b1e46e840dae172f61140dc260eede4f124ebb31Timo Sirainen else
b1e46e840dae172f61140dc260eede4f124ebb31Timo Sirainen type = SEARCH_MAILBOX;
b1e46e840dae172f61140dc260eede4f124ebb31Timo Sirainen arg = mail_search_build_add(search_args, type);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen arg->value.str = p_strdup(search_args->pool, args[i]);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen }
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen if (i > 1) {
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct mail_search_arg *subargs = search_args->args;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen search_args->args = NULL;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen arg = mail_search_build_add(search_args, SEARCH_OR);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen arg->value.subargs = subargs;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen }
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen return search_args;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen}
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatic void cmd_mailbox_list_init(struct doveadm_mail_cmd_context *_ctx,
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen const char *const args[])
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen{
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_header("mailbox", "mailbox",
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->search_args = doveadm_mail_mailbox_search_args_build(args);
23878bd03d1de531e3261a25598beec621351910Timo Sirainen}
23878bd03d1de531e3261a25598beec621351910Timo Sirainen
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainenstatic void cmd_mailbox_list_deinit(struct doveadm_mail_cmd_context *_ctx)
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen{
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen
98e8f95ffee4eacca72b1bcf082f2c735592301bTimo Sirainen if (ctx->search_args != NULL)
98e8f95ffee4eacca72b1bcf082f2c735592301bTimo Sirainen mail_search_args_unref(&ctx->search_args);
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen}
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_list_alloc(void)
23878bd03d1de531e3261a25598beec621351910Timo Sirainen{
23878bd03d1de531e3261a25598beec621351910Timo Sirainen struct list_cmd_context *ctx;
23878bd03d1de531e3261a25598beec621351910Timo Sirainen
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct list_cmd_context);
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_list_init;
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen ctx->ctx.ctx.v.deinit = cmd_mailbox_list_deinit;
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_list_run;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_list_parse_arg;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen ctx->ctx.ctx.getopt_args = "78s";
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_init(DOVEADM_PRINT_TYPE_FLOW);
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen return &ctx->ctx.ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen}
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainenstatic int
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainencmd_mailbox_create_run(struct doveadm_mail_cmd_context *_ctx,
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct mail_user *user)
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen{
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen struct create_cmd_context *ctx = (struct create_cmd_context *)_ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct mail_namespace *ns;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct mailbox *box;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen const char *const *namep;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen int ret = 0;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen array_foreach(&ctx->mailboxes, namep) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen const char *name = *namep;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen unsigned int len;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen bool directory = FALSE;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen len = strlen(name);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen if (len > 0 && name[len-1] == mail_namespace_get_sep(ns)) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen name = t_strndup(name, len-1);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen directory = TRUE;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen }
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen box = mailbox_alloc(ns->list, name, 0);
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen if (mailbox_create(box, &ctx->update, directory) < 0) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen i_error("Can't create mailbox %s: %s", name,
11352dc3e4b29f3d2763c82f8ea4f99e8daf4fa3Timo Sirainen mailbox_get_last_error(box, NULL));
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen ret = -1;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen }
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen if (ctx->ctx.subscriptions) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen if (mailbox_set_subscribed(box, TRUE) < 0) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen i_error("Can't subscribe to mailbox %s: %s", name,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen mailbox_get_last_error(box, NULL));
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen ret = -1;
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen }
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen }
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen mailbox_free(&box);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen }
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return ret;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen}
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic void cmd_mailbox_create_init(struct doveadm_mail_cmd_context *_ctx,
23878bd03d1de531e3261a25598beec621351910Timo Sirainen const char *const args[])
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen{
23878bd03d1de531e3261a25598beec621351910Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen const char *name;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen unsigned int i;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen if (args[0] == NULL)
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen doveadm_mail_help_name("mailbox create");
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen doveadm_mailbox_args_check(args);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen for (i = 0; args[i] != NULL; i++) {
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen name = p_strdup(ctx->ctx.ctx.pool, args[i]);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen array_append(&ctx->mailboxes, &name, 1);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen }
23878bd03d1de531e3261a25598beec621351910Timo Sirainen}
23878bd03d1de531e3261a25598beec621351910Timo Sirainen
bada94029be451d716948d6e03a4fc329447486aTimo Sirainenstatic bool
bada94029be451d716948d6e03a4fc329447486aTimo Sirainencmd_mailbox_create_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen{
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen struct create_cmd_context *ctx = (struct create_cmd_context *)_ctx;
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen switch (c) {
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen case 'g':
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen if (guid_128_from_string(optarg, ctx->update.mailbox_guid) < 0)
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen doveadm_mail_help_name("mailbox create");
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen break;
2df92c5bbd42ff42a1a38d688a6b11f1d326cb78Timo Sirainen case 's':
2df92c5bbd42ff42a1a38d688a6b11f1d326cb78Timo Sirainen ctx->ctx.subscriptions = TRUE;
2df92c5bbd42ff42a1a38d688a6b11f1d326cb78Timo Sirainen break;
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen default:
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen return FALSE;
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen }
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen return TRUE;
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen}
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_create_alloc(void)
23878bd03d1de531e3261a25598beec621351910Timo Sirainen{
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen struct create_cmd_context *ctx;
23878bd03d1de531e3261a25598beec621351910Timo Sirainen
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct create_cmd_context);
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_create_init;
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_create_run;
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_create_parse_arg;
2df92c5bbd42ff42a1a38d688a6b11f1d326cb78Timo Sirainen ctx->ctx.ctx.getopt_args = "g:s";
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen return &ctx->ctx.ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen}
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
27a44fcfd8d19bffe0f267f20a2b5d3fe7600fddTimo Sirainenstatic int i_strcmp_reverse_p(const char *const *s1, const char *const *s2)
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen{
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen return -strcmp(*s1, *s2);
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen}
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainenstatic int
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainenget_child_mailboxes(struct mail_user *user, ARRAY_TYPE(const_string) *mailboxes,
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen const char *name)
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen{
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen struct mailbox_list_iterate_context *iter;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen struct mail_namespace *ns;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen const struct mailbox_info *info;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen const char *pattern, *child_name;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
28c669e01da03d36cef8f64a0eddc000c47befd8Timo Sirainen pattern = name[0] == '\0' ? "*" :
28c669e01da03d36cef8f64a0eddc000c47befd8Timo Sirainen t_strdup_printf("%s%c*", name, mail_namespace_get_sep(ns));
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen iter = mailbox_list_iter_init(ns->list, pattern,
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen MAILBOX_LIST_ITER_RETURN_NO_FLAGS);
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen while ((info = mailbox_list_iter_next(iter)) != NULL) {
402e999a878e0cc41a0afb830fea0a93afc75f0dTimo Sirainen child_name = t_strdup(info->vname);
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen array_append(mailboxes, &child_name, 1);
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen }
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return mailbox_list_iter_deinit(&iter);
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen}
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainenstatic int
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainencmd_mailbox_delete_run(struct doveadm_mail_cmd_context *_ctx,
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct mail_user *user)
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen{
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct mail_namespace *ns;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct mailbox *box;
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen struct mail_storage *storage;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen const char *const *namep;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen ARRAY_TYPE(const_string) recursive_mailboxes;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen const ARRAY_TYPE(const_string) *mailboxes = &ctx->mailboxes;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen int ret = 0;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen if (ctx->recursive) {
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen t_array_init(&recursive_mailboxes, 32);
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen array_foreach(&ctx->mailboxes, namep) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (get_child_mailboxes(user, &recursive_mailboxes,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen *namep) < 0) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_error(_ctx, MAIL_ERROR_TEMP);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen ret = -1;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen }
28c669e01da03d36cef8f64a0eddc000c47befd8Timo Sirainen if ((*namep)[0] != '\0')
28c669e01da03d36cef8f64a0eddc000c47befd8Timo Sirainen array_append(&recursive_mailboxes, namep, 1);
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen }
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen array_sort(&recursive_mailboxes, i_strcmp_reverse_p);
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen mailboxes = &recursive_mailboxes;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen }
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen array_foreach(mailboxes, namep) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen const char *name = *namep;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen box = mailbox_alloc(ns->list, name, 0);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen storage = mailbox_get_storage(box);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen if (mailbox_delete(box) < 0) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen i_error("Can't delete mailbox %s: %s", name,
11352dc3e4b29f3d2763c82f8ea4f99e8daf4fa3Timo Sirainen mailbox_get_last_error(box, NULL));
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen ret = -1;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen }
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen if (ctx->ctx.subscriptions) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen if (mailbox_set_subscribed(box, FALSE) < 0) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen i_error("Can't unsubscribe mailbox %s: %s", name,
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen mail_storage_get_last_error(storage, NULL));
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen ret = -1;
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen }
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen }
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen mailbox_free(&box);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen }
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return ret;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen}
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic void cmd_mailbox_delete_init(struct doveadm_mail_cmd_context *_ctx,
23878bd03d1de531e3261a25598beec621351910Timo Sirainen const char *const args[])
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen{
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen const char *name;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen unsigned int i;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen if (args[0] == NULL)
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen doveadm_mail_help_name("mailbox delete");
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen doveadm_mailbox_args_check(args);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen for (i = 0; args[i] != NULL; i++) {
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen name = p_strdup(ctx->ctx.ctx.pool, args[i]);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen array_append(&ctx->mailboxes, &name, 1);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen }
c439de14aff3e8b1d6adf30fa5215f5dff642a04Timo Sirainen array_sort(&ctx->mailboxes, i_strcmp_reverse_p);
23878bd03d1de531e3261a25598beec621351910Timo Sirainen}
23878bd03d1de531e3261a25598beec621351910Timo Sirainen
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainenstatic bool
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainencmd_mailbox_delete_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen{
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen switch (c) {
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen case 'r':
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen ctx->recursive = TRUE;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen break;
c43bfb802ccb82e3855253bd8cb2233e3b061dd7Timo Sirainen case 's':
c43bfb802ccb82e3855253bd8cb2233e3b061dd7Timo Sirainen ctx->ctx.subscriptions = TRUE;
c43bfb802ccb82e3855253bd8cb2233e3b061dd7Timo Sirainen break;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen default:
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen return FALSE;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen }
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen return TRUE;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen}
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_delete_alloc(void)
23878bd03d1de531e3261a25598beec621351910Timo Sirainen{
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen struct delete_cmd_context *ctx;
23878bd03d1de531e3261a25598beec621351910Timo Sirainen
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct delete_cmd_context);
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_delete_init;
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_delete_run;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_delete_parse_arg;
c43bfb802ccb82e3855253bd8cb2233e3b061dd7Timo Sirainen ctx->ctx.ctx.getopt_args = "rs";
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen return &ctx->ctx.ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen}
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainenstatic int
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainencmd_mailbox_rename_run(struct doveadm_mail_cmd_context *_ctx,
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct mail_user *user)
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen{
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct mail_namespace *oldns, *newns;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct mailbox *oldbox, *newbox;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen const char *oldname = ctx->oldname;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen const char *newname = ctx->newname;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen int ret = 0;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen oldns = mail_namespace_find(user->namespaces, oldname);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen newns = mail_namespace_find(user->namespaces, newname);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen oldbox = mailbox_alloc(oldns->list, oldname, 0);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen newbox = mailbox_alloc(newns->list, newname, 0);
71e88fae3be360e9a93b3398e743f99a6f05d2edTimo Sirainen if (mailbox_rename(oldbox, newbox) < 0) {
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen i_error("Can't rename mailbox %s to %s: %s", oldname, newname,
11352dc3e4b29f3d2763c82f8ea4f99e8daf4fa3Timo Sirainen mailbox_get_last_error(oldbox, NULL));
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_mailbox(_ctx, oldbox);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen ret = -1;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen }
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen if (ctx->ctx.subscriptions) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen if (mailbox_set_subscribed(oldbox, FALSE) < 0) {
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen i_error("Can't unsubscribe mailbox %s: %s", ctx->oldname,
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen mailbox_get_last_error(oldbox, NULL));
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_mailbox(_ctx, oldbox);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen ret = -1;
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen }
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen if (mailbox_set_subscribed(newbox, TRUE) < 0) {
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen i_error("Can't subscribe to mailbox %s: %s", ctx->newname,
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen mailbox_get_last_error(newbox, NULL));
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_mailbox(_ctx, newbox);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen ret = -1;
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen }
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen }
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen mailbox_free(&oldbox);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen mailbox_free(&newbox);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return ret;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen}
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic void cmd_mailbox_rename_init(struct doveadm_mail_cmd_context *_ctx,
23878bd03d1de531e3261a25598beec621351910Timo Sirainen const char *const args[])
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen{
23878bd03d1de531e3261a25598beec621351910Timo Sirainen struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen if (str_array_length(args) != 2)
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen doveadm_mail_help_name("mailbox rename");
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen doveadm_mailbox_args_check(args);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen ctx->oldname = p_strdup(ctx->ctx.ctx.pool, args[0]);
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen ctx->newname = p_strdup(ctx->ctx.ctx.pool, args[1]);
23878bd03d1de531e3261a25598beec621351910Timo Sirainen}
23878bd03d1de531e3261a25598beec621351910Timo Sirainen
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_rename_alloc(void)
23878bd03d1de531e3261a25598beec621351910Timo Sirainen{
23878bd03d1de531e3261a25598beec621351910Timo Sirainen struct rename_cmd_context *ctx;
23878bd03d1de531e3261a25598beec621351910Timo Sirainen
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct rename_cmd_context);
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_rename_init;
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_rename_run;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen return &ctx->ctx.ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen}
23878bd03d1de531e3261a25598beec621351910Timo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainenstatic int
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainencmd_mailbox_subscribe_run(struct doveadm_mail_cmd_context *_ctx,
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen struct mail_user *user)
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen{
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen struct mail_namespace *ns;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen struct mailbox *box;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen const char *const *namep;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen int ret = 0;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen array_foreach(&ctx->mailboxes, namep) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen const char *name = *namep;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen box = mailbox_alloc(ns->list, name, 0);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen if (mailbox_set_subscribed(box, ctx->ctx.subscriptions) < 0) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen i_error("Can't %s mailbox %s: %s", name,
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen ctx->ctx.subscriptions ? "subscribe to" :
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen "unsubscribe",
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen mailbox_get_last_error(box, NULL));
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen ret = -1;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen }
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen mailbox_free(&box);
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen }
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return ret;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen}
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainenstatic void cmd_mailbox_subscribe_init(struct doveadm_mail_cmd_context *_ctx,
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen const char *const args[])
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen{
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen const char *name;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen unsigned int i;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen if (args[0] == NULL) {
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen doveadm_mail_help_name(ctx->ctx.subscriptions ?
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen "mailbox subscribe" :
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen "mailbox unsubscribe");
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen }
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainen doveadm_mailbox_args_check(args);
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen for (i = 0; args[i] != NULL; i++) {
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen name = p_strdup(ctx->ctx.ctx.pool, args[i]);
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen array_append(&ctx->mailboxes, &name, 1);
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen }
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen}
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainenstatic struct doveadm_mail_cmd_context *
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainencmd_mailbox_subscriptions_alloc(bool subscriptions)
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen{
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen struct mailbox_cmd_context *ctx;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct mailbox_cmd_context);
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen ctx->ctx.subscriptions = subscriptions;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_parse_arg;
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_subscribe_init;
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_subscribe_run;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen return &ctx->ctx.ctx;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen}
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_subscribe_alloc(void)
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen{
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen return cmd_mailbox_subscriptions_alloc(TRUE);
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen}
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_unsubscribe_alloc(void)
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen{
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen return cmd_mailbox_subscriptions_alloc(FALSE);
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen}
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomistatic
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomivoid cmd_mailbox_update_init(struct doveadm_mail_cmd_context *_ctx,
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi const char *const args[])
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi{
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi struct update_cmd_context *ctx = (struct update_cmd_context *)_ctx;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi if (str_array_length(args) != 1)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi doveadm_mail_help_name("mailbox update");
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi doveadm_mailbox_args_check(args);
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi ctx->mailbox = args[0];
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi if ((ctx->update.min_first_recent_uid != 0 ||
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi ctx->update.min_next_uid != 0) &&
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi ctx->update.min_first_recent_uid > ctx->update.min_next_uid) {
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi i_fatal_status(EX_DATAERR,
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi "min_first_recent_uid > min_next_uid");
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi }
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi}
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomistatic
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomibool cmd_mailbox_update_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi{
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi struct update_cmd_context *ctx = (struct update_cmd_context *)_ctx;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi switch (c) {
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi case 'g':
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi if (guid_128_from_string(optarg, ctx->update.mailbox_guid) < 0)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi doveadm_mail_help_name("mailbox update");
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi break;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi case 'V':
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi if (str_to_uint32(optarg, &(ctx->update.uid_validity)) < 0)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi doveadm_mail_help_name("mailbox update");
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi break;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi case 'N':
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi if (str_to_uint32(optarg, &(ctx->update.min_next_uid)) < 0)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi doveadm_mail_help_name("mailbox update");
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi break;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi case 'R':
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi if (str_to_uint32(optarg, &(ctx->update.min_first_recent_uid)) < 0)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi doveadm_mail_help_name("mailbox update");
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi break;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi case 'H':
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi if (str_to_uint64(optarg, &(ctx->update.min_highest_modseq)) < 0)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi doveadm_mail_help_name("mailbox update");
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi break;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi case 'P':
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi if (str_to_uint64(optarg, &(ctx->update.min_highest_pvt_modseq)) < 0)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi doveadm_mail_help_name("mailbox update");
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi break;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi default:
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi return FALSE;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi }
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi return TRUE;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi}
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomistatic
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomiint cmd_mailbox_update_run(struct doveadm_mail_cmd_context *_ctx,
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi struct mail_user *user)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi{
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi struct update_cmd_context *ctx = (struct update_cmd_context *)_ctx;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi struct mail_namespace *ns;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi struct mailbox *box;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi int ret = 0;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi ns = mail_namespace_find(user->namespaces, ctx->mailbox);
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi box = mailbox_alloc(ns->list, ctx->mailbox, 0);
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi if ((ret = mailbox_update(box, &(ctx->update))) != 0) {
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi i_error("Cannot update %s: %s",
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi ctx->mailbox,
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi mailbox_get_last_error(box, NULL));
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi }
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi mailbox_free(&box);
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi return ret;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi}
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomistatic
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomistruct doveadm_mail_cmd_context *cmd_mailbox_update_alloc(void)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi{
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi struct update_cmd_context *ctx;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi ctx = doveadm_mail_cmd_alloc(struct update_cmd_context);
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi ctx->ctx.ctx.v.parse_arg = cmd_mailbox_update_parse_arg;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi ctx->ctx.ctx.v.init = cmd_mailbox_update_init;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi ctx->ctx.ctx.v.run = cmd_mailbox_update_run;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi return &ctx->ctx.ctx;
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi}
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_list_ver2 = {
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .name = "mailbox list",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .mail_cmd = cmd_mailbox_list_alloc,
c45a841bee3f42ec6524b8f62c3fd457115c3f97Timo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"[-7|-8] [-s] [<mailbox mask> [...]]",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_START
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_MAIL_COMMON
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('7', "mutf7", CMD_PARAM_BOOL, 0)
a18da4410dcd47ab8d9b40c09a76a54fa55b9c86Timo SirainenDOVEADM_CMD_PARAM('8', "utf8", CMD_PARAM_BOOL, 0)
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('s', "subscriptions", CMD_PARAM_BOOL, 0)
a18da4410dcd47ab8d9b40c09a76a54fa55b9c86Timo SirainenDOVEADM_CMD_PARAM('\0', "mailbox-mask", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_END
23878bd03d1de531e3261a25598beec621351910Timo Sirainen};
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_create_ver2 = {
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .name = "mailbox create",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .mail_cmd = cmd_mailbox_create_alloc,
c45a841bee3f42ec6524b8f62c3fd457115c3f97Timo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"[-s] [-g <guid>] <mailbox> [...]",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_START
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_MAIL_COMMON
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('s', "subscriptions", CMD_PARAM_BOOL, 0)
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('g', "guid", CMD_PARAM_STR, 0)
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_END
23878bd03d1de531e3261a25598beec621351910Timo Sirainen};
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_delete_ver2 = {
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .name = "mailbox delete",
5f7f5baf6ce0b9428793b590ca286cdb24f67a11Aki Tuomi .mail_cmd = cmd_mailbox_delete_alloc,
5f7f5baf6ce0b9428793b590ca286cdb24f67a11Aki Tuomi .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"[-s] <mailbox> [...]",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_START
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_MAIL_COMMON
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('s', "subscriptions", CMD_PARAM_BOOL, 0)
4b5a2e923b61c3512dec0fcb32653fbd652bdc32Aki TuomiDOVEADM_CMD_PARAM('r', "recursive", CMD_PARAM_BOOL, 0)
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_END
23878bd03d1de531e3261a25598beec621351910Timo Sirainen};
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_rename_ver2 = {
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .name = "mailbox rename",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .mail_cmd = cmd_mailbox_rename_alloc,
c45a841bee3f42ec6524b8f62c3fd457115c3f97Timo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"[-s] <old name> <new name>",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_START
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_MAIL_COMMON
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('s', "subscriptions", CMD_PARAM_BOOL, 0)
a18da4410dcd47ab8d9b40c09a76a54fa55b9c86Timo SirainenDOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
a18da4410dcd47ab8d9b40c09a76a54fa55b9c86Timo SirainenDOVEADM_CMD_PARAM('\0', "new-name", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_END
23878bd03d1de531e3261a25598beec621351910Timo Sirainen};
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_subscribe_ver2 = {
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .name = "mailbox subscribe",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .mail_cmd = cmd_mailbox_subscribe_alloc,
c45a841bee3f42ec6524b8f62c3fd457115c3f97Timo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<mailbox> [...]",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_START
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_MAIL_COMMON
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_END
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen};
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_unsubscribe_ver2 = {
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .name = "mailbox unsubscribe",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomi .mail_cmd = cmd_mailbox_unsubscribe_alloc,
c45a841bee3f42ec6524b8f62c3fd457115c3f97Timo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<mailbox> [...]",
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_START
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_MAIL_COMMON
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki TuomiDOVEADM_CMD_PARAMS_END
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen};
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_update_ver2 = {
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi .name = "mailbox update",
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi .mail_cmd = cmd_mailbox_update_alloc,
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"[--mailbox-guid guid] [--uid-validity uid] [--min-next-uid uid] [--min-first-recent-uid uid] [--min-highest-modseq seq] [--min-highest-pvt-modseq seq] <mailbox>",
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki TuomiDOVEADM_CMD_PARAMS_START
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki TuomiDOVEADM_CMD_MAIL_COMMON
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki TuomiDOVEADM_CMD_PARAM('g', "mailbox-guid", CMD_PARAM_STR, 0)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki TuomiDOVEADM_CMD_PARAM('V', "uid-validity", CMD_PARAM_INT64, 0)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki TuomiDOVEADM_CMD_PARAM('N', "min-next-uid", CMD_PARAM_INT64, 0)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki TuomiDOVEADM_CMD_PARAM('R', "min-first-recent-uid", CMD_PARAM_INT64, 0)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki TuomiDOVEADM_CMD_PARAM('H', "min-highest-modseq", CMD_PARAM_INT64, 0)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki TuomiDOVEADM_CMD_PARAM('P', "min-highest-pvt-modseq", CMD_PARAM_INT64, 0)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki TuomiDOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki TuomiDOVEADM_CMD_PARAMS_END
c220c8cd341ee9ba78979397c5d33ccd98b5d19fAki Tuomi};