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 2dd9015a MIME4J-109 Add (disabled) tests for MIME parameter decoding
2dd9015a is described below

commit 2dd9015a302c53c935c2c165ed70e3c3554bcb97
Author: cketti <c...@cketti.de>
AuthorDate: Thu Aug 25 23:51:00 2022 +0200

    MIME4J-109 Add (disabled) tests for MIME parameter decoding
---
 .../james/mime4j/field/ContentTypeFieldImpl.java   |   5 +
 .../mime4j/field/ContentTypeFieldLenientImpl.java  |   5 +
 .../field/ContentTypeFieldMimeParameterTest.java   | 339 +++++++++++++++++++++
 3 files changed, 349 insertions(+)

diff --git 
a/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldImpl.java 
b/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldImpl.java
index 01a9f813..7bad508b 100644
--- a/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldImpl.java
+++ b/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldImpl.java
@@ -228,5 +228,10 @@ public class ContentTypeFieldImpl extends AbstractField 
implements ContentTypeFi
             return new ContentTypeFieldImpl(rawField, monitor);
         }
 
+        @Override
+        public String toString() {
+            return "ContentTypeFieldImpl.PARSER";
+        }
+
     };
 }
diff --git 
a/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java
 
b/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java
index 66004460..7b923d7b 100644
--- 
a/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java
+++ 
b/dom/src/main/java/org/apache/james/mime4j/field/ContentTypeFieldLenientImpl.java
@@ -150,6 +150,11 @@ public class ContentTypeFieldLenientImpl extends 
AbstractField implements Conten
             return new ContentTypeFieldLenientImpl(rawField, monitor);
         }
 
+        @Override 
+        public String toString() {
+            return "ContentTypeFieldLenientImpl.PARSER";
+        }
+
     };
 
 }
diff --git 
a/dom/src/test/java/org/apache/james/mime4j/field/ContentTypeFieldMimeParameterTest.java
 
