]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap: Iterate over ns settings when deciding to add SPECIAL-USE capability
authorJosef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
Mon, 29 Jan 2018 14:55:51 +0000 (09:55 -0500)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Mon, 5 Feb 2018 11:52:38 +0000 (13:52 +0200)
To determine whether we should add the SPECIAL-USE capability to the
OK response to LOGIN, we have to iterate over namespace and mailbox
*settings* since the namespaces haven't been set up yet.

src/imap/imap-client.c

index ae4c616142ced9cddea74a2454e988bc177ced9f..82f01e1aad96996d7888ca1568ebafb7b615edfc 100644 (file)
@@ -73,12 +73,32 @@ static void client_init_urlauth(struct client *client)
 
 static bool user_has_special_use_mailboxes(struct mail_user *user)
 {
-       struct mail_namespace *ns;
+       struct mail_namespace_settings *const *ns_set;
 
-       for (ns = user->namespaces; ns != NULL; ns = ns->next) {
-               if (ns->special_use_mailboxes)
-                       return TRUE;
+       /*
+        * We have to iterate over namespace and mailbox *settings* since
+        * the namespaces haven't been set up yet.  The namespaces haven't
+        * been set up so that we don't hold up the OK response to LOGIN
+        * when using slow lib-storage backends.
+        */
+
+       /* no namespaces => no special use flags */
+       if (!array_is_created(&user->set->namespaces))
+               return FALSE;
+
+       array_foreach(&user->set->namespaces, ns_set) {
+               struct mailbox_settings *const *box_set;
+
+               /* no mailboxes => no special use flags */
+               if (!array_is_created(&(*ns_set)->mailboxes))
+                       continue;
+
+               array_foreach(&(*ns_set)->mailboxes, box_set) {
+                       if ((*box_set)->special_use != NULL)
+                               return TRUE;
+               }
        }
+
        return FALSE;
 }