Fixing XML parsers security bug
[so.git] / adapters / mso-openstack-adapters / src / main / java / org / onap / so / adapters / tasks / orchestration / RollbackService.java
1 package org.onap.so.adapters.tasks.orchestration;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.StringReader;
5 import java.nio.charset.StandardCharsets;
6 import java.util.HashMap;
7 import java.util.Map;
8 import java.util.Optional;
9 import javax.xml.XMLConstants;
10 import javax.xml.bind.JAXB;
11 import javax.xml.parsers.DocumentBuilder;
12 import javax.xml.parsers.DocumentBuilderFactory;
13 import javax.xml.ws.Holder;
14 import org.apache.commons.lang3.StringUtils;
15 import org.camunda.bpm.client.task.ExternalTask;
16 import org.camunda.bpm.client.task.ExternalTaskService;
17 import org.onap.so.adapters.network.MsoNetworkAdapterImpl;
18 import org.onap.so.adapters.nwrest.CreateNetworkRequest;
19 import org.onap.so.adapters.vnf.MsoVnfAdapterImpl;
20 import org.onap.so.adapters.vnf.MsoVnfPluginAdapterImpl;
21 import org.onap.so.adapters.vnf.VnfAdapterUtils;
22 import org.onap.so.adapters.vnfrest.CreateVfModuleRequest;
23 import org.onap.so.adapters.vnfrest.CreateVolumeGroupRequest;
24 import org.onap.so.logging.tasks.AuditMDCSetup;
25 import org.onap.so.utils.ExternalTaskUtils;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28 import org.springframework.beans.factory.annotation.Autowired;
29 import org.springframework.stereotype.Component;
30 import org.w3c.dom.Document;
31
32 @Component
33 public class RollbackService extends ExternalTaskUtils {
34
35     private static final Logger logger = LoggerFactory.getLogger(RollbackService.class);
36
37     @Autowired
38     private MsoVnfAdapterImpl vnfAdapterImpl;
39
40     @Autowired
41     private MsoNetworkAdapterImpl networkAdapterImpl;
42
43     @Autowired
44     private VnfAdapterUtils vnfAdapterUtils;
45
46     @Autowired
47     private MsoVnfPluginAdapterImpl vnfPluginImpl;
48
49     @Autowired
50     private AuditMDCSetup mdcSetup;
51
52     public void executeExternalTask(ExternalTask externalTask, ExternalTaskService externalTaskService) {
53         mdcSetup.setupMDC(externalTask);
54         logger.debug("Starting External Task Rollback Service");
55         Map<String, Object> variables = new HashMap<>();
56         boolean success = false;
57         boolean pollRollbackStatus = false;
58         try {
59             String xmlRequest = externalTask.getVariable("openstackAdapterTaskRequest");
60             if (xmlRequest != null) {
61                 Optional<String> requestType = findRequestType(xmlRequest);
62                 if ("createVolumeGroupRequest".equals(requestType.get())) {
63                     logger.debug("Executing External Task Rollback Service for Create Volume Group");
64                     CreateVolumeGroupRequest req =
65                             JAXB.unmarshal(new StringReader(xmlRequest), CreateVolumeGroupRequest.class);
66                     boolean isMulticloud = vnfAdapterUtils.isMulticloudMode(null, req.getCloudSiteId());
67                     if (!isMulticloud) {
68                         vnfAdapterImpl.deleteVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
69                                 req.getVolumeGroupName(), null, req.getMsoRequest(), new Holder<>());
70                         pollRollbackStatus = true;
71                         success = true;
72                     } else {
73                         vnfPluginImpl.deleteVnf(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
74                                 req.getVolumeGroupName(), req.getMsoRequest());
75                         pollRollbackStatus = false;
76                         success = true;
77                     }
78                 } else if ("createVfModuleRequest".equals(requestType.get())) {
79                     logger.debug("Executing External Task Rollback Service for Create Vf Module");
80                     CreateVfModuleRequest req =
81                             JAXB.unmarshal(new StringReader(xmlRequest), CreateVfModuleRequest.class);
82                     boolean isMulticloud = vnfAdapterUtils.isMulticloudMode(null, req.getCloudSiteId());
83                     if (!isMulticloud) {
84                         vnfAdapterImpl.deleteVfModule(req.getCloudSiteId(), req.getCloudOwner(), req.getTenantId(),
85                                 req.getVfModuleName(), req.getModelCustomizationUuid(), req.getMsoRequest(),
86                                 new Holder<>());
87                         pollRollbackStatus = true;
88                         success = true;
89                     } else {
90                         pollRollbackStatus = false;
91                         success = true;
92                     }
93                 } else if ("createNetworkRequest".equals(requestType.get())) {
94                     logger.debug("Executing External Task Rollback Service for Create Network");
95                     CreateNetworkRequest req = JAXB.unmarshal(new StringReader(xmlRequest), CreateNetworkRequest.class);
96                     networkAdapterImpl.deleteNetwork(req.getCloudSiteId(), req.getTenantId(), req.getNetworkType(),
97                             req.getModelCustomizationUuid(), req.getNetworkName(), req.getMsoRequest());
98                     pollRollbackStatus = true;
99                     success = true;
100                 }
101             }
102         } catch (Exception e) {
103             logger.error("Error during External Task Rollback Service", e);
104         }
105         variables.put("OpenstackRollbackSuccess", success);
106         variables.put("rollbackPerformed", true);
107         variables.put("PollRollbackStatus", pollRollbackStatus);
108         if (success) {
109             externalTaskService.complete(externalTask, variables);
110             logger.debug("The External Task Id: {}  Successful", externalTask.getId());
111         } else {
112             logger.debug("The External Task Id: {}  Failed. Not Retrying", externalTask.getId());
113             externalTaskService.complete(externalTask, variables);
114         }
115     }
116
117     protected Optional<String> findRequestType(final String xmlString) {
118         try {
119             final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
120             factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, StringUtils.EMPTY);
121             factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, StringUtils.EMPTY);
122
123             final DocumentBuilder builder = factory.newDocumentBuilder();
124             final Document doc = builder.parse(new ByteArrayInputStream(xmlString.getBytes(StandardCharsets.UTF_8)));
125             return Optional.of(doc.getDocumentElement().getNodeName());
126         } catch (final Exception e) {
127             logger.error("Error Finding Request Type", e);
128             return Optional.empty();
129         }
130     }
131
132 }