Yair Zaslavsky has uploaded a new change for review.

Change subject: core: Store only single certificate
......................................................................

core: Store only single certificate

Change-Id: Ic9bd8cd7f913cf23eca839452b6e113f749966f7
Signed-off-by: Yair Zaslavsky <yzasl...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ExternalTrustStoreInitializer.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ImportProviderCertificateChainCommand.java
3 files changed, 33 insertions(+), 57 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/33/35833/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
index a816c0f..499d431 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
@@ -14,7 +14,6 @@
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
 import org.ovirt.engine.core.bll.network.MacPoolManager;
 import org.ovirt.engine.core.bll.pm.PmHealthCheckManager;
-import org.ovirt.engine.core.bll.provider.ExternalTrustStoreInitializer;
 import org.ovirt.engine.core.bll.scheduling.MigrationHandler;
 import org.ovirt.engine.core.bll.scheduling.SchedulingManager;
 import org.ovirt.engine.core.bll.storage.StoragePoolStatusHandler;
@@ -86,8 +85,6 @@
             StoragePoolStatusHandler.init();
 
             GlusterJobsManager.init();
-
-            ExternalTrustStoreInitializer.init();
 
             try {
                 log.info("Init VM custom properties utilities");
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ExternalTrustStoreInitializer.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ExternalTrustStoreInitializer.java
index ea30878..7707911 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ExternalTrustStoreInitializer.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ExternalTrustStoreInitializer.java
@@ -3,8 +3,10 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
-import java.io.OutputStream;
 import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
 
 import org.ovirt.engine.core.utils.EngineLocalConfig;
 import org.ovirt.engine.core.utils.log.Log;
@@ -14,55 +16,49 @@
 
     private static final Log log = 
LogFactory.getLog(ExternalTrustStoreInitializer.class);
 
-    private static String getTrustStorePath() {
-        File varDir = EngineLocalConfig.getInstance().getVarDir();
-        return varDir + "/" + "external_truststore";
-    }
-
-    public static void init() {
-        File trustStoreFile = new File(getTrustStorePath());
-        if (!trustStoreFile.exists()) {
-            try (OutputStream out = new FileOutputStream(trustStoreFile)){
-                String password = 
EngineLocalConfig.getInstance().getPKITrustStorePassword();
-                KeyStore trustStore = 
KeyStore.getInstance(KeyStore.getDefaultType());
-                // Passing null stream will create a new empty trust store
-                trustStore.load(null, password.toCharArray());
-                trustStore.store(out, password.toCharArray());
-            } catch (Exception e) {
-                log.error("Creation of the external trust store failed.", e);
-            }
-        }
-    }
-
     public static KeyStore getTrustStore() {
-        KeyStore ks = null;
         try {
-            ks = 
EngineLocalConfig.getInstance().getExternalProvidersTrustStore().exists() ?
-                            
KeyStore.getInstance(EngineLocalConfig.getInstance().getExternalProvidersTrustStoreType())
-                            : null;
-            if (ks != null) {
+            KeyStore ks = 
KeyStore.getInstance(EngineLocalConfig.getInstance().getExternalProvidersTrustStoreType());
+            if 
(!EngineLocalConfig.getInstance().getExternalProvidersTrustStore().exists()) {
+                ks.load(null);
+            } else {
                 try (FileInputStream ksFileInputStream =
                         new 
FileInputStream(EngineLocalConfig.getInstance().getExternalProvidersTrustStore()))
 {
-                        ks.load(ksFileInputStream, 
EngineLocalConfig.getInstance()
+                    ks.load(ksFileInputStream, EngineLocalConfig.getInstance()
                             .getExternalProvidersTrustStorePassword()
                             .toCharArray());
                 }
             }
+            return ks;
         } catch (Exception ex) {
             throw new RuntimeException(ex);
         }
-        return ks;
-
     }
 
-    public static void setTrustStore(KeyStore keystore) {
-        try (OutputStream out = new FileOutputStream(getTrustStorePath())) {
-            // TODO: do not use password of other store
-            String password = 
EngineLocalConfig.getInstance().getPKITrustStorePassword();
-            keystore.store(out, password.toCharArray());
-        }
-        catch (Exception e) {
+    public static void addCertificate(Certificate cert) throws 
CertificateEncodingException, KeyStoreException {
+        KeyStore keystore = getTrustStore();
+        keystore.setCertificateEntry(Integer.toString(cert.hashCode()), cert);
+
+        File trustStoreFile = 
EngineLocalConfig.getInstance().getExternalProvidersTrustStore();
+        File tempFile = null;
+        try {
+            tempFile = File.createTempFile("keystore", ".tmp", 
trustStoreFile.getParentFile());
+            try (FileOutputStream out = new FileOutputStream(tempFile)) {
+                keystore.store(out, EngineLocalConfig.getInstance()
+                        .getExternalProvidersTrustStorePassword()
+                        .toCharArray());
+            }
+            if (!tempFile.renameTo(trustStoreFile.getAbsoluteFile())) {
+                throw new RuntimeException(String.format("Failed to save trust 
store to file %1$s",
+                        trustStoreFile.getAbsolutePath()));
+            }
+            tempFile = null;
+        } catch (Exception e) {
             throw new RuntimeException(e);
+        } finally {
+            if (tempFile != null && !tempFile.delete()) {
+                log.error("Cannot delete '{}'", tempFile.getAbsolutePath());
+            }
         }
     }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ImportProviderCertificateChainCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ImportProviderCertificateChainCommand.java
index 80a99b1..a99aea3 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ImportProviderCertificateChainCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ImportProviderCertificateChainCommand.java
@@ -1,6 +1,5 @@
 package org.ovirt.engine.core.bll.provider;
 
-import java.security.KeyStore;
 import java.security.cert.Certificate;
 import java.util.Collections;
 import java.util.List;
@@ -57,24 +56,8 @@
 
     private void saveChainToTrustStore(List<? extends Certificate> chain) {
         if (chain != null && chain.size() > 0) {
-            KeyStore ks = null;
             try {
-                ks = ExternalTrustStoreInitializer.getTrustStore();
-            } catch (Throwable e) {
-                handleException(e);
-            }
-
-            try {
-                // In case there is only one certificate, we insert it.
-                // Otherwise, we need to insert the entire chain except the 
end certificate (the end certificate here is the first one)
-                int firstCertificateIndex = chain.size() == 1 ? 0 : 1;
-                for (int certIndex = firstCertificateIndex; certIndex < 
chain.size(); ++certIndex) {
-                    Certificate certificate = chain.get(certIndex);
-                    String alias = Guid.newGuid().toString();
-                    ks.setCertificateEntry(alias, certificate);
-                }
-
-                ExternalTrustStoreInitializer.setTrustStore(ks);
+                
ExternalTrustStoreInitializer.addCertificate(chain.get(chain.size()-1));
                 setSucceeded(true);
             } catch (Throwable e) {
                 handleException(e);


-- 
To view, visit http://gerrit.ovirt.org/35833
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic9bd8cd7f913cf23eca839452b6e113f749966f7
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Yair Zaslavsky <yzasl...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to