summary refs log tree commit diff stats
path: root/worker/imap
diff options
context:
space:
mode:
authorReto Brunner <reto@labrat.space>2019-05-26 12:24:18 +0200
committerDrew DeVault <sir@cmpwn.com>2019-05-26 12:52:24 -0400
commit61f1b229ecf332e79b7d9e33e965a1a23310c01d (patch)
treeaf812c5f2f8790bfb11df84b654408930c463388 /worker/imap
parentee61c28e75dd0dadb7514b2b9cabdc9bf5390d03 (diff)
downloadaerc-61f1b229ecf332e79b7d9e33e965a1a23310c01d.tar.gz
Skip non selectable mailboxes in directory listing
If a MailboxInfo has the attribute \Noselect,
it is not possible to use this name as a selectable mailbox.

Therefore it should not be passed to the directory handlers.
The issue pops up if one has a hierarchy like this:
INBOX
INBOX/lists/stuff
INBOX/lists/otherStuff

Even though lists is not a valid inbox (doesn't contain mail, only other maildirs)
it will show up in the directory listing, when we iterate over the MailboxInfo.

It does have the corresponding attribute set though and we can simply filter it out.
Diffstat (limited to 'worker/imap')
-rw-r--r--worker/imap/list.go13
1 files changed, 13 insertions, 0 deletions
diff --git a/worker/imap/list.go b/worker/imap/list.go
index 75f189f..6aecbca 100644
--- a/worker/imap/list.go
+++ b/worker/imap/list.go
@@ -12,6 +12,10 @@ func (imapw *IMAPWorker) handleListDirectories(msg *types.ListDirectories) {
 
 	go func() {
 		for mbox := range mailboxes {
+			if !canOpen(mbox) {
+				// no need to pass this to handlers if it can't be opened
+				continue
+			}
 			imapw.worker.PostMessage(&types.Directory{
 				Message:    types.RespondTo(msg),
 				Name:       mbox.Name,
@@ -30,3 +34,12 @@ func (imapw *IMAPWorker) handleListDirectories(msg *types.ListDirectories) {
 			&types.Done{types.RespondTo(msg)}, nil)
 	}
 }
+
+func canOpen(mbox *imap.MailboxInfo) bool {
+	for _, attr := range mbox.Attributes {
+		if attr == imap.NoSelectAttr {
+			return false
+		}
+	}
+	return true
+}