dovecot-2.0-pigeonhole: Sieve Storage: improved handling of unco...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Wed May 11 20:26:58 EEST 2011


details:   http://hg.rename-it.nl/dovecot-2.0-pigeonhole/rev/560057691dac
changeset: 1499:560057691dac
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Wed May 11 19:26:57 2011 +0200
description:
Sieve Storage: improved handling of unconfigured user home directory.

diffstat:

 src/lib-sievestorage/sieve-storage.c |  87 ++++++++++++++++++----------
 src/managesieve/managesieve-client.c |   2 +-
 2 files changed, 56 insertions(+), 33 deletions(-)

diffs (182 lines):

diff -r cc25d9fa8183 -r 560057691dac src/lib-sievestorage/sieve-storage.c
--- a/src/lib-sievestorage/sieve-storage.c	Tue May 10 21:36:47 2011 +0200
+++ b/src/lib-sievestorage/sieve-storage.c	Wed May 11 19:26:57 2011 +0200
@@ -177,7 +177,7 @@
 {
 	pool_t pool;
 	struct sieve_storage *storage;
-	const char *tmp_dir, *link_path;
+	const char *tmp_dir, *link_path, *path;
 	const char *sieve_data, *active_path, *active_fname, *storage_dir;
 	mode_t dir_create_mode, file_create_mode;
 	gid_t file_create_gid;
@@ -185,15 +185,11 @@
 	unsigned long long int uint_setting;
 	size_t size_setting;
 
-	/* 
-	 * Read settings 
+	/*
+	 * Configure active script path
 	 */
 
 	active_path = sieve_setting_get(svinst, "sieve");
-    sieve_data = sieve_setting_get(svinst, "sieve_dir");
-
-	if ( sieve_data == NULL )
-		sieve_data = sieve_setting_get(svinst, "sieve_storage");
 
 	/* Get path to active Sieve script */
 
@@ -201,21 +197,29 @@
 		if ( *active_path == '\0' ) {
 			/* disabled */
 			if ( debug ) 
-				i_debug("sieve-storage: sieve is disabled (sieve = \"\")");
+				i_debug("sieve-storage: sieve is disabled (sieve=\"\")");
 			return NULL;
 		}
 	} else {
-
-		if ( home == NULL ) {
-			/* we must have a home directory */
-			i_error("sieve-storage: userdb(%s) didn't return a home directory or "
-				"sieve script location", user);
-			return NULL;
+		if ( debug ) {
+			i_debug("sieve-storage: sieve active script path is unconfigured; "
+				"using default (sieve=%s)", SIEVE_DEFAULT_PATH);
 		}
 
 		active_path = SIEVE_DEFAULT_PATH;
 	}
 
+	/* Substitute home dir if necessary */
+
+	path = home_expand_tilde(active_path, home);
+	if ( path == NULL ) {
+		i_error("sieve-storage: userdb(%s) didn't return a home directory "
+			"for substitition in active script path (sieve=%s)", user, active_path);
+		return NULL;
+	}
+
+	active_path = path;
+
 	/* Get the filename for the active script link */
 
 	active_fname = strrchr(active_path, '/');
@@ -233,10 +237,21 @@
 		return NULL;
 	}
 
-	/* Find out where to put the script storage */
+	/*
+	 * Configure script storage directory
+	 */
 
 	storage_dir = NULL;
 
+	/* Read setting */
+
+	sieve_data = sieve_setting_get(svinst, "sieve_dir");
+
+	if ( sieve_data == NULL )
+		sieve_data = sieve_setting_get(svinst, "sieve_storage");
+
+	/* Determine location */
+
 	if ( sieve_data == NULL || *sieve_data == '\0' ) {
 		/* We'll need to figure out the storage location ourself.
 		 *
@@ -250,7 +265,7 @@
 					i_debug("sieve-storage: root exists (%s)", home);
 				}
 
-				storage_dir = home_expand_tilde("~/sieve", home);
+				storage_dir = t_strconcat(home, "/sieve", NULL);
 			} else {
 				/* Don't have required access on the home directory */
 
@@ -262,26 +277,34 @@
 		} else {
 			if ( debug )
 				i_debug("sieve-storage: HOME not set");
-		}
 
-		if (access("/sieve", R_OK|W_OK|X_OK) == 0) {
-			storage_dir = "/sieve";
-			if ( debug )
-				i_debug("sieve-storage: /sieve exists, assuming chroot");
+			if (access("/sieve", R_OK|W_OK|X_OK) == 0) {
+				storage_dir = "/sieve";
+				if ( debug )
+					i_debug("sieve-storage: /sieve exists, assuming chroot");
+			}
 		}
 	} else {
 		storage_dir = sieve_data;
 	}
 
 	if (storage_dir == NULL || *storage_dir == '\0') {
-		if ( debug )
-			i_debug("sieve-storage: couldn't find storage dir");
+		i_error("sieve-storage: couldn't find storage root directory; "
+			"sieve_dir was left unconfigured and autodetection failed");
 		return NULL;
 	}
 
-	/* Expand home directories in path */
-	active_path = home_expand_tilde(active_path, home);
-	storage_dir = home_expand_tilde(storage_dir, home);
+	/* Expand home directory in path */
+
+	path = home_expand_tilde(storage_dir, home);
+	if ( path == NULL ) {
+		i_error("sieve-storage: userdb(%s) didn't return a home directory "
+			"for substitition in storage root directory (sieve_dir=%s)",
+			user, storage_dir);
+		return NULL;
+	}
+
+	storage_dir = path;
 
 	if ( debug ) {
 		i_debug("sieve-storage: "
@@ -300,19 +323,19 @@
 	 * Ensure sieve local directory structure exists (full autocreate):
 	 *  This currently currently only consists of a ./tmp direcory
 	 */
-	
-	tmp_dir = t_strconcat(storage_dir, "/tmp", NULL);	
+
+	tmp_dir = t_strconcat(storage_dir, "/tmp", NULL);
 
 	/*ret = maildir_check_tmp(box->storage, box->path);
 	if (ret < 0)
 		return -1;*/
 
-	if ( mkdir_verify(tmp_dir, dir_create_mode, file_create_gid, 
+	if ( mkdir_verify(tmp_dir, dir_create_mode, file_create_gid,
 		file_create_gid_origin, debug) < 0 )
 		return NULL;
-	
-	/* 
-	 * Create storage object 
+
+	/*
+	 * Create storage object
 	 */
 
 	pool = pool_alloconly_create("sieve-storage", 512+256);
diff -r cc25d9fa8183 -r 560057691dac src/managesieve/managesieve-client.c
--- a/src/managesieve/managesieve-client.c	Tue May 10 21:36:47 2011 +0200
+++ b/src/managesieve/managesieve-client.c	Wed May 11 19:26:57 2011 +0200
@@ -84,7 +84,7 @@
 	const char *home;
 
 	if ( mail_user_get_home(user, &home) <= 0 )
-	home = NULL;
+		home = NULL;
 
 	storage = sieve_storage_create
 		(svinst, user->username, home, set->mail_debug);


More information about the dovecot-cvs mailing list