changeset 8209:329d8757e5c2 HEAD

Maildir++ quota: Create the missing directory using the correct permissions.
author Timo Sirainen <tss@iki.fi>
date Mon, 22 Sep 2008 21:55:07 +0300
parents f67d4a0d423b
children 1ea7d60cf39a
files src/plugins/quota/quota-maildir.c
diffstat 1 files changed, 13 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/quota/quota-maildir.c	Mon Sep 22 21:51:29 2008 +0300
+++ b/src/plugins/quota/quota-maildir.c	Mon Sep 22 21:55:07 2008 +0300
@@ -224,21 +224,23 @@
 	struct dotlock *dotlock;
 	const char *p, *dir;
 	string_t *str;
-	mode_t mode;
-	gid_t gid;
+	mode_t mode, dir_mode;
+	gid_t gid, dir_gid;
 	int fd;
 
 	i_assert(root->fd == -1);
 
 	/* figure out what permissions we should use for maildirsize.
 	   use the inbox namespace's permissions if possible. */
-	mode = 0600;
-	gid = (gid_t)-1;
+	mode = 0600; dir_mode = 0700;
+	gid = dir_gid = (gid_t)-1;
 	storages = array_get(&root->root.quota->storages, &count);
 	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);
+			mailbox_list_get_dir_permissions(storages[i]->ns->list,
+							 &dir_mode, &dir_gid);
 			break;
 		}
 	}
@@ -252,10 +254,16 @@
 		/* the control directory doesn't exist yet? create it */
 		p = strrchr(path, '/');
 		dir = t_strdup_until(path, p);
-		if (mkdir_parents(dir, 0700) < 0 && errno != EEXIST) {
+		if (mkdir_parents(dir, dir_mode) < 0 && errno != EEXIST) {
 			i_error("mkdir_parents(%s) failed: %m", dir);
 			return -1;
 		}
+		if (dir_gid != (gid_t)-1) {
+			if (chown(dir, (uid_t)-1, dir_gid) < 0) {
+				i_error("chown(%s,-1,%ld) failed: %m",
+					dir, (long)dir_gid);
+			}
+		}
 		fd = file_dotlock_open_mode(&dotlock_settings, path,
 					    DOTLOCK_CREATE_FLAG_NONBLOCK,
 					    mode, (uid_t)-1, gid, &dotlock);