From: Timo Sirainen Date: Thu, 12 Jan 2023 15:27:01 +0000 (+0200) Subject: lib-storage: raw-storage - Create a service_user X-Git-Tag: 2.4.0~3112 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=312d3d700fb62f3f88e3c4e85878d5b4890d0104;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: raw-storage - Create a service_user --- diff --git a/src/lda/main.c b/src/lda/main.c index ffaf2a2461..2b8b74e3fb 100644 --- a/src/lda/main.c +++ b/src/lda/main.c @@ -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); diff --git a/src/lib-storage/index/raw/Makefile.am b/src/lib-storage/index/raw/Makefile.am index 58a9df3bc2..368e8e9839 100644 --- a/src/lib-storage/index/raw/Makefile.am +++ b/src/lib-storage/index/raw/Makefile.am @@ -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 \ diff --git a/src/lib-storage/index/raw/raw-storage.c b/src/lib-storage/index/raw/raw-storage.c index 876cbbb827..70786797d5 100644 --- a/src/lib-storage/index/raw/raw-storage.c +++ b/src/lib-storage/index/raw/raw-storage.c @@ -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; } diff --git a/src/lib-storage/index/raw/raw-storage.h b/src/lib-storage/index/raw/raw-storage.h index 5d8d0ee4dd..ecd4255626 100644 --- a/src/lib-storage/index/raw/raw-storage.h +++ b/src/lib-storage/index/raw/raw-storage.h @@ -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, diff --git a/src/lmtp/lmtp-client.c b/src/lmtp/lmtp-client.c index 441ec44d21..cce61460d3 100644 --- a/src/lmtp/lmtp-client.c +++ b/src/lmtp/lmtp-client.c @@ -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);