]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: ldap - Fail clearly if filter string is empty
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 18 Dec 2024 08:51:45 +0000 (10:51 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:40:01 +0000 (10:40 +0200)
src/auth/db-ldap-settings.c
src/auth/db-ldap-settings.h
src/auth/passdb-ldap.c
src/auth/userdb-ldap.c

index e7fe979c4f1ddb94e07d498db3428919920e7b98..1a0e22ac90722d6033d674fd01a4398f65856f4e 100644 (file)
@@ -198,12 +198,34 @@ int ldap_setting_post_check(const struct ldap_settings *set, const char **error_
        return 0;
 }
 
-int ldap_pre_settings_post_check(const struct ldap_pre_settings *set, const char **error_r)
+int ldap_pre_settings_post_check(const struct ldap_pre_settings *set,
+                                enum db_ldap_lookup_type type,
+                                const char **error_r)
 {
        if (*set->ldap_base == '\0') {
                *error_r = "No ldap_base given";
                return -1;
        }
+       switch (type) {
+       case DB_LDAP_LOOKUP_TYPE_PASSDB:
+               if (set->passdb_ldap_filter[0] == '\0') {
+                       *error_r = "No passdb_ldap_filter given";
+                       return -1;
+               }
+               break;
+       case DB_LDAP_LOOKUP_TYPE_USERDB:
+               if (set->userdb_ldap_filter[0] == '\0') {
+                       *error_r = "No userdb_ldap_filter given";
+                       return -1;
+               }
+               break;
+       case DB_LDAP_LOOKUP_TYPE_ITERATE:
+               if (set->userdb_ldap_iterate_filter[0] == '\0') {
+                       *error_r = "No userdb_ldap_iterate_filter given";
+                       return -1;
+               }
+               break;
+       }
 
        return 0;
 }
index a51b35e77c466466ccfabdee9dc11d685c736b03..dc341dd3943cba79080bf8040f68f64aaece7dfb 100644 (file)
@@ -1,6 +1,12 @@
 #ifndef DB_LDAP_SETTINGS_H
 #define DB_LDAP_SETTINGS_H
 
+enum db_ldap_lookup_type {
+       DB_LDAP_LOOKUP_TYPE_PASSDB,
+       DB_LDAP_LOOKUP_TYPE_USERDB,
+       DB_LDAP_LOOKUP_TYPE_ITERATE,
+};
+
 struct ldap_settings {
        pool_t pool;
 
@@ -66,6 +72,8 @@ extern const struct setting_parser_info ldap_pre_setting_parser_info;
 extern const struct setting_parser_info ldap_post_setting_parser_info;
 
 int ldap_setting_post_check(const struct ldap_settings *set, const char **error_r);
-int ldap_pre_settings_post_check(const struct ldap_pre_settings *set, const char **error_r);
+int ldap_pre_settings_post_check(const struct ldap_pre_settings *set,
+                                enum db_ldap_lookup_type type,
+                                const char **error_r);
 
 #endif
index 3416def067e15490630ed00afa814623b7733b6e..b2a21d8571536e8fa2d44d89d2a9264f2d3b0fa3 100644 (file)
@@ -375,7 +375,8 @@ ldap_verify_plain(struct auth_request *request,
        const struct ldap_pre_settings *ldap_pre = NULL;
        if (settings_get(event, &ldap_pre_setting_parser_info, 0,
                         &ldap_pre, &error) < 0 ||
-           ldap_pre_settings_post_check(ldap_pre, &error) < 0) {
+           ldap_pre_settings_post_check(ldap_pre, DB_LDAP_LOOKUP_TYPE_PASSDB,
+                                        &error) < 0) {
                e_error(event, "%s", error);
                callback(PASSDB_RESULT_INTERNAL_FAILURE, request);
                settings_free(ldap_pre);
@@ -413,7 +414,8 @@ static void ldap_lookup_credentials(struct auth_request *request,
        const struct ldap_pre_settings *ldap_pre = NULL;
        if (settings_get(event, &ldap_pre_setting_parser_info, 0,
                         &ldap_pre, &error) < 0 ||
-           ldap_pre_settings_post_check(ldap_pre, &error) < 0) {
+           ldap_pre_settings_post_check(ldap_pre, DB_LDAP_LOOKUP_TYPE_PASSDB,
+                                        &error) < 0) {
                e_error(event, "%s", error);
                passdb_ldap_request_fail(ldap_request, PASSDB_RESULT_INTERNAL_FAILURE);
                settings_free(ldap_pre);
index ece572793c1d163a87bbdb4a046d1ccbd288bbfa..8f49eb691ecec64dc9912985780cec5ef501afc3 100644 (file)
@@ -125,7 +125,8 @@ static void userdb_ldap_lookup(struct auth_request *auth_request,
        const struct ldap_pre_settings *ldap_pre = NULL;
        if (settings_get(event, &ldap_pre_setting_parser_info, 0,
                         &ldap_pre, &error) < 0 ||
-           ldap_pre_settings_post_check(ldap_pre, &error) < 0) {
+           ldap_pre_settings_post_check(ldap_pre, DB_LDAP_LOOKUP_TYPE_USERDB,
+                                        &error) < 0) {
                e_error(event, "%s", error);
                callback(USERDB_RESULT_INTERNAL_FAILURE, auth_request);
                settings_free(ldap_pre);
@@ -257,7 +258,8 @@ userdb_ldap_iterate_init(struct auth_request *auth_request,
        const struct ldap_pre_settings *ldap_pre = NULL;
        if (settings_get(event, &ldap_pre_setting_parser_info, 0,
                         &ldap_pre, &error) < 0 ||
-           ldap_pre_settings_post_check(ldap_pre, &error) < 0) {
+           ldap_pre_settings_post_check(ldap_pre, DB_LDAP_LOOKUP_TYPE_ITERATE,
+                                        &error) < 0) {
                e_error(event, "%s", error);
                settings_free(ldap_pre);
                ctx->ctx.failed = TRUE;