HttpClientProvider.java 10.9 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.day.cq.replication.AgentConfig
 *  com.day.cq.replication.ReplicationException
 *  com.day.cq.replication.ReplicationLog
 *  com.scene7.is.util.callbacks.Option
 *  com.scene7.is.util.error.Unchecked
 *  org.apache.commons.httpclient.Credentials
 *  org.apache.commons.httpclient.Header
 *  org.apache.commons.httpclient.HostConfiguration
 *  org.apache.commons.httpclient.HttpClient
 *  org.apache.commons.httpclient.HttpConnectionManager
 *  org.apache.commons.httpclient.HttpState
 *  org.apache.commons.httpclient.HttpVersion
 *  org.apache.commons.httpclient.NTCredentials
 *  org.apache.commons.httpclient.UsernamePasswordCredentials
 *  org.apache.commons.httpclient.auth.AuthScope
 *  org.apache.commons.httpclient.params.HttpClientParams
 *  org.apache.commons.httpclient.params.HttpConnectionManagerParams
 *  org.apache.commons.httpclient.protocol.Protocol
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.ValueMap
 *  org.jetbrains.annotations.NotNull
 */
package com.adobe.cq.dam.aod.replication.transport_config;

import com.adobe.cq.dam.aod.replication.Util;
import com.adobe.cq.dam.aod.replication.transport_config.DefaultHeaderHttpClient;
import com.adobe.cq.dam.aod.replication.transport_config.OAuthTokenProvider;
import com.adobe.cq.dam.aod.replication.transport_config.SslProtocolProvider;
import com.day.cq.replication.AgentConfig;
import com.day.cq.replication.ReplicationException;
import com.day.cq.replication.ReplicationLog;
import com.scene7.is.util.callbacks.Option;
import com.scene7.is.util.error.Unchecked;
import java.net.InetAddress;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.Iterator;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.HttpVersion;
import org.apache.commons.httpclient.NTCredentials;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.params.HttpClientParams;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ValueMap;
import org.jetbrains.annotations.NotNull;

@Service(value={HttpClientProvider.class})
@Component
public final class HttpClientProvider {
    @Reference
    @NotNull
    private final OAuthTokenProvider oAuthTokenProvider;
    @Reference
    @NotNull
    private final SslProtocolProvider sslProtocolProvider;
    private static final String BEARER_AUTHENTICATION_FORMAT = "Bearer %s";
    private static final String AUTHORIZATION_HEADER = "Authorization";

    public static HttpClientProvider httpClientProvider(OAuthTokenProvider oAuthTokenProvider, SslProtocolProvider sslProtocolProvider) {
        return new HttpClientProvider(oAuthTokenProvider, sslProtocolProvider);
    }

    public HttpClient getHttpClient(AgentConfig config, ReplicationLog log) {
        DefaultHeaderHttpClient client = new DefaultHeaderHttpClient();
        HttpClientProvider.initDefaultUserPass(config, client, log);
        HttpClientProvider.initProtocolVersion(config, client, log);
        HttpClientProvider.initNetInterface(config, client, log);
        HttpClientProvider.initProxyHost(config, client, log);
        this.initDefaultHostConfig(config, client, log);
        return client;
    }

    public HttpClientProvider() {
        this.oAuthTokenProvider = (OAuthTokenProvider)Util.initRef();
        this.sslProtocolProvider = (SslProtocolProvider)Util.initRef();
    }

    private HttpClientProvider(OAuthTokenProvider oAuthTokenProvider, SslProtocolProvider sslProtocolProvider) {
        this.oAuthTokenProvider = oAuthTokenProvider;
        this.sslProtocolProvider = sslProtocolProvider;
    }

    private static void initDefaultUserPass(AgentConfig config, HttpClient client, ReplicationLog log) {
        String user = config.getTransportUser();
        if (user != null && !user.isEmpty()) {
            String pass = config.getTransportPassword();
            if (pass == null) {
                pass = "";
            }
            log.info("* Auth User: %s", new Object[]{user});
            client.getParams().setAuthenticationPreemptive(true);
            client.getState().setCredentials(AuthScope.ANY, (Credentials)new UsernamePasswordCredentials(user, pass));
        }
    }

    private static void initProtocolVersion(AgentConfig config, HttpClient client, ReplicationLog log) {
        ValueMap conf = config.getProperties();
        String version = (String)conf.get("protocolVersion", (Object)"1.1");
        if ("0.9".equals(version)) {
            log.info("* HTTP Version: 0.9");
            client.getParams().setVersion(HttpVersion.HTTP_0_9);
        } else if ("1.0".equals(version)) {
            log.info("* HTTP Version: 1.0");
            client.getParams().setVersion(HttpVersion.HTTP_1_0);
        } else {
            log.info("* HTTP Version: 1.1");
            client.getParams().setVersion(HttpVersion.HTTP_1_1);
        }
    }

