]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Moved all passdb/userdb template handling to auth_passdb/userdb.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 11 Feb 2016 11:25:28 +0000 (13:25 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 11 Feb 2016 17:14:37 +0000 (19:14 +0200)
This is because passdb_find() and userdb_find() attempts to avoid
duplicating passdbs and userdbs when they have identical driver+args.
This deduplication is useful when using multiple protocol { .. } blocks
that duplicate some passdb/userdb backends. For example we might want
to have only a single SQL connection regardless of how the protocol-specific
passdbs and userdbs are being set up. All the default/override_fields and
result_* settings aren't relevant to the passdb/userdb backends, so removing
them will again allow the deduplication to work correctly.

src/auth/auth-request.c
src/auth/auth.c
src/auth/auth.h
src/auth/passdb.c
src/auth/passdb.h
src/auth/userdb.c
src/auth/userdb.h

index 59ec8c935c28cdc1977bdfa71bd77451fe0bd671..c350ab4d79a65f05aa6254c60c94445ce309b93c 100644 (file)
@@ -690,7 +690,7 @@ static void
 auth_request_verify_plain_callback_finish(enum passdb_result result,
                                          struct auth_request *request)
 {
-       passdb_template_export(request->passdb->passdb->override_fields_tmpl, request);
+       passdb_template_export(request->passdb->override_fields_tmpl, request);
        if (!auth_request_handle_passdb_callback(&result, request)) {
                /* try next passdb */
                auth_request_verify_plain(request, request->mech_password,
@@ -810,7 +810,7 @@ void auth_request_verify_plain(struct auth_request *request,
        } else if (passdb->passdb->blocking) {
                passdb_blocking_verify_plain(request);
        } else {
-               passdb_template_export(passdb->passdb->default_fields_tmpl, request);
+               passdb_template_export(passdb->default_fields_tmpl, request);
                passdb->passdb->iface.verify_plain(request, password,
                                           auth_request_verify_plain_callback);
        }
@@ -822,7 +822,7 @@ auth_request_lookup_credentials_finish(enum passdb_result result,
                                       size_t size,
                                       struct auth_request *request)
 {
-       passdb_template_export(request->passdb->passdb->override_fields_tmpl, request);
+       passdb_template_export(request->passdb->override_fields_tmpl, request);
        if (!auth_request_handle_passdb_callback(&result, request)) {
                /* try next passdb */
                if (request->skip_password_check &&
@@ -948,7 +948,7 @@ void auth_request_lookup_credentials(struct auth_request *request,
        } else if (passdb->passdb->blocking) {
                passdb_blocking_lookup_credentials(request);
        } else {
-               passdb_template_export(passdb->passdb->default_fields_tmpl, request);
+               passdb_template_export(passdb->default_fields_tmpl, request);
                passdb->passdb->iface.lookup_credentials(request,
                        auth_request_lookup_credentials_callback);
        }
@@ -1114,7 +1114,7 @@ void auth_request_userdb_callback(enum userdb_result result,
                if (result == USERDB_RESULT_OK) {
                        /* this userdb lookup succeeded, preserve its extra
                           fields */
-                       userdb_template_export(userdb->userdb->override_fields_tmpl, request);
+                       userdb_template_export(userdb->override_fields_tmpl, request);
                        auth_fields_snapshot(request->userdb_reply);
                } else {
                        /* this userdb lookup failed, remove any extra fields
@@ -1129,7 +1129,7 @@ void auth_request_userdb_callback(enum userdb_result result,
        }
 
        if (request->userdb_success)
-               userdb_template_export(userdb->userdb->override_fields_tmpl, request);
+               userdb_template_export(userdb->override_fields_tmpl, request);
        else if (request->userdbs_seen_internal_failure ||
                 result == USERDB_RESULT_INTERNAL_FAILURE) {
                /* one of the userdb lookups failed. the user might have been
@@ -1181,7 +1181,7 @@ void auth_request_lookup_user(struct auth_request *request,
                /* we still want to set default_fields. these override any
                   existing fields set by previous userdbs (because if that is
                   unwanted, ":protected" can be used). */
-               userdb_template_export(userdb->userdb->default_fields_tmpl, request);
+               userdb_template_export(userdb->default_fields_tmpl, request);
        }
 
        /* (for now) auth_cache is shared between passdb and userdb */
@@ -1604,10 +1604,8 @@ void auth_request_set_fields(struct auth_request *request,
 
 void auth_request_init_userdb_reply(struct auth_request *request)
 {
-       struct userdb_module *module = request->userdb->userdb;
-
        request->userdb_reply = auth_fields_init(request->pool);
-       userdb_template_export(module->default_fields_tmpl, request);
+       userdb_template_export(request->userdb->default_fields_tmpl, request);
 }
 
 static void auth_request_set_uidgid_file(struct auth_request *request,
index bc3dc0bc7617189b20d9953c28db6521833d5cd9..5598535a7bfe14b83af4d1a9aaedfc8db2aaefe7 100644 (file)
@@ -7,6 +7,8 @@
 #include "mech.h"
 #include "userdb.h"
 #include "passdb.h"
+#include "passdb-template.h"
+#include "userdb-template.h"
 #include "auth.h"
 
 static const struct auth_userdb_settings userdb_dummy_set = {
@@ -79,6 +81,11 @@ auth_passdb_preinit(struct auth *auth, const struct auth_passdb_settings *set,
        auth_passdb->result_internalfail =
                auth_db_rule_parse(set->result_internalfail);
 
+       auth_passdb->default_fields_tmpl =
+               passdb_template_build(auth->pool, set->default_fields);
+       auth_passdb->override_fields_tmpl =
+               passdb_template_build(auth->pool, set->override_fields);
+
        /* for backwards compatibility: */
        if (set->pass)
                auth_passdb->result_success = AUTH_DB_RULE_CONTINUE;
@@ -108,6 +115,13 @@ auth_userdb_preinit(struct auth *auth, const struct auth_userdb_settings *set)
        auth_userdb->result_internalfail =
                auth_db_rule_parse(set->result_internalfail);
 
+       auth_userdb->default_fields_tmpl =
+               userdb_template_build(auth->pool, set->driver,
+                                     set->default_fields);
+       auth_userdb->override_fields_tmpl =
+               userdb_template_build(auth->pool, set->driver,
+                                     set->override_fields);
+
        for (dest = &auth->userdbs; *dest != NULL; dest = &(*dest)->next) ;
        *dest = auth_userdb;
 
index b80eb719e8bdda1bdd79ed08ea43467ed1a127ea..4d476e6738f6217f4da14371db723e5f84962853 100644 (file)
@@ -35,6 +35,9 @@ struct auth_passdb {
        /* The caching key for this passdb, or NULL if caching isn't wanted. */
        const char *cache_key;
 
+       struct passdb_template *default_fields_tmpl;
+       struct passdb_template *override_fields_tmpl;
+
        enum auth_passdb_skip skip;
        enum auth_db_rule result_success;
        enum auth_db_rule result_failure;
@@ -50,6 +53,9 @@ struct auth_userdb {
        /* The caching key for this userdb, or NULL if caching isn't wanted. */
        const char *cache_key;
 
+       struct userdb_template *default_fields_tmpl;
+       struct userdb_template *override_fields_tmpl;
+
        enum auth_userdb_skip skip;
        enum auth_db_rule result_success;
        enum auth_db_rule result_failure;
index 0b5ddb588bcc5c6a139f326b35634a447edccd01..ec47e2c34735a42f3c3c9e4ddd3735ac816f7419 100644 (file)
@@ -4,10 +4,8 @@
 #include "array.h"
 #include "password-scheme.h"
 #include "auth-worker-server.h"
-#include "passdb-template.h"
 #include "passdb.h"
 
-
 static ARRAY(struct passdb_module_interface *) passdb_interfaces;
 static ARRAY(struct passdb_module *) passdb_modules;
 
@@ -223,11 +221,6 @@ passdb_preinit(pool_t pool, const struct auth_passdb_settings *set)
        passdb->iface = *iface;
        passdb->args = p_strdup(pool, set->args);
 
-       passdb->default_fields_tmpl =
-               passdb_template_build(pool, set->default_fields);
-       passdb->override_fields_tmpl =
-               passdb_template_build(pool, set->override_fields);
-
        array_append(&passdb_modules, &passdb, 1);
        return passdb;
 }
index 2de5a42bb5a410f8c7f4bdc39299edc92f2bee8e..60f05b3b784a74dd9c358ae980cfc2ae3a418fee 100644 (file)
@@ -70,8 +70,9 @@ struct passdb_module {
        /* number of time init() has been called */
        int init_refcount;
 
-       struct passdb_template *default_fields_tmpl;
-       struct passdb_template *override_fields_tmpl;
+       /* WARNING: avoid adding anything here that isn't based on args.
+          if you do, you need to change passdb.c:passdb_find() also to avoid
+          accidentally merging wrong passdbs. */
 
        struct passdb_module_interface iface;
 };
index afc9d151d08b7502011db617fe78b2f1a8d9f73d..5b45ddba72804449d4bd61a5f65d498b39f961d4 100644 (file)
@@ -4,10 +4,8 @@
 #include "array.h"
 #include "ipwd.h"
 #include "auth-worker-server.h"
-#include "userdb-template.h"
 #include "userdb.h"
 
-
 static ARRAY(struct userdb_module_interface *) userdb_interfaces;
 static ARRAY(struct userdb_module *) userdb_modules;
 
@@ -165,13 +163,6 @@ userdb_preinit(pool_t pool, const struct auth_userdb_settings *set)
        userdb->iface = iface;
        userdb->args = p_strdup(pool, set->args);
 
-       userdb->default_fields_tmpl =
-               userdb_template_build(pool, set->driver,
-                                     set->default_fields);
-       userdb->override_fields_tmpl =
-               userdb_template_build(pool, set->driver,
-                                     set->override_fields);
-
        array_append(&userdb_modules, &userdb, 1);
        return userdb;
 }
index 4f189a282e2d5b0e99298ba112a8b0dd63fae90c..45ba70b3adb94030d93155ec6aaaa28768f7e92c 100644 (file)
@@ -36,8 +36,9 @@ struct userdb_module {
        /* number of time init() has been called */
        int init_refcount;
 
-       struct userdb_template *default_fields_tmpl;
-       struct userdb_template *override_fields_tmpl;
+       /* WARNING: avoid adding anything here that isn't based on args.
+          if you do, you need to change userdb.c:userdb_find() also to avoid
+          accidentally merging wrong userdbs. */
 
        const struct userdb_module_interface *iface;
 };