Forked the emersion/go-imap v1 project.
This commit is contained in:
54
imapserver/namespace.go
Normal file
54
imapserver/namespace.go
Normal file
@@ -0,0 +1,54 @@
|
||||
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(')')
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user