Mercurial > dovecot > core-2.2
changeset 12651:238bafcca676
lib-storage: When creating a new mailbox, get permissions from its parent mailbox, not root.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 12 Feb 2011 00:02:02 +0200 |
parents | 0cadba9597cb |
children | 31b633336ab5 |
files | src/lib-storage/list/mailbox-list-fs.c src/lib-storage/list/mailbox-list-maildir.c src/lib-storage/mailbox-list.c |
diffstat | 3 files changed, 20 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/list/mailbox-list-fs.c Wed Feb 09 02:26:44 2011 +0200 +++ b/src/lib-storage/list/mailbox-list-fs.c Sat Feb 12 00:02:02 2011 +0200 @@ -285,8 +285,8 @@ path = t_strdup_until(path, p); } - mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, - &gid, &gid_origin); + mailbox_list_get_permissions(list, name, &file_mode, &dir_mode, + &gid, &gid_origin); if (mkdir_parents_chgrp(path, dir_mode, gid, gid_origin) == 0) return 0; else if (errno == EEXIST) {
--- a/src/lib-storage/list/mailbox-list-maildir.c Wed Feb 09 02:26:44 2011 +0200 +++ b/src/lib-storage/list/mailbox-list-maildir.c Sat Feb 12 00:02:02 2011 +0200 @@ -263,18 +263,15 @@ static int maildir_list_create_maildirfolder_file(struct mailbox_list *list, - const char *dir) + const char *dir, mode_t file_mode, + gid_t gid, const char *gid_origin) { - const char *path, *gid_origin; - mode_t file_mode, dir_mode, old_mask; - gid_t gid; + const char *path; + mode_t old_mask; int fd; /* Maildir++ spec wants that maildirfolder named file is created for all subfolders. */ - mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, - &gid, &gid_origin); - path = t_strconcat(dir, "/" MAILDIR_SUBFOLDER_FILENAME, NULL); old_mask = umask(0); fd = open(path, O_CREAT | O_WRONLY, file_mode); @@ -336,8 +333,8 @@ root_dir = mailbox_list_get_path(list, NULL, MAILBOX_LIST_PATH_TYPE_MAILBOX); - mailbox_list_get_root_permissions(list, &file_mode, &dir_mode, - &gid, &gid_origin); + mailbox_list_get_permissions(list, name, &file_mode, &dir_mode, + &gid, &gid_origin); if (mkdir_parents_chgrp(path, dir_mode, gid, gid_origin) == 0) { /* ok */ } else if (errno == EEXIST) { @@ -361,7 +358,8 @@ return -1; } return create_parent_dir || strcmp(path, root_dir) == 0 ? 0 : - maildir_list_create_maildirfolder_file(list, path); + maildir_list_create_maildirfolder_file(list, path, file_mode, + gid, gid_origin); } static const char *
--- a/src/lib-storage/mailbox-list.c Wed Feb 09 02:26:44 2011 +0200 +++ b/src/lib-storage/mailbox-list.c Sat Feb 12 00:02:02 2011 +0200 @@ -526,7 +526,7 @@ mode_t *file_mode_r, mode_t *dir_mode_r, gid_t *gid_r, const char **gid_origin_r) { - const char *path; + const char *path, *parent_name, *p; struct stat st; /* use safe defaults */ @@ -547,8 +547,15 @@ list->ns->prefix, path); } if (name != NULL) { - /* return defaults */ - mailbox_list_get_permissions(list, NULL, + /* return parent mailbox */ + p = strrchr(name, mailbox_list_get_hierarchy_sep(list)); + if (p == NULL) { + /* return root defaults */ + parent_name = NULL; + } else { + parent_name = t_strdup_until(name, p); + } + mailbox_list_get_permissions(list, parent_name, file_mode_r, dir_mode_r, gid_r, gid_origin_r); return;