SiteCatalystServlet.java 7.6 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.commons.TidyJSONWriter
 *  com.day.cq.i18n.I18n
 *  javax.servlet.ServletException
 *  javax.servlet.http.HttpServletRequest
 *  org.apache.commons.lang.StringUtils
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.sling.SlingServlet
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.servlets.SlingAllMethodsServlet
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.JSONObject
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.day.cq.analytics.provisioning.impl;

import com.day.cq.analytics.provisioning.impl.ProvisioningHelper;
import com.day.cq.analytics.sitecatalyst.SitecatalystException;
import com.day.cq.analytics.sitecatalyst.SitecatalystHttpClient;
import com.day.cq.analytics.sitecatalyst.impl.util.AnalyticsAPICallsUtils;
import com.day.cq.commons.TidyJSONWriter;
import com.day.cq.i18n.I18n;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingServlet(methods={"POST"}, resourceTypes={"cq/cloudservicesprovisioning/authenticate/sitecatalyst"}, extensions={"json"})
public class SiteCatalystServlet
extends SlingAllMethodsServlet {
    private static final String PARAM_SERVER = "server";
    private static final String PARAM_METHOD = "method";
    private static final String PARAM_AUTH_METHOD = "auth";
    private static final String AUTH_PASSWORD = "password";
    private static final String AUTH_SECRET = "secret";
    private static final String PARAM_DATA = "data";
    private static final String PARAM_COMPANY = "company";
    private static final String PARAM_USERNAME = "username";
    private static final String PARAM_PASSWORD_OR_SECRET = "passwordOrSecret";
    private static final String PARAM_PASSWORD = "password";
    private static final String PARAM_SECRET = "secret";
    private final Logger logger;
    @Reference
    private SitecatalystHttpClient scClient;

    public SiteCatalystServlet() {
        this.logger = LoggerFactory.getLogger(this.getClass());
    }

    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        TidyJSONWriter json = new TidyJSONWriter((Writer)response.getWriter());
        try {
            String error;
            String scResponse;
            boolean automaticProvisioning = Boolean.parseBoolean(request.getParameter("automaticProvisioning"));
            String server = StringUtils.trim((String)request.getParameter("server"));
            String method = request.getParameter("method");
            String data = request.getParameter("data");
            String company = StringUtils.trim((String)request.getParameter("company"));
            String username = request.getParameter("username");
            String passwordOrSecret = request.getParameter("passwordOrSecret");
            String authMethod = request.getParameter("auth");
            String password = request.getParameter("password");
            String secret = request.getParameter("secret");
            JSONObject dataJson = new JSONObject(data);
            String reportingSuite = null;
            if (automaticProvisioning) {
                Properties autoProvisioningProps = ProvisioningHelper.getAutomaticProvisioningData();
                if (autoProvisioningProps != null) {
                    server = StringUtils.trim((String)autoProvisioningProps.getProperty("analytics.server"));
                    company = StringUtils.trim((String)autoProvisioningProps.getProperty("analytics.company"));
                    reportingSuite = autoProvisioningProps.getProperty("analytics.reportsuite");
                    if (StringUtils.isBlank((String)reportingSuite)) {
                        throw new SitecatalystException("Reporting suite is undefined.");
                    }
                    username = autoProvisioningProps.getProperty("analytics.username");
                    password = autoProvisioningProps.getProperty("analytics.password");
                    if (StringUtils.isBlank((String)secret)) {
                        secret = autoProvisioningProps.getProperty("analytics.secret");
                    }
                    authMethod = !StringUtils.isBlank((String)secret) ? "secret" : "password";
                }
            } else if (this.isPasswordAuth(passwordOrSecret)) {
                authMethod = "password";
                password = passwordOrSecret;
            } else {
                authMethod = "secret";
                secret = passwordOrSecret;
            }
            dataJson.put("company", (Object)company);
            if (!StringUtils.isBlank((String)password)) {
                dataJson.put("login", (Object)username);
                dataJson.put("password", (Object)password);
            }
            if ((error = AnalyticsAPICallsUtils.getErrorMessageFromResponse(scResponse = this.scClient.execute(server, method, dataJson.toString(), company, username, secret))) != null) {
                throw new SitecatalystException(error);
            }
            if (automaticProvisioning && "Company.GetReportSuites".equals(method) && !scResponse.contains(reportingSuite)) {
                throw new SitecatalystException("The provided reporting suite doesn't exist.");
            }
            if ("Company.GetEndpoint".equals(method)) {
                server = scResponse.replaceAll("[\\\\\"]", "");
            }
            json.object();
            json.key("success").value((Object)"true");
            json.key("authMethod").value((Object)authMethod);
            json.key("response").value((Object)scResponse);
            json.endObject();
        }
        catch (Exception e) {
            this.logger.error("Unexpected error while querying SiteCatalyst.", (Throwable)e);
            try {
                String message = e.getMessage();
                if (message == null) {
                    message = I18n.get((HttpServletRequest)request, (String)"Unexpected error while querying SiteCatalyst");
                }
                json.object();
                json.key("success").value((Object)"false");
                json.key("error").value((Object)I18n.get((HttpServletRequest)request, (String)message));
                json.endObject();
            }
            catch (JSONException je) {
                throw new ServletException((Throwable)e);
            }
        }
    }

    private boolean isPasswordAuth(String passwordOrSecret) throws JSONException, SitecatalystException {
        return !passwordOrSecret.matches("[a-fA-F0-9]{32}");
    }

    protected void bindScClient(SitecatalystHttpClient sitecatalystHttpClient) {
        this.scClient = sitecatalystHttpClient;
    }

    protected void unbindScClient(SitecatalystHttpClient sitecatalystHttpClient) {
        if (this.scClient == sitecatalystHttpClient) {
            this.scClient = null;
        }
    }
}