This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new cba9f013e8 JAMES-4063 Update SMIMECheckSignature to use Filesystem to 
load crypto materials
cba9f013e8 is described below

commit cba9f013e8a1f3da4650d6d8ce3740e69687b4bb
Author: hung phan <[email protected]>
AuthorDate: Fri Aug 23 17:21:58 2024 +0700

    JAMES-4063 Update SMIMECheckSignature to use Filesystem to load crypto 
materials
---
 mailet/crypto/pom.xml                              |  4 +++
 .../transport/KeyStoreHolderConfiguration.java     | 11 ++++---
 .../james/transport/KeyStoreHolderFactory.java     | 38 +++++++++++++++++-----
 .../java/org/apache/james/transport/PemReader.java |  4 +--
 .../transport/mailets/SMIMECheckSignature.java     | 10 +++++-
 .../apache/james/mailets/TemporaryJamesServer.java |  4 +--
 ...ckSignatureWithKeyStoreFileIntegrationTest.java |  3 +-
 ...MECheckSignatureWithPemFileIntegrationTest.java |  3 +-
 8 files changed, 55 insertions(+), 22 deletions(-)

diff --git a/mailet/crypto/pom.xml b/mailet/crypto/pom.xml
index 44820e7ae7..bc7c11e2e5 100644
--- a/mailet/crypto/pom.xml
+++ b/mailet/crypto/pom.xml
@@ -41,6 +41,10 @@
             <groupId>${james.groupId}</groupId>
             <artifactId>apache-mailet-base</artifactId>
         </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-core</artifactId>
+        </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
             <artifactId>james-server-data-api</artifactId>
diff --git 
a/mailet/crypto/src/main/java/org/apache/james/transport/KeyStoreHolderConfiguration.java
 
b/mailet/crypto/src/main/java/org/apache/james/transport/KeyStoreHolderConfiguration.java
index ae65bdebcb..3ef0e070c3 100644
--- 
a/mailet/crypto/src/main/java/org/apache/james/transport/KeyStoreHolderConfiguration.java
+++ 
b/mailet/crypto/src/main/java/org/apache/james/transport/KeyStoreHolderConfiguration.java
@@ -22,6 +22,7 @@ package org.apache.james.transport;
 import java.security.KeyStore;
 import java.util.Optional;
 
+import org.apache.james.filesystem.api.FileSystem;
 import org.apache.mailet.MailetConfig;
 
 import com.google.common.base.Preconditions;
@@ -118,8 +119,8 @@ public abstract class KeyStoreHolderConfiguration {
         }
 
         @Override
-        public KeyStoreHolderFactory.FileLoader getFileLoader() {
-            return new KeyStoreHolderFactory.KeyStoreFileLoader();
+        public KeyStoreHolderFactory.FileLoader getFileLoader(FileSystem 
fileSystem) {
+            return new KeyStoreHolderFactory.KeyStoreFileLoader(fileSystem);
         }
     }
 
@@ -135,10 +136,10 @@ public abstract class KeyStoreHolderConfiguration {
         }
 
         @Override
-        public KeyStoreHolderFactory.FileLoader getFileLoader() {
-            return new KeyStoreHolderFactory.PemFileLoader();
+        public KeyStoreHolderFactory.FileLoader getFileLoader(FileSystem 
fileSystem) {
+            return new KeyStoreHolderFactory.PemFileLoader(fileSystem);
         }
     }
 
-    public abstract KeyStoreHolderFactory.FileLoader getFileLoader();
+    public abstract KeyStoreHolderFactory.FileLoader getFileLoader(FileSystem 
fileSystem);
 }
diff --git 
a/mailet/crypto/src/main/java/org/apache/james/transport/KeyStoreHolderFactory.java
 
b/mailet/crypto/src/main/java/org/apache/james/transport/KeyStoreHolderFactory.java
index a0500fcff9..38e5ee3af3 100644
--- 
a/mailet/crypto/src/main/java/org/apache/james/transport/KeyStoreHolderFactory.java
+++ 
b/mailet/crypto/src/main/java/org/apache/james/transport/KeyStoreHolderFactory.java
@@ -20,7 +20,6 @@
 package org.apache.james.transport;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.security.KeyStore;
