diff --git a/go.mod b/go.mod index ffa2164..c3a3c70 100644 --- a/go.mod +++ b/go.mod @@ -3,18 +3,18 @@ module github.com/emersion/hydroxide require ( github.com/boltdb/bolt v1.3.1 github.com/emersion/go-bcrypt v0.0.0-20170822072041-6e724a1baa63 - github.com/emersion/go-imap v1.0.0-beta.1 + github.com/emersion/go-imap v1.0.0-beta.2 github.com/emersion/go-imap-move v0.0.0-20180601155324-5eb20cb834bf github.com/emersion/go-imap-specialuse v0.0.0-20161227184202-ba031ced6a62 - github.com/emersion/go-message v0.9.1 + github.com/emersion/go-message v0.9.2 github.com/emersion/go-sasl v0.0.0-20161116183048-7e096a0a6197 - github.com/emersion/go-smtp v0.0.0-20180917150411-7162b2ca3bcb + github.com/emersion/go-smtp v0.11.0 github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe - github.com/emersion/go-vcard v0.0.0-20181001195144-be59a9be3b3f + github.com/emersion/go-vcard v0.0.0-20190105225839-8856043f13c5 github.com/emersion/go-webdav v0.0.0-20180509190321-4ef680e9a32f github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c - golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869 - golang.org/x/net v0.0.0-20181114220301-adae6a3d119a - golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b + golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c + golang.org/x/net v0.0.0-20190403144856-b630fd6fe46b + golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e golang.org/x/text v0.3.0 ) diff --git a/smtp/smtp.go b/smtp/smtp.go index 91316bc..859d2d5 100644 --- a/smtp/smtp.go +++ b/smtp/smtp.go @@ -37,14 +37,22 @@ func formatHeader(h mail.Header) string { return b.String() } -type user struct { +type session struct { c *protonmail.Client u *protonmail.User privateKeys openpgp.EntityList addrs []*protonmail.Address } -func (u *user) Send(from string, to []string, r io.Reader) error { +func (s *session) Mail(from string) error { + return nil +} + +func (s *session) Rcpt(to string) error { + return nil +} + +func (s *session) Data(r io.Reader) error { // Parse the incoming MIME message header mr, err := mail.CreateReader(r) if err != nil { @@ -67,7 +75,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error { rawFrom := fromList[0] fromAddrStr := rawFrom.Address var fromAddr *protonmail.Address - for _, addr := range u.addrs { + for _, addr := range s.addrs { if strings.EqualFold(addr.Email, fromAddrStr) { fromAddr = addr break @@ -87,7 +95,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error { } var privateKey *openpgp.Entity - for _, e := range u.privateKeys { + for _, e := range s.privateKeys { if e.PrimaryKey.KeyId == encryptedPrivateKey.PrimaryKey.KeyId { privateKey = e break @@ -129,7 +137,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error { ExternalID: inReplyTo, AddressID: fromAddr.ID, } - total, msgs, err := u.c.ListMessages(&filter) + total, msgs, err := s.c.ListMessages(&filter) if err != nil { return err } @@ -138,7 +146,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error { } } - msg, err = u.c.CreateDraftMessage(msg, parentID) + msg, err = s.c.CreateDraftMessage(msg, parentID) if err != nil { return fmt.Errorf("cannot create draft message: %v", err) } @@ -214,7 +222,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error { pw.CloseWithError(cleartext.Close()) }() - att, err = u.c.CreateAttachment(att, pr) + att, err = s.c.CreateAttachment(att, pr) if err != nil { return fmt.Errorf("cannot upload attachment: %v", err) } @@ -240,7 +248,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error { return err } - msg, err = u.c.UpdateDraftMessage(msg) + msg, err = s.c.UpdateDraftMessage(msg) if err != nil { return fmt.Errorf("cannot update draft message: %v", err) } @@ -255,7 +263,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error { var plaintextRecipients []string encryptedRecipients := make(map[string]*openpgp.Entity) for _, rcpt := range recipients { - resp, err := u.c.GetPublicKeys(rcpt.Address) + resp, err := s.c.GetPublicKeys(rcpt.Address) if err != nil { return fmt.Errorf("cannot get public key for address %q: %v", rcpt.Address, err) } @@ -330,7 +338,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error { outgoing.Packages = append(outgoing.Packages, encryptedSet) } - _, _, err = u.c.SendMessage(outgoing) + _, _, err = s.c.SendMessage(outgoing) if err != nil { return fmt.Errorf("cannot send message: %v", err) } @@ -338,10 +346,12 @@ func (u *user) Send(from string, to []string, r io.Reader) error { return nil } -func (u *user) Logout() error { - u.c = nil - u.u = nil - u.privateKeys = nil +func (s *session) Reset() {} + +func (s *session) Logout() error { + s.c = nil + s.u = nil + s.privateKeys = nil return nil } @@ -349,7 +359,7 @@ type backend struct { sessions *auth.Manager } -func (be *backend) Login(username, password string) (smtp.User, error) { +func (be *backend) Login(_ *smtp.ConnectionState, username, password string) (smtp.Session, error) { c, privateKeys, err := be.sessions.Auth(username, password) if err != nil { return nil, err @@ -367,10 +377,10 @@ func (be *backend) Login(username, password string) (smtp.User, error) { // TODO: decrypt private keys in u.Addresses - return &user{c, u, privateKeys, addrs}, nil + return &session{c, u, privateKeys, addrs}, nil } -func (be *backend) AnonymousLogin() (smtp.User, error) { +func (be *backend) AnonymousLogin(_ *smtp.ConnectionState) (smtp.Session, error) { return nil, smtp.ErrAuthRequired }