Yair Zaslavsky has uploaded a new change for review.

Change subject: engine: Import single certificate
......................................................................

engine: Import single certificate

GetProviderCertificate is run instead of GetCertificateChain, and retrieves
the top certicate from the chain.

The user approves the certificate, and then it is imported using the new
ImportProviderCertificate command which gets an encoded payload of the 
certificate
as parmater.

Change-Id: Ic9adb21ded6e6d9fb09fc68331872c1cd88f88a9
Signed-off-by: Yair Zaslavsky <yzasl...@redhat.com>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetProviderCertificateQuery.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ExternalTrustStoreInitializer.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ImportProviderCetificateCommand.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImportProviderCertificateParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderModel.java
8 files changed, 218 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/85/35485/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetProviderCertificateQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetProviderCertificateQuery.java
new file mode 100644
index 0000000..7d1db8b
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetProviderCertificateQuery.java
@@ -0,0 +1,48 @@
+package org.ovirt.engine.core.bll;
+
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.util.List;
+
+import org.apache.commons.codec.binary.Base64;
+import org.ovirt.engine.core.bll.provider.ProviderProxy;
+import org.ovirt.engine.core.bll.provider.ProviderProxyFactory;
+import org.ovirt.engine.core.common.businessentities.Provider;
+import org.ovirt.engine.core.common.queries.ProviderQueryParameters;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class GetProviderCertificateQuery<P extends ProviderQueryParameters> 
extends QueriesCommandBase<P> {
+
+    public GetProviderCertificateQuery(P parameters) {
+        super(parameters);
+    }
+
+    private Provider<?> getProvider() {
+        return getParameters().getProvider();
+    }
+
+    @Override
+    protected void executeQueryCommand() {
+        Provider<?> provider = getProvider();
+        ProviderProxy proxy = 
ProviderProxyFactory.getInstance().create(provider);
+        List<? extends Certificate> chain = proxy.getCertificateChain();
+        if (!chain.isEmpty()) {
+            try {
+                getQueryReturnValue().setReturnValue(new 
Base64().encodeToString(chain.get(0).getEncoded()));
+            } catch (CertificateEncodingException e) {
+                getQueryReturnValue().setSucceeded(false);
+                log.error("Error in encoding certificate. Error is {} " + 
e.getMessage());
+                if (log.isDebugEnabled()) {
+                    log.debug("", e);
+                }
+            }
+            getQueryReturnValue().setSucceeded(true);
+        } else {
+            getQueryReturnValue().setSucceeded(false);
+        }
+    }
+
+    private static Logger log = 
LoggerFactory.getLogger(GetProviderCertificateQuery.class);
+
+}
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 9955a68..5cd1b82 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
@@ -50,6 +50,7 @@
         }
     }
 
+    @Deprecated
     public static void addCertificateChain(List<? extends Certificate> chain) 
throws CertificateEncodingException,
             KeyStoreException {
         KeyStore ks = getTrustStore();
@@ -58,4 +59,12 @@
         ks.setCertificateEntry(alias, certificate);
         saveTrustStore(ks);
     }
