dovecot-1.2: Create all mail/index files'/dirs' permissions base...

dovecot at dovecot.org dovecot at dovecot.org
Sun Feb 22 00:46:49 EET 2009


details:   http://hg.dovecot.org/dovecot-1.2/rev/e82e0a6b9399
changeset: 8767:e82e0a6b9399
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Feb 21 17:46:35 2009 -0500
description:
Create all mail/index files'/dirs' permissions based on the mailbox directory.

diffstat:

12 files changed, 47 insertions(+), 33 deletions(-)
src/lib-storage/index/cydir/cydir-storage.c     |    2 -
src/lib-storage/index/dbox/dbox-storage.c       |    2 -
src/lib-storage/index/index-storage.c           |   31 ++++++++++++++---------
src/lib-storage/index/maildir/maildir-storage.c |    8 +++--
src/lib-storage/index/mbox/mbox-storage.c       |    3 +-
src/lib-storage/list/mailbox-list-fs.c          |    2 -
src/lib-storage/list/subscription-file.c        |    4 +-
src/lib-storage/mailbox-list.c                  |   11 ++++----
src/lib-storage/mailbox-list.h                  |    9 +++---
src/plugins/acl/acl-backend-vfile-acllist.c     |    2 -
src/plugins/acl/acl-backend-vfile.c             |    3 +-
src/plugins/quota/quota-maildir.c               |    3 +-

diffs (250 lines):

