]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts-solr: Delay reading settings until solr backend is actually attempted to be used
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 18 Mar 2024 21:09:35 +0000 (23:09 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:39:58 +0000 (10:39 +0200)
It's not an error to load fts_solr plugin, even if it doesn't end up being
configured.

src/plugins/fts-solr/fts-backend-solr.c
src/plugins/fts-solr/fts-solr-plugin.c
src/plugins/fts-solr/fts-solr-plugin.h

index cc153de588e0ac0b7cc7fe384f721459a463ce1a..03d8e2ebac0653eae3c60be028a142bd74068d7d 100644 (file)
@@ -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);
index 01b722212417b737934a4cac86f4d5630860ddf9..88edb362a91181fae56f2f733ee0e8caaff15612 100644 (file)
@@ -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);
index 2d693bd3774f0980a10d28819e1bb1c0d734f711..d672863e969c784f4109a9df2c20528f2f7fc6af 100644 (file)
@@ -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);