Mercurial > dovecot > original-hg > dovecot-1.2
changeset 8767:e82e0a6b9399 HEAD
Create all mail/index files'/dirs' permissions based on the mailbox directory.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 21 Feb 2009 17:46:35 -0500 |
parents | 888f57b1bf9c |
children | 91e880ae387a |
files | src/lib-storage/index/cydir/cydir-storage.c src/lib-storage/index/dbox/dbox-storage.c src/lib-storage/index/index-storage.c src/lib-storage/index/maildir/maildir-storage.c src/lib-storage/index/mbox/mbox-storage.c src/lib-storage/list/mailbox-list-fs.c src/lib-storage/list/subscription-file.c src/lib-storage/mailbox-list.c src/lib-storage/mailbox-list.h src/plugins/acl/acl-backend-vfile-acllist.c src/plugins/acl/acl-backend-vfile.c src/plugins/quota/quota-maildir.c |
diffstat | 12 files changed, 45 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- 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 @@ 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)) {
--- 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 @@ 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)) {
--- 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 @@ 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; + 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(&ibox->box.search_results, ibox->box.pool, 16); - array_create(&ibox->box.module_contexts, - ibox->box.pool, sizeof(void *), 5); + 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;
--- 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 @@ 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 @@ /* 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 @@ 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)
--- 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 @@ 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)) {
--- 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 @@ /* 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) {
--- 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 @@ 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) {
--- 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 @@ 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 @@ 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_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;
--- 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 * 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.
--- 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 @@ /* 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) {
--- 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 @@ 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) {
--- 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 @@ 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; }