Files
go-imap/imapserver/namespace.go
2025-12-08 06:42:29 +02:00

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(')')
})
}