changeset 12538:57d7ea7fa5f6

lib-storage: Added mailbox_list_get_root_[dir_]permissions() They should be used instead of mailbox_list_get_[dir_]permissions() with name=NULL parameter.
author Timo Sirainen <tss@iki.fi>
date Mon, 06 Dec 2010 03:08:31 +0000
parents 16929d83a00c
children d0a24521d13f
files src/lib-storage/index/dbox-multi/mdbox-map.c src/lib-storage/list/mailbox-list-fs.c src/lib-storage/list/mailbox-list-maildir.c src/lib-storage/list/subscription-file.c src/lib-storage/mail-storage.c src/lib-storage/mailbox-list.c src/lib-storage/mailbox-list.h src/lib-storage/mailbox-uidvalidity.c src/plugins/acl/acl-backend-vfile-acllist.c src/plugins/lazy-expunge/lazy-expunge-plugin.c src/plugins/quota/quota-maildir.c
diffstat 11 files changed, 64 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/dbox-multi/mdbox-map.c	Mon Dec 06 02:16:22 2010 +0000
+++ b/src/lib-storage/index/dbox-multi/mdbox-map.c	Mon Dec 06 03:08:31 2010 +0000
@@ -77,8 +77,9 @@
 	map->ref_ext_id = mail_index_ext_register(map->index, "ref", 0,
 				sizeof(uint16_t), sizeof(uint16_t));
 
-	mailbox_list_get_permissions(root_list, NULL, &map->create_mode,
-				     &map->create_gid, &map->create_gid_origin);
+	mailbox_list_get_root_permissions(root_list, &map->create_mode,
+					  &map->create_gid,
+					  &map->create_gid_origin);
 	mail_index_set_permissions(map->index, map->create_mode,
 				   map->create_gid, map->create_gid_origin);
 	return map;
--- a/src/lib-storage/list/mailbox-list-fs.c	Mon Dec 06 02:16:22 2010 +0000
+++ b/src/lib-storage/list/mailbox-list-fs.c	Mon Dec 06 03:08:31 2010 +0000
@@ -331,8 +331,7 @@
 		path = t_strdup_until(path, p);
 	}
 
