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