changeset 12651:238bafcca676

lib-storage: When creating a new mailbox, get permissions from its parent mailbox, not root.
author Timo Sirainen <tss@iki.fi>
date Sat, 12 Feb 2011 00:02:02 +0200
parents 0cadba9597cb
children 31b633336ab5
files src/lib-storage/list/mailbox-list-fs.c src/lib-storage/list/mailbox-list-maildir.c src/lib-storage/mailbox-list.c
diffstat 3 files changed, 20 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/list/mailbox-list-fs.c	Wed Feb 09 02:26:44 2011 +0200
+++ b/src/lib-storage/list/mailbox-list-fs.c	Sat Feb 12 00:02:02 2011 +0200
@@ -285,8 +285,8 @@
 		path = t_strdup_until(path, p);
 	}
 
-	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
-					  &gid, &gid_origin);
+	mailbox_list_get_permissions(list, name, &file_mode, &dir_mode,
+				     &gid, &gid_origin);
 	if (mkdir_parents_chgrp(path, dir_mode, gid, gid_origin) == 0)
 		return 0;
 	else if (errno == EEXIST) {
--- a/src/lib-storage/list/mailbox-list-maildir.c	Wed Feb 09 02:26:44 2011 +0200
+++ b/src/lib-storage/list/mailbox-list-maildir.c	Sat Feb 12 00:02:02 2011 +0200
@@ -263,18 +263,15 @@
 
 static int
 maildir_list_create_maildirfolder_file(struct mailbox_list *list,
-				       const char *dir)
+				       const char *dir, mode_t file_mode,
+				       gid_t gid, const char *gid_origin)
 {
-	const char *path, *gid_origin;
-	mode_t file_mode, dir_mode, old_mask;
-	gid_t gid;
+	const char *path;
+	mode_t old_mask;
 	int fd;
 
 	/* Maildir++ spec wants that maildirfolder named file is created for
 	   all subfolders. */
-	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
-					  &gid, &gid_origin);
-
 	path = t_strconcat(dir, "/" MAILDIR_SUBFOLDER_FILENAME, NULL);
 	old_mask = umask(0);
 	fd = open(path, O_CREAT | O_WRONLY, file_mode);
@@ -336,8 +333,8 @@
 
 	root_dir = mailbox_list_get_path(list, NULL,
 					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
-	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
-					  &gid, &gid_origin);
+	mailbox_list_get_permissions(list, name, &file_mode, &dir_mode,
+				     &gid, &gid_origin);
 	if (mkdir_parents_chgrp(path, dir_mode, gid, gid_origin) == 0) {
 		/* ok */
 	} else if (errno == EEXIST) {
@@ -361,7 +358,8 @@
 		return -1;
 	}
 	return create_parent_dir || strcmp(path, root_dir) == 0 ? 0 :
-		maildir_list_create_maildirfolder_file(list, path);
+		maildir_list_create_maildirfolder_file(list, path, file_mode,
+						       gid, gid_origin);
 }
 
 static const char *
--- a/src/lib-storage/mailbox-list.c	Wed Feb 09 02:26:44 2011 +0200
+++ b/src/lib-storage/mailbox-list.c	Sat Feb 12 00:02:02 2011 +0200
@@ -526,7 +526,7 @@
 				  mode_t *file_mode_r, mode_t *dir_mode_r,
 				  gid_t *gid_r, const char **gid_origin_r)
 {
-	const char *path;
+	const char *path, *parent_name, *p;
 	struct stat st;
 
 	/* use safe defaults */
@@ -547,8 +547,15 @@
 			       list->ns->prefix, path);
 		}
 		if (name != NULL) {
-			/* return defaults */
-			mailbox_list_get_permissions(list, NULL,
+			/* return parent mailbox */
+			p = strrchr(name, mailbox_list_get_hierarchy_sep(list));
+			if (p == NULL) {
+				/* return root defaults */
+				parent_name = NULL;
+			} else {
+				parent_name = t_strdup_until(name, p);
+			}
+			mailbox_list_get_permissions(list, parent_name,
 						     file_mode_r, dir_mode_r,
 						     gid_r, gid_origin_r);
 			return;