changeset 4964:3ed0749731d2 HEAD

If debug is enabled, log some debugging messages. Also cleaned up the code bit, and made "acl = vfile" not require ":" after the "vfile".
author Timo Sirainen <tss@iki.fi>
date Thu, 28 Dec 2006 16:47:38 +0200
parents b13c7888563c
children 9246d9308caa
files src/plugins/acl/acl-api-private.h src/plugins/acl/acl-api.c src/plugins/acl/acl-backend-vfile.c src/plugins/acl/acl-backend.c src/plugins/acl/acl-plugin.c
diffstat 5 files changed, 68 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/acl/acl-api-private.h	Thu Dec 28 14:26:46 2006 +0200
+++ b/src/plugins/acl/acl-api-private.h	Thu Dec 28 16:47:38 2006 +0200
@@ -4,12 +4,12 @@
 #include "acl-api.h"
 
 struct acl_backend_vfuncs {
-	struct acl_backend *(*init)(const char *data);
+	struct acl_backend *(*alloc)(void);
+	int (*init)(struct acl_backend *backend, const char *data);
 	void (*deinit)(struct acl_backend *backend);
 
 	struct acl_object *(*object_init)(struct acl_backend *backend,
-					  const char *name,
-					  const char *control_dir);
+					  const char *name);
 	void (*object_deinit)(struct acl_object *aclobj);
 
 	int (*object_refresh_cache)(struct acl_object *aclobj);
@@ -36,6 +36,8 @@
 	struct acl_mask *default_aclmask;
 
 	struct acl_backend_vfuncs v;
