all repos — postern @ main

Modern mail management

internal/imap/flag.go (view raw)

 1package imap
 2
 3import (
 4	"strings"
 5
 6	"github.com/emersion/go-imap/v2"
 7)
 8
 9func isAllowedFlag(flag imap.Flag) bool {
10	if len(flag) == 0 { // RFC 9051 requires one or more characters
11		return false
12	}
13	// system flags start with "\" and are defined per RFC 9051
14	if strings.HasPrefix(string(flag), "\\") {
15		switch flag {
16		// \Recent was deprecated in IMAP 4 rev.2
17		case imap.FlagSeen, imap.FlagAnswered, imap.FlagFlagged, imap.FlagDeleted, imap.FlagDraft:
18			return true
19		default:
20			return false
21		}
22	}
23
24	// Clients are generally free in adding keywords
25	return true
26}
27
28func toIMAPFlags(flags []string) []imap.Flag {
29	out := make([]imap.Flag, 0, len(flags))
30	for _, flag := range flags {
31		if flag == "" {
32			continue
33		}
34		out = append(out, imap.Flag(flag))
35	}
36	if len(out) == 0 {
37		return nil
38	}
39	return out
40}
41
42func fromIMAPFlags(flags []imap.Flag) []string {
43	out := make([]string, 0, len(flags))
44	for _, f := range flags {
45		if string(f) == "" {
46			continue
47		}
48		out = append(out, string(f))
49	}
50	return out
51}