(geronimo-mail) 02/07: GERONIMO-6896 - getContentLanguage() throws NPE for IMAP messages whose BODYSTRUCTURE has no language field
[email protected] Sat, 18 Jul 2026 18:49:01 +0000
| Newsgroups | gmane.comp.java.geronimo.cvs |
|---|---|
| Message-ID | <[email protected]> |
This is an automated email from the ASF dual-hosted git repository. rzo1 pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/geronimo-mail.git commit 51c2a9af39024002ea6da7a7ab17506c39d36608 Author: Richard Zowalla <[email protected]> AuthorDate: Sat Jul 18 20:48:28 2026 +0200 GERONIMO-6896 - getContentLanguage() throws NPE for IMAP messages whose BODYSTRUCTURE has no language field --- .../geronimo/mail/store/imap/IMAPMessage.java | 3 +- .../mail/store/imap/IMAPTckRegressionTest.java | 91 ++++++++++++++++++++++ geronimo-mail_2.1_tck/src/tck/geronimo.jtx | 1 - 3 files changed, 93 insertions(+), 2 deletions(-) diff --git a/geronimo-mail_2.1_impl/geronimo-mail_2.1_provider/src/main/java/org/apache/geronimo/mail/store/imap/IMAPMessage.java b/geronimo-mail_2.1_impl/geronimo-mail_2.1_provider/src/main/java/org/apache/geronimo/mail/store/imap/IMAPMessage.java index 7fa8f11..722bfb0 100644 --- a/geronimo-mail_2.1_impl/geronimo-mail_2.1_provider/src/main/java/org/apache/geronimo/mail/store/imap/IMAPMessage.java +++ b/geronimo-mail_2.1_impl/geronimo-mail_2.1_provider/src/main/java/org/apache/geronimo/mail/store/imap/IMAPMessage.java @@ -550,7 +550,8 @@ public class IMAPMessage extends MimeMessage { public String[] getContentLanguage() throws MessagingException { loadBodyStructure(); - if (!bodyStructure.languages.isEmpty()) { + // the BODYSTRUCTURE response may not have included any language information at all + if (bodyStructure.languages != null && !bodyStructure.languages.isEmpty()) { return (String[])bodyStructure.languages.toArray(new String[bodyStructure.languages.size()]); } return null; diff --git a/geronimo-mail_2.1_impl/geronimo-mail_2.1_provider/src/test/java/org/apache/geronimo/mail/store/imap/IMAPTckRegressionTest.java b/geronimo-mail_2.1_impl/geronimo-mail_2.1_provider/src/test/java/org/apache/geronimo/mail/store/imap/IMAPTckRegressionTest.java new file mode 100644 index 0000000..667f94f --- /dev/null +++ b/geronimo-mail_2.1_impl/geronimo-mail_2.1_provider/src/test/java/org/apache/geronimo/mail/store/imap/IMAPTckRegressionTest.java @@ -0,0 +1,91 @@ +/** + * 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.geronimo.mail.store.imap; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.util.Properties; + +import jakarta.mail.Folder; +import jakarta.mail.Session; +import jakarta.mail.Store; + +import org.apache.geronimo.mail.testserver.AbstractProtocolTest; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNull; + +/** + * Regression tests for a set of IMAP provider defects surfaced by the + * Jakarta Mail TCK when run against Apache James. + */ +public class IMAPTckRegressionTest extends AbstractProtocolTest { + + protected Store connect() throws Exception { + final Properties props = new Properties(); + props.setProperty("mail.imap.port", String.valueOf(imapConf.getListenerPort())); + props.setProperty("mail.debug", "true"); + final Session session = Session.getInstance(props); + final Store store = session.getStore("imap"); + store.connect("127.0.0.1", "serveruser", "serverpass"); + return store; + } + + protected byte[] readMessageResource(final String name) throws Exception { + final ByteArrayOutputStream bout = new ByteArrayOutputStream(); + try (InputStream in = IMAPTckRegressionTest.class.getResourceAsStream(name)) { + final byte[] buf = new byte[4096]; + int n; + while ((n = in.read(buf)) != -1) { + bout.write(buf, 0, n); + } + } + return bout.toByteArray(); + } + + protected void createMailboxWithMessage(final String name) throws Exception { + server.createUserMailbox(name); + server.appendToUserMailbox(name, readMessageResource("/messages/simple.msg")); + } + + /** + * MimeMessage#getContentLanguage_Test: a message whose BODYSTRUCTURE + * carries no language information used to trigger a NullPointerException; + * the spec requires a null return instead. + */ + @Test + public void testGetContentLanguageWithoutLanguagesReturnsNull() throws Exception { + start(); + createMailboxWithMessage("test1"); + + final Store store = connect(); + try { + final Folder folder = store.getDefaultFolder().getFolder("test1"); + folder.open(Folder.READ_ONLY); + try { + final jakarta.mail.internet.MimeMessage msg = + (jakarta.mail.internet.MimeMessage) folder.getMessage(1); + assertNull(msg.getContentLanguage(), + "getContentLanguage must return null when the message has no Content-Language"); + } finally { + folder.close(false); + } + } finally { + store.close(); + } + } +} diff --git a/geronimo-mail_2.1_tck/src/tck/geronimo.jtx b/geronimo-mail_2.1_tck/src/tck/geronimo.jtx index 844f991..0cbef10 100644 --- a/geronimo-mail_2.1_tck/src/tck/geronimo.jtx +++ b/geronimo-mail_2.1_tck/src/tck/geronimo.jtx @@ -54,7 +54,6 @@ javasoft/sqe/tests/jakarta/mail/internet/MimeBodyPart/testlist.html#attachFile_s javasoft/sqe/tests/jakarta/mail/internet/MimeBodyPart/testlist.html#isMimeType_Test javasoft/sqe/tests/jakarta/mail/internet/MimeBodyPart/testlist.html#setContentLanguage_Test javasoft/sqe/tests/jakarta/mail/internet/MimeBodyPart/testlist.html#setFileNameEncoded_Test -javasoft/sqe/tests/jakarta/mail/internet/MimeMessage/testlist.html#getContentLanguage_Test javasoft/sqe/tests/jakarta/mail/internet/MimeMessage/testlist.html#setFileNameEncoded_Test javasoft/sqe/tests/jakarta/mail/internet/MimeMessage/testlist.html#setSentDate_Test javasoft/sqe/tests/jakarta/mail/internet/MimeMessage/testlist.html#unicode_Test