mirror of
https://github.com/mjl-/mox.git
synced 2025-07-19 02:46:37 +03:00
implement the imap metadata extension, rfc 5464
this allows setting per-mailbox and per-server annotations (metadata). we have a fixed maximum for total number of annotations (1000) and their total size (1000000 bytes). this size isn't held against the regular quota for simplicity. we send unsolicited metadata responses when a connection is in the idle command and a change to a metadata item is made. we currently only implement the /private/ namespace. we should implement the /shared/ namespace, for mox-global metadata annotations. only the admin should be able to configure those, probably through the config file, cli, or admin web interface. for issue #290
This commit is contained in:
@ -427,6 +427,50 @@ func (c *Conn) xuntagged() Untagged {
|
||||
c.xcrlf()
|
||||
return r
|
||||
|
||||
case "METADATA":
|
||||
// ../rfc/5464:807
|
||||
c.xspace()
|
||||
mailbox := c.xastring()
|
||||
c.xspace()
|
||||
if !c.take('(') {
|
||||
// Unsolicited form, with only annotation keys, not values.
|
||||
var keys []string
|
||||
for {
|
||||
key := c.xastring()
|
||||
keys = append(keys, key)
|
||||
if !c.space() {
|
||||
break
|
||||
}
|
||||
}
|
||||
c.xcrlf()
|
||||
return UntaggedMetadataKeys{mailbox, keys}
|
||||
}
|
||||
|
||||
// Form with values, in response to GETMETADATA command.
|
||||
r := UntaggedMetadataAnnotations{Mailbox: mailbox}
|
||||
for {
|
||||
key := c.xastring()
|
||||
c.xspace()
|
||||
var value []byte
|
||||
var isString bool
|
||||
if c.take('~') {
|
||||
value = c.xliteral()
|
||||
} else {
|
||||
value = []byte(c.xstring())
|
||||
isString = true
|
||||
// note: the abnf also allows nstring, but that only makes sense when the
|
||||
// production rule is used in the setmetadata command. ../rfc/5464:831
|
||||
}
|
||||
r.Annotations = append(r.Annotations, Annotation{key, isString, value})
|
||||
|
||||
if c.take(')') {
|
||||
break
|
||||
}
|
||||
c.xspace()
|
||||
}
|
||||
c.xcrlf()
|
||||
return r
|
||||
|
||||
case "NAMESPACE":
|
||||
// ../rfc/9051:6778
|
||||
c.xspace()
|
||||
|
Reference in New Issue
Block a user