github.com/jordwest/imap-server@v0.0.0-20200627020849-1cf758ba359f/conn/command_store.go (about) 1 package conn 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/jordwest/imap-server/mailstore" 8 "github.com/jordwest/imap-server/types" 9 ) 10 11 const storeArgUID int = 0 12 const storeArgRange int = 1 13 const storeArgOperation int = 2 14 const storeArgSilent int = 3 15 const storeArgFlags int = 4 16 17 func cmdStoreFlags(args commandArgs, c *Conn) { 18 if !c.assertSelected(args.ID(), readWrite) { 19 return 20 } 21 22 operation := args.Arg(storeArgOperation) 23 flags := args.Arg(storeArgFlags) 24 uid := strings.ToUpper(args.Arg(storeArgUID)) == "UID " 25 seqSetStr := args.Arg(storeArgRange) 26 27 silent := false 28 if args.Arg(storeArgSilent) == ".SILENT" { 29 silent = true 30 } 31 32 var msgs []mailstore.Message 33 seqSet, err := types.InterpretSequenceSet(seqSetStr) 34 if err != nil { 35 c.writeResponse(args.ID(), "NO "+err.Error()) 36 return 37 } 38 if uid { 39 msgs = c.SelectedMailbox.MessageSetByUID(seqSet) 40 } else { 41 msgs = c.SelectedMailbox.MessageSetBySequenceNumber(seqSet) 42 } 43 44 flagField := types.FlagsFromString(flags) 45 for _, msg := range msgs { 46 47 if operation == "+" { 48 msg = msg.AddFlags(flagField) 49 } else if operation == "-" { 50 msg = msg.RemoveFlags(flagField) 51 } else { 52 msg = msg.OverwriteFlags(flagField) 53 } 54 msg.Save() 55 56 if err != nil { 57 c.writeResponse(args.ID(), "NO "+err.Error()) 58 return 59 } 60 61 // Auto-fetch for the client 62 if !silent { 63 newFlags, err := fetch("FLAGS", c, msg) 64 if err != nil { 65 c.writeResponse(args.ID(), "NO "+err.Error()) 66 return 67 } 68 69 fetchResponse := fmt.Sprintf("%d FETCH (%s)", 70 msg.SequenceNumber(), 71 newFlags, 72 ) 73 74 c.writeResponse("", fetchResponse) 75 } 76 } 77 78 c.writeResponse(args.ID(), "OK STORE Completed") 79 }