@Provides @Singleton JMAPConfiguration provideConfiguration(PropertiesProvider propertiesProvider, FileSystem fileSystem) throws ConfigurationException, IOException { try { Configuration configuration = propertiesProvider.getConfiguration("jmap"); return JMAPConfiguration.builder() .enabled(configuration.getBoolean("enabled", true)) .keystore(configuration.getString("tls.keystoreURL")) .secret(configuration.getString("tls.secret")) .jwtPublicKeyPem(loadPublicKey(fileSystem, Optional.ofNullable(configuration.getString("jwt.publickeypem.url")))) .port(configuration.getInt("jmap.port", DEFAULT_JMAP_PORT)) .build(); } catch (FileNotFoundException e) { LOGGER.warn("Could not find JMAP configuration file. JMAP server will not be enabled."); return JMAPConfiguration.builder() .disable() .build(); } }
public JMAPConfiguration build() { Preconditions.checkState(enabled.isPresent(), "You should specify if JMAP server should be started"); Preconditions.checkState(!enabled.get() || !Strings.isNullOrEmpty(keystore), "'keystore' is mandatory"); Preconditions.checkState(!enabled.get() || !Strings.isNullOrEmpty(secret), "'secret' is mandatory"); Preconditions.checkState(!enabled.get() || jwtPublicKeyPem.isPresent(), "'publicKey' is mandatory"); return new JMAPConfiguration(enabled.get(), keystore, secret, jwtPublicKeyPem, port); }
@Override public void initModule() { try { if (jmapConfiguration.isEnabled()) { signatureHandler.init(); server.configure(NULL_CONFIGURATION); registerPEMWithSecurityProvider(); } } catch (Exception e) { throw new RuntimeException(e); } }
@Override public void init() throws Exception { KeyStore keystore = KeyStore.getInstance(JKS); InputStream fis = fileSystem.getResource(jmapConfiguration.getKeystore()); char[] secret = jmapConfiguration.getSecret().toCharArray(); keystore.load(fis, secret); Certificate aliasCertificate = Optional .ofNullable(keystore.getCertificate(ALIAS)) .orElseThrow(() -> new KeyStoreException("Alias '" + ALIAS + "' keystore can't be found")); publicKey = aliasCertificate.getPublicKey(); Key key = keystore.getKey(ALIAS, secret); if (! (key instanceof PrivateKey)) { throw new KeyStoreException("Provided key is not a PrivateKey"); } privateKey = (PrivateKey) key; }
@Test public void buildShouldWorkWhenDisabled() { String keystore = null; String secret = null; Optional<String> jwtPublicKeyPem = Optional.empty(); Optional<Integer> port = Optional.empty(); JMAPConfiguration expectedJMAPConfiguration = new JMAPConfiguration(DISABLED, keystore, secret, jwtPublicKeyPem, port); JMAPConfiguration jmapConfiguration = JMAPConfiguration.builder() .disable() .build(); assertThat(jmapConfiguration).isEqualToComparingFieldByField(expectedJMAPConfiguration); } }
@Provides @Singleton JwtConfiguration providesJwtConfiguration(JMAPConfiguration jmapConfiguration) { return new JwtConfiguration(jmapConfiguration.getJwtPublicKeyPem()); }
@Test public void buildShouldWorkWhenRandomPort() { JMAPConfiguration expectedJMAPConfiguration = new JMAPConfiguration(ENABLED, "keystore", "secret", Optional.of("file://conf/jwt_publickey"), Optional.empty()); JMAPConfiguration jmapConfiguration = JMAPConfiguration.builder() .enable() .keystore("keystore") .secret("secret") .jwtPublicKeyPem(Optional.of("file://conf/jwt_publickey")) .randomPort() .build(); assertThat(jmapConfiguration).isEqualToComparingFieldByField(expectedJMAPConfiguration); }
@Test public void buildShouldThrowWhenKeystoreIsNull() { assertThatThrownBy(() -> JMAPConfiguration.builder() .enable() .keystore(null) .build()) .isInstanceOf(IllegalStateException.class) .hasMessage("'keystore' is mandatory"); }
@Test public void buildShouldWorkWhenFixedPort() { JMAPConfiguration expectedJMAPConfiguration = new JMAPConfiguration(ENABLED, "keystore", "secret", Optional.of("file://conf/jwt_publickey"), Optional.of(80)); JMAPConfiguration jmapConfiguration = JMAPConfiguration.builder() .enable() .keystore("keystore") .secret("secret") .jwtPublicKeyPem(Optional.of("file://conf/jwt_publickey")) .port(80) .build(); assertThat(jmapConfiguration).isEqualToComparingFieldByField(expectedJMAPConfiguration); }
AuthenticationServlet authenticationServlet, JMAPServlet jmapServlet, DownloadServlet downloadServlet, UploadServlet uploadServlet, AuthenticationFilter authenticationFilter, UserProvisioningFilter userProvisioningFilter, DefaultMailboxesProvisioningFilter defaultMailboxesProvisioningFilter) { if (jmapConfiguration.isEnabled()) { server = Optional.of(JettyHttpServer.create( configurationBuilderFor(jmapConfiguration)
@Test public void buildShouldThrowWhenKeystoreIsEmpty() { assertThatThrownBy(() -> JMAPConfiguration.builder() .enable() .keystore("") .build()) .isInstanceOf(IllegalStateException.class) .hasMessage("'keystore' is mandatory"); }
@Test public void buildShouldThrowWhenSecretIsEmpty() { assertThatThrownBy(() -> JMAPConfiguration.builder() .enable() .keystore("keystore") .secret("") .build()) .isInstanceOf(IllegalStateException.class) .hasMessage("'secret' is mandatory"); }
@Test public void buildShouldThrowWhenSecretIsNull() { assertThatThrownBy(() -> JMAPConfiguration.builder() .enable() .keystore("keystore") .secret(null) .build()) .isInstanceOf(IllegalStateException.class) .hasMessage("'secret' is mandatory"); }
@Provides @Singleton JMAPConfiguration provideConfiguration() throws FileNotFoundException, ConfigurationException { return JMAPConfiguration.builder() .enable() .keystore("keystore") .secret("james72laBalle") .jwtPublicKeyPem(Optional.of(PUBLIC_PEM_KEY)) .randomPort() .build(); } }
@Test public void buildShouldThrowWhenJwtPublicKeyPemIsEmpty() { assertThatThrownBy(() -> JMAPConfiguration.builder() .enable() .keystore("keystore") .secret("secret") .jwtPublicKeyPem(Optional.empty()) .build()) .isInstanceOf(IllegalStateException.class); }
public static Builder newConfigurationBuilder() { return JMAPConfiguration.builder() .enable() .keystore("keystore") .secret("james72laBalle") .jwtPublicKeyPem(Optional.of(JWT_PUBLIC_KEY)); }
@Test public void buildShouldThrowWhenJwtPublicKeyPemIsNull() { assertThatThrownBy(() -> JMAPConfiguration.builder() .enable() .keystore("keystore") .secret("secret") .jwtPublicKeyPem(null) .build()) .isInstanceOf(NullPointerException.class); }