From: Stephan Bosch Date: Mon, 27 Aug 2018 21:39:02 +0000 (+0200) Subject: imap: Implement the STATUS=SIZE capability. X-Git-Tag: 2.3.10~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1404e9b6134d219682178a8de002eee02949afdf;p=thirdparty%2Fdovecot%2Fcore.git imap: Implement the STATUS=SIZE capability. Coexists with the existing proprietary X-SIZE status, which is to be deprecated in the future. --- diff --git a/configure.ac b/configure.ac index 4bb3aadaa4..8a6d86c582 100644 --- a/configure.ac +++ b/configure.ac @@ -782,7 +782,7 @@ dnl ** dnl IDLE doesn't really belong to banner. It's there just to make Blackberries dnl happy, because otherwise BIS server disables push email. capability_banner="IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE" -capability="$capability_banner SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY" +capability="$capability_banner SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY STATUS=SIZE" AC_DEFINE_UNQUOTED(CAPABILITY_STRING, "$capability", [IMAP capabilities]) AC_DEFINE_UNQUOTED(CAPABILITY_BANNER_STRING, "$capability_banner", [IMAP capabilities advertised in banner]) diff --git a/src/imap/imap-status.c b/src/imap/imap-status.c index 4bdf309744..ef521cb2f2 100644 --- a/src/imap/imap-status.c +++ b/src/imap/imap-status.c @@ -40,6 +40,8 @@ int imap_status_parse_items(struct client_command_context *cmd, flags |= IMAP_STATUS_ITEM_UNSEEN; else if (strcmp(item, "HIGHESTMODSEQ") == 0) flags |= IMAP_STATUS_ITEM_HIGHESTMODSEQ; + else if (strcmp(item, "SIZE") == 0) + flags |= IMAP_STATUS_ITEM_SIZE; else if (strcmp(item, "X-SIZE") == 0) flags |= IMAP_STATUS_ITEM_X_SIZE; else if (strcmp(item, "X-GUID") == 0) @@ -77,7 +79,8 @@ int imap_status_get_result(struct client *client, struct mailbox *box, client_enable(client, imap_feature_condstore); status |= STATUS_HIGHESTMODSEQ; } - if (HAS_ALL_BITS(items->flags, IMAP_STATUS_ITEM_X_SIZE)) + if (HAS_ANY_BITS(items->flags, IMAP_STATUS_ITEM_SIZE | + IMAP_STATUS_ITEM_X_SIZE)) metadata |= MAILBOX_METADATA_VIRTUAL_SIZE; if (HAS_ALL_BITS(items->flags, IMAP_STATUS_ITEM_X_GUID)) metadata |= MAILBOX_METADATA_GUID; @@ -149,6 +152,10 @@ int imap_status_send(struct client *client, const char *mailbox_mutf7, str_printfa(str, "HIGHESTMODSEQ %"PRIu64" ", status->highest_modseq); } + if (HAS_ALL_BITS(items->flags, IMAP_STATUS_ITEM_SIZE)) { + str_printfa(str, "SIZE %"PRIu64" ", + result->metadata.virtual_size); + } if (HAS_ALL_BITS(items->flags, IMAP_STATUS_ITEM_X_SIZE)) { str_printfa(str, "X-SIZE %"PRIu64" ", result->metadata.virtual_size); diff --git a/src/imap/imap-status.h b/src/imap/imap-status.h index 07ec8c487b..58bd58179f 100644 --- a/src/imap/imap-status.h +++ b/src/imap/imap-status.h @@ -8,8 +8,9 @@ enum imap_status_item_flags { IMAP_STATUS_ITEM_UIDVALIDITY = BIT(3), IMAP_STATUS_ITEM_UNSEEN = BIT(4), IMAP_STATUS_ITEM_HIGHESTMODSEQ = BIT(5), + IMAP_STATUS_ITEM_SIZE = BIT(6), - IMAP_STATUS_ITEM_X_SIZE = BIT(16), + IMAP_STATUS_ITEM_X_SIZE = BIT(16), /* to be deprecated */ IMAP_STATUS_ITEM_X_GUID = BIT(17), };