Update go-smtp to latest version

This commit is contained in:
emersion 2019-04-03 19:40:00 +03:00
parent 0d2085911c
commit 8f167410be
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48
2 changed files with 34 additions and 24 deletions

14
go.mod
View File

@ -3,18 +3,18 @@ module github.com/emersion/hydroxide
require ( require (
github.com/boltdb/bolt v1.3.1 github.com/boltdb/bolt v1.3.1
github.com/emersion/go-bcrypt v0.0.0-20170822072041-6e724a1baa63 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-move v0.0.0-20180601155324-5eb20cb834bf
github.com/emersion/go-imap-specialuse v0.0.0-20161227184202-ba031ced6a62 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-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-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/emersion/go-webdav v0.0.0-20180509190321-4ef680e9a32f
github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c
golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869 golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a golang.org/x/net v0.0.0-20190403144856-b630fd6fe46b
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e
golang.org/x/text v0.3.0 golang.org/x/text v0.3.0
) )

View File

@ -37,14 +37,22 @@ func formatHeader(h mail.Header) string {
return b.String() return b.String()
} }
type user struct { type session struct {
c *protonmail.Client c *protonmail.Client
u *protonmail.User u *protonmail.User
privateKeys openpgp.EntityList privateKeys openpgp.EntityList
addrs []*protonmail.Address 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 // Parse the incoming MIME message header
mr, err := mail.CreateReader(r) mr, err := mail.CreateReader(r)
if err != nil { if err != nil {
@ -67,7 +75,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error {
rawFrom := fromList[0] rawFrom := fromList[0]
fromAddrStr := rawFrom.Address fromAddrStr := rawFrom.Address
var fromAddr *protonmail.Address var fromAddr *protonmail.Address
for _, addr := range u.addrs { for _, addr := range s.addrs {
if strings.EqualFold(addr.Email, fromAddrStr) { if strings.EqualFold(addr.Email, fromAddrStr) {
fromAddr = addr fromAddr = addr
break break
@ -87,7 +95,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error {
} }
var privateKey *openpgp.Entity var privateKey *openpgp.Entity
for _, e := range u.privateKeys { for _, e := range s.privateKeys {
if e.PrimaryKey.KeyId == encryptedPrivateKey.PrimaryKey.KeyId { if e.PrimaryKey.KeyId == encryptedPrivateKey.PrimaryKey.KeyId {
privateKey = e privateKey = e
break break
@ -129,7 +137,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error {
ExternalID: inReplyTo, ExternalID: inReplyTo,
AddressID: fromAddr.ID, AddressID: fromAddr.ID,
} }
total, msgs, err := u.c.ListMessages(&filter) total, msgs, err := s.c.ListMessages(&filter)
if err != nil { if err != nil {
return err 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 { if err != nil {
return fmt.Errorf("cannot create draft message: %v", err) 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()) pw.CloseWithError(cleartext.Close())
}() }()
att, err = u.c.CreateAttachment(att, pr) att, err = s.c.CreateAttachment(att, pr)
if err != nil { if err != nil {
return fmt.Errorf("cannot upload attachment: %v", err) 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 return err
} }
msg, err = u.c.UpdateDraftMessage(msg) msg, err = s.c.UpdateDraftMessage(msg)
if err != nil { if err != nil {
return fmt.Errorf("cannot update draft message: %v", err) 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 var plaintextRecipients []string
encryptedRecipients := make(map[string]*openpgp.Entity) encryptedRecipients := make(map[string]*openpgp.Entity)
for _, rcpt := range recipients { for _, rcpt := range recipients {
resp, err := u.c.GetPublicKeys(rcpt.Address) resp, err := s.c.GetPublicKeys(rcpt.Address)
if err != nil { if err != nil {
return fmt.Errorf("cannot get public key for address %q: %v", rcpt.Address, err) 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) outgoing.Packages = append(outgoing.Packages, encryptedSet)
} }
_, _, err = u.c.SendMessage(outgoing) _, _, err = s.c.SendMessage(outgoing)
if err != nil { if err != nil {
return fmt.Errorf("cannot send message: %v", err) 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 return nil
} }
func (u *user) Logout() error { func (s *session) Reset() {}
u.c = nil
u.u = nil func (s *session) Logout() error {
u.privateKeys = nil s.c = nil
s.u = nil
s.privateKeys = nil
return nil return nil
} }
@ -349,7 +359,7 @@ type backend struct {
sessions *auth.Manager 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) c, privateKeys, err := be.sessions.Auth(username, password)
if err != nil { if err != nil {
return nil, err return nil, err
@ -367,10 +377,10 @@ func (be *backend) Login(username, password string) (smtp.User, error) {
// TODO: decrypt private keys in u.Addresses // 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 return nil, smtp.ErrAuthRequired
} }