doveadm-mail-mailbox.c revision 5f7f5baf6ce0b9428793b590ca286cdb24f67a11
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "lib.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "array.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "str.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "unichar.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "imap-utf7.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "mail-namespace.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "mail-storage.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "mail-search-build.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "doveadm-print.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "doveadm-mailbox-list-iter.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "doveadm-mail.h"
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include <stdio.h>
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstruct doveadm_mailbox_cmd_context {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct doveadm_mail_cmd_context ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch bool subscriptions;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch};
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstruct mailbox_cmd_context {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct doveadm_mailbox_cmd_context ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ARRAY_TYPE(const_string) mailboxes;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch};
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainenstruct create_cmd_context {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct doveadm_mailbox_cmd_context ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ARRAY_TYPE(const_string) mailboxes;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mailbox_update update;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch};
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainenstruct delete_cmd_context {
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen struct doveadm_mailbox_cmd_context ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ARRAY_TYPE(const_string) mailboxes;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch bool recursive;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch};
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstruct rename_cmd_context {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct doveadm_mailbox_cmd_context ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch const char *oldname, *newname;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch};
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstruct list_cmd_context {
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen struct doveadm_mailbox_cmd_context ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mail_search_args *search_args;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch bool mutf7;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch};
597db47e06df5ac9dbf80c336383b921fec9d373Timo Sirainen
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainenstruct update_cmd_context {
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen struct doveadm_mailbox_cmd_context ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch const char *mailbox;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mailbox_update update;
7be8ba0c0462887826e5ee6da6a27964d30383b5Timo Sirainen};
7be8ba0c0462887826e5ee6da6a27964d30383b5Timo Sirainen
7be8ba0c0462887826e5ee6da6a27964d30383b5Timo Sirainenvoid doveadm_mailbox_args_check(const char *const args[])
7be8ba0c0462887826e5ee6da6a27964d30383b5Timo Sirainen{
7be8ba0c0462887826e5ee6da6a27964d30383b5Timo Sirainen unsigned int i;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch for (i = 0; args[i] != NULL; i++) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (!uni_utf8_str_is_valid(args[i])) {
d295cff1b640240cd198b9c8e963c9116ab95510Timo Sirainen i_fatal_status(EX_DATAERR,
d295cff1b640240cd198b9c8e963c9116ab95510Timo Sirainen "Mailbox name not valid UTF-8: %s", args[i]);
935a2434cd674e9cd17eabb296f84d1d891a23aeTimo Sirainen }
935a2434cd674e9cd17eabb296f84d1d891a23aeTimo Sirainen }
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainenstatic bool cmd_mailbox_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen{
9a5980c7bb836f69a63082f4699c30596ea4ee74Timo Sirainen struct doveadm_mailbox_cmd_context *ctx =
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen (struct doveadm_mailbox_cmd_context *)_ctx;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen switch (c) {
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen case 's':
9a5980c7bb836f69a63082f4699c30596ea4ee74Timo Sirainen ctx->subscriptions = TRUE;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen break;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen default:
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return FALSE;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch }
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return TRUE;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#define doveadm_mailbox_cmd_alloc(type) \
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch (type *)doveadm_mailbox_cmd_alloc_size(sizeof(type))
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainenstatic struct doveadm_mail_cmd_context *
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschdoveadm_mailbox_cmd_alloc_size(size_t size)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct doveadm_mail_cmd_context *ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx = doveadm_mail_cmd_alloc_size(size);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx->getopt_args = "s";
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx->v.parse_arg = cmd_mailbox_parse_arg;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic bool
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschcmd_mailbox_list_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch switch (c) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch case '7':
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx->mutf7 = TRUE;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch break;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch case '8':
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx->mutf7 = FALSE;
5d3e31cae626840561c5313e97eef0272be26ae1Timo Sirainen break;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch case 's':
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx->ctx.subscriptions = TRUE;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch break;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch default:
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return FALSE;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch }
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return TRUE;
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic int
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschcmd_mailbox_list_run(struct doveadm_mail_cmd_context *_ctx,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mail_user *user)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch enum mailbox_list_iter_flags iter_flags =
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct doveadm_mailbox_list_iter *iter;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch const struct mailbox_info *info;
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen string_t *str = t_str_new(256);
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (ctx->ctx.subscriptions)
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen iter_flags |= MAILBOX_LIST_ITER_SELECT_SUBSCRIBED;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch iter = doveadm_mailbox_list_iter_full_init(_ctx, user, ctx->search_args,
1a3254b83ba00315cfc47d3c6e99e837914594cfTimo Sirainen iter_flags);
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) {
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen if (!ctx->mutf7)
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen doveadm_print(info->vname);
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen else {
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen str_truncate(str, 0);
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen if (imap_utf8_to_utf7(info->vname, str) < 0)
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen i_unreached();
d730192e34fbedbc590a5abc7351e5af5e120c5fTimo Sirainen doveadm_print(str_c(str));
d730192e34fbedbc590a5abc7351e5af5e120c5fTimo Sirainen }
d730192e34fbedbc590a5abc7351e5af5e120c5fTimo Sirainen }
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen if (doveadm_mailbox_list_iter_deinit(&iter) < 0)
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen return -1;
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen return 0;
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen}
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainenstruct mail_search_args *
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainendoveadm_mail_mailbox_search_args_build(const char *const args[])
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mail_search_args *search_args;
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen struct mail_search_arg *arg;
1a3254b83ba00315cfc47d3c6e99e837914594cfTimo Sirainen enum mail_search_arg_type type;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch unsigned int i;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch doveadm_mailbox_args_check(args);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen search_args = mail_search_build_init();
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch for (i = 0; args[i] != NULL; i++) {
3ab672903a7ed98263b89180261079870c964831Timo Sirainen if (strchr(args[i], '*') != NULL ||
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch strchr(args[i], '%') != NULL)
3ab672903a7ed98263b89180261079870c964831Timo Sirainen type = SEARCH_MAILBOX_GLOB;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch else
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch type = SEARCH_MAILBOX;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch arg = mail_search_build_add(search_args, type);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch arg->value.str = p_strdup(search_args->pool, args[i]);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch }
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (i > 1) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mail_search_arg *subargs = search_args->args;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch search_args->args = NULL;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch arg = mail_search_build_add(search_args, SEARCH_OR);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch arg->value.subargs = subargs;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch }
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return search_args;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic void cmd_mailbox_list_init(struct doveadm_mail_cmd_context *_ctx,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch const char *const args[])
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen{
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch doveadm_print_header("mailbox", "mailbox",
3ab672903a7ed98263b89180261079870c964831Timo Sirainen DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx->search_args = doveadm_mail_mailbox_search_args_build(args);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch}
3ab672903a7ed98263b89180261079870c964831Timo Sirainen
3ab672903a7ed98263b89180261079870c964831Timo Sirainenstatic void cmd_mailbox_list_deinit(struct doveadm_mail_cmd_context *_ctx)
3ab672903a7ed98263b89180261079870c964831Timo Sirainen{
3ab672903a7ed98263b89180261079870c964831Timo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen
3ab672903a7ed98263b89180261079870c964831Timo Sirainen if (ctx->search_args != NULL)
3ab672903a7ed98263b89180261079870c964831Timo Sirainen mail_search_args_unref(&ctx->search_args);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen}
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen
3ab672903a7ed98263b89180261079870c964831Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_list_alloc(void)
3ab672903a7ed98263b89180261079870c964831Timo Sirainen{
3ab672903a7ed98263b89180261079870c964831Timo Sirainen struct list_cmd_context *ctx;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen
3ab672903a7ed98263b89180261079870c964831Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct list_cmd_context);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_list_init;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen ctx->ctx.ctx.v.deinit = cmd_mailbox_list_deinit;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_list_run;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_list_parse_arg;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen ctx->ctx.ctx.getopt_args = "78s";
c67f6d09c1aa9d8bfdce4167da8ac009fd2917ceTimo Sirainen doveadm_print_init(DOVEADM_PRINT_TYPE_FLOW);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return &ctx->ctx.ctx;
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen}
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainenstatic int
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainencmd_mailbox_create_run(struct doveadm_mail_cmd_context *_ctx,
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen struct mail_user *user)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct create_cmd_context *ctx = (struct create_cmd_context *)_ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mail_namespace *ns;
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen struct mailbox *box;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch const char *const *namep;
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen int ret = 0;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch array_foreach(&ctx->mailboxes, namep) {
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen const char *name = *namep;
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen unsigned int len;
2c42748505ef4aed83ff59b34e50ed5606900c86Timo Sirainen bool directory = FALSE;
2c42748505ef4aed83ff59b34e50ed5606900c86Timo Sirainen
2c42748505ef4aed83ff59b34e50ed5606900c86Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
2c42748505ef4aed83ff59b34e50ed5606900c86Timo Sirainen len = strlen(name);
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen if (len > 0 && name[len-1] == mail_namespace_get_sep(ns)) {
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen name = t_strndup(name, len-1);
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen directory = TRUE;
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen }
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch box = mailbox_alloc(ns->list, name, 0);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (mailbox_create(box, &ctx->update, directory) < 0) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch i_error("Can't create mailbox %s: %s", name,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch mailbox_get_last_error(box, NULL));
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen ret = -1;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch }
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (ctx->ctx.subscriptions) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (mailbox_set_subscribed(box, TRUE) < 0) {
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen i_error("Can't subscribe to mailbox %s: %s", name,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch mailbox_get_last_error(box, NULL));
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch doveadm_mail_failed_mailbox(_ctx, box);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ret = -1;
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen }
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen }
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen mailbox_free(&box);
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen }
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return ret;
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainenstatic void cmd_mailbox_create_init(struct doveadm_mail_cmd_context *_ctx,
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen const char *const args[])
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen{
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen const char *name;
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen unsigned int i;
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen if (args[0] == NULL)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch doveadm_mail_help_name("mailbox create");
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch doveadm_mailbox_args_check(args);
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch for (i = 0; args[i] != NULL; i++) {
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen name = p_strdup(ctx->ctx.ctx.pool, args[i]);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch array_append(&ctx->mailboxes, &name, 1);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch }
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
3ab672903a7ed98263b89180261079870c964831Timo Sirainenstatic bool
3ab672903a7ed98263b89180261079870c964831Timo Sirainencmd_mailbox_create_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
3ab672903a7ed98263b89180261079870c964831Timo Sirainen{
3ab672903a7ed98263b89180261079870c964831Timo Sirainen struct create_cmd_context *ctx = (struct create_cmd_context *)_ctx;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen
3ab672903a7ed98263b89180261079870c964831Timo Sirainen switch (c) {
3ab672903a7ed98263b89180261079870c964831Timo Sirainen case 'g':
3ab672903a7ed98263b89180261079870c964831Timo Sirainen if (guid_128_from_string(optarg, ctx->update.mailbox_guid) < 0)
3ab672903a7ed98263b89180261079870c964831Timo Sirainen doveadm_mail_help_name("mailbox create");
3ab672903a7ed98263b89180261079870c964831Timo Sirainen break;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen case 's':
3ab672903a7ed98263b89180261079870c964831Timo Sirainen ctx->ctx.subscriptions = TRUE;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen break;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen default:
3ab672903a7ed98263b89180261079870c964831Timo Sirainen return FALSE;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen }
3ab672903a7ed98263b89180261079870c964831Timo Sirainen return TRUE;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic struct doveadm_mail_cmd_context *cmd_mailbox_create_alloc(void)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct create_cmd_context *ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx = doveadm_mailbox_cmd_alloc(struct create_cmd_context);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx->ctx.ctx.v.init = cmd_mailbox_create_init;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_create_run;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx->ctx.ctx.v.parse_arg = cmd_mailbox_create_parse_arg;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx->ctx.ctx.getopt_args = "g:s";
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return &ctx->ctx.ctx;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic int i_strcmp_reverse_p(const char *const *s1, const char *const *s2)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return -strcmp(*s1, *s2);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic int
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschget_child_mailboxes(struct mail_user *user, ARRAY_TYPE(const_string) *mailboxes,
const char *name)
{
struct mailbox_list_iterate_context *iter;
struct mail_namespace *ns;
const struct mailbox_info *info;
const char *pattern, *child_name;
ns = mail_namespace_find(user->namespaces, name);
pattern = name[0] == '\0' ? "*" :
t_strdup_printf("%s%c*", name, mail_namespace_get_sep(ns));
iter = mailbox_list_iter_init(ns->list, pattern,
MAILBOX_LIST_ITER_RETURN_NO_FLAGS);
while ((info = mailbox_list_iter_next(iter)) != NULL) {
child_name = t_strdup(info->vname);
array_append(mailboxes, &child_name, 1);
}
return mailbox_list_iter_deinit(&iter);
}
static int
cmd_mailbox_delete_run(struct doveadm_mail_cmd_context *_ctx,
struct mail_user *user)
{
struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
struct mail_namespace *ns;
struct mailbox *box;
struct mail_storage *storage;
const char *const *namep;
ARRAY_TYPE(const_string) recursive_mailboxes;
const ARRAY_TYPE(const_string) *mailboxes = &ctx->mailboxes;
int ret = 0;
if (ctx->recursive) {
t_array_init(&recursive_mailboxes, 32);
array_foreach(&ctx->mailboxes, namep) {
if (get_child_mailboxes(user, &recursive_mailboxes,
*namep) < 0) {
doveadm_mail_failed_error(_ctx, MAIL_ERROR_TEMP);
ret = -1;
}
if ((*namep)[0] != '\0')
array_append(&recursive_mailboxes, namep, 1);
}
array_sort(&recursive_mailboxes, i_strcmp_reverse_p);
mailboxes = &recursive_mailboxes;
}
array_foreach(mailboxes, namep) {
const char *name = *namep;
ns = mail_namespace_find(user->namespaces, name);
box = mailbox_alloc(ns->list, name, 0);
storage = mailbox_get_storage(box);
if (mailbox_delete(box) < 0) {
i_error("Can't delete mailbox %s: %s", name,
mailbox_get_last_error(box, NULL));
doveadm_mail_failed_mailbox(_ctx, box);
ret = -1;
}
if (ctx->ctx.subscriptions) {
if (mailbox_set_subscribed(box, FALSE) < 0) {
i_error("Can't unsubscribe mailbox %s: %s", name,
mail_storage_get_last_error(storage, NULL));
doveadm_mail_failed_mailbox(_ctx, box);
ret = -1;
}
}
mailbox_free(&box);
}
return ret;
}
static void cmd_mailbox_delete_init(struct doveadm_mail_cmd_context *_ctx,
const char *const args[])
{
struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
const char *name;
unsigned int i;
if (args[0] == NULL)
doveadm_mail_help_name("mailbox delete");
doveadm_mailbox_args_check(args);
for (i = 0; args[i] != NULL; i++) {
name = p_strdup(ctx->ctx.ctx.pool, args[i]);
array_append(&ctx->mailboxes, &name, 1);
}
array_sort(&ctx->mailboxes, i_strcmp_reverse_p);
}
static bool
cmd_mailbox_delete_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
{
struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
switch (c) {
case 'r':
ctx->recursive = TRUE;
break;
case 's':
ctx->ctx.subscriptions = TRUE;
break;
default:
return FALSE;
}
return TRUE;
}
static struct doveadm_mail_cmd_context *cmd_mailbox_delete_alloc(void)
{
struct delete_cmd_context *ctx;
ctx = doveadm_mailbox_cmd_alloc(struct delete_cmd_context);
ctx->ctx.ctx.v.init = cmd_mailbox_delete_init;
ctx->ctx.ctx.v.run = cmd_mailbox_delete_run;
ctx->ctx.ctx.v.parse_arg = cmd_mailbox_delete_parse_arg;
ctx->ctx.ctx.getopt_args = "rs";
p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
return &ctx->ctx.ctx;
}
static int
cmd_mailbox_rename_run(struct doveadm_mail_cmd_context *_ctx,
struct mail_user *user)
{
struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
struct mail_namespace *oldns, *newns;
struct mailbox *oldbox, *newbox;
const char *oldname = ctx->oldname;
const char *newname = ctx->newname;
int ret = 0;
oldns = mail_namespace_find(user->namespaces, oldname);
newns = mail_namespace_find(user->namespaces, newname);
oldbox = mailbox_alloc(oldns->list, oldname, 0);
newbox = mailbox_alloc(newns->list, newname, 0);
if (mailbox_rename(oldbox, newbox) < 0) {
i_error("Can't rename mailbox %s to %s: %s", oldname, newname,
mailbox_get_last_error(oldbox, NULL));
doveadm_mail_failed_mailbox(_ctx, oldbox);
ret = -1;
}
if (ctx->ctx.subscriptions) {
if (mailbox_set_subscribed(oldbox, FALSE) < 0) {
i_error("Can't unsubscribe mailbox %s: %s", ctx->oldname,
mailbox_get_last_error(oldbox, NULL));
doveadm_mail_failed_mailbox(_ctx, oldbox);
ret = -1;
}
if (mailbox_set_subscribed(newbox, TRUE) < 0) {
i_error("Can't subscribe to mailbox %s: %s", ctx->newname,
mailbox_get_last_error(newbox, NULL));
doveadm_mail_failed_mailbox(_ctx, newbox);
ret = -1;
}
}
mailbox_free(&oldbox);
mailbox_free(&newbox);
return ret;
}
static void cmd_mailbox_rename_init(struct doveadm_mail_cmd_context *_ctx,
const char *const args[])
{
struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
if (str_array_length(args) != 2)
doveadm_mail_help_name("mailbox rename");
doveadm_mailbox_args_check(args);
ctx->oldname = p_strdup(ctx->ctx.ctx.pool, args[0]);
ctx->newname = p_strdup(ctx->ctx.ctx.pool, args[1]);
}
static struct doveadm_mail_cmd_context *cmd_mailbox_rename_alloc(void)
{
struct rename_cmd_context *ctx;
ctx = doveadm_mailbox_cmd_alloc(struct rename_cmd_context);
ctx->ctx.ctx.v.init = cmd_mailbox_rename_init;
ctx->ctx.ctx.v.run = cmd_mailbox_rename_run;
return &ctx->ctx.ctx;
}
static int
cmd_mailbox_subscribe_run(struct doveadm_mail_cmd_context *_ctx,
struct mail_user *user)
{
struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
struct mail_namespace *ns;
struct mailbox *box;
const char *const *namep;
int ret = 0;
array_foreach(&ctx->mailboxes, namep) {
const char *name = *namep;
ns = mail_namespace_find(user->namespaces, name);
box = mailbox_alloc(ns->list, name, 0);
if (mailbox_set_subscribed(box, ctx->ctx.subscriptions) < 0) {
i_error("Can't %s mailbox %s: %s", name,
ctx->ctx.subscriptions ? "subscribe to" :
"unsubscribe",
mailbox_get_last_error(box, NULL));
doveadm_mail_failed_mailbox(_ctx, box);
ret = -1;
}
mailbox_free(&box);
}
return ret;
}
static void cmd_mailbox_subscribe_init(struct doveadm_mail_cmd_context *_ctx,
const char *const args[])
{
struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
const char *name;
unsigned int i;
if (args[0] == NULL) {
doveadm_mail_help_name(ctx->ctx.subscriptions ?
"mailbox subscribe" :
"mailbox unsubscribe");
}
doveadm_mailbox_args_check(args);
for (i = 0; args[i] != NULL; i++) {
name = p_strdup(ctx->ctx.ctx.pool, args[i]);
array_append(&ctx->mailboxes, &name, 1);
}
}
static struct doveadm_mail_cmd_context *
cmd_mailbox_subscriptions_alloc(bool subscriptions)
{
struct mailbox_cmd_context *ctx;
ctx = doveadm_mail_cmd_alloc(struct mailbox_cmd_context);
ctx->ctx.subscriptions = subscriptions;
ctx->ctx.ctx.v.parse_arg = cmd_mailbox_parse_arg;
ctx->ctx.ctx.v.init = cmd_mailbox_subscribe_init;
ctx->ctx.ctx.v.run = cmd_mailbox_subscribe_run;
p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
return &ctx->ctx.ctx;
}
static struct doveadm_mail_cmd_context *cmd_mailbox_subscribe_alloc(void)
{
return cmd_mailbox_subscriptions_alloc(TRUE);
}
static struct doveadm_mail_cmd_context *cmd_mailbox_unsubscribe_alloc(void)
{
return cmd_mailbox_subscriptions_alloc(FALSE);
}
static
void cmd_mailbox_update_init(struct doveadm_mail_cmd_context *_ctx,
const char *const args[])
{
struct update_cmd_context *ctx = (struct update_cmd_context *)_ctx;
if (str_array_length(args) != 1)
doveadm_mail_help_name("mailbox update");
doveadm_mailbox_args_check(args);
ctx->mailbox = args[0];
if ((ctx->update.min_first_recent_uid != 0 ||
ctx->update.min_next_uid != 0) &&
ctx->update.min_first_recent_uid > ctx->update.min_next_uid) {
i_fatal_status(EX_DATAERR,
"min_first_recent_uid > min_next_uid");
}
}
static
bool cmd_mailbox_update_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
{
struct update_cmd_context *ctx = (struct update_cmd_context *)_ctx;
switch (c) {
case 'g':
if (guid_128_from_string(optarg, ctx->update.mailbox_guid) < 0)
doveadm_mail_help_name("mailbox update");
break;
case 'V':
if (str_to_uint32(optarg, &(ctx->update.uid_validity)) < 0)
doveadm_mail_help_name("mailbox update");
break;
case 'N':
if (str_to_uint32(optarg, &(ctx->update.min_next_uid)) < 0)
doveadm_mail_help_name("mailbox update");
break;
case 'R':
if (str_to_uint32(optarg, &(ctx->update.min_first_recent_uid)) < 0)
doveadm_mail_help_name("mailbox update");
break;
case 'H':
if (str_to_uint64(optarg, &(ctx->update.min_highest_modseq)) < 0)
doveadm_mail_help_name("mailbox update");
break;
case 'P':
if (str_to_uint64(optarg, &(ctx->update.min_highest_pvt_modseq)) < 0)
doveadm_mail_help_name("mailbox update");
break;
default:
return FALSE;
}
return TRUE;
}
static
int cmd_mailbox_update_run(struct doveadm_mail_cmd_context *_ctx,
struct mail_user *user)
{
struct update_cmd_context *ctx = (struct update_cmd_context *)_ctx;
struct mail_namespace *ns;
struct mailbox *box;
int ret = 0;
ns = mail_namespace_find(user->namespaces, ctx->mailbox);
box = mailbox_alloc(ns->list, ctx->mailbox, 0);
if ((ret = mailbox_update(box, &(ctx->update))) != 0) {
i_error("Cannot update %s: %s",
ctx->mailbox,
mailbox_get_last_error(box, NULL));
}
mailbox_free(&box);
return ret;
}
static
struct doveadm_mail_cmd_context *cmd_mailbox_update_alloc(void)
{
struct update_cmd_context *ctx;
ctx = doveadm_mail_cmd_alloc(struct update_cmd_context);
ctx->ctx.ctx.v.parse_arg = cmd_mailbox_update_parse_arg;
ctx->ctx.ctx.v.init = cmd_mailbox_update_init;
ctx->ctx.ctx.v.run = cmd_mailbox_update_run;
return &ctx->ctx.ctx;
}
struct doveadm_cmd_ver2 doveadm_cmd_mailbox_list_ver2 = {
.name = "mailbox list",
.mail_cmd = cmd_mailbox_list_alloc,
.usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"[-7|-8] [-s] [<mailbox mask> [...]]",
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_MAIL_COMMON
DOVEADM_CMD_PARAM('7', "mutf7", CMD_PARAM_BOOL, 0)
DOVEADM_CMD_PARAM('8', "utf8", CMD_PARAM_BOOL, 0)
DOVEADM_CMD_PARAM('s', "subscriptions", CMD_PARAM_BOOL, 0)
DOVEADM_CMD_PARAM('\0', "mailbox-mask", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
};
struct doveadm_cmd_ver2 doveadm_cmd_mailbox_create_ver2 = {
.name = "mailbox create",
.mail_cmd = cmd_mailbox_create_alloc,
.usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"[-s] [-g <guid>] <mailbox> [...]",
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_MAIL_COMMON
DOVEADM_CMD_PARAM('s', "subscriptions", CMD_PARAM_BOOL, 0)
DOVEADM_CMD_PARAM('g', "guid", CMD_PARAM_STR, 0)
DOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
};
struct doveadm_cmd_ver2 doveadm_cmd_mailbox_delete_ver2 = {
.name = "mailbox delete",
.mail_cmd = cmd_mailbox_delete_alloc,
.usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"[-s] <mailbox> [...]",
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_MAIL_COMMON
DOVEADM_CMD_PARAM('s', "subscriptions", CMD_PARAM_BOOL, 0)
DOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
};
struct doveadm_cmd_ver2 doveadm_cmd_mailbox_rename_ver2 = {
.name = "mailbox rename",
.mail_cmd = cmd_mailbox_rename_alloc,
.usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"[-s] <old name> <new name>",
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_MAIL_COMMON
DOVEADM_CMD_PARAM('s', "subscriptions", CMD_PARAM_BOOL, 0)
DOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAM('\0', "new-name", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
};
struct doveadm_cmd_ver2 doveadm_cmd_mailbox_subscribe_ver2 = {
.name = "mailbox subscribe",
.mail_cmd = cmd_mailbox_subscribe_alloc,
.usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<mailbox> [...]",
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_MAIL_COMMON
DOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
};
struct doveadm_cmd_ver2 doveadm_cmd_mailbox_unsubscribe_ver2 = {
.name = "mailbox unsubscribe",
.mail_cmd = cmd_mailbox_unsubscribe_alloc,
.usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<mailbox> [...]",
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_MAIL_COMMON
DOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
};
struct doveadm_cmd_ver2 doveadm_cmd_mailbox_update_ver2 = {
.name = "mailbox update",
.mail_cmd = cmd_mailbox_update_alloc,
.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>",
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_MAIL_COMMON
DOVEADM_CMD_PARAM('g', "mailbox-guid", CMD_PARAM_STR, 0)
DOVEADM_CMD_PARAM('V', "uid-validity", CMD_PARAM_INT64, 0)
DOVEADM_CMD_PARAM('N', "min-next-uid", CMD_PARAM_INT64, 0)
DOVEADM_CMD_PARAM('R', "min-first-recent-uid", CMD_PARAM_INT64, 0)
DOVEADM_CMD_PARAM('H', "min-highest-modseq", CMD_PARAM_INT64, 0)
DOVEADM_CMD_PARAM('P', "min-highest-pvt-modseq", CMD_PARAM_INT64, 0)
DOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
};