Add TruststoreFile provider 82/111082/5
authorRemigiusz Janeczek <remigiusz.janeczek@nokia.com>
Mon, 10 Aug 2020 09:39:43 +0000 (11:39 +0200)
committerRemigiusz Janeczek <remigiusz.janeczek@nokia.com>
Tue, 11 Aug 2020 07:00:48 +0000 (09:00 +0200)
Move certification.file classes to certification.path package

Issue-ID: DCAEGEN2-2253
Signed-off-by: Remigiusz Janeczek <remigiusz.janeczek@nokia.com>
Change-Id: I3098ac443b940031506732216f2bedffa3143adb

30 files changed:
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/TrustStoreMerger.java
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/api/ExitStatus.java
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/JksTruststore.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/P12Truststore.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/PemTruststore.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoreFile.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoreFileWithPassword.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/FileManager.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/PasswordReader.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/PasswordReaderException.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFileFactory.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFileFactoryException.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFilesListProvider.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/path/EnvProvider.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/EnvProvider.java with 95% similarity]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/path/PathValidator.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/PathValidator.java with 96% similarity]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/path/TruststoresPathsProvider.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProvider.java with 98% similarity]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/path/TruststoresPathsProviderException.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProviderException.java with 95% similarity]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactory.java
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/FileManagerTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/PasswordReaderTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFileFactoryTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFilesListProviderTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/path/PathValidatorTest.java [moved from trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/PathValidatorTest.java with 97% similarity]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/path/TruststoresPathsProviderTest.java [moved from trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProviderTest.java with 98% similarity]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactoryTest.java
trustStoreMerger/src/test/resources/truststore-jks.jks [new file with mode: 0644]
trustStoreMerger/src/test/resources/truststore-jks.pass [new file with mode: 0644]
trustStoreMerger/src/test/resources/truststore-p12.p12 [new file with mode: 0644]
trustStoreMerger/src/test/resources/truststore-p12.pass [new file with mode: 0644]
trustStoreMerger/src/test/resources/truststore.pem [new file with mode: 0644]

index 3a3b9b6..98c67ba 100644 (file)
@@ -21,11 +21,18 @@ package org.onap.oom.truststoremerger;
 
 import org.onap.oom.truststoremerger.api.ExitStatus;
 import org.onap.oom.truststoremerger.api.ExitableException;
-import org.onap.oom.truststoremerger.certification.file.EnvProvider;
-import org.onap.oom.truststoremerger.certification.file.TruststoresPathsProvider;
+import org.onap.oom.truststoremerger.certification.file.TruststoreFile;
+import org.onap.oom.truststoremerger.certification.file.provider.FileManager;
+import org.onap.oom.truststoremerger.certification.file.provider.PasswordReader;
+import org.onap.oom.truststoremerger.certification.file.provider.TruststoreFileFactory;
+import org.onap.oom.truststoremerger.certification.file.provider.TruststoreFilesListProvider;
+import org.onap.oom.truststoremerger.certification.path.EnvProvider;
+import org.onap.oom.truststoremerger.certification.path.TruststoresPathsProvider;
 import org.onap.oom.truststoremerger.configuration.MergerConfiguration;
 import org.onap.oom.truststoremerger.configuration.MergerConfigurationFactory;