@@ -32,6 +31,7 @@ import java.security.cert.CertificateException;
 import jakarta.mail.MessagingException;
 
 import org.apache.commons.io.input.UnsynchronizedBufferedInputStream;
+import org.apache.james.filesystem.api.FileSystem;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,12 +39,19 @@ import com.github.fge.lambdas.Throwing;
 
 public class KeyStoreHolderFactory {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(KeyStoreHolderFactory.class);
+    private static final String DEFAULT_KEYSTORE_FILE_PATH = 
FileSystem.FILE_PROTOCOL + System.getProperty("java.home") + 
"/lib/security/cacerts".replace('/', File.separatorChar);
 
     interface FileLoader {
         KeyStoreHolder load(KeyStoreHolderConfiguration config) throws 
Exception;
     }
 
     static class KeyStoreFileLoader implements FileLoader {
+        private final FileSystem fileSystem;
+
+        public KeyStoreFileLoader(FileSystem fileSystem) {
+            this.fileSystem = fileSystem;
+        }
+
         @Override
         public KeyStoreHolder load(KeyStoreHolderConfiguration config) {
             KeyStoreHolderConfiguration.KeyStoreConfiguration keyStoreConfig = 
(KeyStoreHolderConfiguration.KeyStoreConfiguration) config;
@@ -52,19 +59,16 @@ public class KeyStoreHolderFactory {
                 .map(Throwing.function(fileName -> 
createFromKeyStoreFile(fileName, keyStoreConfig.getKeyStorePassword(), 
keyStoreConfig.getKeyStoreType())))
                 .orElseGet(Throwing.supplier(() -> {
                     LOGGER.info("No trusted store path specified, using 
default store.");
-                    return 
createFromKeyStoreFile(System.getProperty("java.home") + 
"/lib/security/cacerts".replace('/', File.separatorChar),
-                        keyStoreConfig.getKeyStorePassword(),
-                        KeyStore.getDefaultType());
+                    return createFromKeyStoreFile(DEFAULT_KEYSTORE_FILE_PATH, 
keyStoreConfig.getKeyStorePassword(), KeyStore.getDefaultType());
                 }));
         }
 
         private KeyStoreHolder createFromKeyStoreFile(String keyStoreFileName, 
String keyStorePassword, String keyStoreType)
             throws KeyStoreException, NoSuchAlgorithmException, 
CertificateException, IOException {
-
             KeyStore keyStore = KeyStore.getInstance(keyStoreType);
             keyStore.load(UnsynchronizedBufferedInputStream
                 .builder()
-                .setInputStream(new FileInputStream(keyStoreFileName))
+                .setInputStream(fileSystem.getResource(keyStoreFileName))
                 .get(), keyStorePassword.toCharArray());
             if (keyStore.size() == 0) {
                 throw new KeyStoreException("The keystore must be not empty");
@@ -74,10 +78,16 @@ public class KeyStoreHolderFactory {
     }
 
     static class PemFileLoader implements FileLoader {
+        private final FileSystem fileSystem;
+
+        public PemFileLoader(FileSystem fileSystem) {
+            this.fileSystem = fileSystem;
+        }
+
         @Override
         public KeyStoreHolder load(KeyStoreHolderConfiguration config) throws 
Exception {
             KeyStoreHolderConfiguration.PemConfiguration pemConfig = 
(KeyStoreHolderConfiguration.PemConfiguration) config;
-            KeyStore keyStore = 
PemReader.loadTrustStore(pemConfig.getPemFileName());
+            KeyStore keyStore = 
PemReader.loadTrustStore(fileSystem.getFile(pemConfig.getPemFileName()));
             if (keyStore.size() == 0) {
                 throw new KeyStoreException("The keystore must be not empty");
             }
@@ -85,10 +95,20 @@ public class KeyStoreHolderFactory {
         }
     }
 
-    public static KeyStoreHolder 
createKeyStoreHolder(KeyStoreHolderConfiguration config) throws 
MessagingException {
+    public static KeyStoreHolderFactory from(FileSystem fileSystem) {
+        return new KeyStoreHolderFactory(fileSystem);
+    }
+
+    private final FileSystem fileSystem;
+
+    private KeyStoreHolderFactory(FileSystem fileSystem) {
+        this.fileSystem = fileSystem;
+    }
+
+    public KeyStoreHolder createKeyStoreHolder(KeyStoreHolderConfiguration 
config) throws MessagingException {
         try {
             initJCE();
-            return config.getFileLoader().load(config);
+            return config.getFileLoader(fileSystem).load(config);
         } catch (Exception e) {
             throw new MessagingException("Error loading the trusted 
certificate store", e);
         }
diff --git 
a/mailet/crypto/src/main/java/org/apache/james/transport/PemReader.java 
b/mailet/crypto/src/main/java/org/apache/james/transport/PemReader.java
index 589fe6da17..e9fe1b4032 100644
--- a/mailet/crypto/src/main/java/org/apache/james/transport/PemReader.java
+++ b/mailet/crypto/src/main/java/org/apache/james/transport/PemReader.java
@@ -68,11 +68,11 @@ public class PemReader {
             "-+END\\s+.*PRIVATE\\s+KEY[^-]*-+",            // Footer
         CASE_INSENSITIVE);
 
-    public static KeyStore loadTrustStore(String certificateChainFile) throws 
IOException, GeneralSecurityException {
+    public static KeyStore loadTrustStore(File certificateChainFile) throws 
IOException, GeneralSecurityException {
         KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
         keyStore.load(null, null);
 
-        List<X509Certificate> certificateChain = readCertificateChain(new 
File(certificateChainFile));
+        List<X509Certificate> certificateChain = 
readCertificateChain(certificateChainFile);
         for (X509Certificate certificate : certificateChain) {
             X500Principal principal = certificate.getSubjectX500Principal();
             keyStore.setCertificateEntry(principal.getName("RFC2253"), 
certificate);
diff --git 
a/mailet/crypto/src/main/java/org/apache/james/transport/mailets/SMIMECheckSignature.java
 
b/mailet/crypto/src/main/java/org/apache/james/transport/mailets/SMIMECheckSignature.java
index 1cd45756d4..7dfa7c072d 100644
--- 
a/mailet/crypto/src/main/java/org/apache/james/transport/mailets/SMIMECheckSignature.java
+++ 
b/mailet/crypto/src/main/java/org/apache/james/transport/mailets/SMIMECheckSignature.java
@@ -26,12 +26,14 @@ import java.security.cert.CertificateEncodingException;
 import java.util.ArrayList;
 import java.util.List;
 
+import jakarta.inject.Inject;
 import jakarta.mail.MessagingException;
 import jakarta.mail.Multipart;
 import jakarta.mail.internet.MimeBodyPart;
 import jakarta.mail.internet.MimeMessage;
 import jakarta.mail.internet.MimeMultipart;
 
+import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.transport.KeyStoreHolder;
 import org.apache.james.transport.KeyStoreHolderConfiguration;
 import org.apache.james.transport.KeyStoreHolderFactory;
@@ -112,11 +114,17 @@ public class SMIMECheckSignature extends GenericMailet {
 
     private static final String SMIME_STATUS_HEADER = "X-SMIME-Status";
 
+    private final FileSystem fileSystem;
     private KeyStoreHolder trustedCertificateStore;
     private boolean stripSignature = false;
     private boolean onlyTrusted = true;
     private AttributeName mailAttribute = 
AttributeName.of("org.apache.james.SMIMECheckSignature");
 
+    @Inject
+    public SMIMECheckSignature(FileSystem fileSystem) {
+        this.fileSystem = fileSystem;
+    }
+
     @Override
     public void init() throws MessagingException {
         MailetConfig config = getMailetConfig();
@@ -136,7 +144,7 @@ public class SMIMECheckSignature extends GenericMailet {
             mailAttribute = AttributeName.of(mailAttributeConf);
         }
 
-        trustedCertificateStore = 
KeyStoreHolderFactory.createKeyStoreHolder(KeyStoreHolderConfiguration.from(config));
+        trustedCertificateStore = 
KeyStoreHolderFactory.from(fileSystem).createKeyStoreHolder(KeyStoreHolderConfiguration.from(config));
     }
 
     @Override
diff --git 
a/server/mailet/integration-testing/src/main/java/org/apache/james/mailets/TemporaryJamesServer.java
 
b/server/mailet/integration-testing/src/main/java/org/apache/james/mailets/TemporaryJamesServer.java
index 81139fae44..1f136009cd 100644
--- 
a/server/mailet/integration-testing/src/main/java/org/apache/james/mailets/TemporaryJamesServer.java
+++ 
b/server/mailet/integration-testing/src/main/java/org/apache/james/mailets/TemporaryJamesServer.java
@@ -139,9 +139,7 @@ public class TemporaryJamesServer {
         "pop3server.xml",
         "recipientrewritetable.xml",
         "usersrepository.xml",
-        "smime.p12",
-        "trusted_cert_keystore",
-        "trusted_certificate.pem");
+        "smime.p12");
 
     private final GuiceJamesServer jamesServer;
 
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMECheckSignatureWithKeyStoreFileIntegrationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMECheckSignatureWithKeyStoreFileIntegrationTest.java
index d730acd0b1..1e0bdc0806 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMECheckSignatureWithKeyStoreFileIntegrationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMECheckSignatureWithKeyStoreFileIntegrationTest.java
@@ -24,6 +24,7 @@ import static 
org.apache.james.mailets.configuration.Constants.DEFAULT_DOMAIN;
 import java.io.File;
 
 import org.apache.james.MemoryJamesServerMain;
+import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.mailets.TemporaryJamesServer;
 import org.apache.james.mailets.configuration.CommonProcessors;
 import org.apache.james.mailets.configuration.MailetConfiguration;
@@ -59,7 +60,7 @@ public class 
SMIMECheckSignatureWithKeyStoreFileIntegrationTest extends SMIMEChe
                     .mailet(SMIMECheckSignature.class)
                     .matcher(All.class)
                     .addProperty("fileType", "keystore")
-                    .addProperty("keyStoreFileName", 
temporaryFolder.toPath().resolve("conf").resolve("trusted_cert_keystore").toAbsolutePath().toString())
+                    .addProperty("keyStoreFileName", 
FileSystem.CLASSPATH_PROTOCOL + "trusted_cert_keystore")
                     .addProperty("keyStorePassword", "secret")
                     .addProperty("keyStoreType", "PKCS12")
                     .addProperty("debug", "true"))
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMECheckSignatureWithPemFileIntegrationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMECheckSignatureWithPemFileIntegrationTest.java
index e850c0cd77..1c33661c59 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMECheckSignatureWithPemFileIntegrationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/crypto/SMIMECheckSignatureWithPemFileIntegrationTest.java
@@ -24,6 +24,7 @@ import static 
org.apache.james.mailets.configuration.Constants.DEFAULT_DOMAIN;
 import java.io.File;
 
 import org.apache.james.MemoryJamesServerMain;
+import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.mailets.TemporaryJamesServer;
 import org.apache.james.mailets.configuration.CommonProcessors;
 import org.apache.james.mailets.configuration.MailetConfiguration;
@@ -59,7 +60,7 @@ public class SMIMECheckSignatureWithPemFileIntegrationTest 
extends SMIMECheckSig
                     .mailet(SMIMECheckSignature.class)
                     .matcher(All.class)
                     .addProperty("fileType", "pem")
-                    .addProperty("pemFileName", 
temporaryFolder.toPath().resolve("conf").resolve("trusted_certificate.pem").toAbsolutePath().toString())
+                    .addProperty("pemFileName", FileSystem.CLASSPATH_PROTOCOL 
+ "trusted_certificate.pem")
                     .addProperty("debug", "true"))
                 .addMailet(MailetConfiguration.LOCAL_DELIVERY))
             .build();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to