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