diff options
-rw-r--r-- | go.mod | 6 | ||||
-rw-r--r-- | go.sum | 18 | ||||
-rw-r--r-- | plugins/base/imap.go | 21 | ||||
-rw-r--r-- | plugins/base/routes.go | 15 | ||||
-rw-r--r-- | plugins/base/smtp.go | 3 | ||||
-rw-r--r-- | plugins/base/strconv.go | 12 |
6 files changed, 35 insertions, 40 deletions
@@ -7,9 +7,9 @@ require ( github.com/chris-ramon/douceur v0.2.0 github.com/dustin/go-humanize v1.0.1 github.com/emersion/go-ical v0.0.0-20220601085725-0864dccc089f - github.com/emersion/go-imap/v2 v2.0.0-alpha.7 - github.com/emersion/go-message v0.17.0 - github.com/emersion/go-sasl v0.0.0-20220912192320-0145f2c60ead + github.com/emersion/go-imap/v2 v2.0.0-alpha.8 + github.com/emersion/go-message v0.18.0 + github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 github.com/emersion/go-smtp v0.18.1 github.com/emersion/go-vcard v0.0.0-20230815062825-8fda7d206ec9 github.com/emersion/go-webdav v0.4.1-0.20231227221649-7e076258d6c1 @@ -12,14 +12,13 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/emersion/go-ical v0.0.0-20220601085725-0864dccc089f h1:feGUUxxvOtWVOhTko8Cbmp33a+tU0IMZxMEmnkoAISQ= github.com/emersion/go-ical v0.0.0-20220601085725-0864dccc089f/go.mod h1:2MKFUgfNMULRxqZkadG1Vh44we3y5gJAtTBlVsx1BKQ= -github.com/emersion/go-imap/v2 v2.0.0-alpha.7 h1:CN25ax8kmTOLrhsxWIqlsDVvFYuIyaTYEHPOYgQ1S5A= -github.com/emersion/go-imap/v2 v2.0.0-alpha.7/go.mod h1:NQQIs7aGbZC7CuvEp9yfidW2TCstC3rUIo4k8LbqxzA= -github.com/emersion/go-message v0.16.0/go.mod h1:pDJDgf/xeUIF+eicT6B/hPX/ZbEorKkUMPOxrPVG2eQ= -github.com/emersion/go-message v0.17.0 h1:NIdSKHiVUx4qKqdd0HyJFD41cW8iFguM2XJnRZWQH04= -github.com/emersion/go-message v0.17.0/go.mod h1:/9Bazlb1jwUNB0npYYBsdJ2EMOiiyN3m5UVHbY7GoNw= +github.com/emersion/go-imap/v2 v2.0.0-alpha.8 h1:OCh6kS5N7/3AXfJ+may4CA4C0asg4F9PWQN4355nVaQ= +github.com/emersion/go-imap/v2 v2.0.0-alpha.8/go.mod h1:HVKGwfmw6RkfT33vW8DQpSlvGJatNivoFNl/z/Sq4vE= +github.com/emersion/go-message v0.18.0 h1:7LxAXHRpSeoO/Wom3ZApVZYG7c3d17yCScYce8WiXA8= +github.com/emersion/go-message v0.18.0/go.mod h1:Zi69ACvzaoV/MBnrxfVBPV3xWEuCmC2nEN39oJF4B8A= github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= -github.com/emersion/go-sasl v0.0.0-20220912192320-0145f2c60ead h1:fI1Jck0vUrXT8bnphprS1EoVRe2Q5CKCX8iDlpqjQ/Y= -github.com/emersion/go-sasl v0.0.0-20220912192320-0145f2c60ead/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= +github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 h1:hH4PQfOndHDlpzYfLAAfl63E8Le6F2+EL/cdhlkyRJY= +github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= github.com/emersion/go-smtp v0.18.1 h1:4DFV0jxKhq0Gqt/Br3BRHyKZy5TStk6NIMHAx6GE/LA= github.com/emersion/go-smtp v0.18.1/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ= github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 h1:IbFBtwoTQyw0fIM5xv1HF+Y+3ZijDR839WMulgxCcUY= @@ -132,12 +131,11 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/plugins/base/imap.go b/plugins/base/imap.go index e9636e3..ec4947d 100644 --- a/plugins/base/imap.go +++ b/plugins/base/imap.go @@ -448,7 +448,8 @@ func listMessages(conn *imapclient.Client, mboxName string, page, messagesPerPag return nil, total, nil } - seqSet := imap.SeqSetRange(uint32(from), uint32(to)) + var seqSet imap.SeqSet + seqSet.AddRange(uint32(from), uint32(to)) options := imap.FetchOptions{ Flags: true, Envelope: true, @@ -486,7 +487,7 @@ func searchMessages(conn *imapclient.Client, mboxName, query string, page, messa if err != nil { return nil, 0, fmt.Errorf("SEARCH failed: %v", err) } - nums = data.AllNums() + nums = data.AllSeqNums() } else { sortOptions := &imapclient.SortOptions{ SearchCriteria: searchCriteria, @@ -541,13 +542,11 @@ func searchMessages(conn *imapclient.Client, mboxName, query string, page, messa return msgs, total, nil } -func getMessagePart(conn *imapclient.Client, mboxName string, uid uint32, partPath []int) (*IMAPMessage, *message.Entity, error) { +func getMessagePart(conn *imapclient.Client, mboxName string, uid imap.UID, partPath []int) (*IMAPMessage, *message.Entity, error) { if err := ensureMailboxSelected(conn, mboxName); err != nil { return nil, nil, err } - seqSet := imap.SeqSetNum(uid) - headerItem := &imap.FetchItemBodySection{ Peek: true, Part: partPath, @@ -577,7 +576,7 @@ func getMessagePart(conn *imapclient.Client, mboxName string, uid uint32, partPa } // TODO: stream attachments - msgs, err := conn.UIDFetch(seqSet, &options).Collect() + msgs, err := conn.Fetch(imap.UIDSetNum(uid), &options).Collect() if err != nil { return nil, nil, fmt.Errorf("failed to fetch message: %v", err) } else if len(msgs) == 0 { @@ -610,13 +609,12 @@ func getMessagePart(conn *imapclient.Client, mboxName string, uid uint32, partPa return &IMAPMessage{msg, mboxName}, part, nil } -func markMessageAnswered(conn *imapclient.Client, mboxName string, uid uint32) error { +func markMessageAnswered(conn *imapclient.Client, mboxName string, uid imap.UID) error { if err := ensureMailboxSelected(conn, mboxName); err != nil { return err } - seqSet := imap.SeqSetNum(uid) - return conn.UIDStore(seqSet, &imap.StoreFlags{ + return conn.Store(imap.UIDSetNum(uid), &imap.StoreFlags{ Op: imap.StoreFlagsAdd, Silent: true, Flags: []imap.Flag{imap.FlagAnswered}, @@ -655,13 +653,12 @@ func appendMessage(c *imapclient.Client, msg *OutgoingMessage, mboxType mailboxT return mbox, nil } -func deleteMessage(conn *imapclient.Client, mboxName string, uid uint32) error { +func deleteMessage(conn *imapclient.Client, mboxName string, uid imap.UID) error { if err := ensureMailboxSelected(conn, mboxName); err != nil { return err } - seqSet := imap.SeqSetNum(uid) - err := conn.UIDStore(seqSet, &imap.StoreFlags{ + err := conn.Store(imap.UIDSetNum(uid), &imap.StoreFlags{ Op: imap.StoreFlagsAdd, Silent: true, Flags: []imap.Flag{imap.FlagDeleted}, diff --git a/plugins/base/routes.go b/plugins/base/routes.go index 8b346a2..482b368 100644 --- a/plugins/base/routes.go +++ b/plugins/base/routes.go @@ -514,7 +514,7 @@ type ComposeRenderData struct { type messagePath struct { Mailbox string - Uid uint32 + Uid imap.UID } type composeOptions struct { @@ -674,7 +674,7 @@ func handleCompose(ctx *alps.Context, msg *OutgoingMessage, options *composeOpti if saveAsDraft { var ( drafts *MailboxInfo - uid uint32 + uid imap.UID ) err = ctx.Session.DoIMAP(func(c *imapclient.Client) error { drafts, err = appendMessage(c, msg, mailboxDrafts) @@ -700,7 +700,7 @@ func handleCompose(ctx *alps.Context, msg *OutgoingMessage, options *composeOpti } if data, err := c.UIDSearch(&criteria, nil).Wait(); err != nil { return err - } else if uids := data.AllNums(); len(uids) != 1 { + } else if uids := data.AllUIDs(); len(uids) != 1 { panic(fmt.Errorf("Duplicate message ID")) } else { uid = uids[0] @@ -1049,8 +1049,7 @@ func handleMove(ctx *alps.Context) error { return err } - seqSet := imap.SeqSetNum(uids...) - if _, err := c.UIDMove(seqSet, to).Wait(); err != nil { + if _, err := c.Move(imap.UIDSetNum(uids...), to).Wait(); err != nil { return fmt.Errorf("failed to move message: %v", err) } @@ -1093,8 +1092,7 @@ func handleDelete(ctx *alps.Context) error { return err } - seqSet := imap.SeqSetNum(uids...) - err := c.UIDStore(seqSet, &imap.StoreFlags{ + err := c.Store(imap.UIDSetNum(uids...), &imap.StoreFlags{ Op: imap.StoreFlagsAdd, Silent: true, Flags: []imap.Flag{imap.FlagDeleted}, @@ -1172,8 +1170,7 @@ func handleSetFlags(ctx *alps.Context) error { return err } - seqSet := imap.SeqSetNum(uids...) - err := c.UIDStore(seqSet, &imap.StoreFlags{ + err := c.Store(imap.UIDSetNum(uids...), &imap.StoreFlags{ Op: op, Silent: true, Flags: l, diff --git a/plugins/base/smtp.go b/plugins/base/smtp.go index 8892cae..bf91c24 100644 --- a/plugins/base/smtp.go +++ b/plugins/base/smtp.go @@ -11,6 +11,7 @@ import ( "strings" "time" + "github.com/emersion/go-imap/v2" "github.com/emersion/go-message/mail" "github.com/emersion/go-smtp" ) @@ -56,7 +57,7 @@ func (att *formAttachment) Filename() string { type imapAttachment struct { Mailbox string - Uid uint32 + Uid imap.UID Node *IMAPPartNode Body []byte diff --git a/plugins/base/strconv.go b/plugins/base/strconv.go index b423f13..4266e00 100644 --- a/plugins/base/strconv.go +++ b/plugins/base/strconv.go @@ -5,9 +5,11 @@ import ( "net/url" "strconv" "strings" + + "github.com/emersion/go-imap/v2" ) -func parseUid(s string) (uint32, error) { +func parseUid(s string) (imap.UID, error) { uid, err := strconv.ParseUint(s, 10, 32) if err != nil { return 0, fmt.Errorf("invalid UID: %v", err) @@ -15,10 +17,10 @@ func parseUid(s string) (uint32, error) { if uid == 0 { return 0, fmt.Errorf("UID must be non-zero") } - return uint32(uid), nil + return imap.UID(uid), nil } -func parseMboxAndUid(mboxString, uidString string) (string, uint32, error) { +func parseMboxAndUid(mboxString, uidString string) (string, imap.UID, error) { mboxName, err := url.PathUnescape(mboxString) if err != nil { return "", 0, fmt.Errorf("invalid mailbox name: %v", err) @@ -27,8 +29,8 @@ func parseMboxAndUid(mboxString, uidString string) (string, uint32, error) { return mboxName, uid, err } -func parseUidList(values []string) ([]uint32, error) { - var uids []uint32 +func parseUidList(values []string) ([]imap.UID, error) { + var uids []imap.UID for _, v := range values { uid, err := parseUid(v) if err != nil { |