From fe73f2022c89ab7e32644668a3499698dd2f8368 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 18 Mar 2020 21:10:40 +0100 Subject: [PATCH] plugins/base: add action param to handleSetFlags This alows to add/remove flags instead of setting them. --- plugins/base/imap.go | 1 - plugins/base/routes.go | 18 +++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/plugins/base/imap.go b/plugins/base/imap.go index dd78e3f..ffa172f 100755 --- a/plugins/base/imap.go +++ b/plugins/base/imap.go @@ -450,7 +450,6 @@ func getMessagePart(conn *imapclient.Client, mboxName string, uid uint32, partPa partHeaderSection.Path = partPath var partBodySection imap.BodySectionName - partBodySection.Peek = true if len(partPath) > 0 { partBodySection.Specifier = imap.EntireSpecifier } else { diff --git a/plugins/base/routes.go b/plugins/base/routes.go index c24d3bb..0237634 100644 --- a/plugins/base/routes.go +++ b/plugins/base/routes.go @@ -738,6 +738,18 @@ func handleSetFlags(ctx *koushin.Context) error { return echo.NewHTTPError(http.StatusBadRequest, "missing 'flags' form values") } + var op imap.FlagsOp + switch ctx.FormValue("action") { + case "", "set": + op = imap.SetFlags + case "add": + op = imap.AddFlags + case "remove": + op = imap.RemoveFlags + default: + return echo.NewHTTPError(http.StatusBadRequest, "invalid 'action' value") + } + err = ctx.Session.DoIMAP(func(c *imapclient.Client) error { if err := ensureMailboxSelected(c, mboxName); err != nil { return err @@ -751,7 +763,7 @@ func handleSetFlags(ctx *koushin.Context) error { storeItems[i] = f } - item := imap.FormatFlagsOp(imap.SetFlags, true) + item := imap.FormatFlagsOp(op, true) if err := c.UidStore(&seqSet, item, storeItems, nil); err != nil { return fmt.Errorf("failed to add deleted flag: %v", err) } @@ -762,6 +774,10 @@ func handleSetFlags(ctx *koushin.Context) error { return err } + if op == imap.RemoveFlags && len(flags) == 1 && flags[0] == "\\Seen" { + // Redirecting to the message view would mark the message as read again + return ctx.Redirect(http.StatusFound, fmt.Sprintf("/mailbox/%v", url.PathEscape(mboxName))) + } return ctx.Redirect(http.StatusFound, fmt.Sprintf("/message/%v/%v", url.PathEscape(mboxName), uid)) }