55 lines
1.0 KiB
Go
55 lines
1.0 KiB
Go
package imapserver
|
|
|
|
import (
|
|
"github.com/emersion/go-imap/v2"
|
|
"github.com/emersion/go-imap/v2/internal/imapwire"
|
|
)
|
|
|
|
func (c *Conn) handleNamespace(dec *imapwire.Decoder) error {
|
|
if !dec.ExpectCRLF() {
|
|
return dec.Err()
|
|
}
|
|
|
|
if err := c.checkState(imap.ConnStateAuthenticated); err != nil {
|
|
return err
|
|
}
|
|
|
|
session, ok := c.session.(SessionNamespace)
|
|
if !ok {
|
|
return newClientBugError("NAMESPACE is not supported")
|
|
}
|
|
|
|
data, err := session.Namespace()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
enc := newResponseEncoder(c)
|
|
defer enc.end()
|
|
enc.Atom("*").SP().Atom("NAMESPACE").SP()
|
|
writeNamespace(enc.Encoder, data.Personal)
|
|
enc.SP()
|
|
writeNamespace(enc.Encoder, data.Other)
|
|
enc.SP()
|
|
writeNamespace(enc.Encoder, data.Shared)
|
|
return enc.CRLF()
|
|
}
|
|
|
|
func writeNamespace(enc *imapwire.Encoder, l []imap.NamespaceDescriptor) {
|
|
if l == nil {
|
|
enc.NIL()
|
|
return
|
|
}
|
|
|
|
enc.List(len(l), func(i int) {
|
|
descr := l[i]
|
|
enc.Special('(').String(descr.Prefix).SP()
|
|
if descr.Delim == 0 {
|
|
enc.NIL()
|
|
} else {
|
|
enc.Quoted(string(descr.Delim))
|
|
}
|
|
enc.Special(')')
|
|
})
|
|
}
|