doveadm-mail-mailbox.c revision c43bfb802ccb82e3855253bd8cb2233e3b061dd7
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2010-2012 Dovecot authors, see the included COPYING file */
3e1ded79bbc9166aa221bcf62d8eb2bee179c557Timo Sirainenvoid doveadm_mailbox_args_check(const char *const args[])
3e1ded79bbc9166aa221bcf62d8eb2bee179c557Timo Sirainen unsigned int i;
14b495a09db7aea6b68146fd6427229e75d2bb39Timo Sirainenstatic bool cmd_mailbox_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
0a8926b91a84abf462afdc1ed95def229377d7ffTimo Sirainen (type *)doveadm_mailbox_cmd_alloc_size(sizeof(type))
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainencmd_mailbox_list_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
b96dcd982888d89e6f2508258d6d9588d79c7a26Timo Sirainencmd_mailbox_list_run(struct doveadm_mail_cmd_context *_ctx,
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen iter_flags |= MAILBOX_LIST_ITER_SELECT_SUBSCRIBED;
a84eb0599fa1d796206eaed65c4e3239f0799276Timo Sirainen iter = doveadm_mailbox_list_iter_full_init(_ctx, user, ctx->search_args,
e153e1205bc686fac815ce7bb534adcb36dfb722Timo Sirainen while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen if (doveadm_mailbox_list_iter_deinit(&iter) < 0)
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainendoveadm_mail_mailbox_search_args_build(const char *const args[])
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen unsigned int i;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen arg = mail_search_build_add(search_args, SEARCH_MAILBOX_GLOB);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen arg->value.str = p_strdup(search_args->pool, args[i]);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen struct mail_search_arg *subargs = search_args->args;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen arg = mail_search_build_add(search_args, SEARCH_OR);
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainenstatic void cmd_mailbox_list_init(struct doveadm_mail_cmd_context *_ctx,
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen const char *const args[])
c4457e497e01b57565d24da624968699b166e02aTimo Sirainen struct list_cmd_context *ctx = (struct list_cmd_context *)_ctx;
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen ctx->search_args = doveadm_mail_mailbox_search_args_build(args);
190ba2ebc899bd114e1e4ab9ee119be10f0cc0ecTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_list_alloc(void)
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct list_cmd_context);
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_list_parse_arg;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainencmd_mailbox_create_run(struct doveadm_mail_cmd_context *_ctx,
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen const char *const *namep;
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen unsigned int len;
e82af44fe25ca9b88210f313548dc08538e4a677Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen if (len > 0 && name[len-1] == mail_namespace_get_sep(ns)) {
6332ef7522d7a77a18c1bec4fc80d92ee597336cTimo Sirainen if (mailbox_create(box, NULL, directory) < 0) {
78361883c67c58e339697c167ca285731f50287bTimo Sirainen i_error("Can't subscribe to mailbox %s: %s", name,
78361883c67c58e339697c167ca285731f50287bTimo Sirainenstatic void cmd_mailbox_create_init(struct doveadm_mail_cmd_context *_ctx,
78361883c67c58e339697c167ca285731f50287bTimo Sirainen const char *const args[])
78361883c67c58e339697c167ca285731f50287bTimo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
c184857e1fc86878761f6e47896c9cc1fad2d666Timo Sirainen unsigned int i;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_create_alloc(void)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct mailbox_cmd_context);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_create_init;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainenstatic int i_strcmp_reverse_p(const void *p1, const void *p2)
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainenget_child_mailboxes(struct mail_user *user, ARRAY_TYPE(const_string) *mailboxes,
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen pattern = t_strdup_printf("%s%c*", name, mail_namespace_get_sep(ns));
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen iter = mailbox_list_iter_init(ns->list, pattern,
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen while ((info = mailbox_list_iter_next(iter)) != NULL) {
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainencmd_mailbox_delete_run(struct doveadm_mail_cmd_context *_ctx,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *const *namep;
965ed6ea3fc8f7637bd0d159d2fdb283a191ce34Timo Sirainen const ARRAY_TYPE(const_string) *mailboxes = &ctx->mailboxes;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (get_child_mailboxes(user, &recursive_mailboxes,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen doveadm_mail_failed_error(_ctx, MAIL_ERROR_TEMP);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen array_sort(&recursive_mailboxes, i_strcmp_reverse_p);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
16133a719ce8b6a5b8cedd721340cc1607c43433Timo Sirainen i_error("Can't find namespace for: %s", name);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen doveadm_mail_failed_error(_ctx, MAIL_ERROR_NOTFOUND);
2219b375f50f9af1f3e69b7b38aab733ea174c24Timo Sirainen i_error("Can't unsubscribe mailbox %s: %s", name,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenstatic void cmd_mailbox_delete_init(struct doveadm_mail_cmd_context *_ctx,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *const args[])
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen unsigned int i;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen array_sort(&ctx->mailboxes, i_strcmp_reverse_p);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainencmd_mailbox_delete_parse_arg(struct doveadm_mail_cmd_context *_ctx, int c)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct delete_cmd_context *ctx = (struct delete_cmd_context *)_ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_delete_alloc(void)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct delete_cmd_context);
0c822051bb9a910ee588fd97f7ec6f9df3d1b3c6Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_delete_init;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_delete_parse_arg;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainencmd_mailbox_rename_run(struct doveadm_mail_cmd_context *_ctx,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
613daa324c2b61ec69291519a57186be7cc23286Timo Sirainen oldns = mail_namespace_find(user->namespaces, oldname);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen newns = mail_namespace_find(user->namespaces, newname);
63cde222abaaa2a9bdaa9a143698dbc8b23bd742Timo Sirainen oldbox = mailbox_alloc(oldns->list, oldname, 0);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen newbox = mailbox_alloc(newns->list, newname, 0);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (mailbox_rename(oldbox, newbox, TRUE) < 0) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen i_error("Can't rename mailbox %s to %s: %s", oldname, newname,
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen if (mailbox_set_subscribed(oldbox, FALSE) < 0) {
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen i_error("Can't unsubscribe mailbox %s: %s", ctx->oldname,
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen if (mailbox_set_subscribed(newbox, TRUE) < 0) {
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen i_error("Can't subscribe to mailbox %s: %s", ctx->newname,
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainenstatic void cmd_mailbox_rename_init(struct doveadm_mail_cmd_context *_ctx,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *const args[])
ed5e91e58dfc372c2135c55427bf6f25a7725042Timo Sirainen struct rename_cmd_context *ctx = (struct rename_cmd_context *)_ctx;
584a5375b70caa8bf7b202248aea84092bcb9c22Timo Sirainen ctx->oldname = p_strdup(ctx->ctx.ctx.pool, args[0]);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->newname = p_strdup(ctx->ctx.ctx.pool, args[1]);
ed5e91e58dfc372c2135c55427bf6f25a7725042Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_rename_alloc(void)
ed5e91e58dfc372c2135c55427bf6f25a7725042Timo Sirainen ctx = doveadm_mailbox_cmd_alloc(struct rename_cmd_context);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_rename_init;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainencmd_mailbox_subscribe_run(struct doveadm_mail_cmd_context *_ctx,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *const *namep;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen ns = mail_namespace_find(user->namespaces, name);
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen if (mailbox_set_subscribed(box, ctx->ctx.subscriptions) < 0) {
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen "unsubscribe",
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenstatic void cmd_mailbox_subscribe_init(struct doveadm_mail_cmd_context *_ctx,
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen const char *const args[])
3cff7935d606a75357472a3e4269e0b06ac1bef2Timo Sirainen struct mailbox_cmd_context *ctx = (struct mailbox_cmd_context *)_ctx;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen unsigned int i;
63cde222abaaa2a9bdaa9a143698dbc8b23bd742Timo Sirainen doveadm_mail_help_name(ctx->ctx.subscriptions ?
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen "mailbox subscribe" :
63cde222abaaa2a9bdaa9a143698dbc8b23bd742Timo Sirainen "mailbox unsubscribe");
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainencmd_mailbox_subscriptions_alloc(bool subscriptions)
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen ctx = doveadm_mail_cmd_alloc(struct mailbox_cmd_context);
6135260095e1704ed6edff9d00bdfc043c11429cTimo Sirainen ctx->ctx.ctx.v.parse_arg = cmd_mailbox_parse_arg;
3cff7935d606a75357472a3e4269e0b06ac1bef2Timo Sirainen ctx->ctx.ctx.v.init = cmd_mailbox_subscribe_init;
3cff7935d606a75357472a3e4269e0b06ac1bef2Timo Sirainen ctx->ctx.ctx.v.run = cmd_mailbox_subscribe_run;
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainen p_array_init(&ctx->mailboxes, ctx->ctx.ctx.pool, 16);
e023e3c2677ab66d7a7445eae9caf3d739e199cbTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_subscribe_alloc(void)
fc4ff2356fee6389d4cf2b3f12f4098a436f0502Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_unsubscribe_alloc(void)
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen return cmd_mailbox_subscriptions_alloc(FALSE);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "[-7|-8] [-s] [<mailbox mask> [...]]"
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "[-s] <mailbox> [...]"
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "[-s] <mailbox> [...]"
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "[-s] <old name> <new name>"
b6df44e31bf9d54669b5903dfb5dd3fbbe896accTimo Sirainenstruct doveadm_mail_cmd cmd_mailbox_subscribe = {
14b495a09db7aea6b68146fd6427229e75d2bb39Timo Sirainen cmd_mailbox_subscribe_alloc, "mailbox subscribe",
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen "<mailbox> [...]"
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainenstruct doveadm_mail_cmd cmd_mailbox_unsubscribe = {
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen cmd_mailbox_unsubscribe_alloc, "mailbox unsubscribe",
3fb1531681f9cbe49928f8e32357a692bf901c83Timo Sirainen "<mailbox> [...]"