diff -r 888f57b1bf9c -r e82e0a6b9399 src/lib-storage/index/cydir/cydir-storage.c
--- a/src/lib-storage/index/cydir/cydir-storage.c	Sat Feb 21 17:10:43 2009 -0500
+++ b/src/lib-storage/index/cydir/cydir-storage.c	Sat Feb 21 17:46:35 2009 -0500
@@ -135,7 +135,7 @@ static int create_cydir(struct mail_stor
 	mode_t mode;
 	gid_t gid;
 
-	mailbox_list_get_dir_permissions(storage->list, &mode, &gid);
+	mailbox_list_get_dir_permissions(storage->list, NULL, &mode, &gid);
 	if (mkdir_parents_chown(path, mode, (uid_t)-1, gid) < 0 &&
 	    errno != EEXIST) {
 		if (!mail_storage_set_error_from_errno(storage)) {
diff -r 888f57b1bf9c -r e82e0a6b9399 src/lib-storage/index/dbox/dbox-storage.c
--- a/src/lib-storage/index/dbox/dbox-storage.c	Sat Feb 21 17:10:43 2009 -0500
+++ b/src/lib-storage/index/dbox/dbox-storage.c	Sat Feb 21 17:46:35 2009 -0500
@@ -155,7 +155,7 @@ static int create_dbox(struct mail_stora
 	mode_t mode;
 	gid_t gid;
 
-	mailbox_list_get_dir_permissions(storage->list, &mode, &gid);
+	mailbox_list_get_dir_permissions(storage->list, NULL, &mode, &gid);
 	if (mkdir_parents_chown(path, mode, (uid_t)-1, gid) < 0 &&
 	    errno != EEXIST) {
 		if (!mail_storage_set_error_from_errno(storage)) {
diff -r 888f57b1bf9c -r e82e0a6b9399 src/lib-storage/index/index-storage.c
--- a/src/lib-storage/index/index-storage.c	Sat Feb 21 17:10:43 2009 -0500
+++ b/src/lib-storage/index/index-storage.c	Sat Feb 21 17:46:35 2009 -0500
@@ -447,21 +447,28 @@ void index_storage_mailbox_init(struct i
 				bool move_to_memory)
 {
 	struct mail_storage *storage = ibox->storage;
+	struct mailbox *box = &ibox->box;
+	gid_t dir_gid;
 
 	i_assert(name != NULL);
 
-	ibox->box.storage = storage;
-	ibox->box.name = p_strdup(ibox->box.pool, name);
-	ibox->box.open_flags = flags;
-	if (ibox->box.file_create_mode == 0) {
-		ibox->box.file_create_mode = 0600;
-		ibox->box.dir_create_mode = 0700;
-		ibox->box.file_create_gid = (gid_t)-1;
-	}
-
-	p_array_init(&ibox->box.search_results, ibox->box.pool, 16);
-	array_create(&ibox->box.module_contexts,
-		     ibox->box.pool, sizeof(void *), 5);
+	box->storage = storage;
+	box->name = p_strdup(box->pool, name);
+	box->open_flags = flags;
+	if (box->file_create_mode == 0) {
+		mailbox_list_get_permissions(box->storage->list, name,
+					     &box->file_create_mode,
+					     &box->file_create_gid);
+		mailbox_list_get_dir_permissions(box->storage->list, name,
+						 &box->dir_create_mode,
+						 &dir_gid);
+		mail_index_set_permissions(ibox->index, box->file_create_mode,
+					   box->file_create_gid);
+	}
+
+	p_array_init(&box->search_results, box->pool, 16);
+	array_create(&box->module_contexts,
+		     box->pool, sizeof(void *), 5);
 
 	ibox->keep_recent = (flags & MAILBOX_OPEN_KEEP_RECENT) != 0;
 	ibox->keep_locked = (flags & MAILBOX_OPEN_KEEP_LOCKED) != 0;
diff -r 888f57b1bf9c -r e82e0a6b9399 src/lib-storage/index/maildir/maildir-storage.c
--- a/src/lib-storage/index/maildir/maildir-storage.c	Sat Feb 21 17:10:43 2009 -0500
+++ b/src/lib-storage/index/maildir/maildir-storage.c	Sat Feb 21 17:46:35 2009 -0500
@@ -501,7 +501,8 @@ maildir_mailbox_open(struct mail_storage
 	if (strcmp(name, "INBOX") == 0 &&
 	    (_storage->ns->flags & NAMESPACE_FLAG_INBOX) != 0) {
 		/* INBOX always exists */
-		mailbox_list_get_dir_permissions(_storage->list, &mode, &gid);
+		mailbox_list_get_dir_permissions(_storage->list, NULL,
+						 &mode, &gid);
 		if (create_maildir(_storage, path, mode, gid, TRUE) < 0)
 			return NULL;
 		return maildir_open(storage, "INBOX", flags);
@@ -520,7 +521,8 @@ maildir_mailbox_open(struct mail_storage
 	/* tmp/ directory doesn't exist. does the maildir? */
 	if (stat(path, &st) == 0) {
 		/* yes, we'll need to create the missing dirs */
-		mailbox_list_get_dir_permissions(_storage->list, &mode, &gid);
+		mailbox_list_get_dir_permissions(_storage->list, name,
+						 &mode, &gid);
 		if (create_maildir(_storage, path, mode, gid, TRUE) < 0)
 			return NULL;
 
@@ -591,7 +593,7 @@ static int maildir_mailbox_create(struct
 					  st.st_mode & 0666, st.st_gid) < 0)
 			return -1;
 	} else {
-		mailbox_list_get_dir_permissions(_storage->list,
+		mailbox_list_get_dir_permissions(_storage->list, NULL,
 						 &st.st_mode, &st.st_gid);
 		if (create_maildir(_storage, path, st.st_mode, st.st_gid,
 				   FALSE) < 0)
diff -r 888f57b1bf9c -r e82e0a6b9399 src/lib-storage/index/mbox/mbox-storage.c
--- a/src/lib-storage/index/mbox/mbox-storage.c	Sat Feb 21 17:10:43 2009 -0500
+++ b/src/lib-storage/index/mbox/mbox-storage.c	Sat Feb 21 17:46:35 2009 -0500
@@ -733,7 +733,8 @@ static int mbox_mailbox_create(struct ma
 	p = directory ? path + strlen(path) : strrchr(path, '/');
 	if (p != NULL) {
 		p = t_strdup_until(path, p);
-		mailbox_list_get_dir_permissions(_storage->list, &mode, &gid);
+		mailbox_list_get_dir_permissions(_storage->list, NULL,
+						 &mode, &gid);
 		if (mkdir_parents_chown(p, mode, (uid_t)-1, gid) < 0 &&
 		    errno != EEXIST) {
 			if (!mail_storage_set_error_from_errno(_storage)) {
diff -r 888f57b1bf9c -r e82e0a6b9399 src/lib-storage/list/mailbox-list-fs.c
--- a/src/lib-storage/list/mailbox-list-fs.c	Sat Feb 21 17:10:43 2009 -0500
+++ b/src/lib-storage/list/mailbox-list-fs.c	Sat Feb 21 17:46:35 2009 -0500
@@ -287,7 +287,7 @@ static int fs_list_rename_mailbox(struct
 	/* create the hierarchy */
 	p = strrchr(newpath, '/');
 	if (p != NULL) {
-		mailbox_list_get_dir_permissions(list, &mode, &gid);
+		mailbox_list_get_dir_permissions(list, NULL, &mode, &gid);
 		p = t_strdup_until(newpath, p);
 		if (mkdir_parents_chown(p, mode, (uid_t)-1, gid) < 0 &&
 		    errno != EEXIST) {
diff -r 888f57b1bf9c -r e82e0a6b9399 src/lib-storage/list/subscription-file.c
--- a/src/lib-storage/list/subscription-file.c	Sat Feb 21 17:10:43 2009 -0500
+++ b/src/lib-storage/list/subscription-file.c	Sat Feb 21 17:46:35 2009 -0500
@@ -111,8 +111,8 @@ int subsfile_set_subscribed(struct mailb
 	dotlock_set.timeout = SUBSCRIPTION_FILE_LOCK_TIMEOUT;
 	dotlock_set.stale_timeout = SUBSCRIPTION_FILE_CHANGE_TIMEOUT;
 
-	mailbox_list_get_permissions(list, &mode, &gid);
-	mailbox_list_get_dir_permissions(list, &dir_mode, &gid);
+	mailbox_list_get_permissions(list, NULL, &mode, &gid);
+	mailbox_list_get_dir_permissions(list, NULL, &dir_mode, &gid);
 	fd_out = file_dotlock_open_mode(&dotlock_set, path, 0,
 					mode, (uid_t)-1, gid, &dotlock);
 	if (fd_out == -1 && errno == ENOENT) {
diff -r 888f57b1bf9c -r e82e0a6b9399 src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c	Sat Feb 21 17:10:43 2009 -0500
+++ b/src/lib-storage/mailbox-list.c	Sat Feb 21 17:46:35 2009 -0500
@@ -261,19 +261,19 @@ mailbox_list_get_namespace(const struct 
 	return list->ns;
 }
 
-void mailbox_list_get_permissions(struct mailbox_list *list,
+void mailbox_list_get_permissions(struct mailbox_list *list, const char *name,
 				  mode_t *mode_r, gid_t *gid_r)
 {
 	const char *path;
 	struct stat st;
 
-	if (list->file_create_mode != (mode_t)-1) {
+	if (list->file_create_mode != (mode_t)-1 && name == NULL) {
 		*mode_r = list->file_create_mode;
 		*gid_r = list->file_create_gid;
 		return;
 	}
 
-	path = mailbox_list_get_path(list, NULL, MAILBOX_LIST_PATH_TYPE_DIR);
+	path = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_DIR);
 	if (stat(path, &st) < 0) {
 		if (!ENOTFOUND(errno)) {
 			mailbox_list_set_critical(list, "stat(%s) failed: %m",
@@ -303,7 +303,7 @@ void mailbox_list_get_permissions(struct
 		list->file_create_gid = st.st_gid;
 	}
 
-	if ((list->flags & MAILBOX_LIST_FLAG_DEBUG) != 0) {
+	if ((list->flags & MAILBOX_LIST_FLAG_DEBUG) != 0 && name == NULL) {
 		i_info("Namespace %s: Using permissions from %s: "
 		       "mode=0%o gid=%ld", list->ns->prefix, path,
 		       (int)list->file_create_mode,
@@ -316,11 +316,12 @@ void mailbox_list_get_permissions(struct
 }
 
 void mailbox_list_get_dir_permissions(struct mailbox_list *list,
+				      const char *name,
 				      mode_t *mode_r, gid_t *gid_r)
 {
 	mode_t mode;
 
-	mailbox_list_get_permissions(list, &mode, gid_r);
+	mailbox_list_get_permissions(list, name, &mode, gid_r);
 
 	/* add the execute bit if either read or write bit is set */
 	if ((mode & 0600) != 0) mode |= 0100;
diff -r 888f57b1bf9c -r e82e0a6b9399 src/lib-storage/mailbox-list.h
--- a/src/lib-storage/mailbox-list.h	Sat Feb 21 17:10:43 2009 -0500
+++ b/src/lib-storage/mailbox-list.h	Sat Feb 21 17:46:35 2009 -0500
@@ -142,14 +142,15 @@ struct mail_namespace *
 struct mail_namespace *
 mailbox_list_get_namespace(const struct mailbox_list *list) ATTR_PURE;
 
-/* Returns the mode and GID that should be used when creating new global files
-   to the mailbox list root directories. (gid_t)-1 is returned if it's not
-   necessary to change the default */
-void mailbox_list_get_permissions(struct mailbox_list *list,
+/* 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
+   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);
 /* 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);
 
 /* Returns TRUE if the name doesn't contain any invalid characters.
diff -r 888f57b1bf9c -r e82e0a6b9399 src/plugins/acl/acl-backend-vfile-acllist.c
--- a/src/plugins/acl/acl-backend-vfile-acllist.c	Sat Feb 21 17:10:43 2009 -0500
+++ b/src/plugins/acl/acl-backend-vfile-acllist.c	Sat Feb 21 17:46:35 2009 -0500
@@ -187,7 +187,7 @@ int acl_backend_vfile_acllist_rebuild(st
 	/* 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, &mode, &gid);
+	mailbox_list_get_permissions(list, NULL, &mode, &gid);
 	fd = safe_mkstemp(path, mode, (uid_t)-1, gid);
 	if (fd == -1) {
 		if (errno == EACCES) {
diff -r 888f57b1bf9c -r e82e0a6b9399 src/plugins/acl/acl-backend-vfile.c
--- a/src/plugins/acl/acl-backend-vfile.c	Sat Feb 21 17:10:43 2009 -0500
+++ b/src/plugins/acl/acl-backend-vfile.c	Sat Feb 21 17:46:35 2009 -0500
@@ -846,7 +846,8 @@ static int acl_backend_vfile_update_begi
 	int fd;
 
 	/* first lock the ACL file */
-	mailbox_list_get_permissions(_aclobj->backend->list, &mode, &gid);
+	mailbox_list_get_permissions(_aclobj->backend->list, _aclobj->name,
+				     &mode, &gid);
 	fd = file_dotlock_open_mode(&dotlock_set, aclobj->local_path, 0,
 				    mode, (uid_t)-1, gid, dotlock_r);
 	if (fd == -1) {
diff -r 888f57b1bf9c -r e82e0a6b9399 src/plugins/quota/quota-maildir.c
--- a/src/plugins/quota/quota-maildir.c	Sat Feb 21 17:10:43 2009 -0500
+++ b/src/plugins/quota/quota-maildir.c	Sat Feb 21 17:46:35 2009 -0500
@@ -238,8 +238,9 @@ static int maildirsize_write(struct mail
 	for (i = 0; i < count; i++) {
 		if ((storages[i]->ns->flags & NAMESPACE_FLAG_INBOX) != 0) {
 			mailbox_list_get_permissions(storages[i]->ns->list,
-						     &mode, &gid);
+						     NULL, &mode, &gid);
 			mailbox_list_get_dir_permissions(storages[i]->ns->list,
+							 NULL,
 							 &dir_mode, &dir_gid);
 			break;
 		}


More information about the dovecot-cvs mailing list