From e41ed82cf3dbb4a1152a562ab754a9dc4a6c57b3 Mon Sep 17 00:00:00 2001 From: Robin Jarry Date: Mon, 1 Nov 2021 21:38:26 +0100 Subject: imap: add manual {dis,}connect support Signed-off-by: Robin Jarry --- worker/imap/worker.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'worker') diff --git a/worker/imap/worker.go b/worker/imap/worker.go index 82b81bd..cd52536 100644 --- a/worker/imap/worker.go +++ b/worker/imap/worker.go @@ -59,7 +59,7 @@ func NewIMAPWorker(worker *types.Worker) (types.Backend, error) { } func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { - if w.idleStop != nil { + if w.client != nil && w.client.State() == imap.SelectedState { close(w.idleStop) if err := <-w.idleDone; err != nil { w.worker.PostMessage(&types.Error{Error: err}, nil) @@ -110,6 +110,9 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { c *client.Client err error ) + if w.client != nil { + return fmt.Errorf("Already connected") + } switch w.config.scheme { case "imap": c, err = client.Dial(w.config.addr) @@ -157,6 +160,15 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { c.Updates = w.updates w.client = &imapClient{c, sortthread.NewSortClient(c)} w.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + case *types.Disconnect: + if w.client == nil { + return fmt.Errorf("Not connected") + } + if err := w.client.Logout(); err != nil { + return err + } + w.client = nil + w.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) case *types.ListDirectories: w.handleListDirectories(msg) case *types.OpenDirectory: @@ -189,7 +201,7 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { reterr = errUnsupported } - if w.idleStop != nil { + if w.client != nil && w.client.State() == imap.SelectedState { w.idleStop = make(chan struct{}) go func() { w.idleDone <- w.client.Idle(w.idleStop, &client.IdleOptions{0, 0}) -- cgit v1.2.3