From 100f5fc0d5bc51c5b37b8e35d1d8bc4cb417322f Mon Sep 17 00:00:00 2001 From: David Whitlock Date: Thu, 28 Nov 2024 09:57:26 -0800 Subject: [PATCH 1/2] Attempt to update to Greenmail 2.1.1. It's not working yet because the self-signed certificate doesn't have a subject alternate name for localhost. --- grader/pom.xml | 2 +- .../pdx/cs/joy/grader/GreenmailIntegrationTestCase.java | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/grader/pom.xml b/grader/pom.xml index dcb0673dd..387d63f91 100644 --- a/grader/pom.xml +++ b/grader/pom.xml @@ -64,7 +64,7 @@ com.icegreen greenmail - 2.0.1 + 2.1.1 test diff --git a/grader/src/it/java/edu/pdx/cs/joy/grader/GreenmailIntegrationTestCase.java b/grader/src/it/java/edu/pdx/cs/joy/grader/GreenmailIntegrationTestCase.java index 54454abc1..66626b64d 100644 --- a/grader/src/it/java/edu/pdx/cs/joy/grader/GreenmailIntegrationTestCase.java +++ b/grader/src/it/java/edu/pdx/cs/joy/grader/GreenmailIntegrationTestCase.java @@ -6,6 +6,8 @@ import com.icegreen.greenmail.store.FolderListener; import com.icegreen.greenmail.store.MailFolder; import com.icegreen.greenmail.user.GreenMailUser; +import com.icegreen.greenmail.util.DummySSLServerSocketFactory; +import com.icegreen.greenmail.util.DummySSLSocketFactory; import com.icegreen.greenmail.util.GreenMail; import com.icegreen.greenmail.util.ServerSetup; import com.sun.mail.util.MailSSLSocketFactory; @@ -16,6 +18,7 @@ import org.junit.jupiter.api.BeforeEach; import java.security.GeneralSecurityException; +import java.security.Security; import java.util.Properties; public class GreenmailIntegrationTestCase { @@ -33,6 +36,8 @@ public void startEmailServer() throws FolderException, AuthorizationException { ServerSetup imaps = new ServerSetup(imapsPort, emailServerHost, ServerSetup.PROTOCOL_IMAPS); emailServer = new GreenMail(new ServerSetup[]{ smtp, imaps }); + Security.setProperty("ssl.SocketFactory.provider", DummySSLSocketFactory.class.getName()); + GreenMailUser user = emailServer.setUser(emailAddress, imapUserName, imapPassword); doSomethingWithUser(user); @@ -81,8 +86,7 @@ protected Folder openFolder(Store store, String folderName) throws MessagingExce protected Store connectToIMAPServer() throws GeneralSecurityException, MessagingException { Properties props = new Properties(); - MailSSLSocketFactory socketFactory = new MailSSLSocketFactory(); - socketFactory.setTrustedHosts(new String[]{"127.0.0.1", "localhost"}); + DummySSLSocketFactory socketFactory = new DummySSLSocketFactory(); props.put("mail.imaps.ssl.socketFactory", socketFactory); Session session = Session.getInstance(props, null); From 6b30f6c2c4e278f8d9091bd8bf29a9d81ac427f6 Mon Sep 17 00:00:00 2001 From: David Whitlock Date: Sat, 15 Aug 2026 16:29:54 -0700 Subject: [PATCH 2/2] =?UTF-8?q?GreenMail=20now=20uses=20Angus=20Mail,=20so?= =?UTF-8?q?=20the=20legacy=20com.sun.mail=20SSL=20socket=20factory=20was?= =?UTF-8?q?=20ignored.=20The=20tests=20hit=20GreenMail=E2=80=99s=20self-si?= =?UTF-8?q?gned=20IMAPS=20certificate;=20localhost-only=20trust=20and=20di?= =?UTF-8?q?sabled=20hostname=20verification=20now=20use=20standard=20mail?= =?UTF-8?q?=20properties.=20I=20also=20made=20the=20MIME=20content-type=20?= =?UTF-8?q?assertion=20case-insensitive=20because=20GreenMail=20now=20norm?= =?UTF-8?q?alizes=20text/plain.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grader/pom.xml | 2 +- .../joy/grader/GreenmailIntegrationTestCase.java | 14 +++----------- .../joy/grader/poa/POASubmissionsDownloaderIT.java | 3 ++- .../edu/pdx/cs/joy/grader/GraderEmailAccount.java | 9 +++------ 4 files changed, 9 insertions(+), 19 deletions(-) diff --git a/grader/pom.xml b/grader/pom.xml index 387d63f91..18a91ac6b 100644 --- a/grader/pom.xml +++ b/grader/pom.xml @@ -64,7 +64,7 @@ com.icegreen greenmail - 2.1.1 + 2.1.12 test diff --git a/grader/src/it/java/edu/pdx/cs/joy/grader/GreenmailIntegrationTestCase.java b/grader/src/it/java/edu/pdx/cs/joy/grader/GreenmailIntegrationTestCase.java index 66626b64d..5240be7f2 100644 --- a/grader/src/it/java/edu/pdx/cs/joy/grader/GreenmailIntegrationTestCase.java +++ b/grader/src/it/java/edu/pdx/cs/joy/grader/GreenmailIntegrationTestCase.java @@ -6,19 +6,14 @@ import com.icegreen.greenmail.store.FolderListener; import com.icegreen.greenmail.store.MailFolder; import com.icegreen.greenmail.user.GreenMailUser; -import com.icegreen.greenmail.util.DummySSLServerSocketFactory; -import com.icegreen.greenmail.util.DummySSLSocketFactory; import com.icegreen.greenmail.util.GreenMail; import com.icegreen.greenmail.util.ServerSetup; -import com.sun.mail.util.MailSSLSocketFactory; import jakarta.mail.*; import jakarta.mail.internet.InternetAddress; import jakarta.mail.internet.MimeMessage; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; -import java.security.GeneralSecurityException; -import java.security.Security; import java.util.Properties; public class GreenmailIntegrationTestCase { @@ -36,8 +31,6 @@ public void startEmailServer() throws FolderException, AuthorizationException { ServerSetup imaps = new ServerSetup(imapsPort, emailServerHost, ServerSetup.PROTOCOL_IMAPS); emailServer = new GreenMail(new ServerSetup[]{ smtp, imaps }); - Security.setProperty("ssl.SocketFactory.provider", DummySSLSocketFactory.class.getName()); - GreenMailUser user = emailServer.setUser(emailAddress, imapUserName, imapPassword); doSomethingWithUser(user); @@ -83,11 +76,10 @@ protected Folder openFolder(Store store, String folderName) throws MessagingExce return folder; } - protected Store connectToIMAPServer() throws GeneralSecurityException, MessagingException { + protected Store connectToIMAPServer() throws MessagingException { Properties props = new Properties(); - - DummySSLSocketFactory socketFactory = new DummySSLSocketFactory(); - props.put("mail.imaps.ssl.socketFactory", socketFactory); + props.put("mail.imaps.ssl.trust", emailServerHost); + props.put("mail.imaps.ssl.checkserveridentity", "false"); Session session = Session.getInstance(props, null); Store store = session.getStore("imaps"); diff --git a/grader/src/it/java/edu/pdx/cs/joy/grader/poa/POASubmissionsDownloaderIT.java b/grader/src/it/java/edu/pdx/cs/joy/grader/poa/POASubmissionsDownloaderIT.java index 5e8d6f72d..1ab5de13b 100644 --- a/grader/src/it/java/edu/pdx/cs/joy/grader/poa/POASubmissionsDownloaderIT.java +++ b/grader/src/it/java/edu/pdx/cs/joy/grader/poa/POASubmissionsDownloaderIT.java @@ -23,6 +23,7 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalToIgnoringCase; import static org.mockito.Mockito.*; public class POASubmissionsDownloaderIT extends GreenmailIntegrationTestCase { @@ -88,7 +89,7 @@ private void assertEmailIsProperlyProcessed(String subject, String poa, String s POASubmission submission = captor.getValue(); assertThat(submission.getSubject(), equalTo(subject)); assertThat(submission.getContent(), equalTo(poa)); - assertThat(submission.getContentType(), equalTo(contentType)); + assertThat(submission.getContentType(), equalToIgnoringCase(contentType)); assertThat(submission.getSubmitter(), equalTo(sender)); ArgumentCaptor statusCaptor = ArgumentCaptor.forClass(StatusMessage.class); diff --git a/grader/src/main/java/edu/pdx/cs/joy/grader/GraderEmailAccount.java b/grader/src/main/java/edu/pdx/cs/joy/grader/GraderEmailAccount.java index 1614dca45..6bc25a756 100644 --- a/grader/src/main/java/edu/pdx/cs/joy/grader/GraderEmailAccount.java +++ b/grader/src/main/java/edu/pdx/cs/joy/grader/GraderEmailAccount.java @@ -1,13 +1,11 @@ package edu.pdx.cs.joy.grader; import com.google.common.annotations.VisibleForTesting; -import com.sun.mail.util.MailSSLSocketFactory; import jakarta.mail.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.List; import java.util.Properties; @@ -280,9 +278,8 @@ private Store connectToIMAPServer() { Properties props = new Properties(); if (this.trustLocalhostSSL) { - MailSSLSocketFactory socketFactory= new MailSSLSocketFactory(); - socketFactory.setTrustedHosts("127.0.0.1", "localhost"); - props.put("mail.imaps.ssl.socketFactory", socketFactory); + props.put("mail.imaps.ssl.trust", "127.0.0.1 localhost"); + props.put("mail.imaps.ssl.checkserveridentity", "false"); } Session session = Session.getInstance(props, null); @@ -290,7 +287,7 @@ private Store connectToIMAPServer() { store.connect(this.emailServerHostName, this.emailServerPort, this.userName, this.password); return store; - } catch (MessagingException | GeneralSecurityException ex) { + } catch (MessagingException ex) { throw new IllegalStateException("While connecting to " + this.emailServerHostName + ":" + this.emailServerPort, ex); } }