]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap: Implement the STATUS=SIZE capability.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Mon, 27 Aug 2018 21:39:02 +0000 (23:39 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Thu, 6 Feb 2020 13:21:47 +0000 (13:21 +0000)
Coexists with the existing proprietary X-SIZE status, which is to be deprecated
in the future.

configure.ac
src/imap/imap-status.c
src/imap/imap-status.h

index 4bb3aadaa4b9128ba0ca11ebaeb9c9c06c93d791..8a6d86c5826d93bd00df561bb468cdfbd42cce4c 100644 (file)
@@ -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])
 
index 4bdf3097446e4681bb12334a3cfde17458c7f30e..ef521cb2f21f28e44457e01cf99e7fe5453a47d4 100644 (file)
@@ -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);
index 07ec8c487b8f0a7085ae7723c9beaabb447ce2c1..58bd58179f6efdcfdd1aaa72798d6cdaa110d6f9 100644 (file)
@@ -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),
 };