b/dom/src/test/java/org/apache/james/mime4j/field/ContentTypeFieldMimeParameterTest.java
new file mode 100644
index 00000000..126a4c07
--- /dev/null
+++ 
b/dom/src/test/java/org/apache/james/mime4j/field/ContentTypeFieldMimeParameterTest.java
@@ -0,0 +1,339 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mime4j.field;
+
+import java.util.AbstractMap.SimpleEntry;
+import java.util.Arrays;
+import java.util.Collection;
+import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.dom.FieldParser;
+import org.apache.james.mime4j.dom.field.ContentTypeField;
+import org.apache.james.mime4j.stream.RawField;
+import org.apache.james.mime4j.stream.RawFieldParser;
+import org.apache.james.mime4j.util.ByteSequence;
+import org.apache.james.mime4j.util.ContentUtil;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(Parameterized.class)
+public class ContentTypeFieldMimeParameterTest {
+
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<FieldParser<ContentTypeField>> data() {
+        return Arrays.asList(ContentTypeFieldImpl.PARSER, 
ContentTypeFieldLenientImpl.PARSER);
+    }
+
+    private final FieldParser<ContentTypeField> parser;
+
+    public ContentTypeFieldMimeParameterTest(FieldParser<ContentTypeField> 
parser) {
+        this.parser = parser;
+    }
+
+    @Test
+    public void rfc2045_example1() throws MimeException {
+        ContentTypeField field = parse("Content-Type: text/plain; 
charset=us-ascii (Plain text)");
+
+        assertThat(field.getMimeType()).isEqualTo("text/plain");
+        assertThat(field.getCharset()).isEqualTo("us-ascii");
+    }
+
+    @Test
+    public void rfc2045_example2() throws MimeException {
+        ContentTypeField field = parse("Content-Type: text/plain; 
charset=\"us-ascii\"");
+
+        assertThat(field.getMimeType()).isEqualTo("text/plain");
+        assertThat(field.getCharset()).isEqualTo("us-ascii");
+    }
+
+    @Ignore("Missing RFC2231 support")
+    @Test
+    public void rfc2231_example1() throws MimeException {
+        ContentTypeField field = parse("Content-Type: message/external-body; 
access-type=URL;\r\n" +
+            " URL*0=\"ftp://\";\r\n"; +
+            " URL*1=\"cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar\"");
+
+        assertThat(field.getMimeType()).isEqualTo("message/external-body");
+        assertThat(field.getParameter("access-type")).isEqualTo("URL");
+        
assertThat(field.getParameter("url")).isEqualTo("ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar";);
+    }
+
+    @Test
+    public void rfc2231_example2() throws MimeException {
+        ContentTypeField field = parse("Content-Type: message/external-body; 
access-type=URL;\r\n" +
+            " URL=\"ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar\"";);
+
+        assertThat(field.getMimeType()).isEqualTo("message/external-body");
+        assertThat(field.getParameter("access-type")).isEqualTo("URL");
+        
assertThat(field.getParameter("url")).isEqualTo("ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar";);
+    }
+
+    @Ignore("Missing RFC2231 support")
+    @Test
+    public void rfc2231_example3() throws MimeException {
+        ContentTypeField field = parse("Content-Type: 
application/x-stuff;\r\n" +
+            " name*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A");
+
+        assertThat(field.getMimeType()).isEqualTo("application/x-stuff");
+        assertThat(field.getParameter("name")).isEqualTo("This is ***fun***");
+    }
+
+    @Ignore("Missing RFC2231 support")
+    @Test
+    public void rfc2231_example4() throws MimeException {
+        ContentTypeField field = parse("Content-Type: 
application/x-stuff;\r\n" +
+            " name*0*=us-ascii'en'This%20is%20even%20more%20;\r\n" +
+            " name*1*=%2A%2A%2Afun%2A%2A%2A%20;\r\n" +
+            " name*2=\"isn't it!\"");
+
+        assertThat(field.getMimeType()).isEqualTo("application/x-stuff");
+        assertThat(field.getParameter("name")).isEqualTo("This is even more 
***fun*** isn't it!");
+    }
+
+    @Ignore("Missing RFC2231 support")
+    @Test
+    public void multipleSectionsOutOfOrder() throws MimeException {
+        ContentTypeField field = parse("Content-Type: 
application/x-stuff;\r\n" +
+            " name*2=\"[three]\";\r\n" +
+            " name*1=\"[two]\";\r\n" +
+            " name*0=\"[one]\"");
+
+        assertThat(field.getParameter("name")).isEqualTo("[one][two][three]");
+    }
+
+    @Ignore("Missing RFC2231 support")
+    @Test
+    public void multipleSectionsDifferentlyCased() throws MimeException {
+        ContentTypeField field = parse("Content-Type: 
application/x-stuff;\r\n" +
+            " name*0=\"[one]\";\r\n" +
+            " NAME*1=\"[two]\";\r\n" +
+            " nAmE*2=\"[three]\"");
+
+        assertThat(field.getParameter("name")).isEqualTo("[one][two][three]");
+    }
+
+    @Ignore("Missing RFC2231 support")
+    @Test
+    public void multipleSectionsSwitchingBetweenExtendedAndRegularValue() 
throws MimeException {
+        ContentTypeField field = parse("Content-Type: 
application/x-stuff;\r\n" +
+            " name*0*=utf-8'en'%5Bone%5D;\r\n" +
+            " name*1*=%5btwo%5d;\r\n" +
+            " name*2=\"[three]\";\r\n" +
+            " name*3*=%5Bfour%5D;\r\n" +
+            " name*4=\"[five]\";\r\n" +
+            " name*5=six");
+
+        
assertThat(field.getParameter("name")).isEqualTo("[one][two][three][four][five]six");
+    }
+
+    @Ignore("Missing RFC2231 support")
+    @Test
+    public void rfc2045AndRfc2231StyleParametersShouldUseRfc2231() throws 
MimeException {
+        ContentTypeField field = parse("Content-Type: 
application/x-stuff;\r\n" +
+            " name=\"filename.ext\";\r\n" +
+            " name*=utf-8''filen%C3%A4me.ext");
+
+        assertThat(field.getParameter("name")).isEqualTo("filenäme.ext");
+    }
+
+    @Ignore("Currently the right-most parameter wins")
+    @Test
+    public void duplicateParameterNames() throws MimeException {
+        ContentTypeField field = parse("Content-Type: 
application/x-stuff;\r\n" +
+            " name=one;\r\n" +
+            " extra=something;\r\n" +
+            " name=two");
+
+        assertThat(field.getParameter("name")).isNull();
+        assertThat(field.getParameter("extra")).isEqualTo("something");
+    }
+
+    @Ignore("Currently the right-most parameter wins")
+    @Test
+    public void duplicateParameterNamesDifferingInCase() throws MimeException {
+        ContentTypeField field = parse("Content-Type: 
application/x-stuff;\r\n" +
+            " name=one;\r\n" +
+            " extra=something;\r\n" +
+            " NAME=two");
+
+        assertThat(field.getParameter("name")).isNull();
+        assertThat(field.getParameter("extra")).isEqualTo("something");
+    }
+
+    @Test
+    public void commentsEverywhere() throws MimeException {
+        ContentTypeField field = parse("Content-Type: 
(comment)application(comment)/(comment)x-stuff" +
+            "(comment);(comment)\r\n" +
+            " (comment)name(comment)=(comment)one(comment);(comment)\r\n" +
+            "  (comment) extra (comment) = (comment) something (comment)");
+
+        assertThat(field.getParameter("name")).isEqualTo("one");
+        assertThat(field.getParameter("extra")).isEqualTo("something");
+    }
+
+    @Ignore("Missing RFC2231 support")
+    @Test
+    public void iso8859_1_charset() throws MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*=iso-8859-1''filen%E4me.ext");
+
+        assertThat(field.getParameter("name")).isEqualTo("filenäme.ext");
+    }
+
+    @Ignore("Missing RFC2231 support")
+    @Test
+    public void missingCharset() throws MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*=''filen%AAme.ext");
+
+        assertThat(field.getParameter("name")).isEqualTo("filen%AAme.ext");
+    }
+
+    @Ignore("Missing RFC2231 support")
+    @Test
+    public void unknownCharset() throws MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*=foobar''filen%AAme.ext");
+
+        assertThat(field.getParameter("name")).isEqualTo("filen%AAme.ext");
+    }
+
+    @Test
+    public void sectionIndexMissing() throws MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name**=utf-8''filename");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name**", "utf-8''filename"));
+    }
+
+    @Test
+    public void sectionIndexNotANumber() throws MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*x*=filename");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*x*", "filename"));
+    }
+
+    @Test
+    public void sectionIndexPrefixedWithPlus() throws MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*+0=filename");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*+0", "filename"));
+    }
+
+    @Test
+    public void sectionIndexPrefixedWithMinus() throws MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*-0=filename");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*-0", "filename"));
+    }
+
+    @Test
+    public void sectionIndexWithTwoZeros() throws MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*00=filename");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*00", "filename"));
+    }
+
+    @Ignore("Missing RFC2231 support")
+    @Test
+    public void sectionIndexWithLeadingZero() throws MimeException {
+        ContentTypeField field = parse("Content-Type: 
application/x-stuff;\r\n" +
+            " name*0=one;\r\n" +
+            " name*01=two");
+
+        assertThat(field.getParameters())
+            .containsExactly(new SimpleEntry<>("name", "one"), new 
SimpleEntry<>("name*01", "two"));
+    }
+
+    @Test
+    public void sectionIndexWithHugeNumber() throws MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*10000000000000000000=filename");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*10000000000000000000", "filename"));
+    }
+
+    @Test
+    public void extendedParameterNameWithAdditionalAsterisk() throws 
MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*0**=utf-8''filename");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*0**", "utf-8''filename"));
+    }
+
+    @Test
+    public void extendedParameterNameWithAdditionalText() throws MimeException 
{
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*0*x=utf-8''filename");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*0*x", "utf-8''filename"));
+    }
+
+    @Test
+    public void extendedParameterValueWithQuotedString() throws MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*0*=\"utf-8''filename\"");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*0*", "utf-8''filename"));
+    }
+
+    @Test
+    public void extendedInitialParameterValueMissingSingleQuotes() throws 
MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*0*=filename");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*0*", "filename"));
+    }
+
+    @Test
+    public void extendedInitialParameterValueMissingSecondSingleQuote() throws 
MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*0*='");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*0*", "'"));
+    }
+
+    @Test
+    public void extendedParameterValueWithTrailingPercentSign() throws 
MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*=utf-8''file%");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*", "utf-8''file%"));
+    }
+
+    @Test
+    public void extendedParameterValueWithInvalidPercentEncoding() throws 
MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*=UTF-8''f%oo.html");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*", "UTF-8''f%oo.html"));
+    }
+
+    @Test
+    public void sectionZeroMissing() throws MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name*1=filename");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name*1", "filename"));
+    }
+
+    @Test
+    public void semicolonInParameterValue() throws MimeException {
+        ContentTypeField field = parse("Content-Type: application/x-stuff; 
name=\"Here's a semicolon;.txt\"");
+
+        assertThat(field.getParameters()).containsExactly(new 
SimpleEntry<>("name", "Here's a semicolon;.txt"));
+    }
+
+    private ContentTypeField parse(final String input) throws MimeException {
+        ByteSequence raw = ContentUtil.encode(input);
+        RawField rawField = RawFieldParser.DEFAULT.parseField(raw);
+        return parser.parse(rawField, null);
+    }
+}


---------------------------------------------------------------------
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