]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: raw-storage - Create a service_user
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 12 Jan 2023 15:27:01 +0000 (17:27 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 27 Jan 2023 11:08:35 +0000 (11:08 +0000)
src/lda/main.c
src/lib-storage/index/raw/Makefile.am
src/lib-storage/index/raw/raw-storage.c
src/lib-storage/index/raw/raw-storage.h
src/lmtp/lmtp-client.c

index ffaf2a246168cbe3fc290ce6b1a7d6c45e00a062..2b8b74e3fb0985538e33f87c958f1e8a6599cd9c 100644 (file)
@@ -153,7 +153,10 @@ lda_raw_mail_open(struct mail_deliver_input *dinput, const char *path)
        time_t mtime;
        int ret;
 
-       raw_mail_user = raw_storage_create_from_set(dinput->rcpt_user->unexpanded_set_parser);
+       struct mail_storage_service_ctx *storage_service =
+               mail_storage_service_user_get_service_ctx(dinput->rcpt_user->_service_user);
+       raw_mail_user = raw_storage_create_from_set(storage_service,
+                               dinput->rcpt_user->unexpanded_set_parser);
 
        mail_from = (dinput->mail_from != NULL ?
                     dinput->mail_from : &default_envelope_sender);
index 58a9df3bc2e9d60f374098d6d3ae6fc036ec2154..368e8e983984393a96c28b87ddaf3569125ab40f 100644 (file)
@@ -2,6 +2,7 @@ noinst_LTLIBRARIES = libstorage_raw.la
 
 AM_CPPFLAGS = \
        -I$(top_srcdir)/src/lib \
+       -I$(top_srcdir)/src/lib-master \
        -I$(top_srcdir)/src/lib-mail \
        -I$(top_srcdir)/src/lib-imap \
        -I$(top_srcdir)/src/lib-index \
index 876cbbb827781c79c7c7a64b9e2b74ced5b19311..70786797d52e3139fafc317a6a93522d08363dbe 100644 (file)
@@ -3,8 +3,11 @@
 #include "lib.h"
 #include "ioloop.h"
 #include "istream.h"
+#include "master-service.h"
+#include "master-service-settings.h"
 #include "index-mail.h"
 #include "mail-copy.h"
+#include "mail-storage-service.h"
 #include "mailbox-list-private.h"
 #include "raw-sync.h"
 #include "raw-storage.h"
@@ -13,26 +16,51 @@ extern struct mail_storage raw_storage;
 extern struct mailbox raw_mailbox;
 
 struct mail_user *
-raw_storage_create_from_set(struct setting_parser_context *unexpanded_set_parser)
+raw_storage_create_from_set(struct mail_storage_service_ctx *ctx,
+                           struct setting_parser_context *unexpanded_set_parser)
 {
+       struct mail_storage_service_user *service_user;
        struct mail_user *user;
        struct mail_namespace *ns;
        struct mail_namespace_settings *ns_set;
-       struct mail_storage_settings *mail_set;
        struct event *event;
        const char *error;
 
+       struct ioloop_context *old_ioloop_ctx =
+               io_loop_get_current_context(current_ioloop);
+
        event = event_create(NULL);
        /* Don't include raw user's events in statistics or anything else.
           They would just cause confusion. */
        event_disable_callbacks(event);
-       user = mail_user_alloc(event, "raw-mail-user", unexpanded_set_parser);
-       event_unref(&event);
 
-       user->autocreated = TRUE;
-       mail_user_set_home(user, "/");
-       if (mail_user_init(user, &error) < 0)
+       const struct master_service_settings *service_set =
+               master_service_settings_get(master_service);
+       const char *const userdb_fields[] = {
+               /* use unwritable home directory */
+               t_strdup_printf("home=%s/empty", service_set->base_dir),
+               /* absolute paths are ok with raw storage */
+               "mail_full_filesystem_access=yes",
+               NULL,
+       };
+       struct mail_storage_service_input input = {
+               .event_parent = event,
+               .username = "raw-mail-user",
+               .unexpanded_set_parser = unexpanded_set_parser,
+               .autocreated = TRUE,
+               .no_userdb_lookup = TRUE,
+               .userdb_fields = userdb_fields,
+               .flags_override_add =
+                       MAIL_STORAGE_SERVICE_FLAG_NO_RESTRICT_ACCESS |
+                       MAIL_STORAGE_SERVICE_FLAG_NO_CHDIR |
+                       MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT |
+                       MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS |
+                       MAIL_STORAGE_SERVICE_FLAG_NO_NAMESPACES,
+       };
+       if (mail_storage_service_lookup_next(ctx, &input, &service_user,
+                                            &user, &error) < 0)
                i_fatal("Raw user initialization failed: %s", error);
+       event_unref(&event);
 
        ns_set = p_new(user->pool, struct mail_namespace_settings, 1);
        ns_set->name = "raw-storage";
@@ -45,16 +73,17 @@ raw_storage_create_from_set(struct setting_parser_context *unexpanded_set_parser
        ns->flags &= ENUM_NEGATE(NAMESPACE_FLAG_INBOX_USER);
        ns->flags |= NAMESPACE_FLAG_NOQUOTA | NAMESPACE_FLAG_NOACL;
        ns->set = ns_set;
-       /* absolute paths are ok with raw storage */
-       mail_set = p_new(user->pool, struct mail_storage_settings, 1);
-       *mail_set = *ns->mail_set;
-       mail_set->mail_full_filesystem_access = TRUE;
-       ns->mail_set = mail_set;
 
        if (mail_storage_create(ns, "raw", 0, &error) < 0)
                i_fatal("Couldn't create internal raw storage: %s", error);
        if (mail_namespaces_init_finish(ns, &error) < 0)
                i_fatal("Couldn't create internal raw namespace: %s", error);
+
+       if (old_ioloop_ctx != NULL)
+               io_loop_context_switch(old_ioloop_ctx);
+       else
+               mail_storage_service_io_deactivate_user(service_user);
+       mail_storage_service_user_unref(&service_user);
        return user;
 }
 
index 5d8d0ee4dda8d0b22efe1db5a39504dd2ab24fb1..ecd4255626625b9203a388a57eed62900e0356db 100644 (file)
@@ -4,6 +4,7 @@
 #include "index-storage.h"
 
 struct setting_parser_context;
+struct mail_storage_service_ctx;
 
 #define RAW_STORAGE_NAME "raw"
 #define RAW_SUBSCRIPTION_FILE_NAME "subscriptions"
@@ -30,7 +31,8 @@ struct raw_mailbox {
 extern struct mail_vfuncs raw_mail_vfuncs;
 
 struct mail_user *
-raw_storage_create_from_set(struct setting_parser_context *unexpanded_set_parser);
+raw_storage_create_from_set(struct mail_storage_service_ctx *ctx,
+                           struct setting_parser_context *unexpanded_set_parser);
 
 int raw_mailbox_alloc_stream(struct mail_user *user, struct istream *input,
                             time_t received_time, const char *envelope_sender,
index 441ec44d21f8dfd4c32bbfaf9d62977ac64bdd31..cce61460d3b847e841544b20dc1a589fa0ebed58 100644 (file)
@@ -119,7 +119,8 @@ static void client_read_settings(struct client *client, bool ssl)
                i_fatal("%s", error);
 
        /* create raw user before duplicating the settings parser */
-       client->raw_mail_user = raw_storage_create_from_set(set_parser);
+       client->raw_mail_user =
+               raw_storage_create_from_set(storage_service, set_parser);
 
        set_parser = settings_parser_dup(set_parser, client->pool);
        lmtp_settings_get(set_parser, client->pool, &lmtp_set, &lda_set);