diff --git a/bookkeeper-admin-api/src/main/java/io/github/protocol/bookkeeper/admin/api/Configuration.java b/bookkeeper-admin-api/src/main/java/io/github/protocol/bookkeeper/admin/api/Configuration.java new file mode 100644 index 0000000..38a0942 --- /dev/null +++ b/bookkeeper-admin-api/src/main/java/io/github/protocol/bookkeeper/admin/api/Configuration.java @@ -0,0 +1,34 @@ +package io.github.protocol.bookkeeper.admin.api; + +public class Configuration { + public String host = "localhost"; + + public int port; + + public boolean tlsEnabled; + + public TlsConfig tlsConfig; + + public Configuration() { + } + + public Configuration host(String host) { + this.host = host; + return this; + } + + public Configuration port(int port) { + this.port = port; + return this; + } + + public Configuration tlsEnabled(boolean tlsEnabled) { + this.tlsEnabled = tlsEnabled; + return this; + } + + public Configuration tlsConfig(TlsConfig tlsConfig) { + this.tlsConfig = tlsConfig; + return this; + } +} diff --git a/bookkeeper-admin-common/pom.xml b/bookkeeper-admin-common/pom.xml new file mode 100644 index 0000000..533e754 --- /dev/null +++ b/bookkeeper-admin-common/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + io.github.protocol-laboratory + bookkeeper-admin-parent + 0.0.3 + + + bookkeeper-admin-common + + + + io.github.protocol-laboratory + bookkeeper-admin-api + ${project.version} + + + + diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/JacksonService.java b/bookkeeper-admin-common/src/main/java/io/github/protocol/bookkeeper/admin/common/JacksonService.java similarity index 64% rename from bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/JacksonService.java rename to bookkeeper-admin-common/src/main/java/io/github/protocol/bookkeeper/admin/common/JacksonService.java index 5bd2282..67d01f0 100644 --- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/JacksonService.java +++ b/bookkeeper-admin-common/src/main/java/io/github/protocol/bookkeeper/admin/common/JacksonService.java @@ -1,22 +1,4 @@ -/* - * 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 io.github.protocol.bookkeeper.admin.jdk; +package io.github.protocol.bookkeeper.admin.common; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; diff --git a/bookkeeper-admin-common/src/main/java/io/github/protocol/bookkeeper/admin/common/package-info.java b/bookkeeper-admin-common/src/main/java/io/github/protocol/bookkeeper/admin/common/package-info.java new file mode 100644 index 0000000..33a68c1 --- /dev/null +++ b/bookkeeper-admin-common/src/main/java/io/github/protocol/bookkeeper/admin/common/package-info.java @@ -0,0 +1 @@ +package io.github.protocol.bookkeeper.admin.common; diff --git a/bookkeeper-admin-jdk/pom.xml b/bookkeeper-admin-jdk/pom.xml index 86b0b3c..b8d89f5 100644 --- a/bookkeeper-admin-jdk/pom.xml +++ b/bookkeeper-admin-jdk/pom.xml @@ -14,7 +14,7 @@ io.github.protocol-laboratory - bookkeeper-admin-api + bookkeeper-admin-common ${project.version} diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImpl.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImpl.java index 12910b8..0e9c159 100644 --- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImpl.java +++ b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImpl.java @@ -1,6 +1,7 @@ package io.github.protocol.bookkeeper.admin.jdk; import com.fasterxml.jackson.core.type.TypeReference; +import io.github.protocol.bookkeeper.admin.common.JacksonService; import java.io.IOException; import java.net.http.HttpResponse; diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImpl.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImpl.java index ea54fbf..3577150 100644 --- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImpl.java +++ b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImpl.java @@ -1,6 +1,7 @@ package io.github.protocol.bookkeeper.admin.jdk; import com.fasterxml.jackson.core.type.TypeReference; +import io.github.protocol.bookkeeper.admin.common.JacksonService; import java.io.IOException; import java.net.http.HttpResponse; diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminBuilderImpl.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminBuilderImpl.java index e58ac36..6f18bf9 100644 --- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminBuilderImpl.java +++ b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminBuilderImpl.java @@ -1,5 +1,7 @@ package io.github.protocol.bookkeeper.admin.jdk; +import io.github.protocol.bookkeeper.admin.api.Configuration; + public class BookkeeperAdminBuilderImpl implements BookkeeperAdminBuilder { private final Configuration conf; @@ -14,13 +16,13 @@ public BookkeeperAdmin build() { @Override public BookkeeperAdminBuilder host(String host) { - this.conf.setHost(host); + this.conf.host(host); return this; } @Override public BookkeeperAdminBuilder port(int port) { - this.conf.setPort(port); + this.conf.port(port); return this; } } diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminImpl.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminImpl.java index 53f019b..73804f1 100644 --- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminImpl.java +++ b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminImpl.java @@ -1,5 +1,7 @@ package io.github.protocol.bookkeeper.admin.jdk; +import io.github.protocol.bookkeeper.admin.api.Configuration; + public class BookkeeperAdminImpl implements BookkeeperAdmin { private final BookiesImpl bookies; diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImpl.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImpl.java index 4bb8323..6225855 100644 --- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImpl.java +++ b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImpl.java @@ -1,6 +1,8 @@ package io.github.protocol.bookkeeper.admin.jdk; +import io.github.protocol.bookkeeper.admin.common.JacksonService; + import java.io.IOException; import java.net.http.HttpResponse; import java.util.Map; diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/Configuration.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/Configuration.java deleted file mode 100644 index 48b05e1..0000000 --- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/Configuration.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.github.protocol.bookkeeper.admin.jdk; - -import lombok.Getter; -import lombok.Setter; - -@Setter -@Getter -public class Configuration { - private String host = "localhost"; - - private int port; - - public Configuration() { - } -} diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/InnerHttpClient.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/InnerHttpClient.java index 0511936..86fe369 100644 --- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/InnerHttpClient.java +++ b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/InnerHttpClient.java @@ -1,6 +1,8 @@ package io.github.protocol.bookkeeper.admin.jdk; import com.fasterxml.jackson.core.JsonProcessingException; +import io.github.protocol.bookkeeper.admin.api.Configuration; +import io.github.protocol.bookkeeper.admin.common.JacksonService; import java.io.IOException; import java.net.URI; @@ -22,7 +24,7 @@ public InnerHttpClient(Configuration conf) { this.client = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_1_1) .build(); - this.httpPrefix = "http://" + conf.getHost() + ":" + conf.getPort(); + this.httpPrefix = "http://" + conf.host + ":" + conf.port; } public HttpResponse get(String urlSuffix) throws Exception { diff --git a/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImplTest.java b/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImplTest.java index aeaeb1e..d1f85a7 100644 --- a/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImplTest.java +++ b/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImplTest.java @@ -1,6 +1,7 @@ package io.github.protocol.bookkeeper.admin.jdk; import io.github.embedded.bookkeeper.core.EmbeddedBookkeeperServer; +import io.github.protocol.bookkeeper.admin.api.Configuration; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; @@ -18,8 +19,8 @@ public class AutoRecoveryImplTest { public static void setup() throws Exception { SERVER.start(); Configuration conf = new Configuration(); - conf.setHost("localhost"); - conf.setPort(SERVER.getBkWebPort()); + conf.host("localhost"); + conf.port(SERVER.getBkWebPort()); autoRecovery = new AutoRecoveryImpl(new InnerHttpClient(conf)); } diff --git a/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImplTest.java b/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImplTest.java index 12965ec..0403f5a 100644 --- a/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImplTest.java +++ b/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImplTest.java @@ -1,6 +1,7 @@ package io.github.protocol.bookkeeper.admin.jdk; import io.github.embedded.bookkeeper.core.EmbeddedBookkeeperServer; +import io.github.protocol.bookkeeper.admin.api.Configuration; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; @@ -19,8 +20,8 @@ public class BookiesImplTest { public static void setup() throws Exception { SERVER.start(); Configuration conf = new Configuration(); - conf.setHost("localhost"); - conf.setPort(SERVER.getBkWebPort()); + conf.host("localhost"); + conf.port(SERVER.getBkWebPort()); bookiesImpl = new BookiesImpl(new InnerHttpClient(conf)); } diff --git a/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImplTest.java b/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImplTest.java index 80e540d..9789c72 100644 --- a/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImplTest.java +++ b/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImplTest.java @@ -1,6 +1,7 @@ package io.github.protocol.bookkeeper.admin.jdk; import io.github.embedded.bookkeeper.core.EmbeddedBookkeeperServer; +import io.github.protocol.bookkeeper.admin.api.Configuration; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; @@ -20,8 +21,8 @@ public class ConfigsImplTest { public static void setup() throws Exception { SERVER.start(); Configuration conf = new Configuration(); - conf.setHost("localhost"); - conf.setPort(SERVER.getBkWebPort()); + conf.host("localhost"); + conf.port(SERVER.getBkWebPort()); configsImpl = new ConfigsImpl(new InnerHttpClient(conf)); } diff --git a/bookkeeper-admin-reactor/pom.xml b/bookkeeper-admin-reactive/pom.xml similarity index 88% rename from bookkeeper-admin-reactor/pom.xml rename to bookkeeper-admin-reactive/pom.xml index dc62f75..471ea59 100644 --- a/bookkeeper-admin-reactor/pom.xml +++ b/bookkeeper-admin-reactive/pom.xml @@ -9,12 +9,12 @@ 0.0.3 - bookkeeper-admin-reactor + bookkeeper-admin-reactive io.github.protocol-laboratory - bookkeeper-admin-api + bookkeeper-admin-common ${project.version} diff --git a/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/InnerReactiveClient.java b/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/InnerReactiveClient.java new file mode 100644 index 0000000..f3d2a96 --- /dev/null +++ b/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/InnerReactiveClient.java @@ -0,0 +1,33 @@ +package io.github.protocol.bookkeeper.admin.reactive; + +import io.github.protocol.bookkeeper.admin.api.Configuration; +import io.netty.handler.ssl.SslContext; +import reactor.netty.http.client.HttpClient; +import reactor.netty.http.client.HttpClientSecurityUtils; + +public class InnerReactiveClient { + private final HttpClient httpClient; + + private final String httpPrefix; + + public InnerReactiveClient(Configuration conf) { + HttpClient client = HttpClient.create(); + + if (conf.tlsEnabled) { + client = client.secure(spec -> { + SslContext context = SslContextUtil.build(conf.tlsConfig); + if (conf.tlsConfig.hostnameVerifyDisabled) { + spec.sslContext(context) + .handlerConfigurator(HttpClientSecurityUtils.HOSTNAME_VERIFICATION_CONFIGURER); + } else { + spec.sslContext(context); + } + }); + this.httpPrefix = "https://" + conf.host + ":" + conf.port; + } else { + this.httpPrefix = "http://" + conf.host + ":" + conf.port; + } + + this.httpClient = client; + } +} diff --git a/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/SslContextUtil.java b/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/SslContextUtil.java new file mode 100644 index 0000000..c540df4 --- /dev/null +++ b/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/SslContextUtil.java @@ -0,0 +1,57 @@ +package io.github.protocol.bookkeeper.admin.reactive; + +import io.github.protocol.bookkeeper.admin.api.TlsConfig; +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.util.InsecureTrustManagerFactory; + +import java.io.FileInputStream; +import java.security.KeyStore; +import java.util.Arrays; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.TrustManagerFactory; + +public class SslContextUtil { + + public static SslContext build(TlsConfig config) { + try { + SslContextBuilder sslContextBuilder = SslContextBuilder.forClient(); + + if (config.keyStorePath != null && config.keyStorePassword != null) { + KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); + try (FileInputStream keyStoreInputStream = new FileInputStream(config.keyStorePath)) { + keyStore.load(keyStoreInputStream, config.keyStorePassword); + } + String defaultKeyAlgorithm = KeyManagerFactory.getDefaultAlgorithm(); + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(defaultKeyAlgorithm); + keyManagerFactory.init(keyStore, config.keyStorePassword); + sslContextBuilder.keyManager(keyManagerFactory); + } + + if (config.verifyDisabled) { + sslContextBuilder.trustManager(InsecureTrustManagerFactory.INSTANCE); + } else if (config.trustStorePath != null && config.trustStorePassword != null) { + KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); + try (FileInputStream trustStoreInputStream = new FileInputStream(config.trustStorePath)) { + trustStore.load(trustStoreInputStream, config.trustStorePassword); + } + String defaultTrustAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); + TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(defaultTrustAlgorithm); + trustManagerFactory.init(trustStore); + sslContextBuilder.trustManager(trustManagerFactory); + } + + if (config.versions != null) { + sslContextBuilder.protocols(config.versions); + } + + if (config.cipherSuites != null) { + sslContextBuilder.ciphers(Arrays.asList(config.cipherSuites)); + } + + return sslContextBuilder.build(); + } catch (Exception e) { + throw new RuntimeException("Error setting up SSL configuration", e); + } + } +} diff --git a/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/package-info.java b/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/package-info.java new file mode 100644 index 0000000..5d2b272 --- /dev/null +++ b/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/package-info.java @@ -0,0 +1 @@ +package io.github.protocol.bookkeeper.admin.reactive; diff --git a/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/Configuration.java b/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/Configuration.java deleted file mode 100644 index 7878eb4..0000000 --- a/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/Configuration.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.github.protocol.bookkeeper.admin.reactor; - -import lombok.Getter; -import lombok.Setter; - -@Setter -@Getter -public class Configuration { - private String host = "localhost"; - - private int port; - - public boolean tlsEnable; - - public Configuration() { - } -} diff --git a/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/InnerReactorClient.java b/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/InnerReactorClient.java deleted file mode 100644 index 1bbd8c2..0000000 --- a/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/InnerReactorClient.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.github.protocol.bookkeeper.admin.reactor; - -import reactor.netty.http.client.HttpClient; - -public class InnerReactorClient { - private final HttpClient httpClient; - - private final String httpPrefix; - - public InnerReactorClient(Configuration conf) { - HttpClient client = HttpClient.create(); - - if (conf.isTlsEnable()) { - this.httpPrefix = "https://" + conf.getHost() + ":" + conf.getPort(); - } else { - this.httpPrefix = "http://" + conf.getHost() + ":" + conf.getPort(); - } - - this.httpClient = client; - } -} diff --git a/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/package-info.java b/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/package-info.java deleted file mode 100644 index 82b9055..0000000 --- a/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package io.github.protocol.bookkeeper.admin.reactor; diff --git a/pom.xml b/pom.xml index d865c00..8b2cf1e 100644 --- a/pom.xml +++ b/pom.xml @@ -11,8 +11,9 @@ bookkeeper-admin-api + bookkeeper-admin-common bookkeeper-admin-jdk - bookkeeper-admin-reactor + bookkeeper-admin-reactive