/* Copyright (c) 2005-2024 Dovecot authors, see the included COPYING file */
#include "lib.h"
+#include "array.h"
#include "settings.h"
#include "db-ldap-settings.h"
DEF(STR, connection_group),
DEF(STR, auth_dn),
DEF(STR, auth_dn_password),
- DEF(STR, auth_sasl_mechanism),
+ DEF(BOOLLIST, auth_sasl_mechanisms),
DEF(STR, auth_sasl_realm),
DEF(STR, auth_sasl_authz_id),
DEF(BOOL, starttls),
.connection_group = "",
.auth_dn = "",
.auth_dn_password = "",
- .auth_sasl_mechanism = "",
+ .auth_sasl_mechanisms = ARRAY_INIT,
.auth_sasl_realm = "",
.auth_sasl_authz_id = "",
.starttls = FALSE,
#endif
#ifndef HAVE_LDAP_SASL
- if (*set->auth_sasl_mechanism != '\0') {
+ if (!array_is_empty(&set->auth_sasl_mechanisms)) {
*error_r = "ldap_auth_sasl_mechanism set, but no SASL support compiled in";
return FALSE;
}
}
if (set->version < 3) {
- if (*set->auth_sasl_mechanism != '\0') {
+ if (!array_is_empty(&set->auth_sasl_mechanisms)) {
*error_r = "ldap_auth_sasl_mechanism requires ldap_version=3";
return -1;
}
const char *auth_dn;
const char *auth_dn_password;
- const char *auth_sasl_mechanism;
+ ARRAY_TYPE(const_string) auth_sasl_mechanisms;
const char *auth_sasl_realm;
const char *auth_sasl_authz_id;
context.realm = conn->set->auth_sasl_realm;
context.authzid = conn->set->auth_sasl_authz_id;
+ const char *mechs = t_array_const_string_join(
+ &conn->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,
- conn->set->auth_sasl_mechanism,
+ 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)
static int db_ldap_bind(struct ldap_connection *conn)
{
- if (*conn->set->auth_sasl_mechanism != '\0') {
- if (db_ldap_bind_sasl(conn) < 0)
- return -1;
- } else {
- if (db_ldap_bind_simple(conn) < 0)
- return -1;
- }
-
- return 0;
+ int ret;
+ if (array_is_empty(&conn->set->auth_sasl_mechanisms))
+ ret = db_ldap_bind_simple(conn);
+ else
+ ret = db_ldap_bind_sasl(conn);
+ return ret < 0 ? -1 : 0;
}
static void db_ldap_get_fd(struct ldap_connection *conn)