CRXCredentialsProvider.java 5.67 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.jcr.Credentials
 *  javax.jcr.LoginException
 *  javax.jcr.SimpleCredentials
 *  javax.servlet.ServletException
 *  javax.servlet.http.HttpServletRequest
 *  org.apache.jackrabbit.api.security.authentication.token.TokenCredentials
 */
package com.day.crx.explorer.impl.j2ee;

import com.day.crx.explorer.impl.j2ee.BasicCredentialsProvider;
import com.day.crx.explorer.impl.j2ee.LoginServlet;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import javax.jcr.Credentials;
import javax.jcr.LoginException;
import javax.jcr.SimpleCredentials;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.apache.jackrabbit.api.security.authentication.token.TokenCredentials;

public class CRXCredentialsProvider
extends BasicCredentialsProvider {
    private static final Set<String> SPECIAL_PARAMS = new HashSet<String>(6);
    private static final String ATTR_TOKEN = ".token";
    private static final String ATTR_TOKEN_IP = ".token.ip";
    private static final String ATTR_TOKEN_AGENT = ".token.useragent";
    private static final String ATTR_REFERER = "referer";

    public CRXCredentialsProvider() {
        this(null);
    }

    public CRXCredentialsProvider(String defaultHeaderValue) {
        super(defaultHeaderValue);
    }

    public Credentials getCredentials(HttpServletRequest request) throws LoginException, ServletException {
        Credentials creds = CRXCredentialsProvider.getCredentialsFromParam(request);
        if (creds == null && (creds = CRXCredentialsProvider.getCredentialsFromToken(request)) == null) {
            creds = super.getCredentials(request);
        }
        CRXCredentialsProvider.setCredentialsAttributes(creds, request);
        return creds;
    }

    private static Credentials getCredentialsFromToken(HttpServletRequest request) {
        String token = LoginServlet.getLoginTokenFromCookies(request);
        if (token == null) {
            return null;
        }
        return new TokenCredentials(token);
    }

    private static Credentials getCredentialsFromParam(HttpServletRequest request) {
        TokenCredentials creds;
        String userid = request.getParameter("UserId");
        String passwd = request.getParameter("Password");
        if (passwd == null) {
            passwd = "";
        }
        String token = request.getParameter(".token");
        if (userid != null && userid.length() > 0) {
            creds = new SimpleCredentials(userid, passwd.toCharArray());
            if (token != null) {
                ((SimpleCredentials)creds).setAttribute(".token", (Object)token);
            }
        } else {
            creds = token != null ? new TokenCredentials(token) : null;
        }
        return creds;
    }

    /*
     * Enabled force condition propagation
     * Lifted jumps to return sites
     */
    private static void setCredentialsAttributes(Credentials creds, HttpServletRequest request) {
        if (creds instanceof SimpleCredentials) {
            String referrer;
            String ip;
            SimpleCredentials sCreds = (SimpleCredentials)creds;
            if (sCreds.getAttribute(".token") == null) return;
            String xff = request.getHeader("X-Forwarded-For");
            if (xff == null) {
                ip = request.getRemoteAddr();
            } else {
                String[] ips = xff.split(",");
                ip = ips[ips.length - 1].trim();
            }
            sCreds.setAttribute(".token.ip", (Object)ip);
            String userAgent = request.getHeader("User-Agent");
            if (userAgent != null) {
                sCreds.setAttribute(".token.useragent", (Object)userAgent);
            }
            if ((referrer = request.getHeader("Referer")) != null) {
                sCreds.setAttribute("referer", (Object)referrer);
            }
            Enumeration names = request.getParameterNames();
            while (names.hasMoreElements()) {
                String name = names.nextElement().toString();
                String param = request.getParameter(name);
                if (param == null || SPECIAL_PARAMS.contains(name)) continue;
                sCreds.setAttribute(name, (Object)param);
            }
            return;
        } else {
            String referrer;
            String ip;
            if (!(creds instanceof TokenCredentials)) return;
            TokenCredentials tc = (TokenCredentials)creds;
            String xff = request.getHeader("X-Forwarded-For");
            if (xff == null) {
                ip = request.getRemoteAddr();
            } else {
                String[] ips = xff.split(",");
                ip = ips[ips.length - 1].trim();
            }
            tc.setAttribute(".token.ip", ip);
            String userAgent = request.getHeader("User-Agent");
            if (userAgent != null) {
                tc.setAttribute(".token.useragent", userAgent);
            }
            if ((referrer = request.getHeader("Referer")) != null) {
                tc.setAttribute("referer", referrer);
            }
            Enumeration names = request.getParameterNames();
            while (names.hasMoreElements()) {
                String name = names.nextElement().toString();
                String param = request.getParameter(name);
                if (param == null || SPECIAL_PARAMS.contains(name)) continue;
                tc.setAttribute(name, param);
            }
        }
    }

    static {
        SPECIAL_PARAMS.add("UserId");
        SPECIAL_PARAMS.add("Password");
        SPECIAL_PARAMS.add("Workspace");
        SPECIAL_PARAMS.add(".token");
        SPECIAL_PARAMS.add("redirect");
        SPECIAL_PARAMS.add("_charset_");
    }
}