+
+	unsigned int debug:1;
 };
 
 struct acl_object {
--- a/src/plugins/acl/acl-api.c	Thu Dec 28 14:26:46 2006 +0200
+++ b/src/plugins/acl/acl-api.c	Thu Dec 28 16:47:38 2006 +0200
@@ -9,10 +9,7 @@
 struct acl_object *acl_object_init_from_name(struct acl_backend *backend,
 					     const char *name)
 {
-	const char *control_dir =
-		mail_storage_get_mailbox_control_dir(backend->storage, name);
-
-	return backend->v.object_init(backend, name, control_dir);
+	return backend->v.object_init(backend, name);
 }
 
 struct acl_object *acl_object_init_from_mailbox(struct acl_backend *backend,
--- a/src/plugins/acl/acl-backend-vfile.c	Thu Dec 28 14:26:46 2006 +0200
+++ b/src/plugins/acl/acl-backend-vfile.c	Thu Dec 28 16:47:38 2006 +0200
@@ -65,19 +65,31 @@
 	{ '\0', NULL }
 };
 
-static struct acl_backend *acl_backend_vfile_init(const char *data)
+static struct acl_backend *acl_backend_vfile_alloc(void)
 {
 	struct acl_backend_vfile *backend;
 	pool_t pool;
 
-	pool = pool_alloconly_create("ACL backend", nearest_power(512));
+	pool = pool_alloconly_create("ACL backend", 512);
 	backend = p_new(pool, struct acl_backend_vfile, 1);
-	backend->global_dir = p_strdup(pool, data);
 	backend->backend.pool = pool;
-	backend->backend.cache =
-		acl_cache_init(&backend->backend,
+	return &backend->backend;
+}
+
+static int
+acl_backend_vfile_init(struct acl_backend *_backend, const char *data)
+{
+	struct acl_backend_vfile *backend =
+		(struct acl_backend_vfile *)_backend;
+
+	if (_backend->debug)
+		i_info("acl vfile: Global ACL directory: %s", data);
+
+	backend->global_dir = p_strdup(_backend->pool, data);
+	_backend->cache =
+		acl_cache_init(_backend,
 			       sizeof(struct acl_backend_vfile_validity));
-	return &backend->backend;
+	return 0;
 }
 
 static void acl_backend_vfile_deinit(struct acl_backend *backend)
@@ -86,12 +98,15 @@
 }
 
 static struct acl_object *
-acl_backend_vfile_object_init(struct acl_backend *_backend,
-			      const char *name, const char *control_dir)
+acl_backend_vfile_object_init(struct acl_backend *_backend, const char *name)
 {
 	struct acl_backend_vfile *backend =
 		(struct acl_backend_vfile *)_backend;
 	struct acl_object_vfile *aclobj;
+	const char *control_dir;
+
+	control_dir =
+		mail_storage_get_mailbox_control_dir(_backend->storage, name);
 
 	aclobj = i_new(struct acl_object_vfile, 1);
 	aclobj->aclobj.backend = _backend;
@@ -241,6 +256,9 @@
 	fd = nfs_safe_open(path, O_RDONLY);
 	if (fd == -1) {
 		if (errno == ENOENT) {
+			if (aclobj->backend->debug)
+				i_info("acl vfile: file %s not found", path);
+
 			validity->last_size = 0;
 			validity->last_mtime = 0;
 			validity->last_read_time = ioloop_time;
@@ -268,6 +286,9 @@
 		return 0;
 	}
 
+	if (aclobj->backend->debug)
+		i_info("acl vfile: reading file %s", path);
+
 	input = i_stream_create_file(fd, default_pool, 4096, FALSE);
 
 	linenum = 1;
@@ -453,6 +474,7 @@
 }
 
 struct acl_backend_vfuncs acl_backend_vfile = {
+	acl_backend_vfile_alloc,
 	acl_backend_vfile_init,
 	acl_backend_vfile_deinit,
 	acl_backend_vfile_object_init,
--- a/src/plugins/acl/acl-backend.c	Thu Dec 28 14:26:46 2006 +0200
+++ b/src/plugins/acl/acl-backend.c	Thu Dec 28 16:47:38 2006 +0200
@@ -32,21 +32,45 @@
 {
 	struct acl_backend *backend;
 	unsigned int i, group_count;
-	bool storage_owner;
+	bool storage_owner, debug;
+
+	debug = getenv("DEBUG") != NULL;
+	if (debug) {
+		i_info("acl: initializing backend with data: %s", data);
+		i_info("acl: acl username = %s", acl_username);
+		i_info("acl: owner username = %s",
+		       owner_username != NULL ? owner_username : "");
+	}
 
 	group_count = strarray_length(groups);
 
-	if (strncmp(data, "vfile:", 6) != 0)
+	if (strncmp(data, "vfile:", 6) == 0)
+		data += 6;
+	else if (strcmp(data, "vfile") == 0)
+		data = "";
+	else
 		i_fatal("Unknown ACL backend: %s", t_strcut(data, ':'));
-	data += 6;
 
-	backend = acl_backend_vfile.init(data);
+	backend = acl_backend_vfile.alloc();
+	backend->debug = debug;
 	backend->v = acl_backend_vfile;
 	backend->storage = storage;
 	backend->username = p_strdup(backend->pool, acl_username);
 	backend->owner_username = owner_username == NULL ? "" :
 		p_strdup(backend->pool, owner_username);
-	backend->group_count = group_count;
+
+	if (group_count > 0) {
+		backend->group_count = group_count;
+		backend->groups =
+			p_new(backend->pool, const char *, group_count);
+		for (i = 0; i < group_count; i++)
+			backend->groups[i] = groups[i];
+		qsort(backend->groups, group_count, sizeof(const char *),
+		      strcmp_p);
+	}
+
+	if (acl_backend_vfile.init(backend, data) < 0)
+		i_fatal("acl: backend vfile init failed with data: %s", data);
 
 	storage_owner = owner_username != NULL &&
 		strcmp(acl_username, owner_username) == 0;
@@ -55,15 +79,6 @@
 				    storage_owner ? owner_mailbox_rights :
 				    non_owner_mailbox_rights);
 
-	if (group_count > 0) {
-		backend->groups =
-			p_new(backend->pool, const char *, group_count);
-		for (i = 0; i < group_count; i++)
-			backend->groups[i] = groups[i];
-		qsort(backend->groups, group_count, sizeof(const char *),
-		      strcmp_p);
-	}
-
 	backend->default_aclobj = acl_object_init_from_name(backend, "");
 	return backend;
 }
--- a/src/plugins/acl/acl-plugin.c	Thu Dec 28 14:26:46 2006 +0200
+++ b/src/plugins/acl/acl-plugin.c	Thu Dec 28 16:47:38 2006 +0200
@@ -23,6 +23,9 @@
 
 		acl_next_hook_mailbox_list_created = hook_mailbox_list_created;
 		hook_mailbox_list_created = acl_mailbox_list_created;
+	} else {
+		if (getenv("DEBUG") != NULL)
+			i_info("acl: ACL environment not set");
 	}
 }