8 "golang.org/x/text/unicode/norm"
11// CheckMailboxName checks if name is valid, returning an INBOX-normalized name.
12func CheckMailboxName(name string, allowInbox bool) (normalizedName string, isInbox bool, rerr error) {
13 t := strings.Split(name, "/")
14 if strings.EqualFold(t[0], "inbox") {
15 if len(name) == len("inbox") && !allowInbox {
16 return "", true, fmt.Errorf("special mailbox name Inbox not allowed")
18 name = "Inbox" + name[len("Inbox"):]
21 if norm.NFC.String(name) != name {
22 return "", false, errors.New("non-unicode-normalized mailbox names not allowed")
28 return "", false, errors.New("empty mailbox name")
30 return "", false, errors.New(`"." not allowed`)
32 return "", false, errors.New(`".." not allowed`)
35 if strings.HasPrefix(name, "/") || strings.HasSuffix(name, "/") || strings.Contains(name, "//") {
36 return "", false, errors.New("bad slashes in mailbox name")
39 // "%" and "*" are difficult to use with the IMAP LIST command, but we allow mostly
41 if strings.HasPrefix(name, "#") {
42 return "", false, errors.New("mailbox name cannot start with hash due to conflict with imap namespaces")
45 // "#" and "&" are special in IMAP mailbox names. "#" for namespaces, "&" for
48 for _, c := range name {
50 if c <= 0x1f || c >= 0x7f && c <= 0x9f || c == 0x2028 || c == 0x2029 {
51 return "", false, errors.New("control characters not allowed in mailbox name")
54 return name, false, nil