From 484502117fc2ce04627e3cc7c0efa40e6c18d272 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Thu, 11 Oct 2007 02:21:35 +0000 Subject: [PATCH] Completed the implementation of RFC2359 (the UIDPLUS extension to IMAP). --- citadel/modules/imap/imap_misc.c | 37 ++++++++++++++++++++++++++++++-- citadel/modules/imap/serv_imap.c | 2 +- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/citadel/modules/imap/imap_misc.c b/citadel/modules/imap/imap_misc.c index d75db8a34..b8e50c2aa 100644 --- a/citadel/modules/imap/imap_misc.c +++ b/citadel/modules/imap/imap_misc.c @@ -144,6 +144,35 @@ int imap_do_copy(char *destination_folder) { } +/* + * Output the [COPYUID xxx yyy] response code required by RFC2359 + * to tell the client the UID's of the messages that were copied (if any). + * We are assuming that the IMAP_SELECTED flag is still set on any relevant + * messages in our source room. Since the Citadel system uses UID's that + * are both globally unique and persistent across a room-to-room copy, we + * can get this done quite easily. + */ +void imap_output_copyuid_response(void) { + int i; + int num_output = 0; + + for (i = 0; i < IMAP->num_msgs; ++i) { + if (IMAP->flags[i] & IMAP_SELECTED) { + ++num_output; + if (num_output == 1) { + cprintf("[COPYUID "); + } + else if (num_output > 1) { + cprintf(","); + } + cprintf("%ld", IMAP->msgids[i]); + } + } + if (num_output > 0) { + cprintf("] "); + } +} + /* * This function is called by the main command loop. @@ -166,7 +195,9 @@ void imap_copy(int num_parms, char *parms[]) { ret = imap_do_copy(parms[3]); if (!ret) { - cprintf("%s OK COPY completed\r\n", parms[0]); + cprintf("%s OK ", parms[0]); + imap_output_copyuid_response(); + cprintf("COPY completed\r\n"); } else { cprintf("%s NO COPY failed (error %d)\r\n", parms[0], ret); @@ -192,7 +223,9 @@ void imap_uidcopy(int num_parms, char *parms[]) { } if (imap_do_copy(parms[4]) == 0) { - cprintf("%s OK UID COPY completed\r\n", parms[0]); + cprintf("%s OK ", parms[0]); + imap_output_copyuid_response(); + cprintf("UID COPY completed\r\n"); } else { cprintf("%s NO UID COPY failed\r\n", parms[0]); diff --git a/citadel/modules/imap/serv_imap.c b/citadel/modules/imap/serv_imap.c index b7d44b557..098ce942f 100644 --- a/citadel/modules/imap/serv_imap.c +++ b/citadel/modules/imap/serv_imap.c @@ -435,7 +435,7 @@ void imap_cleanup_function(void) * output this stuff in other places as well) */ void imap_output_capability_string(void) { - cprintf("CAPABILITY IMAP4REV1 NAMESPACE ID AUTH=PLAIN AUTH=LOGIN"); + cprintf("CAPABILITY IMAP4REV1 NAMESPACE ID AUTH=PLAIN AUTH=LOGIN UIDPLUS"); #ifdef HAVE_OPENSSL if (!CC->redirect_ssl) cprintf(" STARTTLS"); -- 2.30.2