Spin up imap server skeleton
This commit is contained in:
parent
d738fab6d7
commit
00542af08d
|
@ -10,12 +10,14 @@ import (
|
|||
"os"
|
||||
"time"
|
||||
|
||||
imapserver "github.com/emersion/go-imap/server"
|
||||
"github.com/emersion/go-smtp"
|
||||
"github.com/howeyc/gopass"
|
||||
|
||||
"github.com/emersion/hydroxide/auth"
|
||||
"github.com/emersion/hydroxide/carddav"
|
||||
"github.com/emersion/hydroxide/protonmail"
|
||||
imapbackend "github.com/emersion/hydroxide/imap"
|
||||
smtpbackend "github.com/emersion/hydroxide/smtp"
|
||||
)
|
||||
|
||||
|
@ -135,7 +137,7 @@ func main() {
|
|||
case "smtp":
|
||||
port := os.Getenv("PORT")
|
||||
if port == "" {
|
||||
port = "1465"
|
||||
port = "1025"
|
||||
}
|
||||
|
||||
sessions := auth.NewManager(newClient)
|
||||
|
@ -148,6 +150,21 @@ func main() {
|
|||
|
||||
log.Println("Starting SMTP server at", s.Addr)
|
||||
log.Fatal(s.ListenAndServe())
|
||||
case "imap":
|
||||
port := os.Getenv("PORT")
|
||||
if port == "" {
|
||||
port = "1143"
|
||||
}
|
||||
|
||||
sessions := auth.NewManager(newClient)
|
||||
|
||||
be := imapbackend.New(sessions)
|
||||
s := imapserver.New(be)
|
||||
s.Addr = "127.0.0.1:" + port
|
||||
s.AllowInsecureAuth = true // TODO: remove this
|
||||
|
||||
log.Println("Starting IMAP server at", s.Addr)
|
||||
log.Fatal(s.ListenAndServe())
|
||||
case "carddav":
|
||||
port := os.Getenv("PORT")
|
||||
if port == "" {
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
package imap
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
imapbackend "github.com/emersion/go-imap/backend"
|
||||
"golang.org/x/crypto/openpgp"
|
||||
|
||||
"github.com/emersion/hydroxide/auth"
|
||||
"github.com/emersion/hydroxide/protonmail"
|
||||
)
|
||||
|
||||
var errNotYetImplemented = errors.New("not yet implemented")
|
||||
|
||||
type user struct {
|
||||
username string
|
||||
c *protonmail.Client
|
||||
u *protonmail.User
|
||||
privateKeys openpgp.EntityList
|
||||
}
|
||||
|
||||
func (u *user) Username() string {
|
||||
return u.username
|
||||
}
|
||||
|
||||
func (u *user) ListMailboxes(subscribed bool) ([]imapbackend.Mailbox, error) {
|
||||
return nil, errNotYetImplemented // TODO
|
||||
}
|
||||
|
||||
func (u *user) GetMailbox(name string) (imapbackend.Mailbox, error) {
|
||||
return nil, errNotYetImplemented // TODO
|
||||
}
|
||||
|
||||
func (u *user) CreateMailbox(name string) error {
|
||||
return errNotYetImplemented // TODO
|
||||
}
|
||||
|
||||
func (u *user) DeleteMailbox(name string) error {
|
||||
return errNotYetImplemented // TODO
|
||||
}
|
||||
|
||||
func (u *user) RenameMailbox(existingName, newName string) error {
|
||||
return errNotYetImplemented // TODO
|
||||
}
|
||||
|
||||
func (u *user) Logout() error {
|
||||
u.c = nil
|
||||
u.u = nil
|
||||
u.privateKeys = nil
|
||||
return nil
|
||||
}
|
||||
|
||||
type backend struct {
|
||||
sessions *auth.Manager
|
||||
}
|
||||
|
||||
func (be *backend) Login(username, password string) (imapbackend.User, error) {
|
||||
c, privateKeys, err := be.sessions.Auth(username, password)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
u, err := c.GetCurrentUser()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// TODO: decrypt private keys in u.Addresses
|
||||
|
||||
return &user{
|
||||
username: username,
|
||||
c: c,
|
||||
u: u,
|
||||
privateKeys: privateKeys,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func New(sessions *auth.Manager) imapbackend.Backend {
|
||||
return &backend{sessions}
|
||||
}
|
|
@ -310,6 +310,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error {
|
|||
|
||||
func (u *user) Logout() error {
|
||||
u.c = nil
|
||||
u.u = nil
|
||||
u.privateKeys = nil
|
||||
return nil
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue