dovecot-2.2: lib-storage: mailbox_list_get_root_permissions() no...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Sep 26 01:47:47 EEST 2012
details: http://hg.dovecot.org/dovecot-2.2/rev/d0ca4c69ec76
changeset: 15115:d0ca4c69ec76
user: Timo Sirainen <tss at iki.fi>
date: Wed Sep 26 01:38:59 2012 +0300
description:
lib-storage: mailbox_list_get_root_permissions() now returns struct mailbox_permissions.
diffstat:
src/lib-storage/index/dbox-multi/mdbox-file.c | 14 +-
src/lib-storage/index/dbox-multi/mdbox-map-private.h | 4 +-
src/lib-storage/index/dbox-multi/mdbox-map.c | 11 +-
src/lib-storage/list/mailbox-list-fs.c | 11 +-
src/lib-storage/list/subscription-file.c | 18 ++--
src/lib-storage/mailbox-list-private.h | 7 +-
src/lib-storage/mailbox-list.c | 78 +++++++------------
src/lib-storage/mailbox-list.h | 3 +-
src/lib-storage/mailbox-uidvalidity.c | 18 ++--
src/plugins/acl/acl-backend-vfile-acllist.c | 16 ++-
src/plugins/quota/quota-maildir.c | 25 +++--
11 files changed, 94 insertions(+), 111 deletions(-)
diffs (truncated from 488 to 300 lines):
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/index/dbox-multi/mdbox-file.c
--- a/src/lib-storage/index/dbox-multi/mdbox-file.c Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-file.c Wed Sep 26 01:38:59 2012 +0300
@@ -306,7 +306,7 @@
const char *p, *dir, *error;
int fd;
- old_mask = umask(0666 & ~map->create_mode);
+ old_mask = umask(0666 & ~map->perm.file_create_mode);
fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
umask(old_mask);
if (fd == -1 && errno == ENOENT && parents &&
@@ -322,25 +322,25 @@
return -1;
}
/* try again */
- old_mask = umask(0666 & ~map->create_mode);
+ old_mask = umask(0666 & ~map->perm.file_create_mode);
fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
umask(old_mask);
}
if (fd == -1) {
mail_storage_set_critical(&file->storage->storage,
"open(%s, O_CREAT) failed: %m", path);
- } else if (map->create_gid == (gid_t)-1) {
+ } else if (map->perm.file_create_gid == (gid_t)-1) {
/* no group change */
- } else if (fchown(fd, (uid_t)-1, map->create_gid) < 0) {
+ } else if (fchown(fd, (uid_t)-1, map->perm.file_create_gid) < 0) {
if (errno == EPERM) {
mail_storage_set_critical(&file->storage->storage, "%s",
eperm_error_get_chgrp("fchown", path,
- map->create_gid,
- map->create_gid_origin));
+ map->perm.file_create_gid,
+ map->perm.file_create_gid_origin));
} else {
mail_storage_set_critical(&file->storage->storage,
"fchown(%s, -1, %ld) failed: %m",
- path, (long)map->create_gid);
+ path, (long)map->perm.file_create_gid);
}
/* continue anyway */
}
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/index/dbox-multi/mdbox-map-private.h
--- a/src/lib-storage/index/dbox-multi/mdbox-map-private.h Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-map-private.h Wed Sep 26 01:38:59 2012 +0300
@@ -20,9 +20,7 @@
uint32_t map_ext_id, ref_ext_id;
struct mailbox_list *root_list;
- mode_t create_mode;
- gid_t create_gid;
- const char *create_gid_origin;
+ struct mailbox_permissions perm;
unsigned int verify_existing_file_ids:1;
};
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/index/dbox-multi/mdbox-map.c
--- a/src/lib-storage/index/dbox-multi/mdbox-map.c Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-map.c Wed Sep 26 01:38:59 2012 +0300
@@ -50,7 +50,6 @@
{
struct mdbox_map *map;
const char *root, *index_root;
- mode_t dir_mode;
root = mailbox_list_get_root_path(root_list, MAILBOX_LIST_PATH_TYPE_DIR);
index_root = mailbox_list_get_root_path(root_list, MAILBOX_LIST_PATH_TYPE_INDEX);
@@ -76,12 +75,10 @@
map->ref_ext_id = mail_index_ext_register(map->index, "ref", 0,
sizeof(uint16_t), sizeof(uint16_t));
- mailbox_list_get_root_permissions(root_list,
- &map->create_mode, &dir_mode,
- &map->create_gid,
- &map->create_gid_origin);
- mail_index_set_permissions(map->index, map->create_mode,
- map->create_gid, map->create_gid_origin);
+ mailbox_list_get_root_permissions(root_list, &map->perm);
+ mail_index_set_permissions(map->index, map->perm.file_create_mode,
+ map->perm.file_create_gid,
+ map->perm.file_create_gid_origin);
return map;
}
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/list/mailbox-list-fs.c
--- a/src/lib-storage/list/mailbox-list-fs.c Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/list/mailbox-list-fs.c Wed Sep 26 01:38:59 2012 +0300
@@ -293,13 +293,12 @@
if (strcmp(oldparent, newparent) != 0 && stat(oldpath, &st) == 0) {
/* make sure the newparent exists */
- mode_t file_mode, dir_mode;
- gid_t gid;
- const char *origin;
+ struct mailbox_permissions perm;
- mailbox_list_get_root_permissions(newlist, &file_mode,
- &dir_mode, &gid, &origin);
- if (mkdir_parents_chgrp(newparent, dir_mode, gid, origin) < 0 &&
+ mailbox_list_get_root_permissions(newlist, &perm);
+ if (mkdir_parents_chgrp(newparent, perm.dir_create_mode,
+ perm.file_create_gid,
+ perm.file_create_gid_origin) < 0 &&
errno != EEXIST) {
if (mailbox_list_set_error_from_errno(oldlist))
return -1;
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/list/subscription-file.c
--- a/src/lib-storage/list/subscription-file.c Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/list/subscription-file.c Wed Sep 26 01:38:59 2012 +0300
@@ -88,12 +88,11 @@
const struct mail_storage_settings *mail_set = list->mail_set;
struct dotlock_settings dotlock_set;
struct dotlock *dotlock;
- const char *line, *origin;
+ struct mailbox_permissions perm;
+ const char *line;
struct istream *input;
struct ostream *output;
int fd_in, fd_out;
- mode_t file_mode, dir_mode;
- gid_t gid;
bool found, changed = FALSE, failed = FALSE;
if (strcasecmp(name, "INBOX") == 0)
@@ -106,17 +105,20 @@
dotlock_set.timeout = SUBSCRIPTION_FILE_LOCK_TIMEOUT;
dotlock_set.stale_timeout = SUBSCRIPTION_FILE_CHANGE_TIMEOUT;
- mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
- &gid, &origin);
+ mailbox_list_get_root_permissions(list, &perm);
fd_out = file_dotlock_open_group(&dotlock_set, path, 0,
- file_mode, gid, origin, &dotlock);
+ perm.file_create_mode,
+ perm.file_create_gid,
+ perm.file_create_gid_origin, &dotlock);
if (fd_out == -1 && errno == ENOENT) {
/* directory hasn't been created yet. */
if (mailbox_list_mkdir_parent(list, NULL, path) < 0)
return -1;
fd_out = file_dotlock_open_group(&dotlock_set, path, 0,
- file_mode, gid,
- origin, &dotlock);
+ perm.file_create_mode,
+ perm.file_create_gid,
+ perm.file_create_gid_origin,
+ &dotlock);
}
if (fd_out == -1) {
if (errno == EAGAIN) {
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/mailbox-list-private.h
--- a/src/lib-storage/mailbox-list-private.h Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/mailbox-list-private.h Wed Sep 26 01:38:59 2012 +0300
@@ -105,11 +105,8 @@
const struct mail_storage_settings *mail_set;
enum mailbox_list_flags flags;
- /* -1 if not set yet. use mailbox_list_get_permissions() to set them */
- mode_t file_create_mode, dir_create_mode;
- gid_t file_create_gid;
- /* origin (e.g. path) where the file_create_gid was got from */
- const char *file_create_gid_origin;
+ /* may not be set yet, use mailbox_list_get_permissions() to access */
+ struct mailbox_permissions root_permissions;
struct mailbox_tree_context *subscriptions;
time_t subscriptions_mtime, subscriptions_read_time;
diff -r 081b62bed2ea -r d0ca4c69ec76 src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c Wed Sep 26 00:56:08 2012 +0300
+++ b/src/lib-storage/mailbox-list.c Wed Sep 26 01:38:59 2012 +0300
@@ -138,9 +138,9 @@
list->ns = ns;
list->mail_set = ns->mail_set;
list->flags = flags;
- list->file_create_mode = (mode_t)-1;
- list->dir_create_mode = (mode_t)-1;
- list->file_create_gid = (gid_t)-1;
+ list->root_permissions.file_create_mode = (mode_t)-1;
+ list->root_permissions.dir_create_mode = (mode_t)-1;
+ list->root_permissions.file_create_gid = (gid_t)-1;
list->changelog_timestamp = (time_t)-1;
/* copy settings */
@@ -741,10 +741,8 @@
}
if (name == NULL) {
- list->file_create_mode = permissions_r->file_create_mode;
- list->dir_create_mode = permissions_r->dir_create_mode;
- list->file_create_gid = permissions_r->file_create_gid;
- list->file_create_gid_origin =
+ list->root_permissions = *permissions_r;
+ list->root_permissions.file_create_gid_origin =
p_strdup(list->pool,
permissions_r->file_create_gid_origin);
}
@@ -753,9 +751,9 @@
i_debug("Namespace %s: Using permissions from %s: "
"mode=0%o gid=%ld", list->ns->prefix,
path != NULL ? path : "",
- (int)list->dir_create_mode,
- list->file_create_gid == (gid_t)-1 ? -1L :
- (long)list->file_create_gid);
+ (int)permissions_r->dir_create_mode,
+ permissions_r->file_create_gid == (gid_t)-1 ? -1L :
+ (long)permissions_r->file_create_gid);
}
}
@@ -766,23 +764,13 @@
}
void mailbox_list_get_root_permissions(struct mailbox_list *list,
- mode_t *file_mode_r, mode_t *dir_mode_r,
- gid_t *gid_r, const char **gid_origin_r)
+ struct mailbox_permissions *permissions_r)
{
- struct mailbox_permissions perm;
-
- if (list->file_create_mode != (mode_t)-1) {
- *file_mode_r = list->file_create_mode;
- *dir_mode_r = list->dir_create_mode;
- *gid_r = list->file_create_gid;
- *gid_origin_r = list->file_create_gid_origin;
- } else {
- mailbox_list_get_permissions_internal(list, NULL, &perm);
-
- *file_mode_r = perm.file_create_mode;
- *dir_mode_r = perm.dir_create_mode;
- *gid_r = perm.file_create_gid;
- *gid_origin_r = perm.file_create_gid_origin;
+ if (list->root_permissions.file_create_mode != (mode_t)-1)
+ *permissions_r = list->root_permissions;
+ else {
+ mailbox_list_get_permissions_internal(list, NULL,
+ permissions_r);
}
}
@@ -853,10 +841,9 @@
enum mailbox_list_path_type type,
const char **error_r)
{
- const char *expanded, *unexpanded, *root_dir, *p, *origin, *error;
+ const char *expanded, *unexpanded, *root_dir, *p, *error;
struct stat st;
- mode_t file_mode, dir_mode;
- gid_t gid;
+ struct mailbox_permissions perm;
if (stat(path, &st) == 0) {
/* looks like it already exists, don't bother checking
@@ -870,8 +857,7 @@
return -1;
}
- mailbox_list_get_root_permissions(list, &file_mode, &dir_mode,
- &gid, &origin);
+ mailbox_list_get_root_permissions(list, &perm);
/* get the directory path up to last %variable. for example
unexpanded path may be "/var/mail/%d/%2n/%n/Maildir", and we want
@@ -906,15 +892,19 @@
return -1;
}
}
- if (gid == (gid_t)-1 && (dir_mode & S_ISGID) == 0) {
+ if (perm.file_create_gid == (gid_t)-1 &&
+ (perm.dir_create_mode & S_ISGID) == 0) {
/* change the group for user directories */
- gid = getegid();
+ perm.file_create_gid = getegid();
+ perm.file_create_gid_origin = "egid";
}
}
/* the rest of the directories exist only for one user. create them
with default directory permissions */
- if (mkdir_parents_chgrp(path, dir_mode, gid, origin) < 0 &&
+ if (mkdir_parents_chgrp(path, perm.dir_create_mode,
+ perm.file_create_gid,
+ perm.file_create_gid_origin) < 0 &&
errno != EEXIST) {
if (errno == EACCES)
*error_r = mail_error_create_eacces_msg("mkdir", path);
@@ -1187,10 +1177,8 @@
static bool mailbox_list_init_changelog(struct mailbox_list *list)
{
+ struct mailbox_permissions perm;
const char *path;
- mode_t file_mode, dir_mode;
- gid_t gid;
- const char *gid_origin;
if (list->changelog != NULL)
return TRUE;
@@ -1204,9 +1192,10 @@
More information about the dovecot-cvs
mailing list