]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Convert passdbs_generate_md5() to read all settings
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 29 Nov 2024 10:37:46 +0000 (12:37 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:40:01 +0000 (10:40 +0200)
src/auth/auth-worker-connection.c
src/auth/auth-worker-server.c
src/auth/auth.c
src/auth/auth.h
src/auth/passdb.c
src/auth/passdb.h

index 0f1b3a9c44d58efa2ce94a6bc3f8d6cd847a24ee..afdd9a5eb945ac42cc82323781372aaffeabc2f3 100644 (file)
@@ -194,7 +194,7 @@ static void auth_worker_connection_connected(struct connection *conn,
 
        string_t *str = t_str_new(128);
 
-       passdbs_generate_md5(passdb_md5);
+       auth_passdbs_generate_md5(passdb_md5);
        userdbs_generate_md5(userdb_md5);
        str_append(str, "DBHASH\t");
        binary_to_hex_append(str, passdb_md5, sizeof(passdb_md5));
index 60263b329bdc8598daf5bca34421ce443df61ad2..c3d5b5126a4dd0f8aff164a92d02977a0bc956e8 100644 (file)
@@ -749,7 +749,7 @@ static bool auth_worker_verify_db_hash(const char *passdb_hash, const char *user
        unsigned char passdb_md5[MD5_RESULTLEN];
        unsigned char userdb_md5[MD5_RESULTLEN];
 
-       passdbs_generate_md5(passdb_md5);
+       auth_passdbs_generate_md5(passdb_md5);
        userdbs_generate_md5(userdb_md5);
 
        binary_to_hex_append(str, passdb_md5, sizeof(passdb_md5));
index e3ae4db347c3c3a19b4297a3ed84234c2773e4dc..d55b1cf1898e16ff26cf2b3d690834654ebd7a07 100644 (file)
@@ -79,6 +79,7 @@ auth_passdb_preinit(struct auth *auth, const struct auth_passdb_settings *_set,
 {
        struct auth_passdb *auth_passdb, **dest;
        const struct auth_passdb_settings *set;
+       const char *error;
 
        /* Lookup passdb-specific auth_settings */
        struct event *event = event_create(auth_event);
@@ -92,6 +93,11 @@ auth_passdb_preinit(struct auth *auth, const struct auth_passdb_settings *_set,
        auth_passdb = p_new(auth->pool, struct auth_passdb, 1);
        auth_passdb->auth_set =
                settings_get_or_fatal(event, &auth_setting_parser_info);
+       if (settings_get(event, &auth_passdb_post_setting_parser_info,
+                        SETTINGS_GET_FLAG_NO_CHECK |
+                        SETTINGS_GET_FLAG_NO_EXPAND,
+                        &auth_passdb->unexpanded_post_set, &error) < 0)
+               i_fatal("%s", error);
 
        auth_passdb->name = set->name;
        auth_passdb->set = set;
@@ -135,6 +141,7 @@ static void auth_passdb_deinit(struct auth_passdb *passdb)
 {
        settings_free(passdb->set);
        settings_free(passdb->auth_set);
+       settings_free(passdb->unexpanded_post_set);
        passdb_deinit(passdb->passdb);
 }
 
@@ -396,6 +403,37 @@ static void auth_deinit(struct auth *auth)
        dns_client_deinit(&auth->dns_client);
 }
 
+static void
+auth_passdbs_update_md5(struct auth *auth, struct md5_context *ctx)
+{
+       struct auth_passdb *passdb;
+       unsigned int hash;
+
+       for (passdb = auth->passdbs; passdb != NULL; passdb = passdb->next) {
+               md5_update(ctx, &passdb->passdb->id, sizeof(passdb->passdb->id));
+               hash = settings_hash(&auth_passdb_setting_parser_info,
+                                    passdb->set, NULL);
+               md5_update(ctx, &hash, sizeof(hash));
+               hash = settings_hash(&auth_setting_parser_info,
+                                    passdb->auth_set, NULL);
+               md5_update(ctx, &hash, sizeof(hash));
+               hash = settings_hash(&auth_passdb_post_setting_parser_info,
+                                    passdb->unexpanded_post_set, NULL);
+               md5_update(ctx, &hash, sizeof(hash));
+       }
+}
+
+void auth_passdbs_generate_md5(unsigned char md5[STATIC_ARRAY MD5_RESULTLEN])
+{
+       struct auth *auth;
+       struct md5_context ctx;
+
+       md5_init(&ctx);
+       array_foreach_elem(&auths, auth)
+               auth_passdbs_update_md5(auth, &ctx);
+       md5_final(&ctx, md5);
+}
+
 struct auth *auth_find_protocol(const char *name)
 {
        struct auth *const *a;
index e6ebcd37999b42b80ca64e39a26ccafdf7150192..acffb651c2c1c6e03c8a9009a6017dad3be5b8c0 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef AUTH_H
 #define AUTH_H
 
+#include "md5.h"
 #include "auth-settings.h"
 
 #define PASSWORD_HIDDEN_STR "<hidden>"
@@ -35,6 +36,7 @@ struct auth_passdb {
        const char *name;
        const struct auth_settings *auth_set;
        const struct auth_passdb_settings *set;
+       const struct auth_passdb_post_settings *unexpanded_post_set;
        struct passdb_module *passdb;
 
        /* The caching key for this passdb, or NULL if caching isn't wanted. */
@@ -85,6 +87,8 @@ struct auth {
 struct auth *auth_find_protocol(const char *name);
 struct auth *auth_default_protocol(void);
 
+void auth_passdbs_generate_md5(unsigned char md5[STATIC_ARRAY MD5_RESULTLEN]);
+
 void auths_preinit(struct event *parent_event,
                   const struct auth_settings *set,
                   const struct mechanisms_register *reg,
index 187b659cc050bea90e92e15f02e622ab61ad37c1..5d9602ed99ec04759ca86500ae703a8cd3ae0aa8 100644 (file)
@@ -238,23 +238,6 @@ void passdb_deinit(struct passdb_module *passdb)
        passdb->iface = passdb_iface_deinit;
 }
 
-void passdbs_generate_md5(unsigned char md5[STATIC_ARRAY MD5_RESULTLEN])
-{
-       struct md5_context ctx;
-       struct passdb_module *const *passdbs;
-       unsigned int i, count;
-
-       md5_init(&ctx);
-       passdbs = array_get(&passdb_modules, &count);
-       for (i = 0; i < count; i++) {
-               md5_update(&ctx, &passdbs[i]->id, sizeof(passdbs[i]->id));
-               md5_update(&ctx, passdbs[i]->iface.name,
-                          strlen(passdbs[i]->iface.name));
-               md5_update(&ctx, passdbs[i]->args, strlen(passdbs[i]->args));
-       }
-       md5_final(&ctx, md5);
-}
-
 const char *
 passdb_result_to_string(enum passdb_result result)
 {
index dd853036edc1c278f8ff181954e0dadf231cd940..0404303a659da495314c3a6ca123a104f56b5876 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef PASSDB_H
 #define PASSDB_H
 
-#include "md5.h"
-
 #define IS_VALID_PASSWD(pass) \
        ((pass)[0] != '\0' && (pass)[0] != '*' && (pass)[0] != '!')
 
@@ -109,8 +107,6 @@ void passdb_deinit(struct passdb_module *passdb);
 void passdb_register_module(struct passdb_module_interface *iface);
 void passdb_unregister_module(struct passdb_module_interface *iface);
 
-void passdbs_generate_md5(unsigned char md5[STATIC_ARRAY MD5_RESULTLEN]);
-
 void passdbs_init(void);
 void passdbs_deinit(void);