mailbox-attribute.h revision 7f0fad65a36fab61739a50ea110e243b225d5d18
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch#ifndef MAILBOX_ATTRIBUTE_H
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch#define MAILBOX_ATTRIBUTE_H
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschstruct mailbox;
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschstruct mailbox_transaction_context;
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch/* RFC 5464 specifies that this is vendor/<vendor-token>/. The registered
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch vendor-tokens always begin with "vendor." so there's some redundancy.. */
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch#define MAILBOX_ATTRIBUTE_PREFIX_DOVECOT "vendor/vendor.dovecot/"
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch/* Prefix used for attributes reserved for Dovecot's internal use. Normal
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch users cannot access these in any way. */
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch#define MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT \
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch MAILBOX_ATTRIBUTE_PREFIX_DOVECOT"pvt/"
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen/* Server attributes are currently stored in INBOX under this private prefix.
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen They're under the pvt/ prefix so they won't be listed as regular INBOX
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen attributes, but unlike other pvt/ attributes it's actually possible to
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen access these attributes as regular users.
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen If INBOX is deleted, attributes under this prefix are preserved. */
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch#define MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER \
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT"server/"
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen/* User can get/set all non-pvt/ attributes and also pvt/server/ attributes. */
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen#define MAILBOX_ATTRIBUTE_KEY_IS_USER_ACCESSIBLE(key) \
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen (strncmp(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT, \
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen strlen(MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT)) != 0 || \
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen strncmp(key, MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER, \
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen strlen(MAILBOX_ATTRIBUTE_PREFIX_DOVECOT_PVT_SERVER)) == 0)
7f0fad65a36fab61739a50ea110e243b225d5d18Timo Sirainen
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschenum mail_attribute_type {
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch MAIL_ATTRIBUTE_TYPE_PRIVATE,
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch MAIL_ATTRIBUTE_TYPE_SHARED
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch};
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschenum mail_attribute_value_flags {
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch MAIL_ATTRIBUTE_VALUE_FLAG_READONLY = 0x01,
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch MAIL_ATTRIBUTE_VALUE_FLAG_INT_STREAMS = 0x02
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch};
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschstruct mail_attribute_value {
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch /* mailbox_attribute_set() can set either value or value_stream.
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch mailbox_attribute_get() returns only values, but
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch mailbox_attribute_get_stream() may return either value or
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch value_stream. The caller must unreference the returned streams. */
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch const char *value;
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch struct istream *value_stream;
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch /* Last time the attribute was changed (0 = unknown). This may be
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch returned even for values that don't exist anymore. */
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch time_t last_change;
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch enum mail_attribute_value_flags flags;
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch};
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch/*
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch * Attribute API
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch */
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch/* Set mailbox attribute key to value. The key should be compatible with
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch IMAP METADATA, so for Dovecot-specific keys use
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch MAILBOX_ATTRIBUTE_PREFIX_DOVECOT. */
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschint mailbox_attribute_set(struct mailbox_transaction_context *t,
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch enum mail_attribute_type type, const char *key,
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch const struct mail_attribute_value *value);
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch/* Delete mailbox attribute key. This is just a wrapper to
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch mailbox_attribute_set() with value->value=NULL. */
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschint mailbox_attribute_unset(struct mailbox_transaction_context *t,
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch enum mail_attribute_type type, const char *key);
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch/* Returns value for mailbox attribute key. Returns 1 if value was returned,
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch 0 if value wasn't found (set to NULL), -1 if error */
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschint mailbox_attribute_get(struct mailbox_transaction_context *t,
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch enum mail_attribute_type type, const char *key,
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch struct mail_attribute_value *value_r);
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch/* Same as mailbox_attribute_get(), but the returned value may be either an
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch input stream or a string. */
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschint mailbox_attribute_get_stream(struct mailbox_transaction_context *t,
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch enum mail_attribute_type type, const char *key,
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch struct mail_attribute_value *value_r);
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch/* Iterate through mailbox attributes of the given type. The prefix can be used
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch to restrict what attributes are returned. */
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschstruct mailbox_attribute_iter *
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschmailbox_attribute_iter_init(struct mailbox *box, enum mail_attribute_type type,
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch const char *prefix);
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch/* Returns the attribute key or NULL if there are no more attributes. */
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschconst char *mailbox_attribute_iter_next(struct mailbox_attribute_iter *iter);
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Boschint mailbox_attribute_iter_deinit(struct mailbox_attribute_iter **iter);
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch#endif