Update go-smtp to latest version
This commit is contained in:
parent
0d2085911c
commit
8f167410be
14
go.mod
14
go.mod
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
44
smtp/smtp.go
44
smtp/smtp.go
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue