shared-storage.c revision bcb4e51a409d94ae670de96afb8483a4f7855294
b9f30617c2c96d54acbc4f85ed17b939c4f28916Timo Sirainen/* Copyright (c) 2008-2018 Dovecot authors, see the included COPYING file */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic struct mail_storage *shared_storage_alloc(void)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen pool = pool_alloconly_create("shared storage", 1024);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen storage = p_new(pool, struct shared_storage, 1);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenshared_storage_create(struct mail_storage *_storage, struct mail_namespace *ns,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen const char **error_r)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct shared_storage *storage = SHARED_STORAGE(_storage);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen const char *driver, *p;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* location must begin with the actual mailbox driver */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen *error_r = "Shared mailbox location not prefixed with driver";
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen driver = t_strdup_until(ns->set->location, p);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen storage->location = p_strdup(_storage->pool, ns->set->location);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen p_strdup(_storage->pool, ns->unexpanded_set->location);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen storage->storage_class_name = p_strdup(_storage->pool, driver);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen storage_class = mail_user_get_storage_class(_storage->user, driver);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen _storage->class_flags = storage_class->class_flags;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen *error_r = t_strconcat("Unknown shared storage driver: ",
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen *error_r = "Shared namespace prefix doesn't contain %";
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen storage->ns_prefix_pattern = p_strdup(_storage->pool, wildcardp);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen for (p = storage->ns_prefix_pattern; *p != '\0'; p++) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (*p != '%')
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (*p != '\0') {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen *error_r = "Shared namespace prefix contains unknown variables";
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen *error_r = "Shared namespace prefix doesn't contain %u or %n";
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen *error_r = "Shared namespace prefix doesn't end with hierarchy separator";
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* truncate prefix after the above checks are done, so they can log
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen the full prefix in error conditions */
ce8a6f53ea3ce91b759a54b771e1779564de19a1Timo Sirainenshared_storage_get_list_settings(const struct mail_namespace *ns ATTR_UNUSED,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenget_nonexistent_user_location(struct shared_storage *storage,
1cbc0c6372d24168962698c5f4d3e15df8943ebfTimo Sirainen /* user wasn't found. we'll still need to create the storage
1cbc0c6372d24168962698c5f4d3e15df8943ebfTimo Sirainen to avoid exposing which users exist and which don't. */
1cbc0c6372d24168962698c5f4d3e15df8943ebfTimo Sirainen str_append(location, storage->storage_class_name);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* use a reachable but nonexistent path as the mail root directory */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen str_append(location, storage->storage.user->set->base_dir);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic bool shared_namespace_exists(struct mail_namespace *ns)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen path = mailbox_list_get_root_forced(ns->list, MAILBOX_LIST_PATH_TYPE_DIR);
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen /* we can't know if this exists */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenint shared_storage_get_namespace(struct mail_namespace **_ns,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen const char **_name)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct mail_storage *_storage = (*_ns)->storage;
d63b4241643b6014d49ff356f14e0f3ee43068a8Timo Sirainen struct shared_storage *storage = SHARED_STORAGE(_storage);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen struct mail_namespace_settings *ns_set, *unexpanded_ns_set;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen const char *domain = NULL, *username = NULL, *userdomain = NULL;
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen if (*p != '%') {
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen switch (*++p) {
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen /* we checked this already above */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen next = strchr(name, *p != '\0' ? *p : ns_sep);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (*p != '\0') {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen /* trying to open <prefix>/<user> mailbox */
domain++;
ret = 0;
if (ret > 0 &&
if (ret <= 0) {
NULL,
NULL,
NULL,
NULL,
NULL,