dovecot-2.0: Whenever file's group changing fails, show the grou...

dovecot at dovecot.org dovecot at dovecot.org
Sun Jun 28 03:40:06 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/b373de4973cd
changeset: 9537:b373de4973cd
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Jun 27 20:39:38 2009 -0400
description:
Whenever file's group changing fails, show the group origin in the error message.

diffstat:

36 files changed, 423 insertions(+), 161 deletions(-)
src/lda/main.c                                   |    5 -
src/lib-index/mail-index-private.h               |    1 
src/lib-index/mail-index-strmap.c                |    5 -
src/lib-index/mail-index.c                       |   14 +++-
src/lib-index/mail-index.h                       |    2 
src/lib-storage/index/cydir/cydir-storage.c      |    5 -
src/lib-storage/index/dbox/dbox-file.c           |   16 +++-
src/lib-storage/index/dbox/dbox-map.c            |    5 -
src/lib-storage/index/dbox/dbox-storage.c        |   23 ++++--
src/lib-storage/index/dbox/dbox-storage.h        |    1 
src/lib-storage/index/index-storage.c            |   21 +++---
src/lib-storage/index/maildir/maildir-keywords.c |   19 ++++-
src/lib-storage/index/maildir/maildir-save.c     |   13 +++
src/lib-storage/index/maildir/maildir-storage.c  |   68 +++++++++++++------
src/lib-storage/index/maildir/maildir-uidlist.c  |   10 ++
src/lib-storage/index/maildir/maildir-util.c     |   15 ++--
src/lib-storage/index/mbox/mbox-storage.c        |    7 +-
src/lib-storage/list/mailbox-list-fs.c           |    7 +-
src/lib-storage/list/subscription-file.c         |   16 ++--
src/lib-storage/mail-storage-private.h           |    2 
src/lib-storage/mail-storage.c                   |    6 -
src/lib-storage/mailbox-list-private.h           |    2 
src/lib-storage/mailbox-list.c                   |   25 +++++--
src/lib-storage/mailbox-list.h                   |    9 +-
src/lib/eacces-error.c                           |   30 ++++++++
src/lib/eacces-error.h                           |    5 +
src/lib/file-dotlock.c                           |   64 +++++++++++++-----
src/lib/file-dotlock.h                           |    4 +
src/lib/mkdir-parents.c                          |   76 +++++++++++++++++++---
src/lib/mkdir-parents.h                          |    9 ++
src/lib/safe-mkstemp.c                           |   39 +++++++++--
src/lib/safe-mkstemp.h                           |    4 +
src/plugins/acl/acl-backend-vfile-acllist.c      |    6 -
src/plugins/acl/acl-backend-vfile.c              |   10 +-
src/plugins/lazy-expunge/lazy-expunge-plugin.c   |    8 +-
src/plugins/quota/quota-maildir.c                |   32 ++++-----

diffs (truncated from 1430 to 300 lines):

