imap: add support for COPY and MOVE

This commit is contained in:
emersion 2018-01-12 19:55:08 +01:00
parent b5969aaf83
commit 2a1b998bbb
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48
1 changed files with 49 additions and 3 deletions

View File

@ -8,6 +8,7 @@ import (
"time" "time"
"github.com/emersion/go-imap" "github.com/emersion/go-imap"
imapbackend "github.com/emersion/go-imap/backend"
"github.com/emersion/hydroxide/imap/database" "github.com/emersion/hydroxide/imap/database"
"github.com/emersion/hydroxide/protonmail" "github.com/emersion/hydroxide/protonmail"
@ -343,7 +344,11 @@ func (mbox *mailbox) SearchMessages(isUID bool, c *imap.SearchCriteria) ([]uint3
} }
func (mbox *mailbox) CreateMessage(flags []string, date time.Time, body imap.Literal) error { func (mbox *mailbox) CreateMessage(flags []string, date time.Time, body imap.Literal) error {
return errNotYetImplemented // TODO if mbox.label != protonmail.LabelDraft {
return errors.New("cannot create messages outside the Drafts mailbox")
}
return errNotYetImplemented
} }
func (mbox *mailbox) fromSeqSet(isUID bool, seqSet *imap.SeqSet) ([]string, error) { func (mbox *mailbox) fromSeqSet(isUID bool, seqSet *imap.SeqSet) ([]string, error) {
@ -404,8 +409,49 @@ func (mbox *mailbox) UpdateMessagesFlags(uid bool, seqSet *imap.SeqSet, op imap.
return nil return nil
} }
func (mbox *mailbox) CopyMessages(uid bool, seqSet *imap.SeqSet, dest string) error { func (mbox *mailbox) CopyMessages(uid bool, seqSet *imap.SeqSet, destName string) error {
return errNotYetImplemented // TODO if err := mbox.init(); err != nil {
return err
}
apiIDs, err := mbox.fromSeqSet(uid, seqSet)
if err != nil {
return err
}
dest := mbox.u.getMailboxByLabel(destName)
if dest == nil {
return imapbackend.ErrNoSuchMailbox
}
if err := mbox.u.c.LabelMessages(dest.label, apiIDs); err != nil {
return err
}
return nil
}
func (mbox *mailbox) MoveMessages(uid bool, seqSet *imap.SeqSet, destName string) error {
if err := mbox.init(); err != nil {
return err
}
apiIDs, err := mbox.fromSeqSet(uid, seqSet)
if err != nil {
return err
}
dest := mbox.u.getMailboxByLabel(destName)
if dest == nil {
return imapbackend.ErrNoSuchMailbox
}
if err := mbox.u.c.LabelMessages(dest.label, apiIDs); err != nil {
return err
}
if err := mbox.u.c.UnlabelMessages(mbox.label, apiIDs); err != nil {
return err
}
return nil
} }
func (mbox *mailbox) Expunge() error { func (mbox *mailbox) Expunge() error {