From: Timo Sirainen Date: Mon, 6 Dec 2010 03:08:31 +0000 (+0000) Subject: lib-storage: Added mailbox_list_get_root_[dir_]permissions() X-Git-Tag: 2.1.alpha1~444 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=17cf149e5f47183bfcc1503649dfb92a14f9dcd9;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Added mailbox_list_get_root_[dir_]permissions() They should be used instead of mailbox_list_get_[dir_]permissions() with name=NULL parameter. --- diff --git a/src/lib-storage/index/dbox-multi/mdbox-map.c b/src/lib-storage/index/dbox-multi/mdbox-map.c index 68fcd5cdd5..dbd5eb50ac 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-map.c +++ b/src/lib-storage/index/dbox-multi/mdbox-map.c @@ -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; diff --git a/src/lib-storage/list/mailbox-list-fs.c b/src/lib-storage/list/mailbox-list-fs.c index 7a92eb0578..0f0282e3ed 100644 --- a/src/lib-storage/list/mailbox-list-fs.c +++ b/src/lib-storage/list/mailbox-list-fs.c @@ -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) { diff --git a/src/lib-storage/list/mailbox-list-maildir.c b/src/lib-storage/list/mailbox-list-maildir.c index 2cce5a45e1..c45b4326b6 100644 --- a/src/lib-storage/list/mailbox-list-maildir.c +++ b/src/lib-storage/list/mailbox-list-maildir.c @@ -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) { diff --git a/src/lib-storage/list/subscription-file.c b/src/lib-storage/list/subscription-file.c index 62261b6775..399983ca16 100644 --- a/src/lib-storage/list/subscription-file.c +++ b/src/lib-storage/list/subscription-file.c @@ -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) { diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index 5ea692721f..828913746e 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -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); diff --git a/src/lib-storage/mailbox-list.c b/src/lib-storage/mailbox-list.c index 17fd7721ae..ba97752136 100644 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@ -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; } diff --git a/src/lib-storage/mailbox-list.h b/src/lib-storage/mailbox-list.h index f3964ed79e..9cf8fc010f 100644 --- a/src/lib-storage/mailbox-list.h +++ b/src/lib-storage/mailbox-list.h @@ -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. */ diff --git a/src/lib-storage/mailbox-uidvalidity.c b/src/lib-storage/mailbox-uidvalidity.c index 1e0bef3326..0dcb6f9c51 100644 --- a/src/lib-storage/mailbox-uidvalidity.c +++ b/src/lib-storage/mailbox-uidvalidity.c @@ -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); diff --git a/src/plugins/acl/acl-backend-vfile-acllist.c b/src/plugins/acl/acl-backend-vfile-acllist.c index f7e3547cd6..80dd46bc97 100644 --- a/src/plugins/acl/acl-backend-vfile-acllist.c +++ b/src/plugins/acl/acl-backend-vfile-acllist.c @@ -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, diff --git a/src/plugins/lazy-expunge/lazy-expunge-plugin.c b/src/plugins/lazy-expunge/lazy-expunge-plugin.c index 79ed88b427..e6069d9ace 100644 --- a/src/plugins/lazy-expunge/lazy-expunge-plugin.c +++ b/src/plugins/lazy-expunge/lazy-expunge-plugin.c @@ -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) { diff --git a/src/plugins/quota/quota-maildir.c b/src/plugins/quota/quota-maildir.c index 89ddc365d3..21dfd58621 100644 --- a/src/plugins/quota/quota-maildir.c +++ b/src/plugins/quota/quota-maildir.c @@ -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;