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) {
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.Flags = []string{imap.SeenFlag, imap.FlaggedFlag, imap.DeletedFlag}
status.PermanentFlags = []string{imap.SeenFlag, imap.FlaggedFlag}
status.Flags = flags
status.PermanentFlags = permFlags
status.UnseenSeqNum = 0 // TODO
for _, name := range items {
@ -446,13 +455,6 @@ func (mbox *mailbox) UpdateMessagesFlags(uid bool, seqSet *imap.SeqSet, op imap.
case imap.RemoveFlags:
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:
// TODO: send updates
switch op {
@ -465,6 +467,20 @@ func (mbox *mailbox) UpdateMessagesFlags(uid bool, seqSet *imap.SeqSet, op imap.
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 {
return err

View File

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