dovecot-2.2: lib-storage: mailbox_list_get_root_permissions() no...

dovecot at dovecot.org dovecot at dovecot.org
Wed Sep 26 01:47:47 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/d0ca4c69ec76
changeset: 15115:d0ca4c69ec76
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Sep 26 01:38:59 2012 +0300
description:
lib-storage: mailbox_list_get_root_permissions() now returns struct mailbox_permissions.

diffstat:

 src/lib-storage/index/dbox-multi/mdbox-file.c        |  14 +-
 src/lib-storage/index/dbox-multi/mdbox-map-private.h |   4 +-
 src/lib-storage/index/dbox-multi/mdbox-map.c         |  11 +-
 src/lib-storage/list/mailbox-list-fs.c               |  11 +-
 src/lib-storage/list/subscription-file.c             |  18 ++--
 src/lib-storage/mailbox-list-private.h               |   7 +-
 src/lib-storage/mailbox-list.c                       |  78 +++++++------------
 src/lib-storage/mailbox-list.h                       |   3 +-
 src/lib-storage/mailbox-uidvalidity.c                |  18 ++--
 src/plugins/acl/acl-backend-vfile-acllist.c          |  16 ++-
 src/plugins/quota/quota-maildir.c                    |  25 +++--
 11 files changed, 94 insertions(+), 111 deletions(-)

diffs (truncated from 488 to 300 lines):

diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/index/dbox-multi/mdbox-file.c
--- a/src/lib-storage/index/dbox-multi/mdbox-file.c	Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-file.c	Wed Sep 26 01:38:59 2012 +0300
@@ -306,7 +306,7 @@
 	const char *p, *dir, *error;
 	int fd;
 
-	old_mask = umask(0666 & ~map->create_mode);
+	old_mask = umask(0666 & ~map->perm.file_create_mode);
 	fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
 	umask(old_mask);
 	if (fd == -1 && errno == ENOENT && parents &&
@@ -322,25 +322,25 @@
 			return -1;
 		}
 		/* try again */
-		old_mask = umask(0666 & ~map->create_mode);
+		old_mask = umask(0666 & ~map->perm.file_create_mode);
 		fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
 		umask(old_mask);
 	}
 	if (fd == -1) {
 		mail_storage_set_critical(&file->storage->storage,
 			"open(%s, O_CREAT) failed: %m", path);
-	} else if (map->create_gid == (gid_t)-1) {
+	} else if (map->perm.file_create_gid == (gid_t)-1) {
 		/* no group change */
-	} else if (fchown(fd, (uid_t)-1, map->create_gid) < 0) {
+	} else if (fchown(fd, (uid_t)-1, map->perm.file_create_gid) < 0) {
 		if (errno == EPERM) {
 			mail_storage_set_critical(&file->storage->storage, "%s",
 				eperm_error_get_chgrp("fchown", path,
-						      map->create_gid,
-						      map->create_gid_origin));
+					map->perm.file_create_gid,
+					map->perm.file_create_gid_origin));
 		} else {
 			mail_storage_set_critical(&file->storage->storage,
 				"fchown(%s, -1, %ld) failed: %m",
-				path, (long)map->create_gid);
+				path, (long)map->perm.file_create_gid);
 		}
 		/* continue anyway */
 	}
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/index/dbox-multi/mdbox-map-private.h
--- a/src/lib-storage/index/dbox-multi/mdbox-map-private.h	Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-map-private.h	Wed Sep 26 01:38:59 2012 +0300
@@ -20,9 +20,7 @@
 	uint32_t map_ext_id, ref_ext_id;
 
 	struct mailbox_list *root_list;
