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