From da988255f5748d6ec3b84296ce4b6d938a44226e Mon Sep 17 00:00:00 2001
From: Timo Sirainen <timo.sirainen@open-xchange.com>
Date: Fri, 13 Dec 2024 17:06:42 +0200
Subject: [PATCH] lib-sieve: storage: ldap: Change auth_sasl_mechanisms to
 boollist

---
 src/lib-sieve/storage/ldap/sieve-ldap-db.c             | 10 ++++++----
 .../storage/ldap/sieve-ldap-storage-settings.c         |  4 ++--
 .../storage/ldap/sieve-ldap-storage-settings.h         |  2 +-
 3 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-db.c b/src/lib-sieve/storage/ldap/sieve-ldap-db.c
index fd5942255..aea0d0dd0 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-db.c
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-db.c
@@ -712,7 +712,7 @@ static int db_ldap_set_options(struct ldap_connection *conn)
 #endif
 
 	if (set->ldap_version < 3) {
-		if (set->auth_sasl_mechanisms[0] != '\0') {
+		if (!array_is_empty(&set->auth_sasl_mechanisms)) {
 			e_error(storage->event,
 				"db: ldap_auth_sasl_mechanisms requires ldap_version=3");
 			return -1;
@@ -785,7 +785,7 @@ int sieve_ldap_db_connect(struct ldap_connection *conn)
 #endif
 	}
 
-	if (set->auth_sasl_mechanisms[0]) {
+	if (!array_is_empty(&set->auth_sasl_mechanisms)) {
 #ifdef HAVE_LDAP_SASL
 		struct db_ldap_sasl_bind_context context;
 
@@ -795,10 +795,12 @@ int sieve_ldap_db_connect(struct ldap_connection *conn)
 		context.realm = set->auth_sasl_realm;
 		context.authzid = set->auth_sasl_authz_id;
 
+		const char *mechs = t_array_const_string_join(
+			&set->auth_sasl_mechanisms, " ");
+
 		/* There doesn't seem to be a way to do SASL binding
 		   asynchronously.. */
-		ret = ldap_sasl_interactive_bind_s(conn->ld, NULL,
-						   set->auth_sasl_mechanisms,
+		ret = ldap_sasl_interactive_bind_s(conn->ld, NULL, mechs,
 						   NULL, NULL, LDAP_SASL_QUIET,
 						   sasl_interact, &context);
 		if (db_ldap_connect_finish(conn, ret) < 0)
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c b/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c
index 0e7d611a2..e19970b25 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c
@@ -29,7 +29,7 @@ static const struct setting_define sieve_ldap_setting_defines[] = {
 	DEF(STR, auth_dn),
 	DEF(STR, auth_dn_password),
 	DEF(BOOL, starttls),
-	DEF(STR, auth_sasl_mechanisms),
+	DEF(BOOLLIST, auth_sasl_mechanisms),
 	DEF(STR, auth_sasl_realm),
 	DEF(STR, auth_sasl_authz_id),
 	DEF(STR, tls_ca_cert_file),
@@ -53,7 +53,7 @@ const struct sieve_ldap_settings sieve_ldap_default_settings = {
 	.auth_dn = "",
 	.auth_dn_password = "",
 	.starttls = FALSE,
-	.auth_sasl_mechanisms = "",
+	.auth_sasl_mechanisms = ARRAY_INIT,
 	.auth_sasl_realm = "",
 	.auth_sasl_authz_id = "",
 	.tls_ca_cert_file = "",
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.h b/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.h
index 3f8d195a1..88fa034df 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.h
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.h
@@ -9,7 +9,7 @@ struct sieve_ldap_settings {
 	const char *auth_dn_password;
 
 	bool starttls;
-	const char *auth_sasl_mechanisms;
+	ARRAY_TYPE(const_string) auth_sasl_mechanisms;
 	const char *auth_sasl_realm;
 	const char *auth_sasl_authz_id;
 
-- 
GitLab