DTMUpdateEmbedServlet.java 9.46 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.crypto.CryptoSupport
 *  com.day.cq.i18n.I18n
 *  javax.servlet.ServletException
 *  javax.servlet.http.HttpServletRequest
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.sling.SlingServlet
 *  org.apache.http.HttpEntity
 *  org.apache.http.StatusLine
 *  org.apache.http.client.methods.CloseableHttpResponse
 *  org.apache.http.client.methods.HttpPut
 *  org.apache.http.client.methods.HttpUriRequest
 *  org.apache.http.entity.ContentType
 *  org.apache.http.entity.StringEntity
 *  org.apache.http.impl.client.CloseableHttpClient
 *  org.apache.http.impl.client.HttpClientBuilder
 *  org.apache.http.osgi.services.HttpClientBuilderFactory
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.resource.Resource
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.servlets.SlingAllMethodsServlet
 *  org.apache.sling.commons.json.JSONArray
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.JSONObject
 */
package com.adobe.cq.dtm.impl.servlets;

import com.adobe.cq.dtm.impl.constants.DTMServerType;
import com.adobe.cq.dtm.impl.util.DTMConfigurationUtil;
import com.adobe.granite.crypto.CryptoSupport;
import com.day.cq.i18n.I18n;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.http.HttpEntity;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.osgi.services.HttpClientBuilderFactory;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;

@SlingServlet(methods={"POST"}, resourceTypes={"cq/dtm/components/dynamictagmanagementpage"}, selectors={"update_embed"}, extensions={"json"})
public class DTMUpdateEmbedServlet
extends SlingAllMethodsServlet {
    @Reference
    private CryptoSupport cryptoSupport;
    @Reference
    private HttpClientBuilderFactory clientBuilderFactory = null;

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     */
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        block15 : {
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            JSONObject jsonResponse = new JSONObject();
            I18n i18n = new I18n((HttpServletRequest)request);
            try {
                ResourceResolver resourceResolver = request.getResourceResolver();
                String dtmApiUrl = DTMConfigurationUtil.getDTMApiUrl(resourceResolver);
                if (dtmApiUrl != null) {
                    String token = DTMConfigurationUtil.getValueIfEncrypted(this.cryptoSupport, request.getParameter("token"));
                    String company = request.getParameter("company");
                    String property = request.getParameter("property");
                    if (token != null && company != null && property != null) {
                        dtmApiUrl = dtmApiUrl + "/companies/" + company + "/" + "web_properties" + "/" + property + "/embeds";
                        JSONObject jsonRequestContent = this.createJsonRequestContent(request, company, property);
                        if (jsonRequestContent != null) {
                            CloseableHttpClient client = this.clientBuilderFactory.newBuilder().build();
                            try {
                                HttpPut apiRequest = new HttpPut(dtmApiUrl);
                                apiRequest.addHeader("Authorization", "Token token=\"" + token + "\"");
                                apiRequest.setEntity((HttpEntity)new StringEntity(jsonRequestContent.toString(), ContentType.create((String)"application/json", (String)"utf-8")));
                                CloseableHttpResponse apiResponse = client.execute((HttpUriRequest)apiRequest);
                                if (apiResponse != null && apiResponse.getStatusLine().getStatusCode() == 200) {
                                    jsonResponse.put("success", (Object)"Configuration saved successfully on the DTM server.");
                                    break block15;
                                }
                                DTMConfigurationUtil.setErrorResponse(response, jsonResponse, 500, i18n, "Could not save configuration on the DTM server.", null);
                            }
                            catch (IOException e) {
                                DTMConfigurationUtil.setErrorResponse(response, jsonResponse, 500, i18n, "Failed to obtain a response from the DTM API Server.", e);
                            }
                            finally {
                                if (client != null) {
                                    client.close();
                                }
                            }
                        }
                        DTMConfigurationUtil.setErrorResponse(response, jsonResponse, 500, i18n, "Could not build request for DTM API server.", null);
                        break block15;
                    }
                    DTMConfigurationUtil.setErrorResponse(response, jsonResponse, 400, i18n, "Incorrect request parameters.", null);
                    break block15;
                }
                DTMConfigurationUtil.setErrorResponse(response, jsonResponse, 500, i18n, "DTM API server URL not set.", null);
            }
            catch (JSONException e) {
                throw new ServletException("Error creating JSON response.", (Throwable)e);
            }
            finally {
                response.getWriter().write(jsonResponse.toString());
            }
        }
    }

    private JSONObject createJsonRequestContent(SlingHttpServletRequest request, String company, String property) throws JSONException {
        Resource dtmConfig = request.getResource();
        ResourceResolver resourceResolver = request.getResourceResolver();
        String configName = dtmConfig.getParent().getName();
        String dtmLibPath = "/etc/clientlibs/dtm/" + configName + "/" + company + "/" + property;
        JSONObject jsonRequestContent = new JSONObject();
        JSONObject embed = new JSONObject();
        embed.put("type", (Object)"secure_bundle");
        for (DTMServerType serverType : DTMServerType.values()) {
            String deployHook = "";
            String httpPath = "path not set";
            String httpsPath = "";
            String domainHint = request.getParameter((Object)((Object)serverType) + "DomainHint");
            if (domainHint != null) {
                String isPollingEnabled = request.getParameter((Object)((Object)serverType) + "PollingEnabler");
                if (isPollingEnabled != null && !Boolean.parseBoolean(isPollingEnabled)) {
                    deployHook = DTMConfigurationUtil.getExternalizedURL(resourceResolver, domainHint, "/etc/dtm-hook/" + configName + "/" + (Object)((Object)serverType) + "." + "bundle-download");
                }
                httpPath = this.getUrlWithoutProtocol(DTMConfigurationUtil.getExternalizedURL(resourceResolver, domainHint, dtmLibPath));
                String secureDomainHint = request.getParameter((Object)((Object)serverType) + "SecureDomainHint");
                httpsPath = this.getUrlWithoutProtocol(DTMConfigurationUtil.getExternalizedURL(resourceResolver, secureDomainHint, dtmLibPath));
            }
            JSONArray deployHooks = new JSONArray();
            deployHooks.put((Object)deployHook);
            embed.put((Object)((Object)serverType) + "_deploy_hooks", (Object)deployHooks);
            embed.put((Object)((Object)serverType) + "_http_path", (Object)httpPath);
            embed.put((Object)((Object)serverType) + "_https_path", (Object)httpsPath);
        }
        jsonRequestContent.put("embed", (Object)embed);
        return jsonRequestContent;
    }

    private String getUrlWithoutProtocol(String url) {
        return url.replaceFirst("^https?://", "");
    }

    protected void bindCryptoSupport(CryptoSupport cryptoSupport) {
        this.cryptoSupport = cryptoSupport;
    }

    protected void unbindCryptoSupport(CryptoSupport cryptoSupport) {
        if (this.cryptoSupport == cryptoSupport) {
            this.cryptoSupport = null;
        }
    }

    protected void bindClientBuilderFactory(HttpClientBuilderFactory httpClientBuilderFactory) {
        this.clientBuilderFactory = httpClientBuilderFactory;
    }

    protected void unbindClientBuilderFactory(HttpClientBuilderFactory httpClientBuilderFactory) {
        if (this.clientBuilderFactory == httpClientBuilderFactory) {
            this.clientBuilderFactory = null;
        }
    }
}