changeset 8329:c7d14e00c158 HEAD

If a missing home directory is tried to be used, fail the namespace creation.
author Timo Sirainen <tss@iki.fi>
date Sat, 25 Oct 2008 15:42:42 +0300
parents a3df5b1eac6d
children 16a99d3a34dd
files src/lib-storage/mailbox-list.c
diffstat 1 files changed, 26 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mailbox-list.c	Sat Oct 25 15:42:03 2008 +0300
+++ b/src/lib-storage/mailbox-list.c	Sat Oct 25 15:42:42 2008 +0300
@@ -108,13 +108,17 @@
 	return 0;
 }
 
-static const char *fix_path(struct mail_namespace *ns, const char *path)
+static int fix_path(struct mail_namespace *ns, const char *path,
+		    const char **path_r)
 {
 	size_t len = strlen(path);
 
 	if (len > 1 && path[len-1] == '/')
 		path = t_strndup(path, len-1);
-	return mail_user_home_expand(ns->user, path);
+	if (mail_user_try_home_expand(ns->user, &path) < 0)
+		return -1;
+	*path_r = path;
+	return 0;
 }
 
 int mailbox_list_settings_parse(const char *data,
@@ -123,7 +127,7 @@
 				const char **layout, const char **alt_dir_r,
 				const char **error_r)
 {
-	const char *const *tmp, *key, *value;
+	const char *const *tmp, *key, *value, **dest;
 
 	i_assert(*data != '\0');
 
@@ -133,7 +137,12 @@
 
 	/* <root dir> */
 	tmp = t_strsplit(data, ":");
-	set->root_dir = fix_path(ns, *tmp);
+	if (fix_path(ns, *tmp, &set->root_dir) < 0) {
+		*error_r = t_strdup_printf(
+			"Home directory not set, can't expand ~/ for "
+			"mail root dir in: %s", data);
+		return -1;
+	}
 	tmp++;
 
 	for (; *tmp != NULL; tmp++) {
@@ -147,23 +156,29 @@
 		}
 
 		if (strcmp(key, "INBOX") == 0)
-			set->inbox_path = fix_path(ns, value);
+			dest = &set->inbox_path;
 		else if (strcmp(key, "INDEX") == 0)
-			set->index_dir = fix_path(ns, value);
+			dest = &set->index_dir;
 		else if (strcmp(key, "CONTROL") == 0)
-			set->control_dir = fix_path(ns, value);
+			dest = &set->control_dir;
 		else if (strcmp(key, "ALT") == 0 && alt_dir_r != NULL)
-			*alt_dir_r = fix_path(ns, value);
+			dest = alt_dir_r;
 		else if (strcmp(key, "LAYOUT") == 0)
-			*layout = value;
+			dest = layout;
 		else if (strcmp(key, "SUBSCRIPTIONS") == 0)
-			set->subscription_fname = fix_path(ns, value);
+			dest = &set->subscription_fname;
 		else if (strcmp(key, "DIRNAME") == 0)
-			set->maildir_name = value;
+			dest = &set->maildir_name;
 		else {
 			*error_r = t_strdup_printf("Unknown setting: %s", key);
 			return -1;
 		}
+		if (fix_path(ns, value, dest) < 0) {
+			*error_r = t_strdup_printf(
+				"Home directory not set, can't expand ~/ for "
+				"%s in: %s", key, data);
+			return -1;
+		}
 	}
 
 	if (set->index_dir != NULL && strcmp(set->index_dir, "MEMORY") == 0)