doveadm-mail-mailbox.c revision 14102a0c5db8828ca8c7751ec96587fadc97a0bc
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */
636f017be100bce67d66fd3ae1544a47681efd33Timo Sirainenvoid doveadm_mailbox_args_check(const char *const args[])
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen unsigned int i;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainenstatic bool cmd_mailbox_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen (type *)doveadm_mailbox_cmd_alloc_size(sizeof(type))
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainencmd_mailbox_list_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainencmd_mailbox_list_run(struct doveadm_mail_cmd_context *_ctx,
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen iter_flags |= MAILBOX_LIST_ITER_SELECT_SUBSCRIBED;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen iter = doveadm_mailbox_list_iter_full_init(_ctx, user, ctx->search_args,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (doveadm_mailbox_list_iter_deinit(&iter) < 0)
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainendoveadm_mail_mailbox_search_args_build(const char *const args[])
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen unsigned int i;
b1e46e840dae172f61140dc260eede4f124ebb31Timo Sirainen arg = mail_search_build_add(search_args, type);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen arg->value.str = p_strdup(search_args->pool, args[i]);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct mail_search_arg *subargs = search_args->args;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen arg = mail_search_build_add(search_args, SEARCH_OR);
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainenstatic void cmd_mailbox_list_init(struct doveadm_mail_cmd_context *_ctx,
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen const char *const args[])
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
b8b085f7bc6f1c0367802a9f00062bbbd981690dTimo Sirainen ctx->search_args = doveadm_mail_mailbox_search_args_build(args);
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainenstatic void cmd_mailbox_list_deinit(struct doveadm_mail_cmd_context *_ctx)
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_list_alloc(void)
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct list_cmd_context);
57434d8add2f13b6d6dbd39b941e9e80c64be74eTimo Sirainen ctx->ctx.ctx.v.deinit = cmd_mailbox_list_deinit;
4ca6f6e2ae7be7c5f04ea5ef176a7c4a47ea3d33Timo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_list_parse_arg;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainencmd_mailbox_create_run(struct doveadm_mail_cmd_context *_ctx,
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen struct create_cmd_context *ctx = (struct create_cmd_context *)_ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen const char *const *namep;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen unsigned int len;
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen if (len > 0 && name[len-1] == mail_namespace_get_sep(ns)) {
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen if (mailbox_create(box, &ctx->update, directory) < 0) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen i_error("Can't subscribe to mailbox %s: %s", name,
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic void cmd_mailbox_create_init(struct doveadm_mail_cmd_context *_ctx,
23878bd03d1de531e3261a25598beec621351910Timo Sirainen const char *const args[])
23878bd03d1de531e3261a25598beec621351910Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen unsigned int i;
bada94029be451d716948d6e03a4fc329447486aTimo Sirainencmd_mailbox_create_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen struct create_cmd_context *ctx = (struct create_cmd_context *)_ctx;
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen if (guid_128_from_string(optarg, ctx->update.mailbox_guid) < 0)
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_create_alloc(void)
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct create_cmd_context);
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_create_init;
bada94029be451d716948d6e03a4fc329447486aTimo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_create_parse_arg;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
27a44fcfd8d19bffe0f267f20a2b5d3fe7600fddTimo Sirainenstatic int i_strcmp_reverse_p(const char *const *s1, const char *const *s2)
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainenget_child_mailboxes(struct mail_user *user, ARRAY_TYPE(const_string) *mailboxes,
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
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 while ((info = mailbox_list_iter_next(iter)) != NULL) {
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainencmd_mailbox_delete_run(struct doveadm_mail_cmd_context *_ctx,
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen const char *const *namep;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen const ARRAY_TYPE(const_string) *mailboxes = &ctx->mailboxes;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (get_child_mailboxes(user, &recursive_mailboxes,
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_error(_ctx, MAIL_ERROR_TEMP);
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen array_sort(&recursive_mailboxes, i_strcmp_reverse_p);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen i_error("Can't unsubscribe mailbox %s: %s", name,
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic void cmd_mailbox_delete_init(struct doveadm_mail_cmd_context *_ctx,
23878bd03d1de531e3261a25598beec621351910Timo Sirainen const char *const args[])
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen unsigned int i;
c439de14aff3e8b1d6adf30fa5215f5dff642a04Timo Sirainen array_sort(&ctx->mailboxes, i_strcmp_reverse_p);
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainencmd_mailbox_delete_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_delete_alloc(void)
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct delete_cmd_context);
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_delete_init;
3e1cc04de22e3c564644562897b0a5212bd6ee46Timo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_delete_parse_arg;
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainencmd_mailbox_rename_run(struct doveadm_mail_cmd_context *_ctx,
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
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);
9cf4bb70f014849735aab4226691edcdf56b3271Timo Sirainen i_error("Can't rename mailbox %s to %s: %s", oldname, newname,
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen if (mailbox_set_subscribed(oldbox, FALSE) < 0) {
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen i_error("Can't unsubscribe mailbox %s: %s", ctx->oldname,
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen if (mailbox_set_subscribed(newbox, TRUE) < 0) {
05093f69a5ac540a569c4e675686ed96e61667c6Timo Sirainen i_error("Can't subscribe to mailbox %s: %s", ctx->newname,
23878bd03d1de531e3261a25598beec621351910Timo Sirainenstatic void cmd_mailbox_rename_init(struct doveadm_mail_cmd_context *_ctx,
23878bd03d1de531e3261a25598beec621351910Timo Sirainen const char *const args[])
23878bd03d1de531e3261a25598beec621351910Timo Sirainen struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
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 Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_rename_alloc(void)
e09c7dc961cb9cab04ec7cc79215c2f6318fbde0Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct rename_cmd_context);
1db62753d9e3b5d71018889c8ef0a3722a307455Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_rename_init;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainencmd_mailbox_subscribe_run(struct doveadm_mail_cmd_context *_ctx,
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen const char *const *namep;
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen if (mailbox_set_subscribed(box, ctx->ctx.subscriptions) < 0) {
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen "unsubscribe",
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainenstatic void cmd_mailbox_subscribe_init(struct doveadm_mail_cmd_context *_ctx,
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen const char *const args[])
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen unsigned int i;
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen doveadm_mail_help_name(ctx->ctx.subscriptions ?
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen "mailbox subscribe" :
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen "mailbox unsubscribe");
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainencmd_mailbox_subscriptions_alloc(bool subscriptions)
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct mailbox_cmd_context);
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 Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_subscribe_alloc(void)
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_unsubscribe_alloc(void)
ecbbdf594f9329fc15a182bd6c7c4a7fb144ed74Timo Sirainen return cmd_mailbox_subscriptions_alloc(FALSE);
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_list_ver2 = {
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('7', "mutf7", CMD_PARAM_BOOL, 0)
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('8', "no-mutf7", CMD_PARAM_BOOL, 0)
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('s', "subscriptions", CMD_PARAM_BOOL, 0)
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('\0', "mask", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_create_ver2 = {
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 Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_delete_ver2 = {
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('s', "subscriptions", CMD_PARAM_BOOL, 0)
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_rename_ver2 = {
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('s', "subscriptions", CMD_PARAM_BOOL, 0)
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('\0', "old", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('\0', "new", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_subscribe_ver2 = {
14102a0c5db8828ca8c7751ec96587fadc97a0bcTimo SirainenDOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL)
0368f3b0ae3fc1ea892da5c5ec02c05c0c3989afAki Tuomistruct doveadm_cmd_ver2 doveadm_cmd_mailbox_unsubscribe_ver2 = {