feat: set attachment headers

This commit is contained in:
James Houlahan
2020-08-06 09:49:24 +02:00
parent ea01c155da
commit a5a61c9428
2 changed files with 51 additions and 9 deletions

View File

@ -24,6 +24,7 @@ import (
"io"
"mime"
"net/mail"
"net/textproto"
"strings"
"github.com/ProtonMail/proton-bridge/pkg/message/parser"
@ -40,7 +41,7 @@ func Parse(r io.Reader, key, keyName string) (m *pmapi.Message, mimeMessage, pla
m = pmapi.NewMessage()
if err = parseHeader(m, p.Root().Header); err != nil {
if err = parseMessageHeader(m, p.Root().Header); err != nil {
return
}
@ -297,8 +298,13 @@ func attachPublicKey(p *parser.Part, key, keyName string) {
})
}
func parseHeader(m *pmapi.Message, h message.Header) error {
m.Header = make(mail.Header)
func parseMessageHeader(m *pmapi.Message, h message.Header) error {
mimeHeader, err := toMailHeader(h)
if err != nil {
return err
}
m.Header = mimeHeader
fields := h.Fields()
@ -308,9 +314,6 @@ func parseHeader(m *pmapi.Message, h message.Header) error {
return err
}
// TODO: Is this okay? Might need to append/split/something.
m.Header[fields.Key()] = []string{text}
switch strings.ToLower(fields.Key()) {
case "subject":
m.Subject = text
@ -365,6 +368,13 @@ func parseHeader(m *pmapi.Message, h message.Header) error {
func parseAttachment(h message.Header) (att *pmapi.Attachment, err error) {
att = &pmapi.Attachment{}
mimeHeader, err := toMIMEHeader(h)
if err != nil {
return nil, err
}
att.Header = mimeHeader
if att.MIMEType, _, err = h.ContentType(); err != nil {
return
}
@ -385,7 +395,39 @@ func parseAttachment(h message.Header) (att *pmapi.Attachment, err error) {
att.ContentID = strings.Trim(h.Get("Content-Id"), " <>")
// TODO: Set att.Header
return
}
func toMailHeader(h message.Header) (mail.Header, error) {
mimeHeader := make(mail.Header)
fields := h.Fields()
for fields.Next() {
text, err := fields.Text()
if err != nil {
return nil, err
}
mimeHeader[fields.Key()] = []string{text}
}
return mimeHeader, nil
}
func toMIMEHeader(h message.Header) (textproto.MIMEHeader, error) {
mimeHeader := make(textproto.MIMEHeader)
fields := h.Fields()
for fields.Next() {
text, err := fields.Text()
if err != nil {
return nil, err
}
mimeHeader[fields.Key()] = []string{text}
}
return mimeHeader, nil
}

View File

@ -38,7 +38,6 @@ func (p *Part) isUTF8() bool {
return utf8.Valid(p.Body)
}
// TODO: Do we then need to set charset to utf-8? What if it's embedded in html?
func (p *Part) convertToUTF8() error {
t, params, err := p.Header.ContentType()
if err != nil {
@ -58,6 +57,7 @@ func (p *Part) convertToUTF8() error {
return err
}
// TODO: Is this okay? What about when the charset is embedded in structured text type eg html/xml?
params["charset"] = "utf-8"
p.Header.SetContentType(t, params)