diff options
author | Drew DeVault <sir@cmpwn.com> | 2018-02-01 19:54:19 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2018-02-01 19:54:19 -0500 |
commit | d603bbe2ce4adebfc9ec0bb708d814fd9152676c (patch) | |
tree | 0b6e06a272a68b98608c85b9b6cb21ef04181547 /worker/imap | |
parent | cc03f6f4c802ee0742520145e9cacbd88f78ed9a (diff) |
Refactoring; consume listing response
Diffstat (limited to 'worker/imap')
-rw-r--r-- | worker/imap/list.go | 12 | ||||
-rw-r--r-- | worker/imap/worker.go | 39 |
2 files changed, 26 insertions, 25 deletions
diff --git a/worker/imap/list.go b/worker/imap/list.go index f6d3677..2f5e5b4 100644 --- a/worker/imap/list.go +++ b/worker/imap/list.go @@ -6,7 +6,7 @@ import ( "git.sr.ht/~sircmpwn/aerc2/worker/types" ) -func (imapw *IMAPWorker) handleListDirectories(msg types.ListDirectories) { +func (imapw *IMAPWorker) handleListDirectories(msg *types.ListDirectories) { mailboxes := make(chan *imap.MailboxInfo) done := make(chan error, 1) imapw.worker.Logger.Println("Listing mailboxes") @@ -18,18 +18,22 @@ func (imapw *IMAPWorker) handleListDirectories(msg types.ListDirectories) { select { case err := <-done: if err != nil { - imapw.worker.PostMessage(types.Error{ + imapw.worker.PostMessage(&types.Error{ Message: types.RespondTo(msg), Error: err, }, nil) } else { imapw.worker.PostMessage( - types.Done{types.RespondTo(msg)}, nil) + &types.Done{types.RespondTo(msg)}, nil) } return case mbox := <-mailboxes: if mbox != nil { - imapw.worker.Logger.Printf("%v\n", mbox.Name) + imapw.worker.PostMessage(&types.Directory{ + Message: types.RespondTo(msg), + Name: mbox.Name, + Attributes: mbox.Attributes, + }, nil) } } } diff --git a/worker/imap/worker.go b/worker/imap/worker.go index d6337bc..d75dbb0 100644 --- a/worker/imap/worker.go +++ b/worker/imap/worker.go @@ -54,7 +54,7 @@ func (w *IMAPWorker) verifyPeerCert(msg types.WorkerMessage) func( pool.AddCert(cert) } - request := types.ApproveCertificate{ + request := &types.CertificateApprovalRequest{ Message: types.RespondTo(msg), CertPool: pool, } @@ -62,25 +62,25 @@ func (w *IMAPWorker) verifyPeerCert(msg types.WorkerMessage) func( response := <-w.worker.Actions if response.InResponseTo() != request { - return fmt.Errorf("Expected UI to answer cert request") + return fmt.Errorf("Expected UI to respond to cert request") } - switch response.(type) { - case types.Ack: - return nil - case types.Disconnect: - return fmt.Errorf("UI rejected certificate") - default: - return fmt.Errorf("Expected UI to answer cert request") + if approval, ok := response.(*types.ApproveCertificate); !ok { + return fmt.Errorf("Expected UI to send certificate approval") + } else { + if approval.Approved { + return nil + } else { + return fmt.Errorf("UI rejected certificate") + } } } } func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { switch msg := msg.(type) { - case types.Ping: - case types.Unsupported: + case *types.Unsupported: // No-op - case types.Configure: + case *types.Configure: u, err := url.Parse(msg.Config.Source) if err != nil { return err @@ -99,14 +99,14 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { w.config.scheme = u.Scheme w.config.user = u.User - case types.Connect: + case *types.Connect: var ( c *client.Client err error ) tlsConfig := &tls.Config{ InsecureSkipVerify: true, - VerifyPeerCertificate: w.verifyPeerCert(&msg), + VerifyPeerCertificate: w.verifyPeerCert(msg), } switch w.config.scheme { case "imap": @@ -146,7 +146,8 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { c.Updates = w.updates w.client = &imapClient{c, idle.NewClient(c)} - case types.ListDirectories: + w.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + case *types.ListDirectories: w.handleListDirectories(msg) default: return errUnsupported @@ -160,18 +161,14 @@ func (w *IMAPWorker) Run() { case msg := <-w.worker.Actions: msg = w.worker.ProcessAction(msg) if err := w.handleMessage(msg); err == errUnsupported { - w.worker.PostMessage(types.Unsupported{ + w.worker.PostMessage(&types.Unsupported{ Message: types.RespondTo(msg), }, nil) } else if err != nil { - w.worker.PostMessage(types.Error{ + w.worker.PostMessage(&types.Error{ Message: types.RespondTo(msg), Error: err, }, nil) - } else { - w.worker.PostMessage(types.Ack{ - Message: types.RespondTo(msg), - }, nil) } case update := <-w.updates: w.worker.Logger.Printf("(= %T", update) |