From 08aa1c03f2f9b783782042faf7db626237bf426e Mon Sep 17 00:00:00 2001 From: "sergey.kitov" Date: Mon, 14 Oct 2024 18:45:38 +0300 Subject: [PATCH] lib-imap: Introduce imap_write_capability() function. --- src/lib-imap/imap-util.c | 24 ++++++++++++++++++++++++ src/lib-imap/imap-util.h | 5 +++++ src/lib-imap/test-imap-util.c | 17 +++++++++++++++++ 3 files changed, 46 insertions(+) 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); -- 2.47.3