-	mailbox_list_get_dir_permissions(list, NULL, &mode,
-					 &gid, &gid_origin);
+	mailbox_list_get_root_dir_permissions(list, &mode, &gid, &gid_origin);
 	if (mkdir_parents_chgrp(path, mode, gid, gid_origin) == 0)
 		return 0;
 	else if (errno == EEXIST) {
@@ -533,8 +532,8 @@
 	/* create the hierarchy */
 	p = strrchr(newpath, '/');
 	if (p != NULL) {
-		mailbox_list_get_dir_permissions(newlist, NULL, &mode,
-						 &gid, &origin);
+		mailbox_list_get_root_dir_permissions(newlist, &mode,
+						      &gid, &origin);
 		p = t_strdup_until(newpath, p);
 		if (mkdir_parents_chgrp(p, mode, gid, origin) < 0 &&
 		    errno != EEXIST) {
--- a/src/lib-storage/list/mailbox-list-maildir.c	Mon Dec 06 02:16:22 2010 +0000
+++ b/src/lib-storage/list/mailbox-list-maildir.c	Mon Dec 06 03:08:31 2010 +0000
@@ -284,7 +284,7 @@
 
 	/* Maildir++ spec wants that maildirfolder named file is created for
 	   all subfolders. */
-	mailbox_list_get_permissions(list, NULL, &mode, &gid, &gid_origin);
+	mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin);
 
 	path = t_strconcat(dir, "/" MAILDIR_SUBFOLDER_FILENAME, NULL);
 	old_mask = umask(0);
@@ -347,8 +347,8 @@
 
 	root_dir = mailbox_list_get_path(list, NULL,
 					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
-	mailbox_list_get_dir_permissions(list, NULL, &mode,
-					 &gid, &gid_origin);
+	mailbox_list_get_root_dir_permissions(list, &mode,
+					      &gid, &gid_origin);
 	if (mkdir_parents_chgrp(path, mode, gid, gid_origin) == 0) {
 		/* ok */
 	} else if (errno == EEXIST) {
--- a/src/lib-storage/list/subscription-file.c	Mon Dec 06 02:16:22 2010 +0000
+++ b/src/lib-storage/list/subscription-file.c	Mon Dec 06 03:08:31 2010 +0000
@@ -108,7 +108,7 @@
 	dotlock_set.timeout = SUBSCRIPTION_FILE_LOCK_TIMEOUT;
 	dotlock_set.stale_timeout = SUBSCRIPTION_FILE_CHANGE_TIMEOUT;
 
-	mailbox_list_get_permissions(list, NULL, &mode, &gid, &origin);
+	mailbox_list_get_root_permissions(list, &mode, &gid, &origin);
 	fd_out = file_dotlock_open_group(&dotlock_set, path, 0,
 					 mode, gid, origin, &dotlock);
 	if (fd_out == -1 && errno == ENOENT) {
--- a/src/lib-storage/mail-storage.c	Mon Dec 06 02:16:22 2010 +0000
+++ b/src/lib-storage/mail-storage.c	Mon Dec 06 03:08:31 2010 +0000
@@ -243,7 +243,7 @@
 		return ret;
 
 	/* we need to create the root directory. */
-	mailbox_list_get_dir_permissions(list, NULL, &mode, &gid, &origin);
+	mailbox_list_get_root_dir_permissions(list, &mode, &gid, &origin);
 	if (mkdir_parents_chgrp(root_dir, mode, gid, origin) < 0 &&
 	    errno != EEXIST) {
 		*error_r = mail_error_create_eacces_msg("mkdir", root_dir);
--- a/src/lib-storage/mailbox-list.c	Mon Dec 06 02:16:22 2010 +0000
+++ b/src/lib-storage/mailbox-list.c	Mon Dec 06 03:08:31 2010 +0000
@@ -490,15 +490,26 @@
 {
 	mode_t dir_mode;
 
-	if (list->file_create_mode != (mode_t)-1 && name == NULL) {
+	i_assert(name != NULL);
+
+	mailbox_list_get_permissions_full(list, name, mode_r, &dir_mode, gid_r,
+					  gid_origin_r);
+}
+
+void mailbox_list_get_root_permissions(struct mailbox_list *list,
+				       mode_t *mode_r, gid_t *gid_r,
+				       const char **gid_origin_r)
+{
+	mode_t dir_mode;
+
+	if (list->file_create_mode != (mode_t)-1) {
 		*mode_r = list->file_create_mode;
 		*gid_r = list->file_create_gid;
 		*gid_origin_r = list->file_create_gid_origin;
-		return;
+	} else {
+		mailbox_list_get_permissions_full(list, NULL, mode_r, &dir_mode,
+						  gid_r, gid_origin_r);
 	}
-
-	mailbox_list_get_permissions_full(list, name, mode_r, &dir_mode, gid_r,
-					  gid_origin_r);
 }
 
 void mailbox_list_get_dir_permissions(struct mailbox_list *list,
@@ -508,15 +519,26 @@
 {
 	mode_t file_mode;
 
-	if (list->dir_create_mode != (mode_t)-1 && name == NULL) {
+	i_assert(name != NULL);
+
+	mailbox_list_get_permissions_full(list, name, &file_mode,
+					  mode_r, gid_r, gid_origin_r);
+}
+
+void mailbox_list_get_root_dir_permissions(struct mailbox_list *list,
+					   mode_t *mode_r, gid_t *gid_r,
+					   const char **gid_origin_r)
+{
+	mode_t file_mode;
+
+	if (list->dir_create_mode != (mode_t)-1) {
 		*mode_r = list->dir_create_mode;
 		*gid_r = list->file_create_gid;
 		*gid_origin_r = list->file_create_gid_origin;
-		return;
+	} else {
+		mailbox_list_get_permissions_full(list, NULL, &file_mode,
+						  mode_r, gid_r, gid_origin_r);
 	}
-
-	mailbox_list_get_permissions_full(list, name, &file_mode,
-					  mode_r, gid_r, gid_origin_r);
 }
 
 static int
@@ -591,7 +613,7 @@
 	mode_t mode;
 	gid_t gid;
 
-	mailbox_list_get_dir_permissions(list, NULL, &mode, &gid, &origin);
+	mailbox_list_get_root_dir_permissions(list, &mode, &gid, &origin);
 
 	/* get the directory path up to last %variable. for example
 	   unexpanded path may be "/var/mail/%d/%2n/%n/Maildir", and we want
@@ -1112,7 +1134,7 @@
 	path = t_strconcat(path, "/"MAILBOX_LOG_FILE_NAME, NULL);
 	list->changelog = mailbox_log_alloc(path);
 
-	mailbox_list_get_permissions(list, NULL, &mode, &gid, &gid_origin);
+	mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin);
 	mailbox_log_set_permissions(list->changelog, mode, gid, gid_origin);
 	return TRUE;
 }
--- a/src/lib-storage/mailbox-list.h	Mon Dec 06 02:16:22 2010 +0000
+++ b/src/lib-storage/mailbox-list.h	Mon Dec 06 03:08:31 2010 +0000
@@ -173,18 +173,24 @@
 				      struct mail_storage **storage);
 
 /* Returns the mode and GID that should be used when creating new files to
-   the specified mailbox, or to mailbox list root if name is NULL. (gid_t)-1 is
+   the specified mailbox or to mailbox list root. (gid_t)-1 is
    returned if it's not necessary to change the default gid. */
 void mailbox_list_get_permissions(struct mailbox_list *list,
 				  const char *name,
 				  mode_t *mode_r, gid_t *gid_r,
 				  const char **gid_origin_r);
+void mailbox_list_get_root_permissions(struct mailbox_list *list,
+				       mode_t *mode_r, gid_t *gid_r,
+				       const char **gid_origin_r);
 /* Like mailbox_list_get_permissions(), but add execute-bits for mode
    if either read or write bit is set (e.g. 0640 -> 0750). */
 void mailbox_list_get_dir_permissions(struct mailbox_list *list,
 				      const char *name,
 				      mode_t *mode_r, gid_t *gid_r,
 				      const char **gid_origin_r);
+void mailbox_list_get_root_dir_permissions(struct mailbox_list *list,
+					   mode_t *mode_r, gid_t *gid_r,
+					   const char **gid_origin_r);
 /* Create path's parent directory with proper permissions. Since most
    directories are created lazily, this function can be used to easily create
    them whenever file creation fails with ENOENT. */
--- a/src/lib-storage/mailbox-uidvalidity.c	Mon Dec 06 02:16:22 2010 +0000
+++ b/src/lib-storage/mailbox-uidvalidity.c	Mon Dec 06 03:08:31 2010 +0000
@@ -41,7 +41,7 @@
 	gid_t gid;
 	const char *gid_origin;
 
-	mailbox_list_get_permissions(list, NULL, &mode, &gid, &gid_origin);
+	mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin);
 
 	old_mask = umask(0666 & ~mode);
 	fd = open(path, O_RDWR | O_CREAT, 0666);
--- a/src/plugins/acl/acl-backend-vfile-acllist.c	Mon Dec 06 02:16:22 2010 +0000
+++ b/src/plugins/acl/acl-backend-vfile-acllist.c	Mon Dec 06 03:08:31 2010 +0000
@@ -228,7 +228,7 @@
 	/* Build it into a temporary file and rename() over. There's no need
 	   to use locking, because even if multiple processes are rebuilding
 	   the file at the same time the result should be the same. */
-	mailbox_list_get_permissions(list, NULL, &mode, &gid, &origin);
+	mailbox_list_get_root_permissions(list, &mode, &gid, &origin);
 	fd = safe_mkstemp_group(path, mode, gid, origin);
 	if (fd == -1 && errno == ENOENT) {
 		if (mailbox_list_create_parent_dir(backend->backend.list, NULL,
--- a/src/plugins/lazy-expunge/lazy-expunge-plugin.c	Mon Dec 06 02:16:22 2010 +0000
+++ b/src/plugins/lazy-expunge/lazy-expunge-plugin.c	Mon Dec 06 03:08:31 2010 +0000
@@ -242,7 +242,7 @@
 	int ret;
 
 	/* make sure the destination root directory exists */
-	mailbox_list_get_dir_permissions(dest_list, NULL, &mode, &gid, &origin);
+	mailbox_list_get_root_dir_permissions(dest_list, &mode, &gid, &origin);
 	dir = mailbox_list_get_path(dest_list, NULL, MAILBOX_LIST_PATH_TYPE_DIR);
 	if (mkdir_parents_chgrp(dir, mode, gid, origin) < 0 &&
 	    errno != EEXIST) {
--- a/src/plugins/quota/quota-maildir.c	Mon Dec 06 02:16:22 2010 +0000
+++ b/src/plugins/quota/quota-maildir.c	Mon Dec 06 03:08:31 2010 +0000
@@ -236,16 +236,15 @@
 	namespaces = array_get(&root->root.quota->namespaces, &count);
 	i_assert(count > 0);
 	for (i = 0; i < count; i++) {
-		if ((namespaces[i]->flags & NAMESPACE_FLAG_INBOX_USER) != 0) {
-			mailbox_list_get_permissions(namespaces[i]->list,
-						     NULL, &mode, &gid,
-						     &gid_origin);
-			mailbox_list_get_dir_permissions(namespaces[i]->list,
-							 NULL,
-							 &dir_mode, &dir_gid,
-							 &dir_gid_origin);
-			break;
-		}
+		if ((namespaces[i]->flags & NAMESPACE_FLAG_INBOX_USER) == 0)
+			continue;
+
+		mailbox_list_get_root_permissions(namespaces[i]->list,
+						  &mode, &gid, &gid_origin);
+		mailbox_list_get_root_dir_permissions(namespaces[i]->list,
+						      &dir_mode, &dir_gid,
+						      &dir_gid_origin);
+		break;
 	}
 
 	dotlock_settings.use_excl_lock = set->dotlock_use_excl;