doveadm-mail-mailbox-metadata.c revision 504f950c5b60967e413b4fa0e79f7f6b9d6cfd7a
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2014-2016 Dovecot authors, see the included COPYING file */
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen#include "lib.h"
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen#include "str.h"
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen#include "mail-namespace.h"
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde#include "mail-storage.h"
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen#include "doveadm-print.h"
cda217260716cfd8d8ec5e56f91708c64c140538Timo Sirainen#include "doveadm-mail.h"
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen#include "doveadm-mailbox-list-iter.h"
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wildestruct metadata_cmd_context {
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen struct doveadm_mail_cmd_context ctx;
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde const char *mailbox;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen enum mail_attribute_type key_type;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen const char *key;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct mail_attribute_value value;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen};
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstatic int
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainencmd_mailbox_metadata_set_run(struct doveadm_mail_cmd_context *_ctx,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct mail_user *user)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen{
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct metadata_cmd_context *ctx = (struct metadata_cmd_context *)_ctx;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct mail_namespace *ns;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct mailbox *box;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct mailbox_transaction_context *trans;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen int ret;
f325d795b52ce2053f914072b22ebca9c4f0dc7eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ns = mail_namespace_find(user->namespaces, ctx->mailbox);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen box = mailbox_alloc(ns->list, ctx->mailbox, 0);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
f1743785713e7632459d623d5df2108f4b93accbTimo Sirainen if (mailbox_open(box) < 0) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen i_error("Failed to open mailbox: %s",
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen mailbox_get_last_error(box, NULL));
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen mailbox_free(&box);
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen return -1;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen }
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen trans = mailbox_transaction_begin(box, 0);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ret = ctx->value.value == NULL ?
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen mailbox_attribute_unset(trans, ctx->key_type, ctx->key) :
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen mailbox_attribute_set(trans, ctx->key_type, ctx->key, &ctx->value);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if (ret < 0) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen i_error("Failed to set attribute: %s",
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen mailbox_get_last_error(box, NULL));
c8cf8a605e0ddea7cb36fe04551aeca5090e684bTimo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen mailbox_transaction_rollback(&trans);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen } else if (mailbox_transaction_commit(&trans) < 0) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen i_error("Failed to commit transaction: %s",
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen mailbox_get_last_error(box, NULL));
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ret = -1;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen }
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen mailbox_free(&box);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen return ret;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen}
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstatic void
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainencmd_mailbox_metadata_parse_key(const char *arg,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen enum mail_attribute_type *type_r,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen const char **key_r)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen{
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if (strncmp(arg, "/private/", 9) == 0) {
c8cf8a605e0ddea7cb36fe04551aeca5090e684bTimo Sirainen *type_r = MAIL_ATTRIBUTE_TYPE_PRIVATE;
c8cf8a605e0ddea7cb36fe04551aeca5090e684bTimo Sirainen *key_r = arg + 9;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen } else if (strncmp(arg, "/shared/", 8) == 0) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen *type_r = MAIL_ATTRIBUTE_TYPE_SHARED;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen *key_r = arg + 8;
c8cf8a605e0ddea7cb36fe04551aeca5090e684bTimo Sirainen } else if (strcmp(arg, "/private") == 0) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen *type_r = MAIL_ATTRIBUTE_TYPE_PRIVATE;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen *key_r = "";
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen } else if (strcmp(arg, "/shared") == 0) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen *type_r = MAIL_ATTRIBUTE_TYPE_SHARED;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen *key_r = "";
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen } else {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen i_fatal_status(EX_USAGE, "Invalid metadata key '%s': "
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen "Must begin with /private or /shared", arg);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen }
33a9c31657771606be5942b55f5f91a5606b2199Timo Sirainen *key_r = t_str_lcase(*key_r);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen}
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstatic void
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainencmd_mailbox_metadata_set_init(struct doveadm_mail_cmd_context *_ctx,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen const char *const args[])
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen{
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct metadata_cmd_context *ctx = (struct metadata_cmd_context *)_ctx;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen const char *key;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if (str_array_length(args) != 3)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_mail_help_name("mailbox metadata set");
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen cmd_mailbox_metadata_parse_key(args[1], &ctx->key_type, &key);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ctx->mailbox = p_strdup(_ctx->pool, args[0]);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ctx->key = p_strdup(_ctx->pool, key);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx->value.value = p_strdup(_ctx->pool, args[2]);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen}
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_metadata_set_alloc(void)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen{
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct metadata_cmd_context *ctx;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx = doveadm_mail_cmd_alloc(struct metadata_cmd_context);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ctx->ctx.v.init = cmd_mailbox_metadata_set_init;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx->ctx.v.run = cmd_mailbox_metadata_set_run;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen return &ctx->ctx;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen}
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainenstatic void
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainencmd_mailbox_metadata_unset_init(struct doveadm_mail_cmd_context *_ctx,
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen const char *const args[])
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen{
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen struct metadata_cmd_context *ctx = (struct metadata_cmd_context *)_ctx;
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen const char *key;
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen if (str_array_length(args) != 2)
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen doveadm_mail_help_name("mailbox metadata unset");
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen cmd_mailbox_metadata_parse_key(args[1], &ctx->key_type, &key);
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen ctx->mailbox = p_strdup(_ctx->pool, args[0]);
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde ctx->key = p_strdup(_ctx->pool, key);
c2ee17c9c263efdc9c0a339c4836c3d43f5cd3d9Sascha Wilde}
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_metadata_unset_alloc(void)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen{
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct metadata_cmd_context *ctx;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx = doveadm_mail_cmd_alloc(struct metadata_cmd_context);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx->ctx.v.init = cmd_mailbox_metadata_unset_init;
f77ffa31038d46ca9c6d24d93e3d76c9aa8d4d0cTimo Sirainen ctx->ctx.v.run = cmd_mailbox_metadata_set_run;
f77ffa31038d46ca9c6d24d93e3d76c9aa8d4d0cTimo Sirainen return &ctx->ctx;
f77ffa31038d46ca9c6d24d93e3d76c9aa8d4d0cTimo Sirainen}
f77ffa31038d46ca9c6d24d93e3d76c9aa8d4d0cTimo Sirainen
f77ffa31038d46ca9c6d24d93e3d76c9aa8d4d0cTimo Sirainenstatic int
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainencmd_mailbox_metadata_get_run(struct doveadm_mail_cmd_context *_ctx,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct mail_user *user)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen{
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct metadata_cmd_context *ctx = (struct metadata_cmd_context *)_ctx;
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen struct mail_namespace *ns;
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen struct mailbox *box;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct mailbox_transaction_context *trans;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct mail_attribute_value value;
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen int ret;
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen ns = mail_namespace_find(user->namespaces, ctx->mailbox);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen box = mailbox_alloc(ns->list, ctx->mailbox, 0);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if (mailbox_open(box) < 0) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen i_error("Failed to open mailbox: %s",
35083063d0e432d0cf78206b5929750e613ad772Timo Sirainen mailbox_get_last_error(box, NULL));
35083063d0e432d0cf78206b5929750e613ad772Timo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
35083063d0e432d0cf78206b5929750e613ad772Timo Sirainen mailbox_free(&box);
35083063d0e432d0cf78206b5929750e613ad772Timo Sirainen return -1;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen }
35083063d0e432d0cf78206b5929750e613ad772Timo Sirainen trans = mailbox_transaction_begin(box, 0);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ret = mailbox_attribute_get_stream(trans, ctx->key_type, ctx->key, &value);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if (ret < 0) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen i_error("Failed to get attribute: %s",
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen mailbox_get_last_error(box, NULL));
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen } else if (ret == 0) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen /* not found, print as empty */
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_print("");
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen } else if (value.value_stream != NULL) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_print_istream(value.value_stream);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen } else {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_print(value.value);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen }
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen (void)mailbox_transaction_commit(&trans);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen mailbox_free(&box);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen return ret;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen}
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
35083063d0e432d0cf78206b5929750e613ad772Timo Sirainenstatic void
35083063d0e432d0cf78206b5929750e613ad772Timo Sirainencmd_mailbox_metadata_get_init(struct doveadm_mail_cmd_context *_ctx,
35083063d0e432d0cf78206b5929750e613ad772Timo Sirainen const char *const args[])
35083063d0e432d0cf78206b5929750e613ad772Timo Sirainen{
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct metadata_cmd_context *ctx = (struct metadata_cmd_context *)_ctx;
35083063d0e432d0cf78206b5929750e613ad772Timo Sirainen const char *key;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if (str_array_length(args) != 2)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_mail_help_name("mailbox metadata get");
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen cmd_mailbox_metadata_parse_key(args[1], &ctx->key_type, &key);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx->mailbox = p_strdup(_ctx->pool, args[0]);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx->key = p_strdup(_ctx->pool, key);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_print_header("value", "value",
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen}
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_metadata_get_alloc(void)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen{
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct metadata_cmd_context *ctx;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx = doveadm_mail_cmd_alloc(struct metadata_cmd_context);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx->ctx.v.init = cmd_mailbox_metadata_get_init;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx->ctx.v.run = cmd_mailbox_metadata_get_run;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_print_init(DOVEADM_PRINT_TYPE_FLOW);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen return &ctx->ctx;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen}
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstatic int
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainencmd_mailbox_metadata_list_run_iter(struct metadata_cmd_context *ctx,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct mailbox *box,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen enum mail_attribute_type type)
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen{
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen struct mailbox_attribute_iter *iter;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen const char *key;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen iter = mailbox_attribute_iter_init(box, type, ctx->key);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen while ((key = mailbox_attribute_iter_next(iter)) != NULL)
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_print(key);
c7194d1d3872ffb2901737e1df337cc227a3fa77Timo Sirainen if (mailbox_attribute_iter_deinit(&iter) < 0) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen i_error("Mailbox %s: Failed to iterate mailbox attributes: %s",
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen mailbox_get_vname(box),
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen mailbox_get_last_error(box, NULL));
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen return -1;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen }
f77ffa31038d46ca9c6d24d93e3d76c9aa8d4d0cTimo Sirainen return 0;
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen}
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainenstatic int
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainencmd_mailbox_metadata_list_run(struct doveadm_mail_cmd_context *_ctx,
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen struct mail_user *user)
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen{
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen struct metadata_cmd_context *ctx = (struct metadata_cmd_context *)_ctx;
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen struct mail_namespace *ns;
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen struct mailbox *box;
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen int ret = 0;
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen ns = mail_namespace_find(user->namespaces, ctx->mailbox);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen box = mailbox_alloc(ns->list, ctx->mailbox, 0);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (mailbox_open(box) < 0) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen i_error("Failed to open mailbox: %s",
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen mailbox_get_last_error(box, NULL));
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen mailbox_free(&box);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen return -1;
c8cf8a605e0ddea7cb36fe04551aeca5090e684bTimo Sirainen }
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if (ctx->key == NULL || ctx->key_type == MAIL_ATTRIBUTE_TYPE_PRIVATE) {
c8cf8a605e0ddea7cb36fe04551aeca5090e684bTimo Sirainen if (cmd_mailbox_metadata_list_run_iter(ctx, box, MAIL_ATTRIBUTE_TYPE_PRIVATE) < 0) {
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
4ac2d38239cea8090154e17faefd77de5a71d882Timo Sirainen ret = -1;
e930af34580510d2fe58628d270dbaf786e86248Timo Sirainen }
c7194d1d3872ffb2901737e1df337cc227a3fa77Timo Sirainen }
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (ctx->key == NULL || ctx->key_type == MAIL_ATTRIBUTE_TYPE_SHARED) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen if (cmd_mailbox_metadata_list_run_iter(ctx, box, MAIL_ATTRIBUTE_TYPE_SHARED) < 0) {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_mail_failed_mailbox(_ctx, box);
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen ret = -1;
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen }
60b42c6dfdf9edcca8a96b380ef9a0adc60c2464Timo Sirainen }
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen mailbox_free(&box);
60b42c6dfdf9edcca8a96b380ef9a0adc60c2464Timo Sirainen return ret;
60b42c6dfdf9edcca8a96b380ef9a0adc60c2464Timo Sirainen}
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic void
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainencmd_mailbox_metadata_list_init(struct doveadm_mail_cmd_context *_ctx,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen const char *const args[])
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen{
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct metadata_cmd_context *ctx = (struct metadata_cmd_context *)_ctx;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen const char *key = NULL;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (args[0] == NULL)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen doveadm_mail_help_name("mailbox metadata list");
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (args[1] != NULL)
0d16525a729011f4fced989a3da74d755ea49e6dTimo Sirainen cmd_mailbox_metadata_parse_key(args[1], &ctx->key_type, &key);
0d16525a729011f4fced989a3da74d755ea49e6dTimo Sirainen ctx->mailbox = p_strdup(_ctx->pool, args[0]);
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo Sirainen ctx->key = key == NULL ? "" : p_strdup(_ctx->pool, key);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_print_header("key", "key",
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE);
4ac2d38239cea8090154e17faefd77de5a71d882Timo Sirainen}
c7194d1d3872ffb2901737e1df337cc227a3fa77Timo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstatic struct doveadm_mail_cmd_context *cmd_mailbox_metadata_list_alloc(void)
94ce7e7700cda14a8342cb08e7285507b4b531daTimo Sirainen{
94ce7e7700cda14a8342cb08e7285507b4b531daTimo Sirainen struct metadata_cmd_context *ctx;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx = doveadm_mail_cmd_alloc(struct metadata_cmd_context);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx->ctx.v.init = cmd_mailbox_metadata_list_init;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen ctx->ctx.v.run = cmd_mailbox_metadata_list_run;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen doveadm_print_init(DOVEADM_PRINT_TYPE_FLOW);
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen return &ctx->ctx;
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen}
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstruct doveadm_cmd_ver2 doveadm_cmd_mailbox_metadata_set_ver2 = {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen .name = "mailbox metadata set",
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen .mail_cmd = cmd_mailbox_metadata_set_alloc,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<mailbox> <key> <value>",
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_PARAMS_START
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_MAIL_COMMON
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_PARAM('\0', "key", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_PARAM('\0', "value", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_PARAMS_END
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen};
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstruct doveadm_cmd_ver2 doveadm_cmd_mailbox_metadata_unset_ver2 = {
c4c9be10781e1a16b3b001dc6b0461c4640da101Timo Sirainen .name = "mailbox metadata unset",
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen .mail_cmd = cmd_mailbox_metadata_unset_alloc,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<mailbox> <key>",
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_PARAMS_START
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_MAIL_COMMON
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_PARAM('\0', "key", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_PARAMS_END
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen};
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstruct doveadm_cmd_ver2 doveadm_cmd_mailbox_metadata_get_ver2 = {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen .name = "mailbox metadata get",
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen .mail_cmd = cmd_mailbox_metadata_get_alloc,
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<mailbox> <key>",
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_PARAMS_START
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_MAIL_COMMON
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
67c47dbb3fde79218320fd38a45c33f61bbf3012Timo SirainenDOVEADM_CMD_PARAM('\0', "key", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
4654f788834c9d7920a351306b89cf5d1c21772eTimo SirainenDOVEADM_CMD_PARAMS_END
77c462c3a415536f9c87028ee34546ee96fd1445Timo Sirainen};
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainenstruct doveadm_cmd_ver2 doveadm_cmd_mailbox_metadata_list_ver2 = {
4654f788834c9d7920a351306b89cf5d1c21772eTimo Sirainen .name = "mailbox metadata list",
.mail_cmd = cmd_mailbox_metadata_list_alloc,
.usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<mailbox> [<key prefix>]",
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_MAIL_COMMON
DOVEADM_CMD_PARAM('\0', "mailbox", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAM('\0', "key-prefix", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
};