+
+    public static void addCertificate(Certificate cert) throws 
CertificateEncodingException, KeyStoreException {
+        KeyStore ks = getTrustStore();
+        String alias = Integer.toString(cert.getEncoded().hashCode());
+        ks.setCertificateEntry(alias, cert);
+        saveTrustStore(ks);
+
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ImportProviderCetificateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ImportProviderCetificateCommand.java
new file mode 100644
index 0000000..4895591
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/provider/ImportProviderCetificateCommand.java
@@ -0,0 +1,104 @@
+package org.ovirt.engine.core.bll.provider;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.codec.binary.Base64;
+import org.ovirt.engine.core.bll.CommandBase;
+import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.action.ImportProviderCertificateParameters;
+import org.ovirt.engine.core.common.businessentities.ActionGroup;
+import org.ovirt.engine.core.common.businessentities.Provider;
+import org.ovirt.engine.core.common.errors.VdcBLLException;
+import org.ovirt.engine.core.common.errors.VdcBllErrors;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.compat.Guid;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/*
+ * This command class imports a certificate chain of an external provider into 
the external trust store.
+ */
+public class ImportProviderCetificateCommand<P extends 
ImportProviderCertificateParameters> extends CommandBase<P> {
+
+    private Certificate certificate;
+
+    public ImportProviderCetificateCommand(Guid commandId) {
+        super(commandId);
+    }
+
+    public ImportProviderCetificateCommand(P parameters) {
+        super(parameters);
+    }
+
+    private Provider getProvider() {
+        return getParameters().getProvider();
+    }
+
+    public String getProviderName() {
+        return getProvider().getName();
+    }
+
+    @Override
+    protected void executeCommand() {
+        Provider<?> provider = getProvider();
+        ProviderProxy proxy = 
ProviderProxyFactory.getInstance().create(provider);
+        getParameters().getEncodedCertificate();
+        try (ByteArrayInputStream bis =
+                new ByteArrayInputStream(new 
Base64(0).decode(getParameters().getEncodedCertificate()))) {
+            certificate = 
CertificateFactory.getInstance("X.509").generateCertificate(bis);
+            saveCertificateToTrustStore(certificate);
+        } catch (CertificateException e) {
+            log.error("Error during import certificate occured. Error is {} ", 
e);
+            if (log.isDebugEnabled()) {
+                log.debug("", e);
+            }
+        } catch (IOException e1) {
+        }
+    }
+
+    @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        // Currently it requires what's required for adding a new Provider
+        // Need to revisit that when designing the permission scheme for 
providers
+        return Collections.singletonList(new PermissionSubject(Guid.SYSTEM,
+                VdcObjectType.System,
+                ActionGroup.CREATE_STORAGE_POOL));
+    }
+
+    private void saveCertificateToTrustStore(final Certificate cert) {
+        if (cert != null) {
+            try {
+                ExternalTrustStoreInitializer.addCertificate(cert);
+                setSucceeded(true);
+            } catch (Throwable e) {
+                handleException(e);
+            }
+        }
+    }
+
+    @Override
+    public AuditLogType getAuditLogTypeValue() {
+        return getSucceeded() ? 
AuditLogType.PROVIDER_CERTIFICATE_CHAIN_IMPORTED
+                : AuditLogType.PROVIDER_CERTIFICATE_CHAIN_IMPORT_FAILED;
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__IMPORT);
+        
addCanDoActionMessage(VdcBllMessages.VAR__TYPE__PROVIDER_CERTIFICATE_CHAIN);
+    }
+
+    private void handleException(Throwable e) {
+        throw new 
VdcBLLException(VdcBllErrors.PROVIDER_IMPORT_CERTIFICATE_CHAIN_ERROR, 
e.getMessage());
+    }
+
+    private static final Logger log = 
LoggerFactory.getLogger(ImportProviderCetificateCommand.class);
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImportProviderCertificateParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImportProviderCertificateParameters.java
new file mode 100644
index 0000000..14a01fd
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImportProviderCertificateParameters.java
@@ -0,0 +1,33 @@
+package org.ovirt.engine.core.common.action;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+import org.ovirt.engine.core.common.businessentities.Provider;
+
+public class ImportProviderCertificateParameters extends ProviderParameters {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = -5926150504207933496L;
+
+    @Valid
+    @NotNull
+    private String certificate;
+
+    private String encodedCertificate;
+
+    public ImportProviderCertificateParameters() {
+    }
+
+    public ImportProviderCertificateParameters(final Provider<?> provider, 
final String encodedCertificate) {
+        super(provider);
+        this.encodedCertificate = encodedCertificate;
+    }
+
+    public String getEncodedCertificate() {
+        return encodedCertificate;
+    }
+
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
index e99a0ee..4fd3d76 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
@@ -318,6 +318,7 @@
     AddNetworkOnProvider(1605, ActionGroup.CREATE_STORAGE_POOL_NETWORK, false, 
QuotaDependency.NONE),
     AddSubnetToProvider(1606, false, QuotaDependency.NONE),
     RemoveSubnetFromProvider(1607, false, QuotaDependency.NONE),
+    ImportProviderCertificate(1608, false, QuotaDependency.NONE),
 
     AddWatchdog(1700, ActionGroup.EDIT_VM_PROPERTIES, QuotaDependency.NONE),
     UpdateWatchdog(1701, ActionGroup.EDIT_VM_PROPERTIES, QuotaDependency.NONE),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
index 58e08fd..47b5941 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
@@ -50,6 +50,7 @@
     GetDiscoveredHostListFromExternalProvider(),
     GetProviderCertificateChainText,
     GetProviderCertificateChain,
+    GetProviderCertificate,
     GetHostsForStorageOperation,
     GetServerSSHPublicKey,
     GetServerSSHKeyFingerprint,
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
index ee962cd..2b106a9 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/dataprovider/AsyncDataProvider.java
@@ -3027,9 +3027,23 @@
                 return source;
             }
         };
