dovecot-2.1: doveadm copy/move: Added "user" parameter to specif...

dovecot at dovecot.org dovecot at dovecot.org
Thu Aug 23 23:46:28 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/6b61cc674eef
changeset: 14682:6b61cc674eef
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Aug 23 23:46:15 2012 +0300
description:
doveadm copy/move: Added "user" parameter to specify the source user.

diffstat:

 src/doveadm/doveadm-mail-copymove.c |  52 +++++++++++++++++++++++++++++++++---
 src/doveadm/doveadm-mail.c          |   2 +
 src/doveadm/doveadm-mail.h          |   1 +
 3 files changed, 50 insertions(+), 5 deletions(-)

diffs (145 lines):

diff -r ade94fde249e -r 6b61cc674eef src/doveadm/doveadm-mail-copymove.c
--- a/src/doveadm/doveadm-mail-copymove.c	Thu Aug 23 22:56:56 2012 +0300
+++ b/src/doveadm/doveadm-mail-copymove.c	Thu Aug 23 23:46:15 2012 +0300
@@ -13,6 +13,9 @@
 struct copy_cmd_context {
 	struct doveadm_mail_cmd_context ctx;
 
+	struct mail_storage_service_user *source_service_user;
+	struct mail_user *source_user;
+
 	const char *destname;
 	bool move;
 };
@@ -68,6 +71,22 @@
 	return ret;
 }
 
+static void
+cmd_copy_alloc_source_user(struct copy_cmd_context *ctx, const char *username)
+{
+	struct mail_storage_service_input input;
+	const char *error;
+
+	input = ctx->ctx.storage_service_input;
+	input.username = username;
+
+	if (mail_storage_service_lookup_next(ctx->ctx.storage_service, &input,
+					     &ctx->source_service_user,
+					     &ctx->source_user,
+					     &error) < 0)
+		i_fatal("Couldn't lookup user %s: %s", input.username, error);
+}
+
 static int
 cmd_copy_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
 {
@@ -77,6 +96,7 @@
 		MAILBOX_LIST_ITER_NO_AUTO_BOXES |
 		MAILBOX_LIST_ITER_RETURN_NO_FLAGS;
 	struct doveadm_mailbox_list_iter *iter;
+	struct mail_user *src_user;
 	struct mail_namespace *ns;
 	struct mailbox *destbox;
 	const struct mailbox_info *info;
@@ -97,7 +117,8 @@
 		return -1;
 	}
 
-	iter = doveadm_mailbox_list_iter_init(_ctx, user, _ctx->search_args,
+	src_user = ctx->source_user != NULL ? ctx->source_user : user;
+	iter = doveadm_mailbox_list_iter_init(_ctx, src_user, _ctx->search_args,
 					      iter_flags);
 	while ((info = doveadm_mailbox_list_iter_next(iter)) != NULL) T_BEGIN {
 		if (cmd_copy_box(ctx, destbox, info) < 0)
@@ -114,7 +135,6 @@
 	}
 	mailbox_free(&destbox);
 	return ret;
-
 }
 
 static void cmd_copy_init(struct doveadm_mail_cmd_context *_ctx,
@@ -125,18 +145,40 @@
 
 	if (destname == NULL || args[1] == NULL)
 		doveadm_mail_help_name(cmdname);
+	args++;
+
+	if (args[0] != NULL && args[1] != NULL &&
+	    strcasecmp(args[0], "user") == 0) {
+		if ((_ctx->service_flags &
+		     MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP) == 0)
+			i_fatal("Use -u parameter to specify destination user");
+
+		cmd_copy_alloc_source_user(ctx, args[1]);
+		args += 2;
+	}
 
 	ctx->destname = p_strdup(ctx->ctx.pool, destname);
-	ctx->ctx.search_args = doveadm_mail_build_search_args(args + 1);
+	_ctx->search_args = doveadm_mail_build_search_args(args);
 	expunge_search_args_check(ctx->ctx.search_args, cmdname);
 }
 
+static void cmd_copy_deinit(struct doveadm_mail_cmd_context *_ctx)
+{
+	struct copy_cmd_context *ctx = (struct copy_cmd_context *)_ctx;
+
+	if (ctx->source_user != NULL) {
+		mail_storage_service_user_free(&ctx->source_service_user);
+		mail_user_unref(&ctx->source_user);
+	}
+}
+
 static struct doveadm_mail_cmd_context *cmd_copy_alloc(void)
 {
 	struct copy_cmd_context *ctx;
 
 	ctx = doveadm_mail_cmd_alloc(struct copy_cmd_context);
 	ctx->ctx.v.init = cmd_copy_init;
+	ctx->ctx.v.deinit = cmd_copy_deinit;
 	ctx->ctx.v.run = cmd_copy_run;
 	doveadm_print_init(DOVEADM_PRINT_TYPE_FLOW);
 	return &ctx->ctx;
@@ -152,8 +194,8 @@
 }
 
 struct doveadm_mail_cmd cmd_copy = {
-	cmd_copy_alloc, "copy", "<destination> <search query>"
+	cmd_copy_alloc, "copy", "<destination> [user <source user>] <search query>"
 };
 struct doveadm_mail_cmd cmd_move = {
-	cmd_move_alloc, "move", "<destination> <search query>"
+	cmd_move_alloc, "move", "<destination> [user <source user>] <search query>"
 };
diff -r ade94fde249e -r 6b61cc674eef src/doveadm/doveadm-mail.c
--- a/src/doveadm/doveadm-mail.c	Thu Aug 23 22:56:56 2012 +0300
+++ b/src/doveadm/doveadm-mail.c	Thu Aug 23 23:46:15 2012 +0300
@@ -323,6 +323,7 @@
 	i_assert(input->username != NULL);
 
 	ctx->cur_username = input->username;
+	ctx->storage_service_input = *input;
 	ctx->storage_service = mail_storage_service_init(master_service, NULL,
 							 ctx->service_flags);
 	ctx->v.init(ctx, ctx->args);
@@ -351,6 +352,7 @@
 	memset(&input, 0, sizeof(input));
 	input.service = "doveadm";
 
+	ctx->storage_service_input = input;
 	ctx->storage_service = mail_storage_service_init(master_service, NULL,
 							 ctx->service_flags);
         lib_signals_set_handler(SIGINT, 0, sig_die, NULL);
diff -r ade94fde249e -r 6b61cc674eef src/doveadm/doveadm-mail.h
--- a/src/doveadm/doveadm-mail.h	Thu Aug 23 22:56:56 2012 +0300
+++ b/src/doveadm/doveadm-mail.h	Thu Aug 23 23:46:15 2012 +0300
@@ -48,6 +48,7 @@
 	const struct doveadm_settings *set;
 	enum mail_storage_service_flags service_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 */
 	struct mail_search_args *search_args;
 


More information about the dovecot-cvs mailing list