imap: allow setting labels (as flags)

This commit is contained in:
Simon Ser 2020-02-29 11:43:24 +01:00
parent 126e260d2e
commit 8fef87f17f
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48
2 changed files with 45 additions and 14 deletions

View File

@ -60,9 +60,18 @@ func (mbox *mailbox) Info() (*imap.MailboxInfo, error) {
} }
func (mbox *mailbox) Status(items []imap.StatusItem) (*imap.MailboxStatus, error) { func (mbox *mailbox) Status(items []imap.StatusItem) (*imap.MailboxStatus, error) {
mbox.u.locker.Lock()
flags := []string{imap.SeenFlag, imap.DeletedFlag}
permFlags := []string{imap.SeenFlag}
for _, flag := range mbox.u.flags {
flags = append(flags, flag)
permFlags = append(permFlags, flag)
}
mbox.u.locker.Unlock()
status := imap.NewMailboxStatus(mbox.name, items) status := imap.NewMailboxStatus(mbox.name, items)
status.Flags = []string{imap.SeenFlag, imap.FlaggedFlag, imap.DeletedFlag} status.Flags = flags
status.PermanentFlags = []string{imap.SeenFlag, imap.FlaggedFlag} status.PermanentFlags = permFlags
status.UnseenSeqNum = 0 // TODO status.UnseenSeqNum = 0 // TODO
for _, name := range items { for _, name := range items {
@ -446,13 +455,6 @@ func (mbox *mailbox) UpdateMessagesFlags(uid bool, seqSet *imap.SeqSet, op imap.
case imap.RemoveFlags: case imap.RemoveFlags:
err = mbox.u.c.MarkMessagesUnread(apiIDs) err = mbox.u.c.MarkMessagesUnread(apiIDs)
} }
case imap.FlaggedFlag:
switch op {
case imap.SetFlags, imap.AddFlags:
err = mbox.u.c.LabelMessages(protonmail.LabelStarred, apiIDs)
case imap.RemoveFlags:
err = mbox.u.c.UnlabelMessages(protonmail.LabelStarred, apiIDs)
}
case imap.DeletedFlag: case imap.DeletedFlag:
// TODO: send updates // TODO: send updates
switch op { switch op {
@ -465,6 +467,20 @@ func (mbox *mailbox) UpdateMessagesFlags(uid bool, seqSet *imap.SeqSet, op imap.
delete(mbox.deleted, apiID) delete(mbox.deleted, apiID)
} }
} }
case imap.DraftFlag:
// No-op
default:
label := mbox.u.getFlag(flag)
if label == "" {
break
}
switch op {
case imap.SetFlags, imap.AddFlags:
err = mbox.u.c.LabelMessages(label, apiIDs)
case imap.RemoveFlags:
err = mbox.u.c.UnlabelMessages(label, apiIDs)
}
} }
if err != nil { if err != nil {
return err return err

View File

@ -30,9 +30,12 @@ var systemMailboxes = []struct {
{"Trash", protonmail.LabelTrash, []string{specialuse.Trash}}, {"Trash", protonmail.LabelTrash, []string{specialuse.Trash}},
} }
var systemFlags = map[string]string{ var systemFlags = []struct {
imap.FlaggedFlag: protonmail.LabelStarred, name string
imap.DraftFlag: protonmail.LabelDraft, label string
}{
{imap.FlaggedFlag, protonmail.LabelStarred},
{imap.DraftFlag, protonmail.LabelDraft},
} }
type user struct { type user struct {
@ -151,8 +154,8 @@ func (u *user) initMailboxes() error {
} }
u.flags = make(map[string]string) u.flags = make(map[string]string)
for flag, label := range systemFlags { for _, data := range systemFlags {
u.flags[flag] = label u.flags[data.label] = data.name
} }
labels, err := u.c.ListLabels() labels, err := u.c.ListLabels()
@ -235,6 +238,18 @@ func (u *user) GetMailbox(name string) (imapbackend.Mailbox, error) {
return mbox, nil return mbox, nil
} }
func (u *user) getFlag(name string) string {
u.locker.Lock()
defer u.locker.Unlock()
for label, flag := range u.flags {
if flag == name {
return label
}
}
return ""
}
func (u *user) CreateMailbox(name string) error { func (u *user) CreateMailbox(name string) error {
return errNotYetImplemented // TODO return errNotYetImplemented // TODO
} }