]> Cypherpunks repositories - gostls13.git/commitdiff
net/mail: ignore whitespace between adjacent 'encoded-word's
authorHiroshi Ioka <hirochachacha@gmail.com>
Sat, 4 Mar 2017 10:47:19 +0000 (19:47 +0900)
committerIan Lance Taylor <iant@golang.org>
Tue, 7 Mar 2017 02:54:40 +0000 (02:54 +0000)
rfc2047 says:
  White space between adjacent 'encoded-word's is not displayed.

Although, mime package already have that feature,
we cannot simply reuse that code,
because there is a subtle difference in quoted-string handling.

Fixes #19363

Change-Id: I754201aa3c6b701074ad78fe46818af5b96cbd00
Reviewed-on: https://go-review.googlesource.com/37811
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/mail/message.go
src/net/mail/message_test.go

index 702b765c3491b753cb37c6c37c2e19a7eb118ef9..6db8a397e9dc84873a259663ce653204654bdf73 100644 (file)
@@ -387,6 +387,7 @@ func (p *addrParser) consumePhrase() (phrase string, err error) {
        debug.Printf("consumePhrase: [%s]", p.s)
        // phrase = 1*word
        var words []string
+       var isPrevEncoded bool
        for {
                // word = atom / quoted-string
                var word string
@@ -394,6 +395,7 @@ func (p *addrParser) consumePhrase() (phrase string, err error) {
                if p.empty() {
                        return "", errors.New("mail: missing phrase")
                }
+               isEncoded := false
                if p.peek() == '"' {
                        // quoted-string
                        word, err = p.consumeQuotedString()
@@ -403,7 +405,7 @@ func (p *addrParser) consumePhrase() (phrase string, err error) {
                        // than what RFC 5322 specifies.
                        word, err = p.consumeAtom(true, true)
                        if err == nil {
-                               word, err = p.decodeRFC2047Word(word)
+                               word, isEncoded, err = p.decodeRFC2047Word(word)
                        }
                }
 
@@ -411,7 +413,12 @@ func (p *addrParser) consumePhrase() (phrase string, err error) {
                        break
                }
                debug.Printf("consumePhrase: consumed %q", word)
-               words = append(words, word)
+               if isPrevEncoded && isEncoded {
+                       words[len(words)-1] += word
+               } else {
+                       words = append(words, word)
+               }
+               isPrevEncoded = isEncoded
        }
        // Ignore any error if we got at least one word.
        if err != nil && len(words) == 0 {
@@ -540,22 +547,23 @@ func (p *addrParser) len() int {
        return len(p.s)
 }
 
-func (p *addrParser) decodeRFC2047Word(s string) (string, error) {
+func (p *addrParser) decodeRFC2047Word(s string) (word string, isEncoded bool, err error) {
        if p.dec != nil {
-               return p.dec.DecodeHeader(s)
+               word, err = p.dec.Decode(s)
+       } else {
+               word, err = rfc2047Decoder.Decode(s)
        }
 
-       dec, err := rfc2047Decoder.Decode(s)
        if err == nil {
-               return dec, nil
+               return word, true, nil
        }
 
        if _, ok := err.(charsetError); ok {
-               return s, err
+               return s, true, err
        }
 
        // Ignore invalid RFC 2047 encoded-word errors.
-       return s, nil
+       return s, false, nil
 }
 
 var rfc2047Decoder = mime.WordDecoder{
index f0761ab09fba75dffd6bb4b9b360f135e07952cf..0ed36b02f877e9bf89742a8a9a447c103cd99746 100644 (file)
@@ -235,6 +235,16 @@ func TestAddressParsing(t *testing.T) {
                                },
                        },
                },
+               // RFC 2047 "Q"-encoded UTF-8 address with multiple encoded-words.
+               {
+                       `=?utf-8?q?J=C3=B6rg?=  =?utf-8?q?Doe?= <joerg@example.com>`,
+                       []*Address{
+                               {
+                                       Name:    `JörgDoe`,
+                                       Address: "joerg@example.com",
+                               },
+                       },
+               },
                // RFC 2047, Section 8.
                {
                        `=?ISO-8859-1?Q?Andr=E9?= Pirard <PIRARD@vm1.ulg.ac.be>`,