    private static void initNetInterface(AgentConfig config, HttpClient client, ReplicationLog log) {
        String localAddress;
        ValueMap conf = config.getProperties();
        int timeout = (Integer)conf.get("protocolConnectTimeout", (Object)0);
        if (timeout > 0) {
            log.info("* Connect Timeout: %d", new Object[]{timeout});
            client.getHttpConnectionManager().getParams().setConnectionTimeout(timeout);
        }
        if ((timeout = ((Integer)conf.get("protocolSocketTimeout", (Object)0)).intValue()) > 0) {
            log.info("* Socket Timeout: %d", new Object[]{timeout});
            client.getParams().setSoTimeout(timeout);
        }
        if (!(localAddress = (String)conf.get("protocolInterface", (Object)"")).isEmpty()) {
            try {
                client.getHostConfiguration().setLocalAddress(InetAddress.getByName(localAddress));
            }
            catch (UnknownHostException e) {
                log.info("Cannot set local address to %s: %s", new Object[]{localAddress, e.toString()});
            }
        }
    }

    private static void initProxyHost(AgentConfig config, HttpClient client, ReplicationLog log) {
        ValueMap conf = config.getProperties();
        String proxyHost = (String)conf.get("proxyHost", (Object)"");
        int proxyPort = (Integer)conf.get("proxyPort", (Object)0);
        if (proxyHost.isEmpty() || proxyPort == 0) {
            return;
        }
        log.info("* Proxy Host: %s", new Object[]{proxyHost});
        log.info("* Proxy Port: %d", new Object[]{proxyPort});
        client.getHostConfiguration().setProxy(proxyHost, proxyPort);
        String proxyUser = (String)conf.get("proxyUser", (Object)"");
        String proxyPass = (String)conf.get("proxyPassword", (Object)"");
        String ntlmHost = (String)conf.get("proxyNTLMHost", (Object)"");
        String ntlmDomain = (String)conf.get("proxyNTLMDomain", (Object)"");
        if (!proxyUser.isEmpty()) {
            UsernamePasswordCredentials creds;
            log.info("* Proxy User: %s", new Object[]{proxyUser});
            if (ntlmHost.isEmpty()) {
                creds = new UsernamePasswordCredentials(proxyUser, proxyPass);
            } else {
                log.info("* Proxy NTLM Host: %s", new Object[]{ntlmHost});
                log.info("* Proxy NTLM Domain: %s", new Object[]{ntlmDomain});
                creds = new NTCredentials(proxyUser, proxyPass, ntlmHost, ntlmDomain);
            }
            client.getState().setProxyCredentials(AuthScope.ANY, (Credentials)creds);
        }
    }

    private void initDefaultHostConfig(AgentConfig config, DefaultHeaderHttpClient client, ReplicationLog log) {
        try {
            URL uri = Util.serverUrl(config.getTransportURI());
            if ("https".equals(uri.getProtocol())) {
                this.initOAuth(config, client, log);
                this.initSsl(config, client, log);
            } else {
                if (config.isOAuthEnabled()) {
                    log.warn("OAuth 2.0 Authorization Grants requires SSL");
                }
                client.getHostConfiguration().setHost(uri.getHost(), uri.getPort());
            }
        }
        catch (ReplicationException | URISyntaxException e) {
            throw Unchecked.unchecked((Throwable)e);
        }
    }

    private void initSsl(AgentConfig config, DefaultHeaderHttpClient client, ReplicationLog log) throws URISyntaxException {
        try {
            Protocol protocol = this.sslProtocolProvider.getProtocol(config, log);
            URL uri = Util.serverUrl(config.getTransportURI());
            client.getHostConfiguration().setHost(uri.getHost(), uri.getPort(), protocol);
        }
        catch (ReplicationException e) {
            throw Unchecked.unchecked((Throwable)e);
        }
    }

    private void initOAuth(AgentConfig config, DefaultHeaderHttpClient client, ReplicationLog log) {
        if (config.isOAuthEnabled()) {
            log.info("* Using OAuth 2.0 Authorization Grants");
            ValueMap conf = config.getProperties();
            String agentUserID = (String)conf.get("userId", (Object)"");
            log.info("* OAuth 2.0 User: %s", new Object[]{agentUserID});
            Iterator i$ = this.oAuthTokenProvider.getToken(config).iterator();
            if (i$.hasNext()) {
                String accessToken = (String)i$.next();
                log.info("* OAuth 2.0 Token: '*****' initialized");
                String authorization = String.format("Bearer %s", accessToken);
                client.setDefaultHeader(new Header("Authorization", authorization));
                return;
            }
            log.warn("No OAuth token available. OAuth not initialized");
        }
    }

    protected void bindOAuthTokenProvider(OAuthTokenProvider oAuthTokenProvider) {
        this.oAuthTokenProvider = oAuthTokenProvider;
    }

    protected void unbindOAuthTokenProvider(OAuthTokenProvider oAuthTokenProvider) {
        if (this.oAuthTokenProvider == oAuthTokenProvider) {
            this.oAuthTokenProvider = null;
        }
    }

    protected void bindSslProtocolProvider(SslProtocolProvider sslProtocolProvider) {
        this.sslProtocolProvider = sslProtocolProvider;
    }

    protected void unbindSslProtocolProvider(SslProtocolProvider sslProtocolProvider) {
        if (this.sslProtocolProvider == sslProtocolProvider) {
            this.sslProtocolProvider = null;
        }
    }
}