From: Markus Valentin Date: Tue, 26 Nov 2019 14:30:47 +0000 (+0100) Subject: doveadm: mail: Add trans-flags parameter to doveadm mail commands X-Git-Tag: 2.3.10~242 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8a7bc361b4f76d3b142f699b3f634f517ea9337a;p=thirdparty%2Fdovecot%2Fcore.git doveadm: mail: Add trans-flags parameter to doveadm mail commands Add a trans-flags parameter to doveadm-mail calls. This allows to run mail commands with specific mailbox transaction flags. mail-storage.h enum mailbox_transaction_flags All doveadm calls take the defined flag additionally to their orignal flags. The flags can be set as decimal integer on the doveadm call. --- diff --git a/src/doveadm/doveadm-mail-copymove.c b/src/doveadm/doveadm-mail-copymove.c index 2485463df4..0115ad0eef 100644 --- a/src/doveadm/doveadm-mail-copymove.c +++ b/src/doveadm/doveadm-mail-copymove.c @@ -39,8 +39,8 @@ cmd_copy_box(struct copy_cmd_context *ctx, struct mailbox *destbox, this guarantees that mails aren't expunged without actually having been copied. */ desttrans = mailbox_transaction_begin(destbox, - MAILBOX_TRANSACTION_FLAG_EXTERNAL, - __func__); + MAILBOX_TRANSACTION_FLAG_EXTERNAL | + ctx->ctx.transaction_flags, __func__); while (doveadm_mail_iter_next(iter, &mail)) { save_ctx = mailbox_save_alloc(desttrans); diff --git a/src/doveadm/doveadm-mail-deduplicate.c b/src/doveadm/doveadm-mail-deduplicate.c index 660587f77e..55d747f502 100644 --- a/src/doveadm/doveadm-mail-deduplicate.c +++ b/src/doveadm/doveadm-mail-deduplicate.c @@ -42,7 +42,7 @@ static int cmd_deduplicate_uidlist(struct doveadm_mail_cmd_context *_ctx, arg = mail_search_build_add(search_args, SEARCH_UIDSET); arg->value.seqset = uids; - trans = mailbox_transaction_begin(box, 0, __func__); + trans = mailbox_transaction_begin(box, _ctx->transaction_flags, __func__); search_ctx = mailbox_search_init(trans, search_args, NULL, 0, NULL); mail_search_args_unref(&search_args); diff --git a/src/doveadm/doveadm-mail-import.c b/src/doveadm/doveadm-mail-import.c index fc85202d81..3b43c47fd3 100644 --- a/src/doveadm/doveadm-mail-import.c +++ b/src/doveadm/doveadm-mail-import.c @@ -91,7 +91,8 @@ dest_mailbox_open_or_create(struct import_cmd_context *ctx, } static int -cmd_import_box_contents(struct doveadm_mail_iter *iter, struct mail *src_mail, +cmd_import_box_contents(struct doveadm_mail_cmd_context *ctx, + struct doveadm_mail_iter *iter, struct mail *src_mail, struct mailbox *dest_box) { struct mail_save_context *save_ctx; @@ -100,8 +101,8 @@ cmd_import_box_contents(struct doveadm_mail_iter *iter, struct mail *src_mail, int ret = 0; dest_trans = mailbox_transaction_begin(dest_box, - MAILBOX_TRANSACTION_FLAG_EXTERNAL, - __func__); + MAILBOX_TRANSACTION_FLAG_EXTERNAL | + ctx->transaction_flags, __func__); do { if (doveadm_debug) { i_debug("import: box=%s uid=%u", @@ -144,7 +145,7 @@ cmd_import_box(struct import_cmd_context *ctx, struct mail_user *dest_user, if (dest_mailbox_open_or_create(ctx, dest_user, info, &box) < 0) ret = -1; else { - if (cmd_import_box_contents(iter, mail, box) < 0) { + if (cmd_import_box_contents(&ctx->ctx, iter, mail, box) < 0) { doveadm_mail_failed_mailbox(&ctx->ctx, mail->box); ret = -1; } diff --git a/src/doveadm/doveadm-mail-index.c b/src/doveadm/doveadm-mail-index.c index 427722ba6b..bdf28b6236 100644 --- a/src/doveadm/doveadm-mail-index.c +++ b/src/doveadm/doveadm-mail-index.c @@ -26,7 +26,8 @@ struct index_cmd_context { bool have_wildcards:1; }; -static int cmd_index_box_precache(struct mailbox *box) +static int cmd_index_box_precache(struct doveadm_mail_cmd_context *dctx, + struct mailbox *box) { struct mailbox_status status; struct mailbox_transaction_context *trans; @@ -65,8 +66,8 @@ static int cmd_index_box_precache(struct mailbox *box) mailbox_get_vname(box), seq, status.messages); } - trans = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_NO_CACHE_DEC, - __func__); + trans = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_NO_CACHE_DEC | + dctx->transaction_flags, __func__); search_args = mail_search_build_init(); mail_search_build_add_seqset(search_args, seq, status.messages); ctx = mailbox_search_init(trans, search_args, NULL, @@ -133,7 +134,7 @@ cmd_index_box(struct index_cmd_context *ctx, const struct mailbox_info *info) doveadm_mail_failed_mailbox(&ctx->ctx, box); ret = -1; } else { - if (cmd_index_box_precache(box) < 0) { + if (cmd_index_box_precache(&ctx->ctx, box) < 0) { doveadm_mail_failed_mailbox(&ctx->ctx, box); ret = -1; } diff --git a/src/doveadm/doveadm-mail-iter.c b/src/doveadm/doveadm-mail-iter.c index da03c1f6fa..eb040aee14 100644 --- a/src/doveadm/doveadm-mail-iter.c +++ b/src/doveadm/doveadm-mail-iter.c @@ -58,7 +58,8 @@ int doveadm_mail_iter_init(struct doveadm_mail_cmd_context *ctx, NULL : mailbox_header_lookup_init(iter->box, wanted_headers); mail_search_args_init(search_args, iter->box, FALSE, NULL); - iter->t = mailbox_transaction_begin(iter->box, 0, ctx->cmd->name); + iter->t = mailbox_transaction_begin(iter->box, ctx->transaction_flags, + ctx->cmd->name); iter->search_ctx = mailbox_search_init(iter->t, search_args, NULL, wanted_fields, headers_ctx); mailbox_header_lookup_unref(&headers_ctx); diff --git a/src/doveadm/doveadm-mail-mailbox-cache.c b/src/doveadm/doveadm-mail-mailbox-cache.c index f4d96db012..da6fc41b7a 100644 --- a/src/doveadm/doveadm-mail-mailbox-cache.c +++ b/src/doveadm/doveadm-mail-mailbox-cache.c @@ -182,7 +182,8 @@ static int cmd_mailbox_cache_decision_run_box(struct mailbox_cache_cmd_context * struct mailbox *box) { struct mailbox_transaction_context *t = - mailbox_transaction_begin(box, 0, "mailbox cache decision"); + mailbox_transaction_begin(box, ctx->ctx.transaction_flags, + "mailbox cache decision"); struct mail_cache *cache = t->box->cache; struct mail_cache_view *view; @@ -329,7 +330,8 @@ static int cmd_mailbox_cache_purge_run_box(struct mailbox_cache_cmd_context *ctx { struct mailbox_transaction_context *t = mailbox_transaction_begin(box, - MAILBOX_TRANSACTION_FLAG_EXTERNAL, + MAILBOX_TRANSACTION_FLAG_EXTERNAL | + ctx->ctx.transaction_flags, "mailbox cache purge"); struct mail_cache *cache = t->box->cache; struct mail_cache_compress_lock *lock; diff --git a/src/doveadm/doveadm-mail-mailbox-metadata.c b/src/doveadm/doveadm-mail-mailbox-metadata.c index 40da3266f8..c75123e9f7 100644 --- a/src/doveadm/doveadm-mail-mailbox-metadata.c +++ b/src/doveadm/doveadm-mail-mailbox-metadata.c @@ -74,9 +74,9 @@ cmd_mailbox_metadata_set_run(struct doveadm_mail_cmd_context *_ctx, if (ret != 0) return ret; - trans = mailbox_transaction_begin(box, ctx->empty_mailbox_name ? - MAILBOX_TRANSACTION_FLAG_EXTERNAL : 0, - __func__); + trans = mailbox_transaction_begin(box, (ctx->empty_mailbox_name ? + MAILBOX_TRANSACTION_FLAG_EXTERNAL : 0) | + ctx->ctx.transaction_flags, __func__); ret = ctx->value.value == NULL ? mailbox_attribute_unset(trans, ctx->key_type, ctx->key) : diff --git a/src/doveadm/doveadm-mail-save.c b/src/doveadm/doveadm-mail-save.c index b1c87a4ec0..7b5e6ba136 100644 --- a/src/doveadm/doveadm-mail-save.c +++ b/src/doveadm/doveadm-mail-save.c @@ -36,8 +36,8 @@ cmd_save_to_mailbox(struct save_cmd_context *ctx, struct mailbox *box, return -1; } - trans = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_EXTERNAL, - __func__); + trans = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_EXTERNAL | + ctx->ctx.transaction_flags, __func__); save_ctx = mailbox_save_alloc(trans); if (mailbox_save_begin(&save_ctx, input) < 0) { i_error("Saving failed: %s", diff --git a/src/doveadm/doveadm-mail.c b/src/doveadm/doveadm-mail.c index 2525087e0c..5a50bdbe6c 100644 --- a/src/doveadm/doveadm-mail.c +++ b/src/doveadm/doveadm-mail.c @@ -1081,6 +1081,11 @@ doveadm_cmd_ver2_to_mail_cmd_wrapper(struct doveadm_cmd_context *cctx) mctx->cmd_input = arg->value.v_istream; i_stream_ref(mctx->cmd_input); + } else if (strcmp(arg->name, "trans-flags") == 0) { + /* This parameter allows to set additional + * mailbox transaction flags. */ + mctx->transaction_flags = arg->value.v_int64; + /* Keep all named special parameters above this line */ } else if (mctx->v.parse_arg != NULL && arg->short_opt != '\0') { diff --git a/src/doveadm/doveadm-mail.h b/src/doveadm/doveadm-mail.h index 9a2c68e74c..0292ead5c8 100644 --- a/src/doveadm/doveadm-mail.h +++ b/src/doveadm/doveadm-mail.h @@ -6,6 +6,7 @@ #include "doveadm-util.h" #include "module-context.h" #include "mail-error.h" +#include "mail-storage.h" #include "mail-storage-service.h" struct mailbox; @@ -70,6 +71,7 @@ struct doveadm_mail_cmd_context { const char *getopt_args; const struct doveadm_settings *set; enum mail_storage_service_flags service_flags; + enum mailbox_transaction_flags transaction_flags; struct mail_storage_service_ctx *storage_service; struct mail_storage_service_input storage_service_input; /* search args aren't set for all mail commands */ @@ -204,6 +206,7 @@ extern struct doveadm_cmd_ver2 doveadm_cmd_rebuild_attachments; DOVEADM_CMD_PARAM('A', "all-users", CMD_PARAM_BOOL, 0) \ DOVEADM_CMD_PARAM('S', "socket-path", CMD_PARAM_STR, 0) \ DOVEADM_CMD_PARAM('u', "user", CMD_PARAM_STR, 0) \ +DOVEADM_CMD_PARAM('\0', "trans-flags", CMD_PARAM_INT64, 0) \ DOVEADM_CMD_PARAM('F', "user-file", CMD_PARAM_ISTREAM, 0) #define DOVEADM_CMD_MAIL_USAGE_PREFIX \ diff --git a/src/plugins/acl/doveadm-acl.c b/src/plugins/acl/doveadm-acl.c index 514dcd44a9..0ab416a246 100644 --- a/src/plugins/acl/doveadm-acl.c +++ b/src/plugins/acl/doveadm-acl.c @@ -201,14 +201,14 @@ cmd_acl_rights_alloc(void) } static int -cmd_acl_mailbox_update(struct mailbox *box, +cmd_acl_mailbox_update(struct doveadm_mail_cmd_context *ctx, struct mailbox *box, const struct acl_rights_update *update) { struct mailbox_transaction_context *t; int ret; - t = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_EXTERNAL, - __func__); + t = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_EXTERNAL | + ctx->transaction_flags, __func__); ret = acl_mailbox_update_acl(t, update); if (mailbox_transaction_commit(&t) < 0) ret = -1; @@ -235,7 +235,7 @@ cmd_acl_set_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user) update.neg_modify_mode = ctx->modify_mode; if (acl_rights_update_import(&update, id, rights, &error) < 0) i_fatal_status(EX_USAGE, "%s", error); - if ((ret = cmd_acl_mailbox_update(box, &update)) < 0) { + if ((ret = cmd_acl_mailbox_update(&ctx->ctx, box, &update)) < 0) { i_error("Failed to set ACL: %s", mailbox_get_last_internal_error(box, NULL)); doveadm_mail_failed_error(_ctx, MAIL_ERROR_TEMP); @@ -293,7 +293,7 @@ cmd_acl_delete_run(struct doveadm_mail_cmd_context *ctx, struct mail_user *user) i_zero(&update); if (acl_rights_update_import(&update, id, NULL, &error) < 0) i_fatal_status(EX_USAGE, "%s", error); - if ((ret = cmd_acl_mailbox_update(box, &update)) < 0) { + if ((ret = cmd_acl_mailbox_update(ctx, box, &update)) < 0) { i_error("Failed to delete ACL: %s", mailbox_get_last_internal_error(box, NULL)); doveadm_mail_failed_error(ctx, MAIL_ERROR_TEMP); diff --git a/src/plugins/mail-crypt/doveadm-mail-crypt.c b/src/plugins/mail-crypt/doveadm-mail-crypt.c index 8c75a5e870..78e66a2470 100644 --- a/src/plugins/mail-crypt/doveadm-mail-crypt.c +++ b/src/plugins/mail-crypt/doveadm-mail-crypt.c @@ -168,7 +168,8 @@ mcp_update_shared_key(struct mailbox_transaction_context *t, return ret; } -static int mcp_update_shared_keys(struct mailbox *box, struct mail_user *user, +static int mcp_update_shared_keys(struct doveadm_mail_cmd_context *ctx, + struct mailbox *box, struct mail_user *user, const char *pubid, struct dcrypt_private_key *key) { const char *error; @@ -192,7 +193,7 @@ static int mcp_update_shared_keys(struct mailbox *box, struct mail_user *user, string_t *uid = t_str_new(64); struct mailbox_transaction_context *t = - mailbox_transaction_begin(box, 0, __func__); + mailbox_transaction_begin(box, ctx->transaction_flags, __func__); ret = 0; @@ -423,7 +424,8 @@ static int mcp_keypair_generate_run(struct doveadm_mail_cmd_context *_ctx, res->success = TRUE; res->id = pubid; T_BEGIN { - mcp_update_shared_keys(box, user, pubid, pair.priv); + mcp_update_shared_keys(&ctx->ctx, box, user, + pubid, pair.priv); } T_END; if (pair.pub != NULL) dcrypt_key_unref_public(&pair.pub); @@ -794,7 +796,8 @@ static int cmd_mcp_key_password_run(struct doveadm_mail_cmd_context *_ctx, if (ret == 1) { struct mailbox_transaction_context *t = - mailbox_transaction_begin(box, 0, __func__); + mailbox_transaction_begin(box, _ctx->transaction_flags, + __func__); struct dcrypt_private_key *key; const struct raw_key *raw_key; const char *algo = ctx->new_password != NULL ?