Mercurial > dovecot > original-hg > dovecot-1.2
diff src/lib-storage/mailbox-list.c @ 6770:083681d2f4fb HEAD
Simplified mailbox_list_get_permissions() a bit. Now it returns only
permissions for the root directory. Also UID isn't returned anymore.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 11 Nov 2007 15:48:59 +0200 |
parents | 4a3cc2968040 |
children | 186b164a9579 |
line wrap: on
line diff
--- a/src/lib-storage/mailbox-list.c Sun Nov 11 02:40:52 2007 +0200 +++ b/src/lib-storage/mailbox-list.c Sun Nov 11 15:48:59 2007 +0200 @@ -170,8 +170,8 @@ list->ns = ns; list->flags = flags; - list->cached_uid = (uid_t)-1; - list->cached_gid = (gid_t)-1; + list->file_create_mode = (mode_t)-1; + list->file_create_gid = (gid_t)-1; /* copy settings */ list->set.root_dir = p_strdup(list->pool, set->root_dir); @@ -246,6 +246,44 @@ return list->ns; } +void mailbox_list_get_permissions(struct mailbox_list *list, + mode_t *mode_r, gid_t *gid_r) +{ + const char *path; + struct stat st; + + if (list->file_create_mode != (mode_t)-1) { + *mode_r = list->file_create_mode; + *gid_r = list->file_create_gid; + } + + path = mailbox_list_get_path(list, NULL, MAILBOX_LIST_PATH_TYPE_DIR); + if (stat(path, &st) < 0) { + if (!ENOTFOUND(errno)) { + mailbox_list_set_critical(list, "stat(%s) failed: %m", + path); + } + /* return safe defaults */ + *mode_r = 0600; + *gid_r = (gid_t)-1; + return; + } + + list->file_create_mode = st.st_mode & 0666; + if (S_ISDIR(st.st_mode) && (st.st_mode & S_ISGID) != 0) { + /* directory's GID is used automatically for new files */ + list->file_create_gid = (gid_t)-1; + } else if (getegid() == st.st_gid) { + /* using our own gid, no need to change it */ + list->file_create_gid = (gid_t)-1; + } else { + list->file_create_gid = st.st_gid; + } + + *mode_r = list->file_create_mode; + *gid_r = list->file_create_gid; +} + bool mailbox_list_is_valid_pattern(struct mailbox_list *list, const char *pattern) { @@ -272,43 +310,6 @@ return list->v.get_path(list, name, type); } -int mailbox_list_get_permissions(struct mailbox_list *list, const char *name, - mode_t *mode_r, uid_t *uid_r, gid_t *gid_r) -{ - const char *path; - struct stat st; - - mailbox_list_clear_error(list); - - path = mailbox_list_get_path(list, name, - MAILBOX_LIST_PATH_TYPE_MAILBOX); - if (*path == '\0') - return -1; - - if (stat(path, &st) < 0) { - if (ENOTFOUND(errno)) - return 0; - mailbox_list_set_critical(list, "stat(%s) failed: %m", path); - return -1; - } - - *mode_r = st.st_mode & 0666; - - if (list->cached_uid == (uid_t)-1) - list->cached_uid = geteuid(); - *uid_r = list->cached_uid == st.st_uid ? (uid_t)-1 : st.st_uid; - - if (S_ISDIR(st.st_mode) && (st.st_mode & S_ISGID) != 0) { - /* directory's GID is used automatically for new files */ - *gid_r = (gid_t)-1; - } else { - if (list->cached_gid == (gid_t)-1) - list->cached_gid = getegid(); - *gid_r = list->cached_gid == st.st_gid ? (gid_t)-1 : st.st_gid; - } - return 1; -} - const char *mailbox_list_get_temp_prefix(struct mailbox_list *list) { return list->v.get_temp_prefix(list);