79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package imapserver
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/emersion/go-imap/v2"
|
|
"github.com/emersion/go-imap/v2/internal"
|
|
"github.com/emersion/go-imap/v2/internal/imapwire"
|
|
)
|
|
|
|
func (c *Conn) handleStore(dec *imapwire.Decoder, numKind NumKind) error {
|
|
var (
|
|
numSet imap.NumSet
|
|
item string
|
|
)
|
|
if !dec.ExpectSP() || !dec.ExpectNumSet(numKind.wire(), &numSet) || !dec.ExpectSP() || !dec.ExpectAtom(&item) || !dec.ExpectSP() {
|
|
return dec.Err()
|
|
}
|
|
var flags []imap.Flag
|
|
isList, err := dec.List(func() error {
|
|
flag, err := internal.ExpectFlag(dec)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
flags = append(flags, flag)
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
return err
|
|
} else if !isList {
|
|
for {
|
|
flag, err := internal.ExpectFlag(dec)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
flags = append(flags, flag)
|
|
|
|
if !dec.SP() {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
if !dec.ExpectCRLF() {
|
|
return dec.Err()
|
|
}
|
|
|
|
item = strings.ToUpper(item)
|
|
silent := strings.HasSuffix(item, ".SILENT")
|
|
item = strings.TrimSuffix(item, ".SILENT")
|
|
|
|
var op imap.StoreFlagsOp
|
|
switch {
|
|
case strings.HasPrefix(item, "+"):
|
|
op = imap.StoreFlagsAdd
|
|
item = strings.TrimPrefix(item, "+")
|
|
case strings.HasPrefix(item, "-"):
|
|
op = imap.StoreFlagsDel
|
|
item = strings.TrimPrefix(item, "-")
|
|
default:
|
|
op = imap.StoreFlagsSet
|
|
}
|
|
|
|
if item != "FLAGS" {
|
|
return newClientBugError("STORE can only change FLAGS")
|
|
}
|
|
|
|
if err := c.checkState(imap.ConnStateSelected); err != nil {
|
|
return err
|
|
}
|
|
|
|
w := &FetchWriter{conn: c}
|
|
options := imap.StoreOptions{}
|
|
return c.session.Store(w, numSet, &imap.StoreFlags{
|
|
Op: op,
|
|
Silent: silent,
|
|
Flags: flags,
|
|
}, &options)
|
|
}
|