From c98c2c3e31e6f3301e0a666838a97fd22618d845 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Sat, 10 Nov 2018 15:26:51 +0100 Subject: [PATCH] lmtp: Load all globally-defined mail_plugins at client connect. Before, this was not performed until after a user lookup was performed for a recipient. That is not acceptable when plugins need to modify the LMTP protocol itself. --- src/lmtp/Makefile.am | 1 + src/lmtp/lmtp-client.c | 20 ++++++++++++++++++++ src/lmtp/lmtp-settings.c | 8 +++++++- src/lmtp/lmtp-settings.h | 3 +++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/lmtp/Makefile.am b/src/lmtp/Makefile.am index ecc71cf128..316e5ccef6 100644 --- a/src/lmtp/Makefile.am +++ b/src/lmtp/Makefile.am @@ -16,6 +16,7 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib-storage \ -I$(top_srcdir)/src/lib-storage/index \ -I$(top_srcdir)/src/lib-storage/index/raw \ + -DMODULEDIR=\""$(moduledir)"\" \ $(BINARY_CFLAGS) lmtp_LDFLAGS = -export-dynamic \ diff --git a/src/lmtp/lmtp-client.c b/src/lmtp/lmtp-client.c index a98ccab313..5843aa1dd3 100644 --- a/src/lmtp/lmtp-client.c +++ b/src/lmtp/lmtp-client.c @@ -10,6 +10,7 @@ #include "hostpid.h" #include "process-title.h" #include "var-expand.h" +#include "module-dir.h" #include "master-service-ssl.h" #include "master-service-settings.h" #include "iostream-ssl.h" @@ -74,6 +75,24 @@ static void refresh_proctitle(void) process_title_set(str_c(title)); } +static void client_load_modules(struct client *client) +{ + struct module_dir_load_settings mod_set; + + i_zero(&mod_set); + mod_set.abi_version = DOVECOT_ABI_VERSION; + mod_set.require_init_funcs = TRUE; + mod_set.binary_name = "lmtp"; + + /* pre-load all configured mail plugins */ + mail_storage_service_modules = + module_dir_load_missing(mail_storage_service_modules, + client->lmtp_set->mail_plugin_dir, + client->lmtp_set->mail_plugins, + &mod_set); + module_dir_init(mail_storage_service_modules); +} + static void client_raw_user_create(struct client *client) { void **sets; @@ -137,6 +156,7 @@ struct client *client_create(int fd_in, int fd_out, client_read_settings(client, conn->ssl); client_raw_user_create(client); + client_load_modules(client); client->my_domain = client->unexpanded_lda_set->hostname; if (client->service_set->verbose_proctitle) diff --git a/src/lmtp/lmtp-settings.c b/src/lmtp/lmtp-settings.c index 095df3da4b..1666ec98fe 100644 --- a/src/lmtp/lmtp-settings.c +++ b/src/lmtp/lmtp-settings.c @@ -70,6 +70,9 @@ static const struct setting_define lmtp_setting_defines[] = { DEF(SET_STR_VARS, login_greeting), DEF(SET_STR, login_trusted_networks), + DEF(SET_STR, mail_plugins), + DEF(SET_STR, mail_plugin_dir), + SETTING_DEFINE_LIST_END }; @@ -83,7 +86,10 @@ static const struct lmtp_settings lmtp_default_settings = { .lmtp_proxy_rawlog_dir = "", .login_greeting = PACKAGE_NAME" ready.", - .login_trusted_networks = "" + .login_trusted_networks = "", + + .mail_plugins = "", + .mail_plugin_dir = MODULEDIR, }; static const struct setting_parser_info *lmtp_setting_dependencies[] = { diff --git a/src/lmtp/lmtp-settings.h b/src/lmtp/lmtp-settings.h index c470e95d65..ca8ad135f4 100644 --- a/src/lmtp/lmtp-settings.h +++ b/src/lmtp/lmtp-settings.h @@ -24,6 +24,9 @@ struct lmtp_settings { const char *login_greeting; const char *login_trusted_networks; + const char *mail_plugins; + const char *mail_plugin_dir; + enum lmtp_hdr_delivery_address parsed_lmtp_hdr_delivery_address; };