]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Added mailbox_list_get_root_[dir_]permissions()
authorTimo Sirainen <tss@iki.fi>
Mon, 6 Dec 2010 03:08:31 +0000 (03:08 +0000)
committerTimo Sirainen <tss@iki.fi>
Mon, 6 Dec 2010 03:08:31 +0000 (03:08 +0000)
They should be used instead of mailbox_list_get_[dir_]permissions() with
name=NULL parameter.

src/lib-storage/index/dbox-multi/mdbox-map.c
src/lib-storage/list/mailbox-list-fs.c
src/lib-storage/list/mailbox-list-maildir.c
src/lib-storage/list/subscription-file.c
src/lib-storage/mail-storage.c
src/lib-storage/mailbox-list.c
src/lib-storage/mailbox-list.h
src/lib-storage/mailbox-uidvalidity.c
src/plugins/acl/acl-backend-vfile-acllist.c
src/plugins/lazy-expunge/lazy-expunge-plugin.c
src/plugins/quota/quota-maildir.c

index 68fcd5cdd5c7dcba1816936ad0f7df5093c9affb..dbd5eb50ac7ba52f565e43cc99e7e7855e565177 100644 (file)
@@ -77,8 +77,9 @@ mdbox_map_init(struct mdbox_storage *storage, struct mailbox_list *root_list)
        map->ref_ext_id = mail_index_ext_register(map->index, "ref", 0,
                                sizeof(uint16_t), sizeof(uint16_t));
 
-       mailbox_list_get_permissions(root_list, NULL, &map->create_mode,
-                                    &map->create_gid, &map->create_gid_origin);
+       mailbox_list_get_root_permissions(root_list, &map->create_mode,
+                                         &map->create_gid,
+                                         &map->create_gid_origin);
        mail_index_set_permissions(map->index, map->create_mode,
                                   map->create_gid, map->create_gid_origin);
        return map;
index 7a92eb0578abf7e2910bf7cc76f99540ed407fa2..0f0282e3ed40946589157981f33a278445d106d2 100644 (file)
@@ -331,8 +331,7 @@ fs_list_create_mailbox_dir(struct mailbox_list *list, const char *name,
                path = t_strdup_until(path, p);
        }
 
