From: Timo Sirainen Date: Mon, 18 Mar 2024 21:09:35 +0000 (+0200) Subject: fts-solr: Delay reading settings until solr backend is actually attempted to be used X-Git-Tag: 2.4.0~628 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6dca52b19194aa5971f736ac5ace4d0a12f13450;p=thirdparty%2Fdovecot%2Fcore.git fts-solr: Delay reading settings until solr backend is actually attempted to be used It's not an error to load fts_solr plugin, even if it doesn't end up being configured. --- diff --git a/src/plugins/fts-solr/fts-backend-solr.c b/src/plugins/fts-solr/fts-backend-solr.c index cc153de588..03d8e2ebac 100644 --- a/src/plugins/fts-solr/fts-backend-solr.c +++ b/src/plugins/fts-solr/fts-backend-solr.c @@ -185,12 +185,10 @@ static int fts_backend_solr_init(struct fts_backend *_backend, const char **error_r) { struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend; - struct fts_solr_user *fuser = FTS_SOLR_USER_CONTEXT(_backend->ns->user); + struct fts_solr_user *fuser; - if (fuser == NULL) { - *error_r = "Invalid fts_solr setting"; + if (fts_solr_mail_user_get(_backend->ns->user, &fuser, error_r) < 0) return -1; - } backend->event = event_create(_backend->event); event_add_category(backend->event, &event_category_fts_solr); diff --git a/src/plugins/fts-solr/fts-solr-plugin.c b/src/plugins/fts-solr/fts-solr-plugin.c index 01b7222124..88edb362a9 100644 --- a/src/plugins/fts-solr/fts-solr-plugin.c +++ b/src/plugins/fts-solr/fts-solr-plugin.c @@ -25,27 +25,37 @@ static void fts_solr_mail_user_deinit(struct mail_user *user) fuser->module_ctx.super.deinit(user); } -static void fts_solr_mail_user_created(struct mail_user *user) +int fts_solr_mail_user_get(struct mail_user *user, + struct fts_solr_user **fuser_r, + const char **error_r) { - struct mail_user_vfuncs *v = user->vlast; - struct fts_solr_user *fuser; - const char *error; + struct fts_solr_user *fuser = FTS_SOLR_USER_CONTEXT(user); const struct fts_solr_settings *set; if (fts_solr_settings_get(user->event, &fts_solr_setting_parser_info, - &set, &error) < 0) { - e_error(user->event, "fts-solr: %s", error); - return; - } + &set, error_r) < 0) + return -1; - if (fts_mail_user_init(user, FALSE, &error) < 0) { - e_error(user->event, "fts-solr: %s", error); + /* Reference the user even when fuser is already initialized */ + if (fts_mail_user_init(user, FALSE, error_r) < 0) { settings_free(set); - return; + return -1; } + if (fuser->set == NULL) + fuser->set = set; + else + settings_free(set); + + *fuser_r = fuser; + return 0; +} + +static void fts_solr_mail_user_created(struct mail_user *user) +{ + struct mail_user_vfuncs *v = user->vlast; + struct fts_solr_user *fuser; fuser = p_new(user->pool, struct fts_solr_user, 1); - fuser->set = set; fuser->module_ctx.super = *v; user->vlast = &fuser->module_ctx.super; v->deinit = fts_solr_mail_user_deinit; @@ -56,7 +66,7 @@ static struct mail_storage_hooks fts_solr_mail_storage_hooks = { .mail_user_created = fts_solr_mail_user_created }; -void fts_solr_plugin_init(struct module *module) +void fts_solr_plugin_init(struct module *module ATTR_UNUSED) { fts_backend_register(&fts_backend_solr); mail_storage_hooks_add(module, &fts_solr_mail_storage_hooks); diff --git a/src/plugins/fts-solr/fts-solr-plugin.h b/src/plugins/fts-solr/fts-solr-plugin.h index 2d693bd377..d672863e96 100644 --- a/src/plugins/fts-solr/fts-solr-plugin.h +++ b/src/plugins/fts-solr/fts-solr-plugin.h @@ -21,6 +21,10 @@ extern struct fts_backend fts_backend_solr; extern MODULE_CONTEXT_DEFINE(fts_solr_user_module, &mail_user_module_register); extern struct http_client *solr_http_client; +int fts_solr_mail_user_get(struct mail_user *user, + struct fts_solr_user **fuser_r, + const char **error_r); + void fts_solr_plugin_init(struct module *module); void fts_solr_plugin_deinit(void);