Spin up imap server skeleton
This commit is contained in:
parent
d738fab6d7
commit
00542af08d
|
@ -10,12 +10,14 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
imapserver "github.com/emersion/go-imap/server"
|
||||||
"github.com/emersion/go-smtp"
|
"github.com/emersion/go-smtp"
|
||||||
"github.com/howeyc/gopass"
|
"github.com/howeyc/gopass"
|
||||||
|
|
||||||
"github.com/emersion/hydroxide/auth"
|
"github.com/emersion/hydroxide/auth"
|
||||||
"github.com/emersion/hydroxide/carddav"
|
"github.com/emersion/hydroxide/carddav"
|
||||||
"github.com/emersion/hydroxide/protonmail"
|
"github.com/emersion/hydroxide/protonmail"
|
||||||
|
imapbackend "github.com/emersion/hydroxide/imap"
|
||||||
smtpbackend "github.com/emersion/hydroxide/smtp"
|
smtpbackend "github.com/emersion/hydroxide/smtp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -135,7 +137,7 @@ func main() {
|
||||||
case "smtp":
|
case "smtp":
|
||||||
port := os.Getenv("PORT")
|
port := os.Getenv("PORT")
|
||||||
if port == "" {
|
if port == "" {
|
||||||
port = "1465"
|
port = "1025"
|
||||||
}
|
}
|
||||||
|
|
||||||
sessions := auth.NewManager(newClient)
|
sessions := auth.NewManager(newClient)
|
||||||
|
@ -148,6 +150,21 @@ func main() {
|
||||||
|
|
||||||
log.Println("Starting SMTP server at", s.Addr)
|
log.Println("Starting SMTP server at", s.Addr)
|
||||||
log.Fatal(s.ListenAndServe())
|
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":
|
case "carddav":
|
||||||
port := os.Getenv("PORT")
|
port := os.Getenv("PORT")
|
||||||
if 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 {
|
func (u *user) Logout() error {
|
||||||
u.c = nil
|
u.c = nil
|
||||||
|
u.u = nil
|
||||||
u.privateKeys = nil
|
u.privateKeys = nil
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue