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

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