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  }