From e78bfe13bb52196ad84e68f4d4aa476aad1b6c52 Mon Sep 17 00:00:00 2001
From: Tomasz Wrobel <tomasz.wrobel@nokia.com>
Date: Thu, 20 Feb 2020 16:45:12 +0100
Subject: Add HttpClient

Issue-ID: AAF-996
Signed-off-by: Tomasz Wrobel <tomasz.wrobel@nokia.com>
Change-Id: I3ebb0ea88ef1a72c16064fd9a1931943b57410d8
---
 .../aaf/certservice/client/CertServiceClient.java  |  15 ++-
 .../onap/aaf/certservice/client/api/ExitCode.java  |   4 +-
 .../certservice/client/api/ExitableException.java  |   1 -
 .../aaf/certservice/client/common/Base64Coder.java |  29 ++++++
 .../httpclient/CloseableHttpClientProvider.java    |  40 ++++++++
 .../certservice/client/httpclient/HttpClient.java  | 109 +++++++++++++++++++++
 .../exception/CertServiceApiResponseException.java |  42 ++++++++
 .../httpclient/exception/HttpClientException.java  |  37 +++++++
 .../httpclient/model/CertServiceResponse.java      |  44 +++++++++
 .../httpclient/model/ErrorCertServiceResponse.java |  40 ++++++++
 10 files changed, 358 insertions(+), 3 deletions(-)
 create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/Base64Coder.java
 create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/CloseableHttpClientProvider.java
 create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/HttpClient.java
 create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/CertServiceApiResponseException.java
 create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/HttpClientException.java
 create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/CertServiceResponse.java
 create mode 100644 certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/ErrorCertServiceResponse.java

(limited to 'certServiceClient/src/main/java/org')

diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/CertServiceClient.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/CertServiceClient.java
index 3e8f73eb..59d0c032 100644
--- a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/CertServiceClient.java
+++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/CertServiceClient.java
@@ -28,12 +28,16 @@ import org.onap.aaf.certservice.client.configuration.factory.ClientConfiguration
 import org.onap.aaf.certservice.client.configuration.factory.CsrConfigurationFactory;
 import org.onap.aaf.certservice.client.configuration.model.ClientConfiguration;
 import org.onap.aaf.certservice.client.configuration.model.CsrConfiguration;
+import org.onap.aaf.certservice.client.httpclient.CloseableHttpClientProvider;
+import org.onap.aaf.certservice.client.httpclient.HttpClient;
+import org.onap.aaf.certservice.client.httpclient.model.CertServiceResponse;
 
 import java.security.KeyPair;
 
 import static org.onap.aaf.certservice.client.api.ExitCode.SUCCESS_EXIT_CODE;
 import static org.onap.aaf.certservice.client.certification.EncryptionAlgorithmConstants.KEY_SIZE;
 import static org.onap.aaf.certservice.client.certification.EncryptionAlgorithmConstants.RSA_ENCRYPTION_ALGORITHM;
