From: sergey.kitov Date: Mon, 14 Oct 2024 15:45:38 +0000 (+0300) Subject: lib-imap: Introduce imap_write_capability() function. X-Git-Tag: 2.4.1~620 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=08aa1c03f2f9b783782042faf7db626237bf426e;p=thirdparty%2Fdovecot%2Fcore.git lib-imap: Introduce imap_write_capability() function. --- diff --git a/src/lib-imap/imap-util.c b/src/lib-imap/imap-util.c index dc1ae24466..944f091fc2 100644 --- a/src/lib-imap/imap-util.c +++ b/src/lib-imap/imap-util.c @@ -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)); + } +} diff --git a/src/lib-imap/imap-util.h b/src/lib-imap/imap-util.h index 47b7d2c066..0c21406876 100644 --- a/src/lib-imap/imap-util.h +++ b/src/lib-imap/imap-util.h @@ -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 diff --git a/src/lib-imap/test-imap-util.c b/src/lib-imap/test-imap-util.c index 90f59a1c80..9757412d66 100644 --- a/src/lib-imap/test-imap-util.c +++ b/src/lib-imap/test-imap-util.c @@ -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);