]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Create all mail/index files'/dirs' permissions based on the mailbox directory.
authorTimo Sirainen <tss@iki.fi>
Sat, 21 Feb 2009 22:46:35 +0000 (17:46 -0500)
committerTimo Sirainen <tss@iki.fi>
Sat, 21 Feb 2009 22:46:35 +0000 (17:46 -0500)
--HG--
branch : HEAD

12 files changed:
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

index 7af9bf98e8ed09179fb86370cb63450b4f271d2a..26a6d7316b7dab98850e73f0103242ecd584e999 100644 (file)
@@ -135,7 +135,7 @@ static int create_cydir(struct mail_storage *storage, const char *path)
        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)) {
index d29dfb72d15228a07918d3d9562b935bc4a6c5ab..3d144895528ef4847d0f29096f407bd14fe38ae8 100644 (file)
@@ -155,7 +155,7 @@ static int create_dbox(struct mail_storage *storage, const char *path)
        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)) {
index d6e4aa90f52083248e3e401f4a910f517ea8cde1..0887d0bcd31e39d29278c7e1a7bf6591793b6d9e 100644 (file)
@@ -447,21 +447,28 @@ void index_storage_mailbox_init(struct index_mailbox *ibox, const char *name,
                                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;
index 71ea3bc9135998d83c38b22c5e0a9ecd246e1084..cd55eb44968825ebaf434a46d9f899a6a908f1ea 100644 (file)
@@ -501,7 +501,8 @@ maildir_mailbox_open(struct mail_storage *_storage, const char *name,
        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 *_storage, const char *name,
        /* 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 mail_storage *_storage,
                                          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)
index 416258898dc21be3d7473aa66c4a769091e4a4c6..12fb02a595d42cbd558dce733832dc7a0b627695 100644 (file)
@@ -733,7 +733,8 @@ static int mbox_mailbox_create(struct mail_storage *_storage, const char *name,
        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)) {
index d4ae5015dbe95018e88fde62a767253343c67bd2..a296a8eb72fb7a0d5e12883a87023c72028ae5ff 100644 (file)
@@ -287,7 +287,7 @@ static int fs_list_rename_mailbox(struct mailbox_list *list,
        /* 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) {
index c1589071b5e1b42b1ae2949116b58a238e8e5253..e34ec6327271dbdc6dcc9e6b2e8ea6c64d5eb2f0 100644 (file)
@@ -111,8 +111,8 @@ int subsfile_set_subscribed(struct mailbox_list *list, const char *path,
        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) {
index 6bd7a2fdc2df4238c6c760bff7686b9e5d238a3a..29e0219cdba362bc65b355b5f241331fd9857897 100644 (file)
@@ -261,19 +261,19 @@ mailbox_list_get_namespace(const struct mailbox_list *list)
        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 mailbox_list *list,
                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 mailbox_list *list,
 }
 
 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;
index 118a7e3251329debd678bb0a777ba9a984a71050..61d9e92032719793be9e8799c840b801ad0bbdfd 100644 (file)
@@ -142,14 +142,15 @@ mailbox_list_get_flags(const struct mailbox_list *list) ATTR_PURE;
 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.
index 3acee29feb46b9b0924aade0cfccb3837b35d5ca..6e333c24b8a8cbfd77703930bab98e1ed705ba86 100644 (file)
@@ -187,7 +187,7 @@ int acl_backend_vfile_acllist_rebuild(struct acl_backend_vfile *backend)
        /* 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) {
index 82990058d65b72796620a9b1746b79ccf8bc25f6..33d40015b7adc29b2a4a6e53842065345a9a9fb8 100644 (file)
@@ -846,7 +846,8 @@ static int acl_backend_vfile_update_begin(struct acl_object_vfile *aclobj,
        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) {
index 719348c68e54df0da21bd40d8782f2c363171abe..da9dd70ab0bd14146d3712574c5b464a340ff8b1 100644 (file)
@@ -238,8 +238,9 @@ static int maildirsize_write(struct maildir_quota_root *root, const char *path)
        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;
                }