static int zlib_mailbox_open_input(struct mailbox *box) { const struct compression_handler *handler; struct istream *input; struct stat st; int fd; handler = compression_lookup_handler_from_ext(box->name); if (handler == NULL || handler->create_istream == NULL) return 0; if (mail_storage_is_mailbox_file(box->storage)) { /* looks like a compressed single file mailbox. we should be able to handle this. */ const char *box_path = mailbox_get_path(box); fd = open(box_path, O_RDONLY); if (fd == -1) { /* let the standard handler figure out what to do with the failure */ return 0; } if (fstat(fd, &st) == 0 && S_ISDIR(st.st_mode)) { i_close_fd(&fd); return 0; } input = i_stream_create_fd(fd, MAX_INBUF_SIZE, FALSE); i_stream_set_name(input, box_path); box->input = handler->create_istream(input, TRUE); i_stream_unref(&input); box->flags |= MAILBOX_FLAG_READONLY; } return 0; }
static bool acl_list_get_root_dir(struct acl_backend_vfile *backend, const char **root_dir_r, enum mailbox_list_path_type *type_r) { struct mail_storage *storage; const char *rootdir, *maildir; enum mailbox_list_path_type type; storage = mailbox_list_get_namespace(backend->backend.list)->storage; type = (storage->class_flags & MAIL_STORAGE_CLASS_FLAG_NO_ROOT) != 0 ? MAILBOX_LIST_PATH_TYPE_CONTROL : MAILBOX_LIST_PATH_TYPE_DIR; if (!mailbox_list_get_root_path(backend->backend.list, type, &rootdir)) return FALSE; *type_r = type; if (type == MAILBOX_LIST_PATH_TYPE_DIR && mail_storage_is_mailbox_file(storage)) { maildir = mailbox_list_get_root_forced(backend->backend.list, MAILBOX_LIST_PATH_TYPE_MAILBOX); if (strcmp(maildir, rootdir) == 0) { /* dovecot-acl-list would show up as a mailbox if we created it to root dir. since we don't really have any other good alternatives, place it to control dir */ rootdir = mailbox_list_get_root_forced(backend->backend.list, MAILBOX_LIST_PATH_TYPE_CONTROL); *type_r = MAILBOX_LIST_PATH_TYPE_CONTROL; } } *root_dir_r = rootdir; return TRUE; }
static const char * acl_backend_vfile_get_local_dir(struct acl_backend *backend, const char *name, const char *vname) { struct mail_namespace *ns = mailbox_list_get_namespace(backend->list); struct mailbox_list *list = ns->list; struct mail_storage *storage; enum mailbox_list_path_type type; const char *dir, *inbox; if (*name == '\0') name = NULL; /* ACL files are very important. try to keep them among the main mail files. that's not possible though with a) if the mailbox is a file or b) if the mailbox path doesn't point to filesystem. */ if (mailbox_list_get_storage(&list, vname, &storage) < 0) return NULL; i_assert(list == ns->list); type = mail_storage_is_mailbox_file(storage) || (storage->class_flags & MAIL_STORAGE_CLASS_FLAG_NO_ROOT) != 0 ? MAILBOX_LIST_PATH_TYPE_CONTROL : MAILBOX_LIST_PATH_TYPE_MAILBOX; if (name == NULL) { if (!mailbox_list_get_root_path(list, type, &dir)) return NULL; } else { if (mailbox_list_get_path(list, name, type, &dir) <= 0) return NULL; } /* verify that the directory isn't same as INBOX's directory. this is mainly for Maildir. */ if (name == NULL && mailbox_list_get_path(list, "INBOX", MAILBOX_LIST_PATH_TYPE_MAILBOX, &inbox) > 0 && strcmp(inbox, dir) == 0) { /* can't have default ACLs with this setup */ return NULL; } return dir; }
static const char *acl_list_get_root_dir(struct acl_backend_vfile *backend) { struct mail_storage *storage; const char *rootdir, *maildir; rootdir = mailbox_list_get_path(backend->backend.list, NULL, MAILBOX_LIST_PATH_TYPE_DIR); storage = mailbox_list_get_namespace(backend->backend.list)->storage; if (mail_storage_is_mailbox_file(storage)) { maildir = mailbox_list_get_path(backend->backend.list, NULL, MAILBOX_LIST_PATH_TYPE_MAILBOX); if (strcmp(maildir, rootdir) == 0) { /* dovecot-acl-list would show up as a mailbox if we created it to root dir. since we don't really have any other good alternatives, place it to control dir */ rootdir = mailbox_list_get_path(backend->backend.list, NULL, MAILBOX_LIST_PATH_TYPE_CONTROL); } } return rootdir; }