-	mode_t create_mode;
-	gid_t create_gid;
-	const char *create_gid_origin;
+	struct mailbox_permissions perm;
 
 	unsigned int verify_existing_file_ids:1;
 };
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/index/dbox-multi/mdbox-map.c
--- a/src/lib-storage/index/dbox-multi/mdbox-map.c	Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-map.c	Wed Sep 26 01:38:59 2012 +0300
@@ -50,7 +50,6 @@
 {
 	struct mdbox_map *map;
 	const char *root, *index_root;
-	mode_t dir_mode;
 
 	root = mailbox_list_get_root_path(root_list, MAILBOX_LIST_PATH_TYPE_DIR);
 	index_root = mailbox_list_get_root_path(root_list, MAILBOX_LIST_PATH_TYPE_INDEX);
@@ -76,12 +75,10 @@
 	map->ref_ext_id = mail_index_ext_register(map->index, "ref", 0,
 				sizeof(uint16_t), sizeof(uint16_t));
 
-	mailbox_list_get_root_permissions(root_list,
-					  &map->create_mode, &dir_mode,
-					  &map->create_gid,
-					  &map->create_gid_origin);
-	mail_index_set_permissions(map->index, map->create_mode,
-				   map->create_gid, map->create_gid_origin);
+	mailbox_list_get_root_permissions(root_list, &map->perm);
+	mail_index_set_permissions(map->index, map->perm.file_create_mode,
+				   map->perm.file_create_gid,
+				   map->perm.file_create_gid_origin);
 	return map;
 }
 
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/list/mailbox-list-fs.c
--- a/src/lib-storage/list/mailbox-list-fs.c	Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/list/mailbox-list-fs.c	Wed Sep 26 01:38:59 2012 +0300
@@ -293,13 +293,12 @@
 
 	if (strcmp(oldparent, newparent) != 0 && stat(oldpath, &st) == 0) {
 		/* make sure the newparent exists */
-		mode_t file_mode, dir_mode;
-		gid_t gid;
-		const char *origin;
+		struct mailbox_permissions perm;
 
-		mailbox_list_get_root_permissions(newlist, &file_mode,
-						  &dir_mode, &gid, &origin);
-		if (mkdir_parents_chgrp(newparent, dir_mode, gid, origin) < 0 &&
+		mailbox_list_get_root_permissions(newlist, &perm);
+		if (mkdir_parents_chgrp(newparent, perm.dir_create_mode,
+					perm.file_create_gid,
+					perm.file_create_gid_origin) < 0 &&
 		    errno != EEXIST) {
 			if (mailbox_list_set_error_from_errno(oldlist))
 				return -1;
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/list/subscription-file.c
--- a/src/lib-storage/list/subscription-file.c	Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/list/subscription-file.c	Wed Sep 26 01:38:59 2012 +0300
@@ -88,12 +88,11 @@
 	const struct mail_storage_settings *mail_set = list->mail_set;
 	struct dotlock_settings dotlock_set;
 	struct dotlock *dotlock;
-	const char *line, *origin;
+	struct mailbox_permissions perm;
+	const char *line;
 	struct istream *input;
 	struct ostream *output;
 	int fd_in, fd_out;
-	mode_t file_mode, dir_mode;
-	gid_t gid;
 	bool found, changed = FALSE, failed = FALSE;
 
 	if (strcasecmp(name, "INBOX") == 0)
@@ -106,17 +105,20 @@
 	dotlock_set.timeout = SUBSCRIPTION_FILE_LOCK_TIMEOUT;
 	dotlock_set.stale_timeout = SUBSCRIPTION_FILE_CHANGE_TIMEOUT;
 
-	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
-					  &gid, &origin);
+	mailbox_list_get_root_permissions(list, &perm);
 	fd_out = file_dotlock_open_group(&dotlock_set, path, 0,
-					 file_mode, gid, origin, &dotlock);
+					 perm.file_create_mode,
+					 perm.file_create_gid,
+					 perm.file_create_gid_origin, &dotlock);
 	if (fd_out == -1 && errno == ENOENT) {
 		/* directory hasn't been created yet. */
 		if (mailbox_list_mkdir_parent(list, NULL, path) < 0)
 			return -1;
 		fd_out = file_dotlock_open_group(&dotlock_set, path, 0,
-						 file_mode, gid,
-						 origin, &dotlock);
+						 perm.file_create_mode,
+						 perm.file_create_gid,
+						 perm.file_create_gid_origin,
+						 &dotlock);
 	}
 	if (fd_out == -1) {
 		if (errno == EAGAIN) {
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/mailbox-list-private.h
--- a/src/lib-storage/mailbox-list-private.h	Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/mailbox-list-private.h	Wed Sep 26 01:38:59 2012 +0300
@@ -105,11 +105,8 @@
 	const struct mail_storage_settings *mail_set;
 	enum mailbox_list_flags flags;
 
-	/* -1 if not set yet. use mailbox_list_get_permissions() to set them */
-	mode_t file_create_mode, dir_create_mode;
-	gid_t file_create_gid;
-	/* origin (e.g. path) where the file_create_gid was got from */
-	const char *file_create_gid_origin;
+	/* may not be set yet, use mailbox_list_get_permissions() to access */
+	struct mailbox_permissions root_permissions;
 
 	struct mailbox_tree_context *subscriptions;
 	time_t subscriptions_mtime, subscriptions_read_time;
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c	Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/mailbox-list.c	Wed Sep 26 01:38:59 2012 +0300
@@ -138,9 +138,9 @@
 	list->ns = ns;
 	list->mail_set = ns->mail_set;
 	list->flags = flags;
-	list->file_create_mode = (mode_t)-1;
-	list->dir_create_mode = (mode_t)-1;
-	list->file_create_gid = (gid_t)-1;
+	list->root_permissions.file_create_mode = (mode_t)-1;
+	list->root_permissions.dir_create_mode = (mode_t)-1;
+	list->root_permissions.file_create_gid = (gid_t)-1;
 	list->changelog_timestamp = (time_t)-1;
 
 	/* copy settings */
@@ -741,10 +741,8 @@
 	}
 
 	if (name == NULL) {
-		list->file_create_mode = permissions_r->file_create_mode;
-		list->dir_create_mode = permissions_r->dir_create_mode;
-		list->file_create_gid = permissions_r->file_create_gid;
-		list->file_create_gid_origin =
+		list->root_permissions = *permissions_r;
+		list->root_permissions.file_create_gid_origin =
 			p_strdup(list->pool,
 				 permissions_r->file_create_gid_origin);
 	}
@@ -753,9 +751,9 @@
 		i_debug("Namespace %s: Using permissions from %s: "
 			"mode=0%o gid=%ld", list->ns->prefix,
 			path != NULL ? path : "",
-			(int)list->dir_create_mode,
-			list->file_create_gid == (gid_t)-1 ? -1L :
-			(long)list->file_create_gid);
+			(int)permissions_r->dir_create_mode,
+			permissions_r->file_create_gid == (gid_t)-1 ? -1L :
+			(long)permissions_r->file_create_gid);
 	}
 }
 
