feat: attach public key

This commit is contained in:
James Houlahan
2020-07-02 16:17:04 +02:00
parent 45b863f931
commit 2b36d3ab7b
6 changed files with 98 additions and 70 deletions

View File

@ -68,7 +68,7 @@ func (im *imapMailbox) CreateMessage(flags []string, date time.Time, body imap.L
// Called from go-imap in goroutines - we need to handle panics for each function. // Called from go-imap in goroutines - we need to handle panics for each function.
defer im.panicHandler.HandlePanic() defer im.panicHandler.HandlePanic()
m, _, _, readers, err := message.Parse(body) m, _, _, readers, err := message.Parse(body, "", "")
if err != nil { if err != nil {
return err return err
} }

View File

@ -182,8 +182,7 @@ func (su *smtpUser) Send(from string, to []string, messageReader io.Reader) (err
attachedPublicKeyName = "publickey - " + kr.GetIdentities()[0].Name attachedPublicKeyName = "publickey - " + kr.GetIdentities()[0].Name
} }
// TODO: Include public keys here! message, mimeBody, plainBody, attReaders, err := message.Parse(messageReader, attachedPublicKey, attachedPublicKeyName)
message, mimeBody, plainBody, attReaders, err := message.Parse(messageReader)
if err != nil { if err != nil {
return return
} }

View File

