diff --git a/dockerfiles/run/guice/destination/conf/jmap.properties b/dockerfiles/run/guice/destination/conf/jmap.properties new file mode 100644 index 00000000000..7c69d0e5a0d --- /dev/null +++ b/dockerfiles/run/guice/destination/conf/jmap.properties @@ -0,0 +1,4 @@ +# Configuration file for JMAP + +tls.keystoreURL=file://conf/keystore +tls.secret=james72laBalle \ No newline at end of file diff --git a/server/container/cassandra-guice/sample-configuration/jmap.properties b/server/container/cassandra-guice/sample-configuration/jmap.properties new file mode 100644 index 00000000000..7c69d0e5a0d --- /dev/null +++ b/server/container/cassandra-guice/sample-configuration/jmap.properties @@ -0,0 +1,4 @@ +# Configuration file for JMAP + +tls.keystoreURL=file://conf/keystore +tls.secret=james72laBalle \ No newline at end of file diff --git a/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/JMAPModule.java b/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/JMAPModule.java index 40957a77fb4..1396ab54256 100644 --- a/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/JMAPModule.java +++ b/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/JMAPModule.java @@ -18,11 +18,19 @@ ****************************************************************/ package org.apache.james.jmap; +import java.io.FileNotFoundException; + +import javax.inject.Singleton; + +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.PropertiesConfiguration; +import org.apache.james.filesystem.api.FileSystem; import org.apache.james.jmap.methods.RequestHandler; import org.apache.james.jmap.model.ProtocolRequest; import org.apache.james.jmap.model.ProtocolResponse; import com.google.inject.AbstractModule; +import com.google.inject.Provides; import com.google.inject.name.Names; public class JMAPModule extends AbstractModule { @@ -46,4 +54,16 @@ public ProtocolResponse process(ProtocolRequest request) { bindConstant().annotatedWith(Names.named(JMAPServer.DEFAULT_JMAP_PORT)).to(DEFAULT_PORT); } + @Provides + @Singleton + JMAPConfiguration provideConfiguration(FileSystem fileSystem) throws FileNotFoundException, ConfigurationException{ + PropertiesConfiguration configuration = getConfiguration(fileSystem); + String keystore = configuration.getString("tls.keystoreURL"); + String secret = configuration.getString("tls.secret"); + return new JMAPConfiguration(keystore, secret); + } + + private PropertiesConfiguration getConfiguration(FileSystem fileSystem) throws FileNotFoundException, ConfigurationException { + return new PropertiesConfiguration(fileSystem.getFile(FileSystem.FILE_PROTOCOL_AND_CONF + "jmap.properties")); + } } diff --git a/server/container/cassandra-guice/src/main/java/org/apache/james/modules/protocols/JMAPServerModule.java b/server/container/cassandra-guice/src/main/java/org/apache/james/modules/protocols/JMAPServerModule.java index b0d112ab8ab..113f2fc4bb0 100644 --- a/server/container/cassandra-guice/src/main/java/org/apache/james/modules/protocols/JMAPServerModule.java +++ b/server/container/cassandra-guice/src/main/java/org/apache/james/modules/protocols/JMAPServerModule.java @@ -51,7 +51,6 @@ public JMAPModuleConfigurationPerformer(JMAPServer server, JamesSignatureHandler @Override public void initModule() throws Exception { - signatureHandler.configure(null); signatureHandler.init(); server.configure(null); } diff --git a/server/container/cassandra-guice/src/test/java/org/apache/james/modules/TestJMAPServerModule.java b/server/container/cassandra-guice/src/test/java/org/apache/james/modules/TestJMAPServerModule.java index 54f0332a8cb..ccb70716a89 100644 --- a/server/container/cassandra-guice/src/test/java/org/apache/james/modules/TestJMAPServerModule.java +++ b/server/container/cassandra-guice/src/test/java/org/apache/james/modules/TestJMAPServerModule.java @@ -19,9 +19,16 @@ package org.apache.james.modules; +import java.io.FileNotFoundException; + +import javax.inject.Singleton; + +import org.apache.commons.configuration.ConfigurationException; +import org.apache.james.jmap.JMAPConfiguration; import org.apache.james.jmap.JMAPServer; import com.google.inject.AbstractModule; +import com.google.inject.Provides; import com.google.inject.name.Names; public class TestJMAPServerModule extends AbstractModule{ @@ -30,4 +37,10 @@ public class TestJMAPServerModule extends AbstractModule{ protected void configure() { bindConstant().annotatedWith(Names.named(JMAPServer.DEFAULT_JMAP_PORT)).to(1080); } + + @Provides + @Singleton + JMAPConfiguration provideConfiguration() throws FileNotFoundException, ConfigurationException{ + return new JMAPConfiguration("keystore", "james72laBalle"); + } } diff --git a/server/container/cassandra-guice/src/test/resources/keystore b/server/container/cassandra-guice/src/test/resources/keystore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPConfiguration.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPConfiguration.java new file mode 100644 index 00000000000..4bad1e35ed2 --- /dev/null +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPConfiguration.java @@ -0,0 +1,38 @@ +/**************************************************************** + * 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.jmap; + +public class JMAPConfiguration { + + public final String keystore; + public final String secret; + + public JMAPConfiguration(String keystore, String secret) { + this.keystore = keystore; + this.secret = secret; + } + + public String getKeystore() { + return keystore; + } + + public String getSecret() { + return secret; + } +} diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/JamesSignatureHandler.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/JamesSignatureHandler.java index 0c259e5217d..220e44ef1fc 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/JamesSignatureHandler.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/JamesSignatureHandler.java @@ -33,10 +33,8 @@ import javax.inject.Singleton; import org.apache.commons.codec.binary.Base64; -import org.apache.commons.configuration.ConfigurationException; -import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.james.filesystem.api.FileSystem; -import org.apache.james.lifecycle.api.Configurable; +import org.apache.james.jmap.JMAPConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,7 +43,7 @@ import com.google.common.base.Throwables; @Singleton -public class JamesSignatureHandler implements SignatureHandler, Configurable { +public class JamesSignatureHandler implements SignatureHandler { private static final Logger LOGGER = LoggerFactory.getLogger(JamesSignatureHandler.class); @@ -54,28 +52,25 @@ public class JamesSignatureHandler implements SignatureHandler, Configurable { public static final String JKS = "JKS"; private final FileSystem fileSystem; - private String secret; - private String keystoreURL; + private final JMAPConfiguration jmapConfiguration; + private PrivateKey privateKey; private PublicKey publicKey; + @Inject - @VisibleForTesting JamesSignatureHandler(FileSystem fileSystem) { + @VisibleForTesting JamesSignatureHandler(FileSystem fileSystem, JMAPConfiguration jmapConfiguration) { this.fileSystem = fileSystem; - } - - public void configure(HierarchicalConfiguration configuration) throws ConfigurationException { - keystoreURL = configuration.getString("tls.keystoreURL", "file://conf/keystoreURL"); - secret = configuration.getString("tls.secret", ""); + this.jmapConfiguration = jmapConfiguration; } @Override public void init() throws Exception { KeyStore keystore = KeyStore.getInstance(JKS); - InputStream fis = fileSystem.getResource(keystoreURL); - keystore.load(fis, secret.toCharArray()); + InputStream fis = fileSystem.getResource(jmapConfiguration.getKeystore()); + keystore.load(fis, jmapConfiguration.getSecret().toCharArray()); publicKey = keystore.getCertificate(ALIAS).getPublicKey(); - Key key = keystore.getKey(ALIAS, secret.toCharArray()); + Key key = keystore.getKey(ALIAS, jmapConfiguration.getSecret().toCharArray()); if (! (key instanceof PrivateKey)) { throw new Exception("Provided key is not a PrivateKey"); } diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JamesSignatureHandlerProvider.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JamesSignatureHandlerProvider.java index 374ec945a91..17eb6ef1574 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JamesSignatureHandlerProvider.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JamesSignatureHandlerProvider.java @@ -24,10 +24,8 @@ import java.io.IOException; import java.io.InputStream; -import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.james.filesystem.api.FileSystem; - -import com.google.common.collect.Lists; +import org.apache.james.jmap.JMAPConfiguration; public class JamesSignatureHandlerProvider { @@ -48,19 +46,9 @@ public File getBasedir() throws FileNotFoundException { return null; } }; - JamesSignatureHandler signatureHandler = new JamesSignatureHandler(fileSystem); - signatureHandler.configure(createTestCConfiguration()); + JamesSignatureHandler signatureHandler = new JamesSignatureHandler(fileSystem, new JMAPConfiguration("keystore", "james72laBalle")); signatureHandler.init(); return signatureHandler; } - private HierarchicalConfiguration createTestCConfiguration() { - HierarchicalConfiguration configuration = new HierarchicalConfiguration(); - HierarchicalConfiguration.Node secretNode = new HierarchicalConfiguration.Node(); - secretNode.setName("secret"); - secretNode.setValue("james72laBalle"); - configuration.addNodes("tls", Lists.newArrayList(secretNode)); - return configuration; - } - }