diff --git a/store/search.go b/store/search.go index 10a3963..da6f5ea 100644 --- a/store/search.go +++ b/store/search.go @@ -5,6 +5,7 @@ import ( "encoding/base64" "fmt" "io" + "mime/quotedprintable" "regexp" "strings" "unicode" @@ -204,7 +205,7 @@ func toLower(buf []byte) []byte { func decodeRFC2047(encoded string) (string, error) { // match e.g. =?(iso-2022-jp)?(B)?(Rnc6...)?= - r := regexp.MustCompile(`=\?([^?]+)\?([BQ])\?([^?]+)\?=`) + r := regexp.MustCompile(`(?i)=\?([^?]+)\?([BQ])\?([^?]+)\?=`) matches := r.FindAllStringSubmatch(encoded, -1) if len(matches) == 0 { // no match. Looks ASCII. @@ -214,19 +215,25 @@ func decodeRFC2047(encoded string) (string, error) { var decodedStrings []string for _, match := range matches { charset := match[1] - encodingName := match[2] + encodingName := strings.ToUpper(match[2]) encodedText := match[3] // Decode Base64 or Quoted-Printable var decodedBytes []byte var err error - if encodingName == "B" { + switch encodingName { + case "B": // Base64 decodedBytes, err = base64.StdEncoding.DecodeString(encodedText) if err != nil { - return "", fmt.Errorf("Base64 decode error: %w", err) + return encoded, fmt.Errorf("Base64 decode error: %w", err) } - } else { - return "", fmt.Errorf("not supported encoding: %s", encodingName) + case "Q": // Quoted-Printable + decodedBytes, err = io.ReadAll(quotedprintable.NewReader(strings.NewReader(encodedText))) + if err != nil { + return "", fmt.Errorf("Quoted-Printable decode error: %w", err) + } + default: + return encoded, fmt.Errorf("not supported encoding: %s", encodingName) } // Select charset @@ -237,14 +244,14 @@ func decodeRFC2047(encoded string) (string, error) { case "utf-8": enc = encUnicode.UTF8 default: - return "", fmt.Errorf("not supported charset: %s", charset) + return encoded, fmt.Errorf("not supported charset: %s", charset) } // Decode with charset reader := transform.NewReader(strings.NewReader(string(decodedBytes)), enc.NewDecoder()) decodedText, err := io.ReadAll(reader) if err != nil { - return "", err + return encoded, err } decodedStrings = append(decodedStrings, string(decodedText))