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