diff -r 5a413a1beb60 -r b373de4973cd src/lda/main.c
--- a/src/lda/main.c	Sat Jun 27 19:55:44 2009 -0400
+++ b/src/lda/main.c	Sat Jun 27 20:39:38 2009 -0400
@@ -90,6 +90,7 @@ static int deliver_create_dir(struct mai
 static int deliver_create_dir(struct mail_user *user, const char *dir)
 {
 	struct mail_namespace *ns;
+	const char *origin;
 	mode_t mode;
 	gid_t gid;
 
@@ -97,8 +98,8 @@ static int deliver_create_dir(struct mai
 	if (ns == NULL)
 		ns = user->namespaces;
 
-	mailbox_list_get_dir_permissions(ns->list, NULL, &mode, &gid);
-	if (mkdir_parents_chown(dir, mode, (uid_t)-1, gid) == 0) {
+	mailbox_list_get_dir_permissions(ns->list, NULL, &mode, &gid, &origin);
+	if (mkdir_parents_chgrp(dir, mode, gid, origin) == 0) {
 		return 0;
 	} else if (errno == EACCES) {
 		i_error("%s", eacces_error_get_creating("mkdir_parents_chown",
diff -r 5a413a1beb60 -r b373de4973cd src/lib-index/mail-index-private.h
--- a/src/lib-index/mail-index-private.h	Sat Jun 27 19:55:44 2009 -0400
+++ b/src/lib-index/mail-index-private.h	Sat Jun 27 20:39:38 2009 -0400
@@ -174,6 +174,7 @@ struct mail_index {
 	enum mail_index_sync_type fsync_mask;
 	mode_t mode;
 	gid_t gid;
+	char *gid_origin;
 
 	pool_t extension_pool;
 	ARRAY_DEFINE(extensions, struct mail_index_registered_ext);
diff -r 5a413a1beb60 -r b373de4973cd src/lib-index/mail-index-strmap.c
--- a/src/lib-index/mail-index-strmap.c	Sat Jun 27 19:55:44 2009 -0400
+++ b/src/lib-index/mail-index-strmap.c	Sat Jun 27 20:39:38 2009 -0400
@@ -998,8 +998,9 @@ static int mail_index_strmap_recreate(st
 
 	str = t_str_new(256);
 	str_append(str, strmap->path);
-	fd = safe_mkstemp_hostpid(str, view->view->index->mode,
-				  (uid_t)-1, view->view->index->gid);
+	fd = safe_mkstemp_hostpid_group(str, view->view->index->mode,
+					view->view->index->gid,
+					view->view->index->gid_origin);
 	temp_path = str_c(str);
 
 	if (fd == -1) {
diff -r 5a413a1beb60 -r b373de4973cd src/lib-index/mail-index.c
--- a/src/lib-index/mail-index.c	Sat Jun 27 19:55:44 2009 -0400
+++ b/src/lib-index/mail-index.c	Sat Jun 27 20:39:38 2009 -0400
@@ -73,6 +73,7 @@ void mail_index_free(struct mail_index *
 	array_free(&index->keywords);
 	array_free(&index->module_contexts);
 
+	i_free(index->gid_origin);
 	i_free(index->error);
 	i_free(index->dir);
 	i_free(index->prefix);
@@ -86,10 +87,13 @@ void mail_index_set_fsync_types(struct m
 }
 
 void mail_index_set_permissions(struct mail_index *index,
-				mode_t mode, gid_t gid)
+				mode_t mode, gid_t gid, const char *gid_origin)
 {
 	index->mode = mode & 0666;
 	index->gid = gid;
+
+	i_free(index->gid_origin);
+	index->gid_origin = i_strdup(gid_origin);
 }
 
 uint32_t mail_index_ext_register(struct mail_index *index, const char *name,
@@ -662,7 +666,13 @@ void mail_index_fchown(struct mail_index
 		   really matter. ignore silently. */
 		return;
 	}
-	mail_index_file_set_syscall_error(index, path, "fchown()");
+	if (errno != EACCES)
+		mail_index_file_set_syscall_error(index, path, "fchown()");
+	else {
+		mail_index_set_error(index, "%s",
+			eperm_error_get_chgrp("fchown", path, index->gid,
+					      index->gid_origin));
+	}
 
 	/* continue, but change permissions so that only the common
 	   subset of group and world is used. this makes sure no one
diff -r 5a413a1beb60 -r b373de4973cd src/lib-index/mail-index.h
--- a/src/lib-index/mail-index.h	Sat Jun 27 19:55:44 2009 -0400
+++ b/src/lib-index/mail-index.h	Sat Jun 27 20:39:38 2009 -0400
@@ -195,7 +195,7 @@ void mail_index_set_fsync_types(struct m
 void mail_index_set_fsync_types(struct mail_index *index,
 				enum mail_index_sync_type fsync_mask);
 void mail_index_set_permissions(struct mail_index *index,
-				mode_t mode, gid_t gid);
+				mode_t mode, gid_t gid, const char *gid_origin);
 
 /* Open index. Returns 1 if ok, 0 if index doesn't exist and CREATE flags
    wasn't given, -1 if error. */
diff -r 5a413a1beb60 -r b373de4973cd src/lib-storage/index/cydir/cydir-storage.c
--- a/src/lib-storage/index/cydir/cydir-storage.c	Sat Jun 27 19:55:44 2009 -0400
+++ b/src/lib-storage/index/cydir/cydir-storage.c	Sat Jun 27 20:39:38 2009 -0400
@@ -51,11 +51,12 @@ static int create_cydir(struct mail_stor
 static int create_cydir(struct mail_storage *storage, struct mailbox_list *list,
 			const char *path)
 {
+	const char *origin;
 	mode_t mode;
 	gid_t gid;
 
-	mailbox_list_get_dir_permissions(list, NULL, &mode, &gid);
-	if (mkdir_parents_chown(path, mode, (uid_t)-1, gid) < 0 &&
+	mailbox_list_get_dir_permissions(list, NULL, &mode, &gid, &origin);
+	if (mkdir_parents_chgrp(path, mode, gid, origin) < 0 &&
 	    errno != EEXIST) {
 		if (!mail_storage_set_error_from_errno(storage)) {
 			mail_storage_set_critical(storage,
diff -r 5a413a1beb60 -r b373de4973cd src/lib-storage/index/dbox/dbox-file.c
--- a/src/lib-storage/index/dbox/dbox-file.c	Sat Jun 27 19:55:44 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-file.c	Sat Jun 27 20:39:38 2009 -0400
@@ -10,6 +10,7 @@
 #include "file-lock.h"
 #include "mkdir-parents.h"
 #include "fdatasync-path.h"
+#include "eacces-error.h"
 #include "str.h"
 #include "dbox-storage.h"
 #include "dbox-file.h"
@@ -441,13 +442,20 @@ int dbox_create_fd(struct dbox_storage *
 	if (fd == -1) {
 		mail_storage_set_critical(&storage->storage,
 			"open(%s, O_CREAT) failed: %m", path);
-	} else if (storage->create_gid != (gid_t)-1) {
-		if (fchown(fd, (uid_t)-1, storage->create_gid) < 0) {
+	} else if (storage->create_gid == (gid_t)-1) {
+		/* no group change */
+	} else if (fchown(fd, (uid_t)-1, storage->create_gid) < 0) {
+		if (errno == EPERM) {
+			mail_storage_set_critical(&storage->storage, "%s",
+				eperm_error_get_chgrp("fchown", path,
+					storage->create_gid,
+					storage->create_gid_origin));
+		} else {
 			mail_storage_set_critical(&storage->storage,
 				"fchown(%s, -1, %ld) failed: %m",
 				path, (long)storage->create_gid);
-			/* continue anyway */
-		}
+		}
+		/* continue anyway */
 	}
 	return fd;
 }
diff -r 5a413a1beb60 -r b373de4973cd src/lib-storage/index/dbox/dbox-map.c
--- a/src/lib-storage/index/dbox/dbox-map.c	Sat Jun 27 19:55:44 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-map.c	Sat Jun 27 20:39:38 2009 -0400
@@ -69,8 +69,9 @@ void dbox_map_deinit(struct dbox_map **_
 
 static int dbox_map_mkdir_storage(struct dbox_storage *storage)
 {
-	if (mkdir_parents_chown(storage->storage_dir, storage->create_mode,
-				(uid_t)-1, storage->create_gid) < 0 &&
+	if (mkdir_parents_chgrp(storage->storage_dir, storage->create_mode,
+				storage->create_gid,
+				storage->create_gid_origin) < 0 &&
 	    errno != EEXIST) {
 		mail_storage_set_critical(&storage->storage,
 			"mkdir(%s) failed: %m", storage->storage_dir);
diff -r 5a413a1beb60 -r b373de4973cd src/lib-storage/index/dbox/dbox-storage.c
--- a/src/lib-storage/index/dbox/dbox-storage.c	Sat Jun 27 19:55:44 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-storage.c	Sat Jun 27 20:39:38 2009 -0400
@@ -56,7 +56,7 @@ dbox_storage_create(struct mail_storage 
 		    const char **error_r)
 {
 	struct dbox_storage *storage = (struct dbox_storage *)_storage;
-	const char *dir;
+	const char *dir, *origin;
 
 	storage->set = mail_storage_get_driver_settings(_storage);
 	i_assert(storage->set->dbox_max_open_files >= 2);
@@ -80,7 +80,8 @@ dbox_storage_create(struct mail_storage 
 
 	storage->map = dbox_map_init(storage);
 	mailbox_list_get_dir_permissions(ns->list, NULL, &storage->create_mode,
-					 &storage->create_gid);
+					 &storage->create_gid, &origin);
+	storage->create_gid_origin = p_strdup(_storage->pool, origin);
 	return 0;
 }
 
@@ -282,12 +283,13 @@ static int dbox_mailbox_create_indexes(s
 				       const struct mailbox_update *update)
 {
 	struct dbox_mailbox *mbox = (struct dbox_mailbox *)box;
+	const char *origin;
 	mode_t mode;
 	gid_t gid;
 	int ret;
 
-	mailbox_list_get_dir_permissions(box->list, NULL, &mode, &gid);
-	if (mkdir_parents_chown(box->path, mode, (uid_t)-1, gid) == 0) {
+	mailbox_list_get_dir_permissions(box->list, NULL, &mode, &gid, &origin);
+	if (mkdir_parents_chgrp(box->path, mode, gid, origin) == 0) {
 		/* create indexes immediately with the dbox header */
 		if (index_storage_mailbox_open(box) < 0)
 			return -1;
@@ -404,7 +406,7 @@ dbox_mailbox_create(struct mailbox *box,
 dbox_mailbox_create(struct mailbox *box, const struct mailbox_update *update,
 		    bool directory)
 {
-	const char *path, *alt_path;
+	const char *path, *alt_path, *origin;
 	struct stat st;
 
 	path = mailbox_list_get_path(box->list, box->name,
@@ -420,8 +422,9 @@ dbox_mailbox_create(struct mailbox *box,
 		mode_t mode;
 		gid_t gid;
 
-		mailbox_list_get_dir_permissions(box->list, NULL, &mode, &gid);
-		if (mkdir_parents_chown(path, mode, (uid_t)-1, gid) == 0)
+		mailbox_list_get_dir_permissions(box->list, NULL, &mode,
+						 &gid, &origin);
+		if (mkdir_parents_chgrp(path, mode, gid, origin) == 0)
 			return 0;
 		else if (errno == EEXIST) {
 			mail_storage_set_error(box->storage, MAIL_ERROR_EXISTS,
@@ -560,11 +563,13 @@ dbox_list_delete_mailbox(struct mailbox_
 	if (ret < 0 && errno == ENOENT) {
 		/* either source mailbox doesn't exist or trash directory
 		   doesn't exist. try creating the trash and retrying. */
+		const char *origin;
 		mode_t mode;
 		gid_t gid;
 
-		mailbox_list_get_dir_permissions(list, NULL, &mode, &gid);
-		if (mkdir_parents_chown(trash_dir, mode, (uid_t)-1, gid) < 0 &&
+		mailbox_list_get_dir_permissions(list, NULL, &mode,
+						 &gid, &origin);
+		if (mkdir_parents_chgrp(trash_dir, mode, gid, origin) < 0 &&
 		    errno != EEXIST) {
 			mailbox_list_set_critical(list,
 				"mkdir(%s) failed: %m", trash_dir);
diff -r 5a413a1beb60 -r b373de4973cd src/lib-storage/index/dbox/dbox-storage.h
--- a/src/lib-storage/index/dbox/dbox-storage.h	Sat Jun 27 19:55:44 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-storage.h	Sat Jun 27 20:39:38 2009 -0400
@@ -51,6 +51,7 @@ struct dbox_storage {
 	/* mode/gid to use for new dbox storage files */
 	mode_t create_mode;
 	gid_t create_gid;
+	const char *create_gid_origin;
 
 	ARRAY_DEFINE(open_files, struct dbox_file *);
 
diff -r 5a413a1beb60 -r b373de4973cd src/lib-storage/index/index-storage.c
--- a/src/lib-storage/index/index-storage.c	Sat Jun 27 19:55:44 2009 -0400
+++ b/src/lib-storage/index/index-storage.c	Sat Jun 27 20:39:38 2009 -0400
@@ -73,6 +73,7 @@ static int create_missing_index_dir(stru
 static int create_missing_index_dir(struct mailbox *box)
 {
 	const char *root_dir, *index_dir, *p, *parent_dir;
+	const char *origin, *parent_origin;
 	mode_t mode, parent_mode;
 	gid_t gid, parent_gid;
 	int n = 0;
@@ -84,8 +85,9 @@ static int create_missing_index_dir(stru
 	if (strcmp(index_dir, root_dir) == 0 || *index_dir == '\0')
 		return 0;
 
-	mailbox_list_get_dir_permissions(box->list, box->name, &mode, &gid);
-	while (mkdir_chown(index_dir, mode, (uid_t)-1, gid) < 0) {
+	mailbox_list_get_dir_permissions(box->list, box->name, &mode,
+					 &gid, &origin);
+	while (mkdir_chgrp(index_dir, mode, gid, origin) < 0) {
 		if (errno == EEXIST)
 			break;
 
@@ -97,10 +99,11 @@ static int create_missing_index_dir(stru
 		}
 		/* create the parent directory first */
 		mailbox_list_get_dir_permissions(box->list, NULL,
-						 &parent_mode, &parent_gid);
+						 &parent_mode, &parent_gid,
+						 &parent_origin);
 		parent_dir = t_strdup_until(index_dir, p);
-		if (mkdir_parents_chown(parent_dir, parent_mode,
-					(uid_t)-1, parent_gid) < 0 &&
+		if (mkdir_parents_chgrp(parent_dir, parent_mode,
+					parent_gid, parent_origin) < 0 &&
 		    errno != EEXIST) {
 			mail_storage_set_critical(box->storage,
 				"mkdir(%s) failed: %m", parent_dir);
@@ -449,6 +452,7 @@ void index_storage_mailbox_alloc(struct 
 	struct mailbox *box = &ibox->box;
 	const char *path;
 	gid_t dir_gid;
+	const char *origin, *dir_origin;
 


More information about the dovecot-cvs mailing list