shared-storage.c revision 5f5870385cff47efd2f58e7892f251cf13761528
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/* Copyright (c) 2008-2012 Dovecot authors, see the included COPYING file */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic struct mail_storage *shared_storage_alloc(void)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster pool = pool_alloconly_create("shared storage", 1024);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster storage = p_new(pool, struct shared_storage, 1);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostershared_storage_create(struct mail_storage *_storage, struct mail_namespace *ns,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char **error_r)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster struct shared_storage *storage = (struct shared_storage *)_storage;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char *driver, *p;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* location must begin with the actual mailbox driver */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *error_r = "Shared mailbox location not prefixed with driver";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster storage->location = p_strdup(_storage->pool, ns->set->location);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster p_strdup(_storage->pool, ns->unexpanded_set->location);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster storage->storage_class_name = p_strdup(_storage->pool, driver);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster storage_class = mail_storage_find_class(driver);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster _storage->class_flags = storage_class->class_flags;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *error_r = t_strconcat("Unknown shared storage driver: ",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *error_r = "Shared namespace prefix doesn't contain %";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster storage->ns_prefix_pattern = p_strdup(_storage->pool, wildcardp);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (p = storage->ns_prefix_pattern; *p != '\0'; p++) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (*p != '%')
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (*p != '\0') {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *error_r = "Shared namespace prefix contains unknown variables";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *error_r = "Shared namespace prefix doesn't contain %u or %n";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *error_r = "Shared namespace prefix doesn't end with hierarchy separator";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* truncate prefix after the above checks are done, so they can log
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster the full prefix in error conditions */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostershared_storage_get_list_settings(const struct mail_namespace *ns ATTR_UNUSED,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterget_nonexistent_user_location(struct shared_storage *storage,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* user wasn't found. we'll still need to create the storage
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster to avoid exposing which users exist and which don't. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster str_append(location, storage->storage_class_name);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* use a reachable but nonexistent path as the mail root directory */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster str_append(location, storage->storage.user->set->base_dir);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterint shared_storage_get_namespace(struct mail_namespace **_ns,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char **_name)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster struct mail_storage *_storage = (*_ns)->storage;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster struct shared_storage *storage = (struct shared_storage *)_storage;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static struct var_expand_table static_tab[] = {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster struct mail_namespace_settings *ns_set, *unexpanded_ns_set;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char *domain = NULL, *username = NULL, *userdomain = NULL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (*p != '%') {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster switch (*++p) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* we checked this already above */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (*p != '\0') {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* trying to open <prefix>/<user> mailbox */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Invalid namespace prefix %s vs %s",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* successfully matched the name. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* user@domain given */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* trying to open namespace "shared/domain"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster namespace prefix. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster mailbox_list_set_error(list, MAIL_ERROR_NOTFOUND,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* no domain given, use ours (if we have one) */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster mailbox_list_set_error(list, MAIL_ERROR_PARAMS,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "Empty username doesn't exist");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* expand the namespace prefix and see if it already exists.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this should normally happen only when the mailbox is being opened */
if (ret > 0)
NULL,
NULL,
NULL,
NULL,