39 lines
1.3 KiB
Go
39 lines
1.3 KiB
Go
package imapserver
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"net"
|
|
|
|
goimapserver "github.com/emersion/go-imap/v2/imapserver"
|
|
)
|
|
|
|
func newSessionFunc(backend *Backend) func(*goimapserver.Conn) (goimapserver.Session, *goimapserver.GreetingData, error) {
|
|
return func(c *goimapserver.Conn) (goimapserver.Session, *goimapserver.GreetingData, error) {
|
|
host, _, err := net.SplitHostPort(c.NetConn().RemoteAddr().String())
|
|
if err != nil {
|
|
host = c.NetConn().RemoteAddr().String()
|
|
}
|
|
return backend.NewSession(host), nil, nil
|
|
}
|
|
}
|
|
|
|
// NewPlainServer mirrors smtpserver.NewPlainServer: no TLS at all, so STARTTLS is
|
|
// never offered. InsecureAuth is required here or LOGIN would always fail with
|
|
// [PRIVACYREQUIRED] on this listener.
|
|
func NewPlainServer(backend *Backend) *goimapserver.Server {
|
|
return goimapserver.New(&goimapserver.Options{
|
|
NewSession: newSessionFunc(backend),
|
|
InsecureAuth: true,
|
|
})
|
|
}
|
|
|
|
// NewTLSServer mirrors smtpserver.NewTLSServer: implicit TLS, the whole connection is
|
|
// encrypted from the first byte. Call ListenAndServeTLS (not ListenAndServe) to run
|
|
// it — TLSConfig here only takes effect for that method.
|
|
func NewTLSServer(backend *Backend, tlsConfig *tls.Config) *goimapserver.Server {
|
|
return goimapserver.New(&goimapserver.Options{
|
|
NewSession: newSessionFunc(backend),
|
|
TLSConfig: tlsConfig,
|
|
})
|
|
}
|