From 1b0c12018b46c2195a1f036a6d7c057c818b7b67 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Sat, 25 Apr 2015 11:42:06 +0200 Subject: [PATCH] imap: Implemented /private/specialuse METADATA entry for SPECIAL-USE capability. --- src/lib-storage/Makefile.am | 2 + src/lib-storage/mailbox-attribute-internal.c | 48 ++++++++++++++++++++ src/lib-storage/mailbox-attribute-internal.h | 9 ++++ src/lib-storage/mailbox-attribute.c | 4 ++ 4 files changed, 63 insertions(+) create mode 100644 src/lib-storage/mailbox-attribute-internal.c create mode 100644 src/lib-storage/mailbox-attribute-internal.h diff --git a/src/lib-storage/Makefile.am b/src/lib-storage/Makefile.am index 822a053808..5492b9914c 100644 --- a/src/lib-storage/Makefile.am +++ b/src/lib-storage/Makefile.am @@ -45,6 +45,7 @@ libstorage_la_SOURCES = \ mail-thread.c \ mail-user.c \ mailbox-attribute.c \ + mailbox-attribute-internal.c \ mailbox-get.c \ mailbox-guid-cache.c \ mailbox-header.c \ @@ -75,6 +76,7 @@ headers = \ mail-storage-settings.h \ mail-user.h \ mailbox-attribute.h \ + mailbox-attribute-internal.h \ mailbox-attribute-private.h \ mailbox-guid-cache.h \ mailbox-list.h \ diff --git a/src/lib-storage/mailbox-attribute-internal.c b/src/lib-storage/mailbox-attribute-internal.c new file mode 100644 index 0000000000..6c87b4b569 --- /dev/null +++ b/src/lib-storage/mailbox-attribute-internal.c @@ -0,0 +1,48 @@ +/* Copyright (c) 2003-2015 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "mail-storage-private.h" +#include "mailbox-attribute-internal.h" + +/* + * Internal mailbox attributes + */ + + /* /private/specialuse (RFC 6154) */ + +static int +mailbox_attribute_specialuse_get(struct mailbox_transaction_context *t, + const char *key ATTR_UNUSED, + struct mail_attribute_value *value_r) +{ + const struct mailbox_settings *set = t->box->set; + + if (set == NULL || *set->special_use == '\0') + return 0; + + value_r->value = set->special_use; + return 1; +} + +static struct mailbox_attribute_internal +iattr_mbox_prv_special_use = { + .type = MAIL_ATTRIBUTE_TYPE_PRIVATE, + .key = MAILBOX_ATTRIBUTE_SPECIALUSE, + .rank = MAIL_ATTRIBUTE_INTERNAL_RANK_AUTHORITY, + + .get = mailbox_attribute_specialuse_get +}; + +/* + * Registry + */ + +void mailbox_attributes_internal_init(void) +{ + /* + * Internal mailbox attributes + */ + + /* /private/specialuse (RFC 6154) */ + mailbox_attribute_register_internal(&iattr_mbox_prv_special_use); +} diff --git a/src/lib-storage/mailbox-attribute-internal.h b/src/lib-storage/mailbox-attribute-internal.h new file mode 100644 index 0000000000..888780b2d1 --- /dev/null +++ b/src/lib-storage/mailbox-attribute-internal.h @@ -0,0 +1,9 @@ +#ifndef MAILBOX_ATTRIBUTE_INTERNAL_H +#define MAILBOX_ATTRIBUTE_INTERNAL_H + +/* RFC 6154, Section 4: IMAP METADATA Entry for Special-Use Attributes */ +#define MAILBOX_ATTRIBUTE_SPECIALUSE "specialuse" + +void mailbox_attributes_internal_init(void); + +#endif diff --git a/src/lib-storage/mailbox-attribute.c b/src/lib-storage/mailbox-attribute.c index 9e4edd04c5..ba94e4711c 100644 --- a/src/lib-storage/mailbox-attribute.c +++ b/src/lib-storage/mailbox-attribute.c @@ -6,6 +6,7 @@ #include "istream.h" #include "mail-storage-private.h" #include "bsearch-insert-pos.h" +#include "mailbox-attribute-internal.h" static ARRAY(struct mailbox_attribute_internal) mailbox_internal_attributes; static pool_t mailbox_attribute_pool; @@ -15,6 +16,9 @@ void mailbox_attributes_init(void) mailbox_attribute_pool = pool_alloconly_create("mailbox attributes", 2048); i_array_init(&mailbox_internal_attributes, 32); + + /* internal mailbox attributes */ + mailbox_attributes_internal_init(); } void mailbox_attributes_deinit(void) -- 2.47.3