aboutsummaryrefslogtreecommitdiffstats
path: root/session.go
diff options
context:
space:
mode:
authorLibravatarLibravatar Simon Ser <[email protected]> 2023-03-20 12:46:26 +0100
committerLibravatarLibravatar Simon Ser <[email protected]> 2023-04-30 16:18:12 +0200
commitf1d00df4dda7a35651359b76bad34a9d1262994d (patch)
tree18d9d8f37cb2adfdd004457caf6e41d7cdc2b9a9 /session.go
parenteeedc9a387117ebb8cb9ee4d38eccbbf240783d0 (diff)
downloadalps-f1d00df4dda7a35651359b76bad34a9d1262994d.tar.gz
alps-f1d00df4dda7a35651359b76bad34a9d1262994d.tar.bz2
alps-f1d00df4dda7a35651359b76bad34a9d1262994d.zip
Upgrade to go-imap v2
Diffstat (limited to 'session.go')
-rw-r--r--session.go34
1 files changed, 12 insertions, 22 deletions
diff --git a/session.go b/session.go
index 4bf8619..a85bff6 100644
--- a/session.go
+++ b/session.go
@@ -7,11 +7,11 @@ import (
"fmt"
"mime/multipart"
"net/http"
- "os"
"sync"
"time"
- imapclient "github.com/emersion/go-imap/client"
+ "github.com/emersion/go-imap/v2"
+ "github.com/emersion/go-imap/v2/imapclient"
"github.com/emersion/go-sasl"
"github.com/emersion/go-smtp"
"github.com/google/uuid"
@@ -84,6 +84,11 @@ func (s *Session) DoIMAP(f func(*imapclient.Client) error) error {
s.imapLocker.Lock()
defer s.imapLocker.Unlock()
+ if s.imapConn != nil && s.imapConn.State() == imap.ConnStateLogout {
+ s.imapConn.Close()
+ s.imapConn = nil
+ }
+
if s.imapConn == nil {
var err error
s.imapConn, err = s.manager.connectIMAP(s.username, s.password)
@@ -93,6 +98,8 @@ func (s *Session) DoIMAP(f func(*imapclient.Client) error) error {
}
}
+ // TODO: to avoid races wrt. disconnection, re-run f if it returns
+ // io.UnexpectedEOF
return f(s.imapConn)
}
@@ -210,19 +217,17 @@ type SessionManager struct {
dialIMAP DialIMAPFunc
dialSMTP DialSMTPFunc
logger echo.Logger
- debug bool
locker sync.Mutex
sessions map[string]*Session // protected by locker
}
-func newSessionManager(dialIMAP DialIMAPFunc, dialSMTP DialSMTPFunc, logger echo.Logger, debug bool) *SessionManager {
+func newSessionManager(dialIMAP DialIMAPFunc, dialSMTP DialSMTPFunc, logger echo.Logger) *SessionManager {
return &SessionManager{
sessions: make(map[string]*Session),
dialIMAP: dialIMAP,
dialSMTP: dialSMTP,
logger: logger,
- debug: debug,
}
}
@@ -238,15 +243,11 @@ func (sm *SessionManager) connectIMAP(username, password string) (*imapclient.Cl
return nil, err
}
- if err := c.Login(username, password); err != nil {
+ if err := c.Login(username, password).Wait(); err != nil {
c.Logout()
return nil, AuthError{err}
}
- if sm.debug {
- c.SetDebug(os.Stderr)
- }
-
return c, nil
}
@@ -308,18 +309,7 @@ func (sm *SessionManager) Put(username, password string) (*Session, error) {
alive := true
for alive {
- var loggedOut <-chan struct{}
- s.imapLocker.Lock()
- if s.imapConn != nil {
- loggedOut = s.imapConn.LoggedOut()
- }
- s.imapLocker.Unlock()
-
select {
- case <-loggedOut:
- s.imapLocker.Lock()
- s.imapConn = nil
- s.imapLocker.Unlock()
case <-s.pings:
if !timer.Stop() {
<-timer.C
@@ -336,7 +326,7 @@ func (sm *SessionManager) Put(username, password string) (*Session, error) {
s.imapLocker.Lock()
if s.imapConn != nil {
- s.imapConn.Logout()
+ s.imapConn.Close()
}
s.imapLocker.Unlock()