Files
crockery/internal/imap/server.go

74 lines
1.2 KiB
Go
Raw Normal View History

2018-03-05 12:19:04 +00:00
package imap
import (
"context"
"io"
"log"
imapbackend "github.com/emersion/go-imap/backend"
imapserver "github.com/emersion/go-imap/server"
"ur.gs/crockery/internal/store"
)
type Server interface {
Run()
io.Closer
}
func NewServer(cancel context.CancelFunc, datastore store.Interface, starttls bool) Server {
out := &concrete{
cancel: cancel,
store: datastore,
starttls: starttls,
2018-03-05 12:19:04 +00:00
}
out.server = imapserver.New(out)
out.server.TLSConfig = out.store.TLSConfig()
2018-03-05 12:19:04 +00:00
if starttls {
out.server.Addr = ":143"
} else {
out.server.Addr = ":993"
}
return out
}
type concrete struct {
cancel context.CancelFunc
store store.Interface
server *imapserver.Server
starttls bool
2018-03-05 12:19:04 +00:00
}
func (c *concrete) Run() {
var err error
if c.starttls {
err = c.server.ListenAndServe()
} else {
err = c.server.ListenAndServeTLS()
}
if err != nil {
2018-03-05 12:19:04 +00:00
log.Printf("Error serving IMAP %s: %v", c.server.Addr, err)
} else {
log.Printf("Stopped listening on IMAP %s", c.server.Addr)
}
c.cancel()
}
// backend implementation for go-smtp
func (c *concrete) Login(string, string) (imapbackend.User, error) {
return nil, nil
}
func (c *concrete) Close() error {
c.cancel() // FIXME: this doesn't touch the server
2018-03-05 12:19:04 +00:00
return nil
}