dovecot-2.1: doveadm acl: Added "add" and "remove" commands.
dovecot at dovecot.org
dovecot at dovecot.org
Sun Feb 12 04:19:01 EET 2012
details: http://hg.dovecot.org/dovecot-2.1/rev/845c3045f45c
changeset: 14119:845c3045f45c
user: Timo Sirainen <tss at iki.fi>
date: Sun Feb 12 04:18:50 2012 +0200
description:
doveadm acl: Added "add" and "remove" commands.
diffstat:
src/plugins/acl/doveadm-acl.c | 47 +++++++++++++++++++++++++++++++-----------
1 files changed, 34 insertions(+), 13 deletions(-)
diffs (100 lines):
diff -r dbff71f51507 -r 845c3045f45c src/plugins/acl/doveadm-acl.c
--- a/src/plugins/acl/doveadm-acl.c Sun Feb 12 04:12:44 2012 +0200
+++ b/src/plugins/acl/doveadm-acl.c Sun Feb 12 04:18:50 2012 +0200
@@ -13,6 +13,7 @@
struct doveadm_acl_cmd_context {
struct doveadm_mail_cmd_context ctx;
bool get_match_me;
+ enum acl_modify_mode modify_mode;
};
const char *doveadm_acl_plugin_version = DOVECOT_VERSION;
@@ -229,10 +230,12 @@
}
static void
-cmd_acl_set_run(struct doveadm_mail_cmd_context *ctx, struct mail_user *user)
+cmd_acl_set_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
{
- const char *mailbox = ctx->args[0], *id = ctx->args[1];
- const char *const *rights = ctx->args + 2;
+ struct doveadm_acl_cmd_context *ctx =
+ (struct doveadm_acl_cmd_context *)_ctx;
+ const char *mailbox = _ctx->args[0], *id = _ctx->args[1];
+ const char *const *rights = _ctx->args + 2;
ARRAY_TYPE(const_string) dest_rights, dest_neg_rights, *dest;
struct mailbox *box;
struct acl_object *aclobj;
@@ -243,8 +246,8 @@
return;
memset(&update, 0, sizeof(update));
- update.modify_mode = ACL_MODIFY_MODE_REPLACE;
- update.neg_modify_mode = ACL_MODIFY_MODE_REPLACE;
+ update.modify_mode = ctx->modify_mode;
+ update.neg_modify_mode = ctx->modify_mode;
if (acl_identifier_parse(id, &update.rights) < 0)
i_fatal("Invalid ID: %s", id);
@@ -278,13 +281,13 @@
if (array_count(&dest_rights) > 0) {
(void)array_append_space(&dest_rights);
update.rights.rights = array_idx(&dest_rights, 0);
- } else {
+ } else if (update.modify_mode == ACL_MODIFY_MODE_REPLACE) {
update.modify_mode = ACL_MODIFY_MODE_CLEAR;
}
if (array_count(&dest_neg_rights) > 0) {
(void)array_append_space(&dest_neg_rights);
update.rights.neg_rights = array_idx(&dest_neg_rights, 0);
- } else {
+ } else if (update.neg_modify_mode == ACL_MODIFY_MODE_REPLACE) {
update.neg_modify_mode = ACL_MODIFY_MODE_CLEAR;
}
@@ -302,14 +305,30 @@
}
static struct doveadm_mail_cmd_context *
-cmd_acl_set_alloc(void)
+cmd_acl_change_alloc(enum acl_modify_mode modify_mode)
{
- struct doveadm_mail_cmd_context *ctx;
+ struct doveadm_acl_cmd_context *ctx;
- ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
- ctx->v.run = cmd_acl_set_run;
- ctx->v.init = cmd_acl_set_init;
- return ctx;
+ ctx = doveadm_mail_cmd_alloc(struct doveadm_acl_cmd_context);
+ ctx->ctx.v.run = cmd_acl_set_run;
+ ctx->ctx.v.init = cmd_acl_set_init;
+ ctx->modify_mode = modify_mode;
+ return &ctx->ctx;
+}
+
+static struct doveadm_mail_cmd_context *cmd_acl_set_alloc(void)
+{
+ return cmd_acl_change_alloc(ACL_MODIFY_MODE_REPLACE);
+}
+
+static struct doveadm_mail_cmd_context *cmd_acl_add_alloc(void)
+{
+ return cmd_acl_change_alloc(ACL_MODIFY_MODE_ADD);
+}
+
+static struct doveadm_mail_cmd_context *cmd_acl_remove_alloc(void)
+{
+ return cmd_acl_change_alloc(ACL_MODIFY_MODE_REMOVE);
}
static void
@@ -539,6 +558,8 @@
{ cmd_acl_get_alloc, "acl get", "[-m] <mailbox>" },
{ cmd_acl_rights_alloc, "acl rights", "<mailbox>" },
{ cmd_acl_set_alloc, "acl set", "<mailbox> <id> <right> [<right> ...]" },
+ { cmd_acl_add_alloc, "acl add", "<mailbox> <id> <right> [<right> ...]" },
+ { cmd_acl_remove_alloc, "acl remove", "<mailbox> <id> <right> [<right> ...]" },
{ cmd_acl_delete_alloc, "acl delete", "<mailbox> <id>" },
{ cmd_acl_debug_alloc, "acl debug", "<mailbox>" }
};
More information about the dovecot-cvs
mailing list