-       mailbox_list_get_dir_permissions(list, NULL, &mode,
-                                        &gid, &gid_origin);
+       mailbox_list_get_root_dir_permissions(list, &mode, &gid, &gid_origin);
        if (mkdir_parents_chgrp(path, mode, gid, gid_origin) == 0)
                return 0;
        else if (errno == EEXIST) {
@@ -533,8 +532,8 @@ static int fs_list_rename_mailbox(struct mailbox_list *oldlist,
        /* create the hierarchy */
        p = strrchr(newpath, '/');
        if (p != NULL) {
-               mailbox_list_get_dir_permissions(newlist, NULL, &mode,
-                                                &gid, &origin);
+               mailbox_list_get_root_dir_permissions(newlist, &mode,
+                                                     &gid, &origin);
                p = t_strdup_until(newpath, p);
                if (mkdir_parents_chgrp(p, mode, gid, origin) < 0 &&
                    errno != EEXIST) {
index 2cce5a45e1a9bf5518da28712ea8a076facf3a8c..c45b4326b66b1a29b6e6961a419313b5f591d9f9 100644 (file)
@@ -284,7 +284,7 @@ maildir_list_create_maildirfolder_file(struct mailbox_list *list,
 
        /* Maildir++ spec wants that maildirfolder named file is created for
           all subfolders. */
-       mailbox_list_get_permissions(list, NULL, &mode, &gid, &gid_origin);
+       mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin);
 
        path = t_strconcat(dir, "/" MAILDIR_SUBFOLDER_FILENAME, NULL);
        old_mask = umask(0);
@@ -347,8 +347,8 @@ maildir_list_create_mailbox_dir(struct mailbox_list *list, const char *name,
 
        root_dir = mailbox_list_get_path(list, NULL,
                                         MAILBOX_LIST_PATH_TYPE_MAILBOX);
-       mailbox_list_get_dir_permissions(list, NULL, &mode,
-                                        &gid, &gid_origin);
+       mailbox_list_get_root_dir_permissions(list, &mode,
+                                             &gid, &gid_origin);
        if (mkdir_parents_chgrp(path, mode, gid, gid_origin) == 0) {
                /* ok */
        } else if (errno == EEXIST) {
index 62261b67758026f94d136b2254057e990aa1c801..399983ca16d1f0224cbea834924a0fec2403dd22 100644 (file)
@@ -108,7 +108,7 @@ 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, NULL, &mode, &gid, &origin);
+       mailbox_list_get_root_permissions(list, &mode, &gid, &origin);
        fd_out = file_dotlock_open_group(&dotlock_set, path, 0,
                                         mode, gid, origin, &dotlock);
        if (fd_out == -1 && errno == ENOENT) {
index 5ea692721f0a98e05694952274d09081bf53c3c3..828913746ec23740e02cc4a684a3527b80a59dc8 100644 (file)
@@ -243,7 +243,7 @@ mail_storage_create_root(struct mailbox_list *list,
                return ret;
 
        /* we need to create the root directory. */
-       mailbox_list_get_dir_permissions(list, NULL, &mode, &gid, &origin);
+       mailbox_list_get_root_dir_permissions(list, &mode, &gid, &origin);
        if (mkdir_parents_chgrp(root_dir, mode, gid, origin) < 0 &&
            errno != EEXIST) {
                *error_r = mail_error_create_eacces_msg("mkdir", root_dir);
index 17fd7721ae3a3d5aefa826adbb1695c7cfec8599..ba9775213676559783ac70c35d15fbb26849955c 100644 (file)
@@ -490,15 +490,26 @@ void mailbox_list_get_permissions(struct mailbox_list *list,
 {
        mode_t dir_mode;
 
-       if (list->file_create_mode != (mode_t)-1 && name == NULL) {
+       i_assert(name != NULL);
+
+       mailbox_list_get_permissions_full(list, name, mode_r, &dir_mode, gid_r,
+                                         gid_origin_r);
+}
+
+void mailbox_list_get_root_permissions(struct mailbox_list *list,
+                                      mode_t *mode_r, gid_t *gid_r,
+                                      const char **gid_origin_r)
+{
+       mode_t dir_mode;
+
+       if (list->file_create_mode != (mode_t)-1) {
                *mode_r = list->file_create_mode;
                *gid_r = list->file_create_gid;
                *gid_origin_r = list->file_create_gid_origin;
-               return;
+       } else {
+               mailbox_list_get_permissions_full(list, NULL, mode_r, &dir_mode,
+                                                 gid_r, gid_origin_r);
        }
-
-       mailbox_list_get_permissions_full(list, name, mode_r, &dir_mode, gid_r,
-                                         gid_origin_r);
 }
 
 void mailbox_list_get_dir_permissions(struct mailbox_list *list,
@@ -508,15 +519,26 @@ void mailbox_list_get_dir_permissions(struct mailbox_list *list,
 {
        mode_t file_mode;
 
-       if (list->dir_create_mode != (mode_t)-1 && name == NULL) {
+       i_assert(name != NULL);
+
+       mailbox_list_get_permissions_full(list, name, &file_mode,
+                                         mode_r, gid_r, gid_origin_r);
+}
+
+void mailbox_list_get_root_dir_permissions(struct mailbox_list *list,
+                                          mode_t *mode_r, gid_t *gid_r,
+                                          const char **gid_origin_r)
+{
+       mode_t file_mode;
+
+       if (list->dir_create_mode != (mode_t)-1) {
                *mode_r = list->dir_create_mode;
                *gid_r = list->file_create_gid;
                *gid_origin_r = list->file_create_gid_origin;
-               return;
+       } else {
+               mailbox_list_get_permissions_full(list, NULL, &file_mode,
+                                                 mode_r, gid_r, gid_origin_r);
        }
-
-       mailbox_list_get_permissions_full(list, name, &file_mode,
-                                         mode_r, gid_r, gid_origin_r);
 }
 
 static int
@@ -591,7 +613,7 @@ int mailbox_list_mkdir(struct mailbox_list *list, const char *path,
        mode_t mode;
        gid_t gid;
 
-       mailbox_list_get_dir_permissions(list, NULL, &mode, &gid, &origin);
+       mailbox_list_get_root_dir_permissions(list, &mode, &gid, &origin);
 
        /* get the directory path up to last %variable. for example
           unexpanded path may be "/var/mail/%d/%2n/%n/Maildir", and we want
@@ -1112,7 +1134,7 @@ static bool mailbox_list_init_changelog(struct mailbox_list *list)
        path = t_strconcat(path, "/"MAILBOX_LOG_FILE_NAME, NULL);
        list->changelog = mailbox_log_alloc(path);
 
-       mailbox_list_get_permissions(list, NULL, &mode, &gid, &gid_origin);
+       mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin);
        mailbox_log_set_permissions(list->changelog, mode, gid, gid_origin);
        return TRUE;
 }
index f3964ed79e82b44f99d6b4378b0f7ed0b516382a..9cf8fc010fcd313e93640781c6bbabdf51b16415 100644 (file)
@@ -173,18 +173,24 @@ void mailbox_list_get_closest_storage(struct mailbox_list *list,
                                      struct mail_storage **storage);
 
 /* 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
+   the specified mailbox or to mailbox list root. (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,
                                  const char **gid_origin_r);
+void mailbox_list_get_root_permissions(struct mailbox_list *list,
+                                      mode_t *mode_r, gid_t *gid_r,
+                                      const char **gid_origin_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,
                                      const char **gid_origin_r);
+void mailbox_list_get_root_dir_permissions(struct mailbox_list *list,
+                                          mode_t *mode_r, gid_t *gid_r,
+                                          const char **gid_origin_r);
 /* Create path's parent directory with proper permissions. Since most
    directories are created lazily, this function can be used to easily create
    them whenever file creation fails with ENOENT. */
index 1e0bef33268f48b44003d209cf1abdfe3a60761c..0dcb6f9c5115e76da1b3bde2c5ea209e8361930d 100644 (file)
@@ -41,7 +41,7 @@ static void mailbox_uidvalidity_write(struct mailbox_list *list,
        gid_t gid;
        const char *gid_origin;
 
-       mailbox_list_get_permissions(list, NULL, &mode, &gid, &gid_origin);
+       mailbox_list_get_root_permissions(list, &mode, &gid, &gid_origin);
 
        old_mask = umask(0666 & ~mode);
        fd = open(path, O_RDWR | O_CREAT, 0666);
index f7e3547cd62b19d2c8c77d85df597167bb0b3af4..80dd46bc97f41a861c3fe4a3de9e506ce68b21d0 100644 (file)
@@ -228,7 +228,7 @@ acl_backend_vfile_acllist_try_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, NULL, &mode, &gid, &origin);
+       mailbox_list_get_root_permissions(list, &mode, &gid, &origin);
        fd = safe_mkstemp_group(path, mode, gid, origin);
        if (fd == -1 && errno == ENOENT) {
                if (mailbox_list_create_parent_dir(backend->backend.list, NULL,
index 79ed88b427876a1d80a7ce87ed567618baf83b55..e6069d9aceb218b59db7d5da1f08f904217f7976 100644 (file)
@@ -242,7 +242,7 @@ mailbox_move(struct mailbox *src_box, struct mailbox_list *dest_list,
        int ret;
 
        /* make sure the destination root directory exists */
-       mailbox_list_get_dir_permissions(dest_list, NULL, &mode, &gid, &origin);
+       mailbox_list_get_root_dir_permissions(dest_list, &mode, &gid, &origin);
        dir = mailbox_list_get_path(dest_list, NULL, MAILBOX_LIST_PATH_TYPE_DIR);
        if (mkdir_parents_chgrp(dir, mode, gid, origin) < 0 &&
            errno != EEXIST) {
index 89ddc365d364efa842c2ef11ea9e47bc7d37e784..21dfd586214b135b50b9551b06e604c60aeff165 100644 (file)
@@ -236,16 +236,15 @@ static int maildirsize_write(struct maildir_quota_root *root, const char *path)
        namespaces = array_get(&root->root.quota->namespaces, &count);
        i_assert(count > 0);
        for (i = 0; i < count; i++) {
-               if ((namespaces[i]->flags & NAMESPACE_FLAG_INBOX_USER) != 0) {
-                       mailbox_list_get_permissions(namespaces[i]->list,
-                                                    NULL, &mode, &gid,
-                                                    &gid_origin);
-                       mailbox_list_get_dir_permissions(namespaces[i]->list,
-                                                        NULL,
-                                                        &dir_mode, &dir_gid,
-                                                        &dir_gid_origin);
-                       break;
-               }
+               if ((namespaces[i]->flags & NAMESPACE_FLAG_INBOX_USER) == 0)
+                       continue;
+
+               mailbox_list_get_root_permissions(namespaces[i]->list,
+                                                 &mode, &gid, &gid_origin);
+               mailbox_list_get_root_dir_permissions(namespaces[i]->list,
+                                                     &dir_mode, &dir_gid,
+                                                     &dir_gid_origin);
+               break;
        }
 
        dotlock_settings.use_excl_lock = set->dotlock_use_excl;