@@ -766,23 +764,13 @@
 }
 
 void mailbox_list_get_root_permissions(struct mailbox_list *list,
-				       mode_t *file_mode_r, mode_t *dir_mode_r,
-				       gid_t *gid_r, const char **gid_origin_r)
+				       struct mailbox_permissions *permissions_r)
 {
-	struct mailbox_permissions perm;
-
-	if (list->file_create_mode != (mode_t)-1) {
-		*file_mode_r = list->file_create_mode;
-		*dir_mode_r = list->dir_create_mode;
-		*gid_r = list->file_create_gid;
-		*gid_origin_r = list->file_create_gid_origin;
-	} else {
-		mailbox_list_get_permissions_internal(list, NULL, &perm);
-
-		*file_mode_r = perm.file_create_mode;
-		*dir_mode_r = perm.dir_create_mode;
-		*gid_r = perm.file_create_gid;
-		*gid_origin_r = perm.file_create_gid_origin;
+	if (list->root_permissions.file_create_mode != (mode_t)-1)
+		*permissions_r = list->root_permissions;
+	else {
+		mailbox_list_get_permissions_internal(list, NULL,
+						      permissions_r);
 	}
 }
 
@@ -853,10 +841,9 @@
 			    enum mailbox_list_path_type type,
 			    const char **error_r)
 {
-	const char *expanded, *unexpanded, *root_dir, *p, *origin, *error;
+	const char *expanded, *unexpanded, *root_dir, *p, *error;
 	struct stat st;
-	mode_t file_mode, dir_mode;
-	gid_t gid;
+	struct mailbox_permissions perm;
 
 	if (stat(path, &st) == 0) {
 		/* looks like it already exists, don't bother checking
@@ -870,8 +857,7 @@
 		return -1;
 	}
 
-	mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
-					  &gid, &origin);
+	mailbox_list_get_root_permissions(list, &perm);
 
 	/* get the directory path up to last %variable. for example
 	   unexpanded path may be "/var/mail/%d/%2n/%n/Maildir", and we want
@@ -906,15 +892,19 @@
 				return -1;
 			}
 		}
-		if (gid == (gid_t)-1 && (dir_mode & S_ISGID) == 0) {
+		if (perm.file_create_gid == (gid_t)-1 &&
+		    (perm.dir_create_mode & S_ISGID) == 0) {
 			/* change the group for user directories */
-			gid = getegid();
+			perm.file_create_gid = getegid();
+			perm.file_create_gid_origin = "egid";
 		}
 	}
 
 	/* the rest of the directories exist only for one user. create them
 	   with default directory permissions */
-	if (mkdir_parents_chgrp(path, dir_mode, gid, origin) < 0 &&
+	if (mkdir_parents_chgrp(path, perm.dir_create_mode,
+				perm.file_create_gid,
+				perm.file_create_gid_origin) < 0 &&
 	    errno != EEXIST) {
 		if (errno == EACCES)
 			*error_r = mail_error_create_eacces_msg("mkdir", path);
@@ -1187,10 +1177,8 @@
 
 static bool mailbox_list_init_changelog(struct mailbox_list *list)
 {
+	struct mailbox_permissions perm;
 	const char *path;
-	mode_t file_mode, dir_mode;
-	gid_t gid;
-	const char *gid_origin;
 
 	if (list->changelog != NULL)
 		return TRUE;
@@ -1204,9 +1192,10 @@


More information about the dovecot-cvs mailing list