changeset 22386:1534de106851

lib-storage: Add setting to disable \NoSelect mailboxes Enabled using mail_location = ...:NO-NOSELECT Trying to create \NoSelect "dir/" will result just creating "dir", similar to how Maildir++ layout already did it. Deleting a mailbox will delete all of its \NoSelect parents.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 25 Jul 2017 16:10:51 +0300
parents ae8fe0ac1f34
children 6cbca06276e6
files src/lib-storage/index/index-storage.c src/lib-storage/list/mailbox-list-delete.c src/lib-storage/list/mailbox-list-fs.c src/lib-storage/mailbox-list.c src/lib-storage/mailbox-list.h
diffstat 5 files changed, 24 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-storage.c	Tue Jul 25 15:54:37 2017 +0300
+++ b/src/lib-storage/index/index-storage.c	Tue Jul 25 16:10:51 2017 +0300
@@ -574,6 +574,12 @@
 	bool create_parent_dir;
 	int ret;
 
+	if ((box->list->props & MAILBOX_LIST_PROP_NO_NOSELECT) != 0) {
+		/* Layout doesn't support creating \NoSelect mailboxes.
+		   Switch to creating a selectable mailbox. */
+		directory = FALSE;
+	}
+
 	type = directory ? MAILBOX_LIST_PATH_TYPE_DIR :
 		MAILBOX_LIST_PATH_TYPE_MAILBOX;
 	if ((ret = mailbox_get_path_to(box, type, &path)) < 0)
@@ -630,8 +636,7 @@
 		return -1;
 	}
 
-	if (directory &&
-	    (box->list->props & MAILBOX_LIST_PROP_NO_NOSELECT) == 0) {
+	if (directory) {
 		/* we only wanted to create the directory and it's done now */
 		return 0;
 	}
--- a/src/lib-storage/list/mailbox-list-delete.c	Tue Jul 25 15:54:37 2017 +0300
+++ b/src/lib-storage/list/mailbox-list-delete.c	Tue Jul 25 16:10:51 2017 +0300
@@ -276,7 +276,7 @@
 	const char *root_dir, *p;
 	size_t len;
 
-	if (list->set.iter_from_index_dir &&
+	if (list->set.iter_from_index_dir && !list->set.no_noselect &&
 	    mailbox_list_path_is_index(list, type)) {
 		/* Don't auto-rmdir parent index directories with ITERINDEX.
 		   Otherwise it'll get us into inconsistent state with a
--- a/src/lib-storage/list/mailbox-list-fs.c	Tue Jul 25 15:54:37 2017 +0300
+++ b/src/lib-storage/list/mailbox-list-fs.c	Tue Jul 25 16:10:51 2017 +0300
@@ -255,17 +255,19 @@
 	const char *path;
 	int ret;
 
+	ret = mailbox_list_get_path(list, name,
+				    MAILBOX_LIST_PATH_TYPE_MAILBOX, &path);
+	if (ret < 0)
+		return -1;
+	i_assert(ret > 0);
+
 	if ((list->flags & MAILBOX_LIST_FLAG_MAILBOX_FILES) != 0) {
-		ret = mailbox_list_get_path(list, name,
-					    MAILBOX_LIST_PATH_TYPE_MAILBOX,
-					    &path);
-		if (ret < 0)
-			return -1;
-		i_assert(ret > 0);
 		ret = mailbox_list_delete_mailbox_file(list, name, path);
 	} else {
 		ret = fs_list_delete_maildir(list, name);
 	}
+	if (ret == 0 && list->set.no_noselect)
+		mailbox_list_delete_until_root(list, path, MAILBOX_LIST_PATH_TYPE_MAILBOX);
 
 	i_assert(ret <= 0);
 	return mailbox_list_delete_finish_ret(list, name, ret == 0);
--- a/src/lib-storage/mailbox-list.c	Tue Jul 25 15:54:37 2017 +0300
+++ b/src/lib-storage/mailbox-list.c	Tue Jul 25 16:10:51 2017 +0300
@@ -146,6 +146,8 @@
 	list->root_permissions.dir_create_mode = (mode_t)-1;
 	list->root_permissions.file_create_gid = (gid_t)-1;
 	list->changelog_timestamp = (time_t)-1;
+	if (set->no_noselect)
+		list->props |= MAILBOX_LIST_PROP_NO_NOSELECT;
 
 	/* copy settings */
 	if (set->root_dir != NULL) {
@@ -178,6 +180,7 @@
 	list->set.index_control_use_maildir_name =
 		set->index_control_use_maildir_name;
 	list->set.iter_from_index_dir = set->iter_from_index_dir;
+	list->set.no_noselect = set->no_noselect;
 
 	if (*set->mailbox_dir_name == '\0')
 		list->set.mailbox_dir_name = "";
@@ -351,6 +354,9 @@
 		} else if (strcmp(key, "ITERINDEX") == 0) {
 			set_r->iter_from_index_dir = TRUE;
 			continue;
+		} else if (strcmp(key, "NO-NOSELECT") == 0) {
+			set_r->no_noselect = TRUE;
+			continue;
 		} else {
 			*error_r = t_strdup_printf("Unknown setting: %s", key);
 			return -1;
--- a/src/lib-storage/mailbox-list.h	Tue Jul 25 15:54:37 2017 +0300
+++ b/src/lib-storage/mailbox-list.h	Tue Jul 25 16:10:51 2017 +0300
@@ -152,6 +152,8 @@
 	   faster storage. This could perhaps be made the default at some point,
 	   but for now since it's less tested it's optional. */
 	bool iter_from_index_dir;
+	/* Avoid creating or listing \NoSelect mailboxes. */
+	bool no_noselect;
 };
 
 struct mailbox_permissions {