]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-imap: Introduce imap_write_capability() function.
authorsergey.kitov <sergey.kitov@open-xchange.com>
Mon, 14 Oct 2024 15:45:38 +0000 (18:45 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:40:00 +0000 (10:40 +0200)
src/lib-imap/imap-util.c
src/lib-imap/imap-util.h
src/lib-imap/test-imap-util.c

index dc1ae244669d872c1c03b9d1bcfb82fbeb0a8c40..944f091fc2adfbfeee6f1ad484b55c32feef5a4a 100644 (file)
@@ -200,3 +200,27 @@ const char *imap_args_to_str(const struct imap_arg *args)
        imap_write_args(str, args);
        return str_c(str);
 }
+
+void imap_write_capability(string_t *dest, const ARRAY_TYPE(const_string) *capabilities)
+{
+       string_t *cap_str;
+       string_t *cur_str;
+       const char *const *tmp;
+       if (array_is_empty(capabilities))
+               return;
+       cap_str = t_str_new(256);
+       for (tmp = array_front(capabilities); *tmp != NULL; tmp++) {
+               if (str_begins_with(*tmp, "IMAP4"))
+                       cur_str = dest;
+               else
+                       cur_str = cap_str;
+               if (str_len(cur_str) > 0)
+                       str_append_c(cur_str, ' ');
+               str_append(cur_str, *tmp);
+       }
+       if (str_len(cap_str) > 0) {
+               if (str_len(dest) > 0)
+                       str_append_c(dest, ' ');
+               str_append(dest, str_c(cap_str));
+       }
+}
index 47b7d2c0664f5e2e09b3c5a3527885bf99e20e9b..0c214068769ef1ed6e0305a0cb516fd7f6e6af55 100644 (file)
@@ -26,4 +26,9 @@ void imap_write_args_for_human(string_t *dest, const struct imap_arg *args);
 /* Like imap_write_args(), but return the string allocated from data stack. */
 const char *imap_args_to_str(const struct imap_arg *args);
 
+/* Writes capabilities from boollist to string.
+   Capabilities beginning with IMAP4 are written first
+   to avoid breaking clients that expect IMAP4rev1 to be the first. */
+void imap_write_capability(string_t *dest, const ARRAY_TYPE(const_string) *capabilities);
+
 #endif
index 90f59a1c8077bb30e11c954a0ca04783ad908808..9757412d66090a0d8148d313f754409551c9c038 100644 (file)
@@ -68,11 +68,28 @@ static void test_imap_write_arg(void)
        test_end();
 }
 
+static void test_imap_write_capabilities(void)
+{
+       ARRAY_TYPE(const_string) capabilities;
+       t_array_init(&capabilities, 5);
+       const char *const unsorted_capabilities[] = {
+               "foo", "bar", "IMAP4rev1", "baz", "IMAP4rev2"
+       };
+       array_append(&capabilities, unsorted_capabilities, N_ELEMENTS(unsorted_capabilities));
+       string_t *cap_str = t_str_new(256);
+
+       test_begin("imap_write_capabilities");
+       imap_write_capability(cap_str, &capabilities);
+       test_assert_strcmp(str_c(cap_str), "IMAP4rev1 IMAP4rev2 foo bar baz");
+       test_end();
+}
+
 int main(void)
 {
        static void (*const test_functions[])(void) = {
                test_imap_parse_system_flag,
                test_imap_write_arg,
+               test_imap_write_capabilities,
                NULL
        };
        return test_run(test_functions);