@ -19,6 +19,7 @@ package message
import ( import (
"bytes" "bytes"
"fmt"
"io" "io"
"mime" "mime"
"net/mail" "net/mail"
@ -30,7 +31,7 @@ import (
"github.com/jaytaylor/html2text" "github.com/jaytaylor/html2text"
) )
func Parse(r io.Reader) (m *pmapi.Message, mimeBody, plainBody string, atts []io.Reader, err error) { func Parse(r io.Reader, key, keyName string) (m *pmapi.Message, mime, plain string, atts []io.Reader, err error) {
p, err := parser.New(r) p, err := parser.New(r)
if err != nil { if err != nil {
return return
@ -38,7 +39,7 @@ func Parse(r io.Reader) (m *pmapi.Message, mimeBody, plainBody string, atts []io
m = pmapi.NewMessage() m = pmapi.NewMessage()
if err = parseHeader(m, p.Header()); err != nil { if err = parseHeader(m, p.Root().Header); err != nil {
return return
} }
@ -46,14 +47,15 @@ func Parse(r io.Reader) (m *pmapi.Message, mimeBody, plainBody string, atts []io
return return
} }
parts, plainParts, err := collectBodyParts(p) if m.Body, plain, err = collectBodyParts(p); err != nil {
if err != nil {
return return
} }
m.Body = strings.Join(parts, "\r\n")
plainBody = strings.Join(plainParts, "\r\n")
if mimeBody, err = writeMimeBody(p); err != nil { if key != "" {
attachPublicKey(p.Root(), key, keyName)
}
if mime, err = writeMIMEMessage(p); err != nil {
return return
} }
@ -82,7 +84,9 @@ func collectAttachments(p *parser.Parser) (atts []*pmapi.Attachment, data []io.R
return return
} }
func collectBodyParts(p *parser.Parser) (parts, plainParts []string, err error) { func collectBodyParts(p *parser.Parser) (body, plain string, err error) {
var parts, plainParts []string
w := p. w := p.
NewWalker(). NewWalker().
WithContentTypeHandler("text/plain", func(p *parser.Part) (err error) { WithContentTypeHandler("text/plain", func(p *parser.Part) (err error) {
@ -106,10 +110,10 @@ func collectBodyParts(p *parser.Parser) (parts, plainParts []string, err error)
return return
} }
return return strings.Join(parts, "\r\n"), strings.Join(plainParts, "\r\n"), nil
} }
func writeMimeBody(p *parser.Parser) (mimeBody string, err error) { func writeMIMEMessage(p *parser.Parser) (mime string, err error) {
writer := p. writer := p.
NewWriter(). NewWriter().
WithCondition(func(p *parser.Part) (keep bool) { WithCondition(func(p *parser.Part) (keep bool) {
@ -126,6 +130,21 @@ func writeMimeBody(p *parser.Parser) (mimeBody string, err error) {
return buf.String(), nil return buf.String(), nil
} }
func attachPublicKey(p *parser.Part, key, keyName string) {
h := message.Header{}
h.Set("Content-Type", fmt.Sprintf(`application/pgp-key; name="%v"`, keyName))
h.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%v.asc.pgp"`, keyName))
h.Set("Content-Transfer-Encoding", "base64")
// TODO: Split body at col width 72.
p.AddChild(&parser.Part{
Header: h,
Body: []byte(key),
})
}
func parseHeader(m *pmapi.Message, h message.Header) (err error) { func parseHeader(m *pmapi.Message, h message.Header) (err error) {
m.Header = make(mail.Header) m.Header = make(mail.Header)

View File

@ -1,7 +1,6 @@
package parser package parser
import ( import (
"errors"
"io" "io"
"io/ioutil" "io/ioutil"
@ -31,20 +30,17 @@ func (p *Parser) NewWriter() *Writer {
return newWriter(p.root) return newWriter(p.root)
} }
func (p *Parser) Header() message.Header { func (p *Parser) Root() *Part {
return p.root.Header return p.root
} }
func (p *Parser) Part(number []int) (part *Part, err error) { func (p *Parser) Part(number []int) (part *Part, err error) {
part = p.root part = p.root
for _, n := range number { for _, n := range number {
if len(part.children) < n { if part, err = part.Part(n); err != nil {
err = errors.New("no such part")
return return
} }
part = part.children[n-1]
} }
return return

View File

@ -1,6 +1,8 @@
package parser package parser
import ( import (
"errors"
"github.com/emersion/go-message" "github.com/emersion/go-message"
) )
@ -10,6 +12,22 @@ type Part struct {
children []*Part children []*Part
} }
func (p *Part) Part(n int) (part *Part, err error) {
if len(p.children) < n {
return nil, errors.New("no such part")
}
return p.children[n-1], nil
}
func (p *Part) Parts() (n int) {
return len(p.children)
}
func (p *Part) AddChild(child *Part) {
p.children = append(p.children, child)
}
func (p *Part) visit(w *Walker) (err error) { func (p *Part) visit(w *Walker) (err error) {
if err = p.handle(w); err != nil { if err = p.handle(w); err != nil {
return return

View File

@ -27,6 +27,7 @@ import (
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/text/encoding/charmap" "golang.org/x/text/encoding/charmap"
) )
@ -64,8 +65,8 @@ func TestParseMessageTextPlain(t *testing.T) {
f := f("text_plain.eml") f := f("text_plain.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -81,8 +82,8 @@ func TestParseMessageTextPlainUTF8(t *testing.T) {
f := f("text_plain_utf8.eml") f := f("text_plain_utf8.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -98,8 +99,8 @@ func TestParseMessageTextPlainLatin1(t *testing.T) {
f := f("text_plain_latin1.eml") f := f("text_plain_latin1.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -115,8 +116,8 @@ func TestParseMessageTextPlainUnknownCharsetIsActuallyLatin1(t *testing.T) {
f := f("text_plain_unknown_latin1.eml") f := f("text_plain_unknown_latin1.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -132,8 +133,8 @@ func TestParseMessageTextPlainUnknownCharsetIsActuallyLatin2(t *testing.T) {
f := f("text_plain_unknown_latin2.eml") f := f("text_plain_unknown_latin2.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -155,8 +156,8 @@ func TestParseMessageTextPlainAlready7Bit(t *testing.T) {
f := f("text_plain_7bit.eml") f := f("text_plain_7bit.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -172,8 +173,8 @@ func TestParseMessageTextPlainWithOctetAttachment(t *testing.T) {
f := f("text_plain_octet_attachment.eml") f := f("text_plain_octet_attachment.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -182,7 +183,7 @@ func TestParseMessageTextPlainWithOctetAttachment(t *testing.T) {
assert.Equal(t, s("text_plain_octet_attachment.mime"), mimeBody) assert.Equal(t, s("text_plain_octet_attachment.mime"), mimeBody)
assert.Equal(t, "body", plainContents) assert.Equal(t, "body", plainContents)
assert.Len(t, atts, 1) require.Len(t, atts, 1)
assert.Equal(t, readerToString(atts[0]), "if you are reading this, hi!") assert.Equal(t, readerToString(atts[0]), "if you are reading this, hi!")
} }
@ -191,7 +192,7 @@ func TestParseMessageTextPlainWithOctetAttachmentGoodFilename(t *testing.T) {
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "") m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -210,7 +211,7 @@ func TestParseMessageTextPlainWithOctetAttachmentBadFilename(t *testing.T) {
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f, "", "") m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -228,8 +229,8 @@ func TestParseMessageTextPlainWithPlainAttachment(t *testing.T) {
f := f("text_plain_plain_attachment.eml") f := f("text_plain_plain_attachment.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -238,7 +239,7 @@ func TestParseMessageTextPlainWithPlainAttachment(t *testing.T) {
assert.Equal(t, s("text_plain_plain_attachment.mime"), mimeBody) assert.Equal(t, s("text_plain_plain_attachment.mime"), mimeBody)
assert.Equal(t, "body", plainContents) assert.Equal(t, "body", plainContents)
assert.Len(t, atts, 1) require.Len(t, atts, 1)
assert.Equal(t, readerToString(atts[0]), "attachment") assert.Equal(t, readerToString(atts[0]), "attachment")
} }
@ -246,8 +247,8 @@ func TestParseMessageTextPlainWithImageInline(t *testing.T) {
f := f("text_plain_image_inline.eml") f := f("text_plain_image_inline.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -257,9 +258,9 @@ func TestParseMessageTextPlainWithImageInline(t *testing.T) {
assert.Equal(t, "body", plainContents) assert.Equal(t, "body", plainContents)
// The inline image is an 8x8 mic-dropping gopher. // The inline image is an 8x8 mic-dropping gopher.
assert.Len(t, atts, 1) require.Len(t, atts, 1)
img, err := png.DecodeConfig(atts[0]) img, err := png.DecodeConfig(atts[0])
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 8, img.Width) assert.Equal(t, 8, img.Width)
assert.Equal(t, 8, img.Height) assert.Equal(t, 8, img.Height)
} }
@ -268,8 +269,8 @@ func TestParseMessageWithMultipleTextParts(t *testing.T) {
f := f("multiple_text_parts.eml") f := f("multiple_text_parts.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -287,8 +288,8 @@ func TestParseMessageTextHTML(t *testing.T) {
f := f("text_html.eml") f := f("text_html.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -306,7 +307,7 @@ func TestParseMessageTextHTMLAlready7Bit(t *testing.T) {
f := f("text_html_7bit.eml") f := f("text_html_7bit.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -325,8 +326,8 @@ func TestParseMessageTextHTMLWithOctetAttachment(t *testing.T) {
f := f("text_html_octet_attachment.eml") f := f("text_html_octet_attachment.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -335,19 +336,18 @@ func TestParseMessageTextHTMLWithOctetAttachment(t *testing.T) {
assert.Equal(t, s("text_html_octet_attachment.mime"), mimeBody) assert.Equal(t, s("text_html_octet_attachment.mime"), mimeBody)
assert.Equal(t, "This is body of *HTML mail* with attachment", plainContents) assert.Equal(t, "This is body of *HTML mail* with attachment", plainContents)
assert.Len(t, atts, 1) require.Len(t, atts, 1)
assert.Equal(t, readerToString(atts[0]), "if you are reading this, hi!") assert.Equal(t, readerToString(atts[0]), "if you are reading this, hi!")
} }
// NOTE: Enable when bug is fixed. func TestParseMessageTextHTMLWithPlainAttachment(t *testing.T) { // nolint[deadcode]
func _TestParseMessageTextHTMLWithPlainAttachment(t *testing.T) { // nolint[deadcode]
rand.Seed(0) rand.Seed(0)
f := f("text_html_plain_attachment.eml") f := f("text_html_plain_attachment.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -357,7 +357,7 @@ func _TestParseMessageTextHTMLWithPlainAttachment(t *testing.T) { // nolint[dead
assert.Equal(t, s("text_html_plain_attachment.mime"), mimeBody) assert.Equal(t, s("text_html_plain_attachment.mime"), mimeBody)
assert.Equal(t, "This is body of *HTML mail* with attachment", plainContents) assert.Equal(t, "This is body of *HTML mail* with attachment", plainContents)
assert.Len(t, atts, 1) require.Len(t, atts, 1)
assert.Equal(t, readerToString(atts[0]), "attachment") assert.Equal(t, readerToString(atts[0]), "attachment")
} }
@ -367,7 +367,7 @@ func TestParseMessageTextHTMLWithImageInline(t *testing.T) {
f := f("text_html_image_inline.eml") f := f("text_html_image_inline.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
@ -378,22 +378,20 @@ func TestParseMessageTextHTMLWithImageInline(t *testing.T) {
assert.Equal(t, "This is body of *HTML mail* with attachment", plainContents) assert.Equal(t, "This is body of *HTML mail* with attachment", plainContents)
// The inline image is an 8x8 mic-dropping gopher. // The inline image is an 8x8 mic-dropping gopher.
assert.Len(t, atts, 1) require.Len(t, atts, 1)
img, err := png.DecodeConfig(atts[0]) img, err := png.DecodeConfig(atts[0])
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 8, img.Width) assert.Equal(t, 8, img.Width)
assert.Equal(t, 8, img.Height) assert.Equal(t, 8, img.Height)
} }
// NOTE: Enable when bug is fixed. func TestParseMessageWithAttachedPublicKey(t *testing.T) { // nolint[deadcode]
/*
func _TestParseMessageWithAttachedPublicKey(t *testing.T) { // nolint[deadcode]
f := f("text_plain.eml") f := f("text_plain.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
// BAD: Public Key is not attached unless Content-Type is specified (not required)! // BAD: Public Key is not attached unless Content-Type is specified (not required)!
m, mimeBody, plainContents, atts, err := Parse(f, "publickey", "publickeyname") m, mimeBody, plainContents, atts, err := Parse(f, "publickey", "publickeyname")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())
@ -403,19 +401,17 @@ func _TestParseMessageWithAttachedPublicKey(t *testing.T) { // nolint[deadcode]
assert.Equal(t, "body", plainContents) assert.Equal(t, "body", plainContents)
// BAD: Public key not available as an attachment! // BAD: Public key not available as an attachment!
assert.Len(t, atts, 1) require.Len(t, atts, 1)
} }
*/
// NOTE: Enable when bug is fixed. func TestParseMessageTextHTMLWithEmbeddedForeignEncoding(t *testing.T) { // nolint[deadcode]
func _TestParseMessageTextHTMLWithEmbeddedForeignEncoding(t *testing.T) { // nolint[deadcode]
rand.Seed(0) rand.Seed(0)
f := f("text_html_embedded_foreign_encoding.eml") f := f("text_html_embedded_foreign_encoding.eml")
defer func() { _ = f.Close() }() defer func() { _ = f.Close() }()
m, mimeBody, plainContents, atts, err := Parse(f) m, mimeBody, plainContents, atts, err := Parse(f, "", "")
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String()) assert.Equal(t, `"Sender" <sender@pm.me>`, m.Sender.String())
assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String()) assert.Equal(t, `"Receiver" <receiver@pm.me>`, m.ToList[0].String())