dovecot-1.2: acl: When lookup ACLs are changed, make sure doveco...

dovecot at dovecot.org dovecot at dovecot.org
Sun Nov 16 16:30:18 EET 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/23aee2534249
changeset: 8430:23aee2534249
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Nov 16 16:30:14 2008 +0200
description:
acl: When lookup ACLs are changed, make sure dovecot-acl-list is updated.

diffstat:

4 files changed, 42 insertions(+), 34 deletions(-)
src/plugins/acl/acl-api-private.h           |    1 
src/plugins/acl/acl-api.c                   |   19 ++++++++++++++
src/plugins/acl/acl-backend-vfile-acllist.c |   21 ----------------
src/plugins/acl/acl-backend-vfile.c         |   35 ++++++++++++++++-----------

diffs (126 lines):

diff -r 633f5ff81767 -r 23aee2534249 src/plugins/acl/acl-api-private.h
--- a/src/plugins/acl/acl-api-private.h	Sun Nov 16 16:29:47 2008 +0200
+++ b/src/plugins/acl/acl-api-private.h	Sun Nov 16 16:30:14 2008 +0200
@@ -82,5 +82,6 @@ acl_backend_mask_get_names(struct acl_ba
 			   const struct acl_mask *mask, pool_t pool);
 int acl_backend_get_default_rights(struct acl_backend *backend,
 				   const struct acl_mask **mask_r);
+bool acl_rights_has_nonowner_lookup_changes(const struct acl_rights *rights);
 
 #endif
diff -r 633f5ff81767 -r 23aee2534249 src/plugins/acl/acl-api.c
--- a/src/plugins/acl/acl-api.c	Sun Nov 16 16:29:47 2008 +0200
+++ b/src/plugins/acl/acl-api.c	Sun Nov 16 16:30:14 2008 +0200
@@ -171,3 +171,22 @@ acl_backend_nonowner_lookups_iter_deinit
 	*_ctx = NULL;
 	ctx->backend->v.nonowner_lookups_iter_deinit(ctx);
 }
+
+bool acl_rights_has_nonowner_lookup_changes(const struct acl_rights *rights)
+{
+	const char *const *p;
+
+	if (rights->id_type == ACL_ID_OWNER) {
+		/* ignore owner rights */
+		return FALSE;
+	}
+
+	if (rights->rights == NULL)
+		return FALSE;
+
+	for (p = rights->rights; *p != NULL; p++) {
+		if (strcmp(*p, MAIL_ACL_LOOKUP) == 0)
+			return TRUE;
+	}
+	return FALSE;
+}
diff -r 633f5ff81767 -r 23aee2534249 src/plugins/acl/acl-backend-vfile-acllist.c
--- a/src/plugins/acl/acl-backend-vfile-acllist.c	Sun Nov 16 16:29:47 2008 +0200
+++ b/src/plugins/acl/acl-backend-vfile-acllist.c	Sun Nov 16 16:30:14 2008 +0200
@@ -125,25 +125,6 @@ void acl_backend_vfile_acllist_refresh(s
 	}
 }
 
-static bool rights_has_lookup_changes(const struct acl_rights *rights)
-{
-	const char *const *p;
-
-	if (rights->id_type == ACL_ID_OWNER) {
-		/* ignore owner rights */
-		return FALSE;
-	}
-
-	if (rights->rights == NULL)
-		return FALSE;
-
-	for (p = rights->rights; *p != NULL; p++) {
-		if (strcmp(*p, MAIL_ACL_LOOKUP) == 0)
-			return TRUE;
-	}
-	return FALSE;
-}
-
 static int
 acllist_append(struct acl_backend_vfile *backend, struct ostream *output,
 	       struct mail_storage *storage, const char *name)
@@ -159,7 +140,7 @@ acllist_append(struct acl_backend_vfile 
 
 	iter = acl_object_list_init(aclobj);
 	while ((ret = acl_object_list_next(iter, &rights)) > 0) {
-		if (rights_has_lookup_changes(&rights))
+		if (acl_rights_has_nonowner_lookup_changes(&rights))
 			break;
 	}
 	acl_object_list_deinit(&iter);
diff -r 633f5ff81767 -r 23aee2534249 src/plugins/acl/acl-backend-vfile.c
--- a/src/plugins/acl/acl-backend-vfile.c	Sun Nov 16 16:29:47 2008 +0200
+++ b/src/plugins/acl/acl-backend-vfile.c	Sun Nov 16 16:30:14 2008 +0200
@@ -1092,6 +1092,8 @@ acl_backend_vfile_object_update(struct a
 				const struct acl_rights_update *update)
 {
 	struct acl_object_vfile *aclobj = (struct acl_object_vfile *)_aclobj;
+	struct acl_backend_vfile *backend =
+		(struct acl_backend_vfile *)_aclobj->backend;
 	const struct acl_rights *rights;
 	struct dotlock *dotlock;
 	const char *path;
@@ -1115,20 +1117,25 @@ acl_backend_vfile_object_update(struct a
 	if (!changed) {
 		file_dotlock_delete(&dotlock);
 		return 0;
-	} else {
-		path = file_dotlock_get_lock_path(dotlock);
-		if (acl_backend_vfile_update_write(aclobj, fd, path) < 0) {
-			file_dotlock_delete(&dotlock);
-			acl_cache_flush(_aclobj->backend->cache, _aclobj->name);
-			return -1;
-		}
-		acl_backend_vfile_update_cache(_aclobj, fd);
-		if (file_dotlock_replace(&dotlock, 0) < 0) {
-			acl_cache_flush(_aclobj->backend->cache, _aclobj->name);
-			return -1;
-		}
-		return 0;
-	}
+	}
+
+	/* ACLs were really changed, write the new ones */
+	path = file_dotlock_get_lock_path(dotlock);
+	if (acl_backend_vfile_update_write(aclobj, fd, path) < 0) {
+		file_dotlock_delete(&dotlock);
+		acl_cache_flush(_aclobj->backend->cache, _aclobj->name);
+		return -1;
+	}
+	acl_backend_vfile_update_cache(_aclobj, fd);
+	if (file_dotlock_replace(&dotlock, 0) < 0) {
+		acl_cache_flush(_aclobj->backend->cache, _aclobj->name);
+		return -1;
+	}
+	/* make sure dovecot-acl-list gets updated if we added any
+	   lookup rights. */
+	if (acl_rights_has_nonowner_lookup_changes(&update->rights))
+		(void)acl_backend_vfile_acllist_rebuild(backend);
+	return 0;
 }
 
 static struct acl_object_list_iter *


More information about the dovecot-cvs mailing list