-import org.onap.oom.truststoremerger.certification.file.PathValidator;
+import org.onap.oom.truststoremerger.certification.path.PathValidator;
+
+import java.util.List;
 
 class TrustStoreMerger {
 
@@ -46,6 +53,7 @@ class TrustStoreMerger {
 
     private void mergeTruststores() throws ExitableException {
         MergerConfiguration configuration = loadConfiguration();
+        List<TruststoreFile> truststoreFilesList = getTruststoreFilesList(configuration);
     }
 
     private MergerConfiguration loadConfiguration() throws ExitableException {
@@ -53,4 +61,14 @@ class TrustStoreMerger {
         MergerConfigurationFactory factory = new MergerConfigurationFactory(truststoresPathsProvider);
         return factory.createConfiguration();
     }
+
+    private List<TruststoreFile> getTruststoreFilesList(MergerConfiguration configuration) throws ExitableException {
+        TruststoreFileFactory truststoreFileFactory = new TruststoreFileFactory(new FileManager(), new PasswordReader());
+        TruststoreFilesListProvider truststoreFilesListProvider = new TruststoreFilesListProvider(truststoreFileFactory);
+        return truststoreFilesListProvider
+                .getTruststoreFilesList(
+                        configuration.getTruststoreFilePaths(),
+                        configuration.getTruststoreFilePasswordPaths()
+                );
+    }
 }
index ae145f7..d0c3b2f 100644 (file)
@@ -23,7 +23,9 @@ public enum ExitStatus {
 
     SUCCESS(0, "Success"),
     TRUSTSTORES_PATHS_PROVIDER_EXCEPTION(1, "Invalid paths in environment variables"),
-    MERGER_CONFIGURATION_EXCEPTION(2, "Invalid merger configuration");
+    MERGER_CONFIGURATION_EXCEPTION(2, "Invalid merger configuration"),
+    TRUSTSTORE_FILE_FACTORY_EXCEPTION(3, "Invalid truststore file-password pair"),
+    PASSWORD_READER_EXCEPTION(4, "Cannot read password from file");
 
     private final int value;
     private final String message;
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/JksTruststore.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/JksTruststore.java
new file mode 100644 (file)
index 0000000..b977dae
--- /dev/null
@@ -0,0 +1,37 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file;
+
+import java.io.File;
+import java.security.cert.Certificate;
+import java.util.Collections;
+import java.util.List;
+
+public class JksTruststore extends TruststoreFileWithPassword {
+
+    public JksTruststore(File truststoreFile, String password) {
+        super(truststoreFile, password);
+    }
+
+    @Override
+    public List<Certificate> getCertificates() {
+        return Collections.emptyList();
+    }
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/P12Truststore.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/P12Truststore.java
new file mode 100644 (file)
index 0000000..8527cce
--- /dev/null
@@ -0,0 +1,38 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file;
+
+import java.io.File;
+import java.security.cert.Certificate;
+import java.util.Collections;
+import java.util.List;
+
+public class P12Truststore extends TruststoreFileWithPassword {
+
+    public P12Truststore(File truststoreFile, String password) {
+        super(truststoreFile, password);
+    }
+
+    @Override
+    public List<Certificate> getCertificates() {
+        return Collections.emptyList();
+    }
+
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/PemTruststore.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/PemTruststore.java
new file mode 100644 (file)
index 0000000..ca2ac85
--- /dev/null
@@ -0,0 +1,37 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file;
+
+import java.io.File;
+import java.security.cert.Certificate;
+import java.util.Collections;
+import java.util.List;
+
+public class PemTruststore extends TruststoreFile {
+
+    public PemTruststore(File truststoreFile) {
+        super(truststoreFile);
+    }
+
+    @Override
+    public List<Certificate> getCertificates() {
+        return Collections.emptyList();
+    }
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoreFile.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoreFile.java
new file mode 100644 (file)
index 0000000..88b1b5a
--- /dev/null
@@ -0,0 +1,38 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file;
+
+import java.io.File;
+import java.security.cert.Certificate;
+import java.util.List;
+
+public abstract class TruststoreFile {
+    private File truststoreFile;
+
+    TruststoreFile(File truststoreFile) {
+        this.truststoreFile = truststoreFile;
+    }
+
+    public abstract List<Certificate> getCertificates();
+
+    public File getTruststoreFile() {
+        return truststoreFile;
+    };
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoreFileWithPassword.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoreFileWithPassword.java
new file mode 100644 (file)
index 0000000..484f2d4
--- /dev/null
@@ -0,0 +1,35 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file;
+
+import java.io.File;
+
+public abstract class TruststoreFileWithPassword extends TruststoreFile {
+    private String password;
+
+    TruststoreFileWithPassword(File truststoreFile, String password) {
+        super(truststoreFile);
+        this.password = password;
+    }
+
+    public String getPassword(){
+        return password;
+    };
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/FileManager.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/FileManager.java
new file mode 100644 (file)
index 0000000..901c13a
--- /dev/null
@@ -0,0 +1,39 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file.provider;
+
+import java.io.File;
+
+public class FileManager {
+    private static final int NOT_FOUND_INDEX=-1;
+
+    String getExtension(File file) {
+        int extStartIndex = file.getName().lastIndexOf(".");
+        if (extStartIndex == NOT_FOUND_INDEX) {
+            return "";
+        }
+        return file.getName().substring(extStartIndex);
+    }
+
+    boolean checkIfFileExists(File file){
+        return file.exists();
+    }
+
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/PasswordReader.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/PasswordReader.java
new file mode 100644 (file)
index 0000000..db42f3b
--- /dev/null
@@ -0,0 +1,36 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file.provider;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+public class PasswordReader {
+    private static final String COULD_NOT_READ_PASSWORD_FROM_FILE_MSG_TEMPLATE = "Could not read password from file: %s";
+
+    String readPassword(File file) throws PasswordReaderException {
+        try {
+            return Files.readString(file.toPath());
+        } catch (IOException e) {
+            throw new PasswordReaderException(String.format(COULD_NOT_READ_PASSWORD_FROM_FILE_MSG_TEMPLATE, file));
+        }
+    }
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/PasswordReaderException.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/PasswordReaderException.java
new file mode 100644 (file)
index 0000000..2928f0c
--- /dev/null
@@ -0,0 +1,29 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file.provider;
+
+import org.onap.oom.truststoremerger.api.ExitStatus;
+import org.onap.oom.truststoremerger.api.ExitableException;
+
+class PasswordReaderException extends ExitableException {
+    PasswordReaderException(String message) {
+        super(message, ExitStatus.PASSWORD_READER_EXCEPTION);
+    }
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFileFactory.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFileFactory.java
new file mode 100644 (file)
index 0000000..e63e7c3
--- /dev/null
@@ -0,0 +1,84 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file.provider;
+
+import org.onap.oom.truststoremerger.certification.file.JksTruststore;
+import org.onap.oom.truststoremerger.certification.file.P12Truststore;
+import org.onap.oom.truststoremerger.certification.file.PemTruststore;
+import org.onap.oom.truststoremerger.certification.file.TruststoreFile;
+
+import java.io.File;
+
+public class TruststoreFileFactory {
+
+    private static final String JKS_EXTENSION = ".jks";
+    private static final String P12_EXTENSION = ".p12";
+    private static final String PEM_EXTENSION = ".pem";
+    private static final String FILE_DOES_NOT_EXIST_MSG_TEMPLATE = "File: %s does not exist";
+    private static final String UNKNOWN_TRUSTSTORE_TYPE_MSG_TEMPLATE = "Unknown truststore extension type: %s";
+
+    private final FileManager fileManager;
+    private final PasswordReader passwordReader;
+
+    public TruststoreFileFactory(FileManager fileManager, PasswordReader passwordReader) {
+        this.fileManager = fileManager;
+        this.passwordReader = passwordReader;
+    }
+
+    TruststoreFile create(String truststoreFilePath, String truststorePasswordPath)
+            throws TruststoreFileFactoryException, PasswordReaderException {
+        File truststoreFile = new File(truststoreFilePath);
+        if (!fileManager.checkIfFileExists(truststoreFile)) {
+            throw new TruststoreFileFactoryException(String.format(FILE_DOES_NOT_EXIST_MSG_TEMPLATE, truststoreFile));
+        }
+        return createTypedTruststore(truststoreFile, truststorePasswordPath);
+    }
+
+    private TruststoreFile createTypedTruststore(File truststoreFile, String truststorePasswordPath)
+            throws PasswordReaderException, TruststoreFileFactoryException {
+        String extension = fileManager.getExtension(truststoreFile);
+        switch (extension) {
+            case JKS_EXTENSION:
+                return createJksTruststore(truststoreFile, truststorePasswordPath);
+            case P12_EXTENSION:
+                return createP12Truststore(truststoreFile, truststorePasswordPath);
+            case PEM_EXTENSION:
+                return createPemTruststore(truststoreFile);
+            default:
+                throw new TruststoreFileFactoryException(String.format(UNKNOWN_TRUSTSTORE_TYPE_MSG_TEMPLATE, extension));
+        }
+    }
+
+    private JksTruststore createJksTruststore(File truststoreFile, String truststorePasswordPath)
+            throws PasswordReaderException {
+        String password = passwordReader.readPassword(new File(truststorePasswordPath));
+        return new JksTruststore(truststoreFile, password);
+    }
+
+    private P12Truststore createP12Truststore(File truststoreFile, String truststorePasswordPath)
+            throws PasswordReaderException {
+        String password = passwordReader.readPassword(new File(truststorePasswordPath));
+        return new P12Truststore(truststoreFile, password);
+    }
+
+    private PemTruststore createPemTruststore(File truststoreFile) {
+        return new PemTruststore(truststoreFile);
+    }
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFileFactoryException.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFileFactoryException.java
new file mode 100644 (file)
index 0000000..43342c8
--- /dev/null
@@ -0,0 +1,30 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file.provider;
+
+import org.onap.oom.truststoremerger.api.ExitStatus;
+import org.onap.oom.truststoremerger.api.ExitableException;
+
+class TruststoreFileFactoryException extends ExitableException {
+    TruststoreFileFactoryException(String message) {
+        super(message, ExitStatus.TRUSTSTORE_FILE_FACTORY_EXCEPTION);
+    }
+
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFilesListProvider.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFilesListProvider.java
new file mode 100644 (file)
index 0000000..2f5356d
--- /dev/null
@@ -0,0 +1,50 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file.provider;
+
+import org.onap.oom.truststoremerger.certification.file.TruststoreFile;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class TruststoreFilesListProvider {
+
+    private final TruststoreFileFactory truststoreFileFactory;
+
+    public TruststoreFilesListProvider(TruststoreFileFactory truststoreFileFactory) {
+        this.truststoreFileFactory = truststoreFileFactory;
+    }
+
+    public List<TruststoreFile> getTruststoreFilesList(List<String> truststoreFilePaths,
+                                                       List<String> truststoreFilePasswordPaths)
+            throws PasswordReaderException, TruststoreFileFactoryException {
+        List<TruststoreFile> truststoreFilesList = new ArrayList<>();
+        for (int i = 0; i < truststoreFilePaths.size(); i++) {
+            String truststorePath = truststoreFilePaths.get(i);
+            String passwordPath = truststoreFilePasswordPaths.get(i);
+
+            TruststoreFile truststoreFile = truststoreFileFactory.create(truststorePath, passwordPath);
+            truststoreFilesList.add(truststoreFile);
+        }
+
+        return truststoreFilesList;
+    }
+}
@@ -17,7 +17,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file;
+package org.onap.oom.truststoremerger.certification.path;
 
 import static org.onap.oom.truststoremerger.api.ConfigurationEnvs.TRUSTSTORES_ENV;
 import static org.onap.oom.truststoremerger.api.ConfigurationEnvs.TRUSTSTORES_PASSWORDS_ENV;
index fa0b8cd..7a2fdc1 100644 (file)
@@ -19,8 +19,8 @@
 
 package org.onap.oom.truststoremerger.configuration;
 
-import org.onap.oom.truststoremerger.certification.file.TruststoresPathsProvider;
-import org.onap.oom.truststoremerger.certification.file.TruststoresPathsProviderException;
+import org.onap.oom.truststoremerger.certification.path.TruststoresPathsProvider;
+import org.onap.oom.truststoremerger.certification.path.TruststoresPathsProviderException;
 
 import static org.onap.oom.truststoremerger.api.ConfigurationEnvs.TRUSTSTORES_ENV;
 import static org.onap.oom.truststoremerger.api.ConfigurationEnvs.TRUSTSTORES_PASSWORDS_ENV;
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/FileManagerTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/FileManagerTest.java
new file mode 100644 (file)
index 0000000..d348dd7
--- /dev/null
@@ -0,0 +1,46 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file.provider;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+
+import java.io.File;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class FileManagerTest {
+
+    private FileManager fileManager = new FileManager();
+
+    @ParameterizedTest
+    @CsvSource(value = {
+            "opt/app/truststore.jks:.jks",
+            "opt/app/truststore.p12:.p12",
+            "opt/app/truststore.pem:.pem",
+            "opt/app/truststore:''",
+    }, delimiter = ':')
+    void shouldReturnCorrectExtension(String filePath, String expectedExtension){
+        String extension = fileManager.getExtension(new File(filePath));
+        assertThat(extension).isEqualTo(expectedExtension);
+    }
+
+}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/PasswordReaderTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/PasswordReaderTest.java
new file mode 100644 (file)
index 0000000..712935a
--- /dev/null
@@ -0,0 +1,44 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file.provider;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+
+class PasswordReaderTest {
+
+    @Test
+    void shouldReturnCorrectPasswordFromFile() throws PasswordReaderException {
+        PasswordReader passwordReader = new PasswordReader();
+        String fileData = passwordReader.readPassword(new File("src/test/resources/truststore-jks.pass"));
+        assertThat(fileData).isEqualTo("EOyuFbuYDyq_EhpboM72RHua");
+    }
+
+    @Test
+    void shouldThrowExceptionForNonExistingFile() {
+        PasswordReader passwordReader = new PasswordReader();
+        assertThatExceptionOfType(PasswordReaderException.class)
+                .isThrownBy(() -> passwordReader.readPassword(new File("src/test/resources/non-esisting-file.pass")));
+    }
+}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFileFactoryTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFileFactoryTest.java
new file mode 100644 (file)
index 0000000..f00b2bc
--- /dev/null
@@ -0,0 +1,114 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file.provider;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.onap.oom.truststoremerger.certification.file.JksTruststore;
+import org.onap.oom.truststoremerger.certification.file.P12Truststore;
+import org.onap.oom.truststoremerger.certification.file.PemTruststore;
+import org.onap.oom.truststoremerger.certification.file.TruststoreFile;
+
+import java.io.File;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+
+@ExtendWith(MockitoExtension.class)
+class TruststoreFileFactoryTest {
+
+    private static final String TRUSTSTORE_JKS_PATH = "src/test/resources/truststore-jks.jks";
+    private static final String TRUSTSTORE_JKS_PASS_PATH = "src/test/resources/truststore-jks.pass";
+    private static final String TRUSTSTORE_JKS_PASS = "EOyuFbuYDyq_EhpboM72RHua";
+    private static final String TRUSTSTORE_P12_PATH = "src/test/resources/truststore-p12.p12";
+    private static final String TRUSTSTORE_P12_PASS_PATH = "src/test/resources/truststore-p12.pass";
+    private static final String TRUSTSTORE_P12_PASS = "88y9v5D8H3SG6bZWRVHDfOAo";
+    private static final String TRUSTSTORE_PEM_PATH = "src/test/resources/truststore.pem";
+    private static final String EMPTY_PASS_PATH = "";
+    private static final String TRUSTSTORE_UNKNOWN_EXTENSION_PATH = "src/test/resources/truststore-jks.unknown";
+    private static final String NON_EXISTING_TRUSTSTORE_PATH = "src/test/resources/non-existing-truststore.jks";
+
+    private TruststoreFileFactory truststoreFileFactory;
+
+    @BeforeEach
+    void setUp() {
+        truststoreFileFactory = new TruststoreFileFactory(new FileManager(), new PasswordReader());
+    }
+
+    @Test
+    void shouldReturnCorrectJksTruststoreForJksFile() throws TruststoreFileFactoryException, PasswordReaderException {
+        TruststoreFile truststore = truststoreFileFactory
+                .create(TRUSTSTORE_JKS_PATH, TRUSTSTORE_JKS_PASS_PATH);
+        assertThat(truststore).isInstanceOf(JksTruststore.class);
+        JksTruststore jksTruststore = (JksTruststore) truststore;
+        assertThat(jksTruststore.getPassword()).isEqualTo(TRUSTSTORE_JKS_PASS);
+        assertThat(jksTruststore.getTruststoreFile()).isEqualTo(new File(TRUSTSTORE_JKS_PATH));
+    }
+
+    @Test
+    void shouldReturnCorrectP12TruststoreForP12File() throws TruststoreFileFactoryException, PasswordReaderException {
+        TruststoreFile truststore = truststoreFileFactory
+                .create(TRUSTSTORE_P12_PATH,
+                        TRUSTSTORE_P12_PASS_PATH);
+        assertThat(truststore).isInstanceOf(P12Truststore.class);
+        P12Truststore jksTruststore = (P12Truststore) truststore;
+        assertThat(jksTruststore.getPassword()).isEqualTo(TRUSTSTORE_P12_PASS);
+    }
+
+    @Test
+    void shouldReturnCorrectPemTruststoreForPemFile() throws TruststoreFileFactoryException, PasswordReaderException {
+        TruststoreFile truststore = truststoreFileFactory
+                .create(TRUSTSTORE_PEM_PATH,
+                        EMPTY_PASS_PATH);
+        assertThat(truststore).isInstanceOf(PemTruststore.class);
+    }
+
+    @Test
+    void shouldThrowExceptionForInvalidP12PassPath() {
+        assertThatExceptionOfType(PasswordReaderException.class).isThrownBy(
+                () -> truststoreFileFactory.create(TRUSTSTORE_P12_PATH, EMPTY_PASS_PATH)
+        );
+    }
+
+    @Test
+    void shouldThrowExceptionForInvalidJksPassPath() {
+        assertThatExceptionOfType(PasswordReaderException.class).isThrownBy(
+                () -> truststoreFileFactory.create(TRUSTSTORE_JKS_PATH, EMPTY_PASS_PATH)
+        );
+    }
+
+    @Test
+    void shouldThrowExceptionForUnknownTruststoreExtension() {
+        assertThatExceptionOfType(TruststoreFileFactoryException.class).isThrownBy(
+                () -> truststoreFileFactory.create(TRUSTSTORE_UNKNOWN_EXTENSION_PATH, TRUSTSTORE_JKS_PASS_PATH)
+        );
+    }
+
+    @Test
+    void shouldThrowExceptionForNonExistingTruststoreFile() {
+        assertThatExceptionOfType(TruststoreFileFactoryException.class).isThrownBy(
+                () -> truststoreFileFactory.create(NON_EXISTING_TRUSTSTORE_PATH, TRUSTSTORE_JKS_PASS_PATH)
+        );
+    }
+
+}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFilesListProviderTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFilesListProviderTest.java
new file mode 100644 (file)
index 0000000..034e1b3
--- /dev/null
@@ -0,0 +1,90 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * 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.oom.truststoremerger.certification.file.provider;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.onap.oom.truststoremerger.certification.file.JksTruststore;
+import org.onap.oom.truststoremerger.certification.file.P12Truststore;
+import org.onap.oom.truststoremerger.certification.file.PemTruststore;
+import org.onap.oom.truststoremerger.certification.file.TruststoreFile;
+import org.onap.oom.truststoremerger.certification.file.TruststoreFileWithPassword;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class TruststoreFilesListProviderTest {
+
+    private static final String TRUSTSTORE_JKS_PATH = "src/test/resources/truststore-jks.jks";
+    private static final String TRUSTSTORE_JKS_PASS_PATH = "src/test/resources/truststore-jks.pass";
+    private static final String TRUSTSTORE_JKS_PASS = "EOyuFbuYDyq_EhpboM72RHua";
+    private static final String TRUSTSTORE_P12_PATH = "src/test/resources/truststore-p12.p12";
+    private static final String TRUSTSTORE_P12_PASS_PATH = "src/test/resources/truststore-p12.pass";
+    private static final String TRUSTSTORE_P12_PASS = "88y9v5D8H3SG6bZWRVHDfOAo";
+    private static final String TRUSTSTORE_PEM_PATH = "src/test/resources/truststore.pem";
+    private static final String EMPTY_PASS_PATH = "";
+
+    private TruststoreFilesListProvider truststoreFilesListProvider;
+
+    @BeforeEach
+    void setUp() {
+        TruststoreFileFactory truststoreFileFactory = new TruststoreFileFactory(new FileManager(), new PasswordReader());
+        truststoreFilesListProvider = new TruststoreFilesListProvider(truststoreFileFactory);
+    }
+
+    @Test
+    void shouldReturnTruststoreFilesList() throws PasswordReaderException, TruststoreFileFactoryException {
+        List<String> truststorePaths = Arrays.asList(TRUSTSTORE_JKS_PATH, TRUSTSTORE_P12_PATH, TRUSTSTORE_PEM_PATH);
+        List<String> truststorePasswordPaths = Arrays.asList(TRUSTSTORE_JKS_PASS_PATH, TRUSTSTORE_P12_PASS_PATH, EMPTY_PASS_PATH);
+        List<TruststoreFile> truststoreFilesList = truststoreFilesListProvider.getTruststoreFilesList(truststorePaths, truststorePasswordPaths);
+        assertThat(truststoreFilesList.size()).isEqualTo(3);
+        assertCorrectJksTruststore(truststoreFilesList.get(0), TRUSTSTORE_JKS_PATH, TRUSTSTORE_JKS_PASS);
+        assertCorrectP12Truststore(truststoreFilesList.get(1), TRUSTSTORE_P12_PATH, TRUSTSTORE_P12_PASS);
+        assertCorrectPemTruststore(truststoreFilesList.get(2), TRUSTSTORE_PEM_PATH);
+    }
+
+    private void assertCorrectJksTruststore(TruststoreFile truststoreFile, String truststorePath, String truststorePass) {
+        assertCorrectTypeAndTruststorePath(truststoreFile, truststorePath, JksTruststore.class);
+        assertContainsCorrectPassword(truststoreFile, truststorePass);
+    }
+
+    private void assertCorrectP12Truststore(TruststoreFile truststoreFile, String truststorePath, String truststorePass) {
+        assertCorrectTypeAndTruststorePath(truststoreFile, truststorePath, P12Truststore.class);
+        assertContainsCorrectPassword(truststoreFile, truststorePass);
+    }
+
+    private void assertCorrectPemTruststore(TruststoreFile truststoreFile, String truststorePath) {
+        assertCorrectTypeAndTruststorePath(truststoreFile, truststorePath, PemTruststore.class);
+    }
+
+    private void assertCorrectTypeAndTruststorePath(TruststoreFile truststoreFile, String truststorePath, Class<?> truststoreType) {
+        assertThat(truststoreFile).isInstanceOf(truststoreType);
+        assertThat(truststoreFile.getTruststoreFile()).isEqualTo(new File(truststorePath));
+    }
+
+    private void assertContainsCorrectPassword(TruststoreFile truststoreFile, String truststorePass) {
+        TruststoreFileWithPassword truststoreFileWithPassword = (TruststoreFileWithPassword) truststoreFile;
+        assertThat(truststoreFileWithPassword.getPassword()).isEqualTo(truststorePass);
+    }
+}
@@ -17,7 +17,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file;
+package org.onap.oom.truststoremerger.certification.path;
 
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
index 336ba5d..43b7b9e 100644 (file)
@@ -24,8 +24,8 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
-import org.onap.oom.truststoremerger.certification.file.TruststoresPathsProvider;
-import org.onap.oom.truststoremerger.certification.file.TruststoresPathsProviderException;
+import org.onap.oom.truststoremerger.certification.path.TruststoresPathsProvider;
+import org.onap.oom.truststoremerger.certification.path.TruststoresPathsProviderException;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/trustStoreMerger/src/test/resources/truststore-jks.jks b/trustStoreMerger/src/test/resources/truststore-jks.jks
new file mode 100644 (file)
index 0000000..3822981
Binary files /dev/null and b/trustStoreMerger/src/test/resources/truststore-jks.jks differ
diff --git a/trustStoreMerger/src/test/resources/truststore-jks.pass b/trustStoreMerger/src/test/resources/truststore-jks.pass
new file mode 100644 (file)
index 0000000..7426fd4
--- /dev/null
@@ -0,0 +1 @@
+EOyuFbuYDyq_EhpboM72RHua
\ No newline at end of file
diff --git a/trustStoreMerger/src/test/resources/truststore-p12.p12 b/trustStoreMerger/src/test/resources/truststore-p12.p12
new file mode 100644 (file)
index 0000000..0fa8aec
Binary files /dev/null and b/trustStoreMerger/src/test/resources/truststore-p12.p12 differ
diff --git a/trustStoreMerger/src/test/resources/truststore-p12.pass b/trustStoreMerger/src/test/resources/truststore-p12.pass
new file mode 100644 (file)
index 0000000..86cc5aa
--- /dev/null
@@ -0,0 +1 @@
+88y9v5D8H3SG6bZWRVHDfOAo
\ No newline at end of file
diff --git a/trustStoreMerger/src/test/resources/truststore.pem b/trustStoreMerger/src/test/resources/truststore.pem
new file mode 100644 (file)
index 0000000..3268e3a
--- /dev/null
@@ -0,0 +1,28 @@
+-----BEGIN CERTIFICATE-----
+MIIEszCCAxugAwIBAgIUE+27eIlr12tQ+AMxkJTf2Y+ycOEwDQYJKoZIhvcNAQEL
+BQAwYTEjMCEGCgmSJomT8ixkAQEME2MtMDRjYmE2YjhhMDQ5ODEyNGQxFTATBgNV
+BAMMDE1hbmFnZW1lbnRDQTEjMCEGA1UECgwaRUpCQ0EgQ29udGFpbmVyIFF1aWNr
+c3RhcnQwHhcNMjAwNzA4MTIzODU4WhcNMzAwNzA4MTIzODU4WjBhMSMwIQYKCZIm
+iZPyLGQBAQwTYy0wNGNiYTZiOGEwNDk4MTI0ZDEVMBMGA1UEAwwMTWFuYWdlbWVu
+dENBMSMwIQYDVQQKDBpFSkJDQSBDb250YWluZXIgUXVpY2tzdGFydDCCAaIwDQYJ
+KoZIhvcNAQEBBQADggGPADCCAYoCggGBALTlx22Ld87VO5QgkD7OJvx81a8xLRWt
+b4cqmLSBRKw+jTjX4fHCtLh98hXNtYXJ9nxPa2t8MKR/I00Wf1razX1IYN9H/diV
+uICjyMxDyK6nwEMpqaWiQgOQx1N4TjNhr19ULTbyFLQMVfXy1OrTsfoWQ2omvRxN
+LIoVKwPHd92KG6iqJDZU14ErfA6UtypDV+4rOKQBh0JrfFI/KxKFKRH3e0oDxD8c
+PIOUpYVccVv/4Gbc0ZRs8KK0uPZN73LlQccYzPrSk/VAUeuZ52Wqk6dNrq5FHSCe
+EwPbx6aqgLwhTLlYAJqmYuDsGU9ZL09buCVKim1pjZiPaoaYAvv3KHdjEKAu9NxF
+dezd4JZ24hqYCA7EGnKgyjHxA0SiD/B8f+aBdRGDZbMlH1gKFKivjuHSfPwRv6Op
+p8ykEzk3yp0RcqSflVPg0mj+LPViYo/loLLOLybFFR7BetyFieN5QV7BKRyfc7Qi
+Se6Idh1nLIrYR9ek8BDkEE9u/JiTT0gP3QIDAQABo2MwYTAPBgNVHRMBAf8EBTAD
+AQH/MB8GA1UdIwQYMBaAFDYtHGSe9lYaC9+WnNT91wuiMlkjMB0GA1UdDgQWBBQ2
+LRxknvZWGgvflpzU/dcLojJZIzAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL
+BQADggGBAIcLj76GVhYSuVaWMMCVlVl8rHhYYufT9z2X7G/0D1G655/dAeAJLltL
+S4T7SZI44XKfVH4ztc4TO6OEMLZzslcfDzv/tUzL4EOsXtBTpsK9JgHP2lzCE+aj
+a7uxn5SGWlu0YmT/++2d+QYaVVAjqalal8NsppOYCh8GB84TXbQjOMWcR9YBozZf
+DSy3/vDNMuggZfdEOMMP57M10NoOKor+8eMGB42k4NR+G2npYHZ4uh1Ifk+eoTAh
+o5O0iz3+/8eMTkLavqpnfzBhWHfRTI8wUu6zgm+QI+tsqhPePRuwauD8r79JBnPW
+0gayZI5jIWTwvufpweKMgLyQbiGVUDtsr2c43kJ6XHoEf0ACUzbJKtGDD3Y7H/G1
+5Q7hBWbQwhUpiVeRnofS9jHQPWu0Ueq4/784hy+yPWotBIeIWEy4KzKTS+GaRDm0
+OSYtta/BdU0iZO/PzzTC5yIzwrsaq+5Idp16mub7mCAW0B36x0Phmr0DQWpZwxmX
+9envV9HcJw==
+-----END CERTIFICATE-----