RequestHelper.java 7.64 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.crx.security.token.TokenCookie
 *  javax.servlet.http.HttpServletRequest
 *  javax.servlet.http.HttpServletResponse
 *  org.apache.sling.jcr.api.SlingRepository
 *  org.apache.sling.settings.SlingSettingsService
 *  org.scribe.utils.OAuthEncoder
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.granite.auth.oauth.impl.helper;

import com.adobe.granite.auth.oauth.impl.helper.OAuthHelper;
import com.day.crx.security.token.TokenCookie;
import java.io.IOException;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.settings.SlingSettingsService;
import org.scribe.utils.OAuthEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public final class RequestHelper {
    public static final String PARAM_CONFIG_ID = "configid";
    private static final String REPO_DESC_ID = "crx.repository.systemid";
    private static final String REPO_DESC_CLUSTER_ID = "crx.cluster.id";
    private static final String COOKIE_CONFIG_ID = "oauth-configid";
    private static final String COOKIE_AUTH_CONFIG_ID = "oauth-authid";
    public static final String ATTRIBUTE_REDIRECT = "oauth-redirect";
    private static final Logger log = LoggerFactory.getLogger(RequestHelper.class);

    private RequestHelper() {
    }

    public static String getRepositoryId(SlingRepository repository, SlingSettingsService settings) {
        String id = repository.getDescriptor("crx.cluster.id");
        if (id == null && (id = repository.getDescriptor("crx.repository.systemid")) == null && (id = settings.getSlingId()) == null) {
            id = UUID.randomUUID().toString();
            log.error("RequestHelper: Failure to acquire unique ID for this token authenticator. Using random UUID {}", (Object)id);
        }
        return id;
    }

    public static String getConfigId(HttpServletRequest request) {
        return TokenCookie.getCookie((HttpServletRequest)request, (String)"oauth-configid");
    }

    public static String getAuthenticatedConfigId(HttpServletRequest request) {
        return TokenCookie.getCookie((HttpServletRequest)request, (String)"oauth-authid");
    }

    public static void storeConfigId(String configId, int maxAge, HttpServletRequest request, HttpServletResponse response) {
        TokenCookie.setCookie((HttpServletResponse)response, (String)"oauth-configid", (String)configId, (int)maxAge, (String)"/", (String)null, (boolean)true, (boolean)request.isSecure());
    }

    public static void storeAuthenticatedConfigId(String configId, int maxAge, HttpServletRequest request, HttpServletResponse response) {
        TokenCookie.setCookie((HttpServletResponse)response, (String)"oauth-authid", (String)configId, (int)maxAge, (String)"/", (String)null, (boolean)true, (boolean)request.isSecure());
    }

    public static void removeConfigId(HttpServletRequest request, HttpServletResponse response) {
        RequestHelper.storeConfigId("", 0, request, response);
    }

    public static void removeAuthenticatedConfigId(HttpServletRequest request, HttpServletResponse response) {
        RequestHelper.storeAuthenticatedConfigId("", 0, request, response);
    }

    public static void handleRedirectAfterAuthentication(HttpServletRequest request, HttpServletResponse response) {
        String resource = (String)request.getAttribute("oauth-redirect");
        if (resource != null && !RequestHelper.isRedirectValid(resource)) {
            log.error("Redirect target '{}' is invalid; checking request URI", (Object)resource);
            resource = null;
        }
        if (resource == null && (resource = request.getParameter("state")) != null && !RequestHelper.isRedirectValid(resource = OAuthEncoder.decode((String)resource))) {
            log.error("Redirect target '{}' is invalid; checking request URI", (Object)resource);
            resource = null;
        }
        if (resource == null) {
            resource = OAuthHelper.getOriginalRequestUri(request.getRequestURI());
            if (resource.length() == 0) {
                resource = "/";
            } else if (!RequestHelper.isRedirectValid(resource)) {
                log.error("Request URI '{}' is invalid, redirecting to '/'", (Object)resource);
                resource = "/";
            }
        }
        try {
            log.debug("Redirecting to '{}' after successful authentication", (Object)resource);
            response.sendRedirect(resource);
        }
        catch (IOException ioe) {
            log.error("Failed to send redirect to: " + resource, (Throwable)ioe);
        }
    }

    public static boolean isInitialCall(HttpServletRequest request, boolean isAuthentication) {
        return (RequestHelper.isInitialLogin(request) || !isAuthentication && RequestHelper.isInitialConnect(request)) && request.getParameter("configid") != null;
    }

    public static boolean isAuthzCode(HttpServletRequest request, boolean isAuthentication) {
        return RequestHelper.hasAuthzCode(request) && (RequestHelper.isAuthzLogin(request) || !isAuthentication && RequestHelper.isAuthzConnect(request));
    }

    private static boolean isInitialLogin(HttpServletRequest request) {
        return request.getRequestURI().endsWith("/j_security_check");
    }

    private static boolean isInitialConnect(HttpServletRequest request) {
        return request.getRequestURI().endsWith("/connect");
    }

    private static boolean isAuthzLogin(HttpServletRequest request) {
        return request.getRequestURI().endsWith("/callback/j_security_check");
    }

    private static boolean isAuthzConnect(HttpServletRequest request) {
        return request.getRequestURI().endsWith("/callback/connect");
    }

    public static boolean hasAuthzCode(HttpServletRequest request) {
        return "GET".equals(request.getMethod()) && (request.getParameter("code") != null || request.getParameter("oauth_verifier") != null);
    }

    public static boolean isRedirectValid(String target) {
        if (target == null || target.length() == 0) {
            log.warn("isRedirectValid: Redirect target must not be empty or null");
            return false;
        }
        if (target.contains("://")) {
            log.warn("isRedirectValid: Redirect target '{}' must not be an URL", (Object)target);
            return false;
        }
        if (!target.startsWith("/")) {
            log.warn("isRedirectValid: Redirect target '{}' must be an absolute path", (Object)target);
            return false;
        }
        if (target.contains("//") || target.contains("/../") || target.contains("/./") || target.endsWith("/.") || target.endsWith("/..")) {
            log.warn("isRedirectValid: Redirect target '{}' is not normalized", (Object)target);
            return false;
        }
        return true;
    }

    public static String getURLWithoutAuthCode(HttpServletRequest request) {
        StringBuilder url = new StringBuilder(request.getRequestURI());
        String query = request.getQueryString();
        if (query != null) {
            url.append("?");
            int start = query.indexOf("code=");
            if (start >= 0) {
                int end = start + "code=".length();
                if (start >= 1 && query.charAt(start - 1) == '&') {
                    --start;
                }
                url.append(query, 0, start);
                int nextParam = query.indexOf(38, end);
                if (nextParam >= 0) {
                    url.append(query.substring(nextParam));
                }
            } else {
                url.append(query);
            }
        }
        return url.toString();
    }
}