about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--widgets/account.go2
-rw-r--r--widgets/dirlist.go42
-rw-r--r--worker/imap/list.go13
-rw-r--r--worker/imap/worker.go4
4 files changed, 48 insertions, 13 deletions
diff --git a/widgets/account.go b/widgets/account.go
index 72874b0..397cccd 100644
--- a/widgets/account.go
+++ b/widgets/account.go
@@ -141,7 +141,7 @@ func (acct *AccountView) connected(msg types.WorkerMessage) {
 					break
 				}
 			}
-			if dir == "" {
+			if dir == "" && len(dirs) > 0 {
 				dir = dirs[0]
 			}
 			acct.dirlist.Select(dir)
diff --git a/widgets/dirlist.go b/widgets/dirlist.go
index 1240e56..d7c4874 100644
--- a/widgets/dirlist.go
+++ b/widgets/dirlist.go
@@ -47,17 +47,6 @@ func (dirlist *DirectoryList) UpdateList(done func(dirs []string)) {
 			case *types.Directory:
 				dirs = append(dirs, msg.Name)
 			case *types.Done:
-				// There is always an INBOX, RFC-guaranteed
-				// However, for some reason Dovecot doesn't always send it.
-				inbox := false
-				for _, dir := range dirs {
-					if dir == "INBOX" {
-						inbox = true
-					}
-				}
-				if !inbox {
-					dirs = append(dirs, "INBOX")
-				}
 				sort.Strings(dirs)
 				dirlist.dirs = dirs
 				dirlist.spinner.Stop()
@@ -78,6 +67,18 @@ func (dirlist *DirectoryList) Select(name string) {
 				dirlist.selecting = ""
 			case *types.Done:
 				dirlist.selected = dirlist.selecting
+				dirlist.filterDirsByFoldersConfig()
+				hasSelected := false
+				for _, d := range dirlist.dirs {
+					if d == dirlist.selected {
+						hasSelected = true
+						break
+					}
+				}
+				if !hasSelected && dirlist.selected != "" {
+					dirlist.dirs = append(dirlist.dirs, dirlist.selected)
+				}
+				sort.Strings(dirlist.dirs)
 			}
 			dirlist.Invalidate()
 		})
@@ -158,3 +159,22 @@ func (dirlist *DirectoryList) Next() {
 func (dirlist *DirectoryList) Prev() {
 	dirlist.nextPrev(-1)
 }
+
+// filterDirsByFoldersConfig filters a folders list to only contain folders
+// present in the account.folders config option
+func (dirlist *DirectoryList) filterDirsByFoldersConfig() {
+	// config option defaults to show all if unset
+	if len(dirlist.conf.Folders) == 0 {
+		return
+	}
+	var filtered []string
+	for _, folder := range dirlist.dirs {
+		for _, cfgfolder := range dirlist.conf.Folders {
+			if folder == cfgfolder {
+				filtered = append(filtered, folder)
+				break
+			}
+		}
+	}
+	dirlist.dirs = filtered
+}
diff --git a/worker/imap/list.go b/worker/imap/list.go
index 5e282ef..552fb45 100644
--- a/worker/imap/list.go
+++ b/worker/imap/list.go
@@ -17,6 +17,19 @@ func (imapw *IMAPWorker) handleListDirectories(msg *types.ListDirectories) {
 				// no need to pass this to handlers if it can't be opened
 				continue
 			}
+			if len(imapw.config.folders) > 0 {
+				// apply user filter
+				found := false
+				for _, folder := range imapw.config.folders {
+					if folder == mbox.Name || imapw.selected.Name == mbox.Name {
+						found = true
+						break
+					}
+				}
+				if !found {
+					continue
+				}
+			}
 			imapw.worker.PostMessage(&types.Directory{
 				Message:    types.RespondTo(msg),
 				Name:       mbox.Name,
diff --git a/worker/imap/worker.go b/worker/imap/worker.go
index d978755..aa59c27 100644
--- a/worker/imap/worker.go
+++ b/worker/imap/worker.go
@@ -7,7 +7,7 @@ import (
 	"strings"
 
 	"github.com/emersion/go-imap"
-	"github.com/emersion/go-imap-idle"
+	idle "github.com/emersion/go-imap-idle"
 	"github.com/emersion/go-imap/client"
 
 	"git.sr.ht/~sircmpwn/aerc/worker/types"
@@ -26,6 +26,7 @@ type IMAPWorker struct {
 		insecure bool
 		addr     string
 		user     *url.Userinfo
+		folders  []string
 	}
 
 	client   *imapClient
@@ -75,6 +76,7 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error {
 		}
 
 		w.config.user = u.User
+		w.config.folders = msg.Config.Folders
 	case *types.Connect:
 		var (
 			c   *client.Client