]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: imapc - Check sasl mechanism
authorAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 19 Feb 2025 09:23:17 +0000 (11:23 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 27 Feb 2025 10:47:44 +0000 (12:47 +0200)
src/lib-storage/index/imapc/Makefile.am
src/lib-storage/index/imapc/imapc-storage.c

index f128f6c4ec9ad526b7adf98bde2da0deabc252c1..5a8c648bdf7ac10b5f944377e3f27e2db9ad0923 100644 (file)
@@ -8,6 +8,7 @@ AM_CPPFLAGS = \
        -I$(top_srcdir)/src/lib-mail \
        -I$(top_srcdir)/src/lib-imap \
        -I$(top_srcdir)/src/lib-imap-client \
+       -I$(top_srcdir)/src/lib-sasl/ \
        -I$(top_srcdir)/src/lib-index \
        -I$(top_srcdir)/src/lib-storage \
        -I$(top_srcdir)/src/lib-storage/list \
index fdd9daf13f581c277184410362ee981415328798..1ec8d99e85ea97b2233b2a9503507470eed9238e 100644 (file)
@@ -16,6 +16,7 @@
 #include "imapc-attribute.h"
 #include "imapc-settings.h"
 #include "imapc-storage.h"
+#include "dsasl-client.h"
 
 #define DNS_CLIENT_SOCKET_NAME "dns-client"
 
@@ -329,10 +330,25 @@ int imapc_storage_client_create(struct mailbox_list *list,
                   it's a bug. */
                params.flags |= IMAPC_PARAMETER_CLIENT_DISABLED;
 
-       if (*imapc_set->imapc_password == '\0') {
-               *error_r = "missing imapc_password";
-               settings_free(imapc_set);
-               return -1;
+       if (!array_is_empty(&imapc_set->imapc_sasl_mechanisms)) {
+               const char *mech_name;
+               array_foreach_elem(&imapc_set->imapc_sasl_mechanisms, mech_name) {
+                       const struct dsasl_client_mech *mech =
+                               dsasl_client_mech_find(mech_name);
+                       if (mech == NULL) {
+                               *error_r =
+                                       t_strdup_printf("imapc_sasl_mechanism: "
+                                                       "'%s' is not supported",
+                                                       mech_name);
+                               settings_free(imapc_set);
+                               return -1;
+                       } else if (dsasl_client_mech_uses_password(mech) &&
+                                  *imapc_set->imapc_password == '\0') {
+                               *error_r = "Missing imapc_password";
+                               settings_free(imapc_set);
+                               return -1;
+                       }
+               }
        }
        params.override_dns_client_socket_path = *ns->user->set->base_dir == '\0' ? "" :
                t_strconcat(ns->user->set->base_dir, "/",