imap: allow setting labels (as flags)
This commit is contained in:
parent
126e260d2e
commit
8fef87f17f
|
@ -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
|
||||||
|
|
25
imap/user.go
25
imap/user.go
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue