This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-mime4j.git


The following commit(s) were added to refs/heads/master by this push:
     new 6581bd26 Parsing multipart UTF-8 encoded filename. (#89)
6581bd26 is described below

commit 6581bd264b5c60fae23bdd7e5990c2641ae3bed8
Author: Shamil Vakhitov <33479697+pingvin...@users.noreply.github.com>
AuthorDate: Tue Nov 28 14:52:00 2023 +0100

    Parsing multipart UTF-8 encoded filename. (#89)
---
 .../apache/james/mime4j/util/MimeParameterMapping.java | 18 ++++++++++++++----
 .../field/LenientContentDispositionFieldTest.java      | 15 +++++++++++++--
 2 files changed, 27 insertions(+), 6 deletions(-)

diff --git 
a/core/src/main/java/org/apache/james/mime4j/util/MimeParameterMapping.java 
b/core/src/main/java/org/apache/james/mime4j/util/MimeParameterMapping.java
index 1335310e..d8b5af2a 100644
--- a/core/src/main/java/org/apache/james/mime4j/util/MimeParameterMapping.java
+++ b/core/src/main/java/org/apache/james/mime4j/util/MimeParameterMapping.java
@@ -25,6 +25,8 @@ import java.util.Map;
 public class MimeParameterMapping {
 
     private final Map<String, String> parameters = new HashMap<>();
+    /** Charset, taken from the first item added to {@link #parameters}. */
+    private String charset;
 
     public Map<String, String> getParameters() {
         return parameters;
@@ -50,15 +52,23 @@ public class MimeParameterMapping {
         int charsetEnd = value.indexOf("'");
         int languageEnd = value.indexOf("'", charsetEnd + 1);
         if (charsetEnd < 0 || languageEnd < 0) {
-            return MimeUtil.unscrambleHeaderValue(value);
+            if (charset != null) {
+                return urlDecode(value);
+            } else {
+                return MimeUtil.unscrambleHeaderValue(value);
+            }
         }
-        String charset = value.substring(0, charsetEnd);
+        charset = value.substring(0, charsetEnd);
         String fileName = value.substring(languageEnd + 1);
+        return urlDecode(fileName);
+    }
+
+    private String urlDecode(String value) {
         try {
-            return java.net.URLDecoder.decode(fileName, charset);
+            return java.net.URLDecoder.decode(value, charset);
         }
         catch (Exception ignore) {
-            return fileName;
+            return value;
         }
     }
 
diff --git 
a/dom/src/test/java/org/apache/james/mime4j/field/LenientContentDispositionFieldTest.java
 
b/dom/src/test/java/org/apache/james/mime4j/field/LenientContentDispositionFieldTest.java
index e3ca1c8c..5978f3b2 100644
--- 
a/dom/src/test/java/org/apache/james/mime4j/field/LenientContentDispositionFieldTest.java
+++ 
b/dom/src/test/java/org/apache/james/mime4j/field/LenientContentDispositionFieldTest.java
@@ -124,7 +124,7 @@ public class LenientContentDispositionFieldTest {
             " 
FileName=\"=?WINDOWS-1251?Q?3244659=5F=C0=EA=F2_=E7=E0_=C8=FE=EB=FC_?=\n" +
             " =?WINDOWS-1251?Q?2020.pdf?=\"")
             .getBytes(StandardCharsets.UTF_8);
-        
+
         ContentDispositionField f = parse(data);
 
         Assert.assertEquals("WINDOWS-1251 Q encoded filename", "3244659_Акт за 
Июль 2020.pdf", f.getFilename());
@@ -132,7 +132,7 @@ public class LenientContentDispositionFieldTest {
 
     @Test
     public void testGetFilenameUtf8() throws Exception {
-        byte[] data = 
+        byte[] data =
             "Content-Disposition: attachment; filename=\"УПД ОБЩЕСТВО С 
ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ \"СТАНЦИЯ ВИРТУАЛЬНАЯ\" 01-05-21.pdf\""
             .getBytes(StandardCharsets.UTF_8);
 
@@ -141,6 +141,17 @@ public class LenientContentDispositionFieldTest {
         Assert.assertEquals("UTF8 encoded filename", "УПД ОБЩЕСТВО С 
ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ \"СТАНЦИЯ ВИРТУАЛЬНАЯ\" 01-05-21.pdf", 
f.getFilename());
     }
 
+    @Test
+    public void testGetFilenameMultipartUtf8() throws Exception {
+        byte[] data = ("Content-Disposition: attachment;\n" +
+            "  
filename*0*=\"UTF-8''%D0%A0%D0%BE%D1%81%D1%82%D0%B5%D0%BB%D0%B5%D0%BA%D0%BE\";\n"
 +
+            "  filename*1*=\"%D0%BC%2E%78%6C%73%78\"\n")
+            .getBytes(StandardCharsets.UTF_8);
+
+        ContentDispositionField f = parse(data);
+        Assert.assertEquals("Ростелеком.xlsx", f.getFilename());
+    }
+
     @Test
     public void testGetCreationDate() throws Exception {
         ContentDispositionField f = parse("Content-Disposition: inline; "


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to