+import static org.onap.aaf.certservice.client.common.Base64Coder.encode;
 
 public class CertServiceClient {
     private AppExitHandler appExitHandler;
@@ -49,7 +53,16 @@ public class CertServiceClient {
             CsrConfiguration csrConfiguration = new CsrConfigurationFactory(new EnvsForCsr()).create();
             KeyPair keyPair = keyPairFactory.create();
             CsrFactory csrFactory = new CsrFactory(csrConfiguration);
-            String csr = csrFactory.createEncodedCsr(keyPair);
+
+            CloseableHttpClientProvider provider = new CloseableHttpClientProvider(clientConfiguration.getRequestTimeout());
+            HttpClient httpClient = new HttpClient(provider, clientConfiguration.getUrlToCertService());
+
+            CertServiceResponse certServiceData =
+                    httpClient.retrieveCertServiceData(
+                            clientConfiguration.getCaName(),
+                            csrFactory.createEncodedCsr(keyPair),
+                            encode(keyPair.getPrivate().toString()));
+
         } catch (ExitableException e) {
             appExitHandler.exit(e.applicationExitCode());
         }
diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitCode.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitCode.java
index 45f2c400..b72a0e2d 100644
--- a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitCode.java
+++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitCode.java
@@ -23,7 +23,9 @@ public enum ExitCode {
     CLIENT_CONFIGURATION_EXCEPTION(1),
     CSR_CONFIGURATION_EXCEPTION(2),
     KEY_PAIR_GENERATION_EXCEPTION(3),
-    CSR_GENERATION_EXCEPTION(4);
+    CSR_GENERATION_EXCEPTION(4),
+    CERT_SERVICE_API_CONNECTION_EXCEPTION(5),
+    HTTP_CLIENT_EXCEPTION(6);
 
     private final int value;
 
diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitableException.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitableException.java
index 51981a48..f9166c96 100644
--- a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitableException.java
+++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/api/ExitableException.java
@@ -26,6 +26,5 @@ public abstract class ExitableException extends Exception {
     public ExitableException(String message) {
         super(message);
     }
-
     public abstract int applicationExitCode();
 }
diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/Base64Coder.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/Base64Coder.java
new file mode 100644
index 00000000..c066187d
--- /dev/null
+++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/common/Base64Coder.java
@@ -0,0 +1,29 @@
+/*
+ * ============LICENSE_START=======================================================
+ * aaf-certservice-client
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aaf.certservice.client.common;
+
+import org.bouncycastle.util.encoders.Base64;
+
+public class Base64Coder {
+    public static String encode(String string){
+        return new String(Base64.encode(string.getBytes()));
+    }
+}
diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/CloseableHttpClientProvider.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/CloseableHttpClientProvider.java
new file mode 100644
index 00000000..ff29a14d
--- /dev/null
+++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/CloseableHttpClientProvider.java
@@ -0,0 +1,40 @@
+/*
+ * ============LICENSE_START=======================================================
+ * aaf-certservice-client
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aaf.certservice.client.httpclient;
+
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+
+public class CloseableHttpClientProvider {
+
+    private final int timeout;
+
+    public CloseableHttpClientProvider(int timeout) {
+        this.timeout = timeout;
+    }
+
+    public CloseableHttpClient getClient() {
+        RequestConfig config =
+                RequestConfig.custom().setConnectionRequestTimeout(timeout).build();
+        return HttpClientBuilder.create().setDefaultRequestConfig(config).build();
+    }
+}
diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/HttpClient.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/HttpClient.java
new file mode 100644
index 00000000..603d5848
--- /dev/null
+++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/HttpClient.java
@@ -0,0 +1,109 @@
+/*
+ * ============LICENSE_START=======================================================
+ * aaf-certservice-client
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aaf.certservice.client.httpclient;
+
+import com.google.gson.Gson;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.onap.aaf.certservice.client.httpclient.exception.CertServiceApiResponseException;
+import org.onap.aaf.certservice.client.httpclient.exception.HttpClientException;
+import org.onap.aaf.certservice.client.httpclient.model.CertServiceResponse;
+import org.onap.aaf.certservice.client.httpclient.model.ErrorCertServiceResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+public class HttpClient {
+
+    private static final String CSR_HEADER_NAME = "CSR";
+    private static final String PK_HEADER_NAME = "PK";
+    private static final String CHARSET_UTF_8 = "UTF-8";
+
+    private final Logger LOGGER = LoggerFactory.getLogger(HttpClient.class);
+
+    private final Gson gson = new Gson();
+    private final CloseableHttpClientProvider httpClientProvider;
+    private final String certServiceAddress;
+
+    public HttpClient(CloseableHttpClientProvider httpClientProvider, String certServiceAddress) {
+        this.httpClientProvider = httpClientProvider;
+        this.certServiceAddress = certServiceAddress;
+    }
+
+    public CertServiceResponse retrieveCertServiceData(String caName, String csr, String encodedPk)
+            throws CertServiceApiResponseException, HttpClientException {
+
+        try (CloseableHttpClient httpClient = httpClientProvider.getClient()) {
+            HttpResponse httpResponse = httpClient.execute(createHttpPayload(caName, csr, encodedPk));
+            return extractCertServiceResponse(httpResponse);
+
+        } catch (IOException e) {
+            LOGGER.error(String.format("Failed on communication between client and API for URL: '%s' . Exception message: '%s'",
+                    certServiceAddress + caName, e.getMessage()));
+            throw new HttpClientException(e);
+        }
+    }
+
+    private int getStatusCode(HttpResponse httpResponse) {
+        return httpResponse.getStatusLine().getStatusCode();
+    }
+
+    private CertServiceResponse extractCertServiceResponse(HttpResponse httpResponse)
+            throws CertServiceApiResponseException, IOException {
+        int httpResponseCode = getStatusCode(httpResponse);
+        if (HttpStatus.SC_OK != httpResponseCode) {
+            LOGGER.error(String.format("Error on API response. Response Code: %d", httpResponseCode));
+            throw generateApiResponseException(httpResponse);
+        }
+        String jsonResponse = getStringResponse(httpResponse.getEntity());
+        return gson.fromJson(jsonResponse, CertServiceResponse.class);
+    }
+
+    private String getStringResponse(HttpEntity httpEntity) throws IOException {
+        return EntityUtils.toString(httpEntity, CHARSET_UTF_8);
+    }
+
+    private HttpGet createHttpPayload(String caName, String csr, String pk) {
+        String url = certServiceAddress + caName;
+        HttpGet httpGet = new HttpGet(url);
+        httpGet.addHeader(CSR_HEADER_NAME, csr);
+        httpGet.addHeader(PK_HEADER_NAME, pk);
+        return httpGet;
+    }
+
+
+    private CertServiceApiResponseException generateApiResponseException(HttpResponse httpResponse) throws IOException {
+        String stringResponse = getStringResponse(httpResponse.getEntity());
+        ErrorCertServiceResponse errorCertServiceResponse =
+                gson.fromJson(stringResponse, ErrorCertServiceResponse.class);
+
+        String messageFromApi = errorCertServiceResponse.getMessage();
+        String path = errorCertServiceResponse.getPath();
+        int httpResponseCode = getStatusCode(httpResponse);
+
+        return new CertServiceApiResponseException(certServiceAddress + path, httpResponseCode, messageFromApi);
+    }
+}
diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/CertServiceApiResponseException.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/CertServiceApiResponseException.java
new file mode 100644
index 00000000..40470af3
--- /dev/null
+++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/CertServiceApiResponseException.java
@@ -0,0 +1,42 @@
+/*
+ * ============LICENSE_START=======================================================
+ * aaf-certservice-client
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aaf.certservice.client.httpclient.exception;
+
+import org.onap.aaf.certservice.client.api.ExitCode;
+import org.onap.aaf.certservice.client.api.ExitableException;
+
+public class CertServiceApiResponseException extends ExitableException {
+    private final ExitCode EXIT_CODE = ExitCode.CERT_SERVICE_API_CONNECTION_EXCEPTION;
+
+    public CertServiceApiResponseException(String url, int responseCode, String messageFromAPI) {
+
+        super(String.format("Request failed for URL '%s'. Response code: %d . Message from API: %s",
+                url,
+                responseCode,
+                messageFromAPI));
+    }
+
+    @Override
+    public int applicationExitCode() {
+        return EXIT_CODE.getValue();
+    }
+
+}
diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/HttpClientException.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/HttpClientException.java
new file mode 100644
index 00000000..d6fb1461
--- /dev/null
+++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/exception/HttpClientException.java
@@ -0,0 +1,37 @@
+/*
+ * ============LICENSE_START=======================================================
+ * aaf-certservice-client
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aaf.certservice.client.httpclient.exception;
+
+import org.onap.aaf.certservice.client.api.ExitCode;
+import org.onap.aaf.certservice.client.api.ExitableException;
+
+public class HttpClientException extends ExitableException {
+    private final ExitCode EXIT_CODE = ExitCode.HTTP_CLIENT_EXCEPTION;
+
+    public HttpClientException(Throwable e) {
+        super(e);
+    }
+
+    @Override
+    public int applicationExitCode() {
+        return EXIT_CODE.getValue();
+    }
+}
diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/CertServiceResponse.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/CertServiceResponse.java
new file mode 100644
index 00000000..4ca17999
--- /dev/null
+++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/CertServiceResponse.java
@@ -0,0 +1,44 @@
+/*
+ * ============LICENSE_START=======================================================
+ * aaf-certservice-client
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aaf.certservice.client.httpclient.model;
+
+import java.util.Collections;
+import java.util.List;
+
+public class CertServiceResponse {
+
+    private final List<String> certificateChain;
+    private final List<String> trustedCertificates;
+
+    public CertServiceResponse(List<String> certificateChain, List<String> trustedCertificates) {
+        this.certificateChain = certificateChain;
+        this.trustedCertificates = trustedCertificates;
+    }
+
+    public List<String> getCertificateChain() {
+        return Collections.unmodifiableList(certificateChain);
+    }
+
+    public List<String> getTrustedCertificates() {
+        return Collections.unmodifiableList(trustedCertificates);
+    }
+
+}
diff --git a/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/ErrorCertServiceResponse.java b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/ErrorCertServiceResponse.java
new file mode 100644
index 00000000..6fe99ce5
--- /dev/null
+++ b/certServiceClient/src/main/java/org/onap/aaf/certservice/client/httpclient/model/ErrorCertServiceResponse.java
@@ -0,0 +1,40 @@
+/*
+ * ============LICENSE_START=======================================================
+ * aaf-certservice-client
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.aaf.certservice.client.httpclient.model;
+
+public class ErrorCertServiceResponse {
+
+    private final String message;
+    private final String path;
+
+    public ErrorCertServiceResponse(String message, String path) {
+        this.message = message;
+        this.path = path;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public String getPath() {
+        return path;
+    }
+}
-- 
cgit 1.2.3-korg