-        
Frontend.getInstance().runQuery(VdcQueryType.GetProviderCertificateChainText, 
new ProviderQueryParameters(provider), aQuery);
+        
Frontend.getInstance().runQuery(VdcQueryType.GetProviderCertificateChain, new 
ProviderQueryParameters(provider), aQuery);
     }
 
+    public void getProviderCertificate(AsyncQuery aQuery, Provider provider) {
+        aQuery.converterCallback = new IAsyncConverter() {
+            @Override
+            public Object Convert(Object source, AsyncQuery _asyncQuery)
+            {
+                return source;
+            }
+        };
+        Frontend.getInstance().runQuery(VdcQueryType.GetProviderCertificate,
+                new ProviderQueryParameters(provider),
+                aQuery);
+    }
+
+
     private void getAllChildVlanInterfaces(Guid vdsID,
             List<VdsNetworkInterface> ifaces,
             IFrontendMultipleQueryAsyncCallback callback)
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderModel.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderModel.java
index ad8bd9d..1c33664 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderModel.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/providers/ProviderModel.java
@@ -5,6 +5,7 @@
 import java.util.Collections;
 import java.util.List;
 
+import org.ovirt.engine.core.common.action.ImportProviderCertificateParameters;
 import org.ovirt.engine.core.common.action.ProviderParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
@@ -67,6 +68,7 @@
     private EntityModel<String> testResult = new EntityModel<String>();
 
     private NeutronAgentModel neutronAgentModel = new NeutronAgentModel();
+    private String certificate;
 
     public EntityModel<String> getName() {
         return name;
@@ -336,7 +338,8 @@
                         public void onSuccess(Object model, Object result)
                         {
                             if (result != null) {
-                                ConfirmationModel confirmationModel = 
getImportChainConfirmationModel((String) result);
+                                certificate = (String)result;
+                                ConfirmationModel confirmationModel = 
getImportChainConfirmationModel(certificate);
                                 
sourceListModel.setConfirmWindow(confirmationModel);
                             } else {
                                 stopProgress();
@@ -344,7 +347,7 @@
                             }
                         }
                     };
-                    
AsyncDataProvider.getInstance().getProviderCertificateChain(getCertChainQuery, 
provider);
+                    
AsyncDataProvider.getInstance().getProviderCertificate(getCertChainQuery, 
provider);
                 } else {
                     stopProgress();
                     setTestResultValue(res);
@@ -378,8 +381,8 @@
     }
 
     private void importChain() {
-        
Frontend.getInstance().runAction(VdcActionType.ImportProviderCertificateChain,
-                new ProviderParameters(provider),
+        
Frontend.getInstance().runAction(VdcActionType.ImportProviderCertificate,
+                new ImportProviderCertificateParameters(provider, certificate),
                 new IFrontendActionAsyncCallback() {
 
             @Override


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic9adb21ded6e6d9fb09fc68331872c1cd88f88a9
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
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