SslProtocolProvider.java 6.35 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.keystore.KeyStoreService
 *  com.day.cq.replication.AgentConfig
 *  com.day.cq.replication.ReplicationException
 *  com.day.cq.replication.ReplicationLog
 *  com.scene7.is.util.callbacks.Func1
 *  com.scene7.is.util.callbacks.Option
 *  org.apache.commons.httpclient.protocol.Protocol
 *  org.apache.commons.httpclient.protocol.ProtocolSocketFactory
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ValueMap
 *  org.jetbrains.annotations.NotNull
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
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.AuthSSLProtocolSocketFactory;
import com.adobe.cq.dam.aod.replication.transport_config.EasySSLProtocolSocketFactory;
import com.adobe.cq.dam.aod.replication.transport_config.ResourceResolverProvider;
import com.adobe.cq.dam.aod.replication.transport_config.TokenProviderImpl;
import com.adobe.granite.keystore.KeyStoreService;
import com.day.cq.replication.AgentConfig;
import com.day.cq.replication.ReplicationException;
import com.day.cq.replication.ReplicationLog;
import com.scene7.is.util.callbacks.Func1;
import com.scene7.is.util.callbacks.Option;
import java.net.URL;
import java.util.Iterator;
import javax.net.ssl.KeyManager;
import javax.net.ssl.TrustManager;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
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.ResourceResolver;
import org.apache.sling.api.resource.ValueMap;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Service(value={SslProtocolProvider.class})
@Component
public final class SslProtocolProvider {
    @Reference
    private final ResourceResolverProvider resolverProvider;
    @Reference
    private final KeyStoreService keyStoreService;
    private static final Logger log = LoggerFactory.getLogger(SslProtocolProvider.class);
    @NotNull
    private final String[] disabledSuites = new String[0];
    @NotNull
    private final String[] enabledSuites = new String[0];

    public static SslProtocolProvider sslProtocolProvider(ResourceResolverProvider resolverProvider, KeyStoreService keyStoreService) {
        return new SslProtocolProvider(resolverProvider, keyStoreService);
    }

    public Protocol getProtocol(final AgentConfig config, final ReplicationLog log) {
        return (Protocol)this.resolverProvider.withResolver(config.getAgentUserId(), new Func1<ResourceResolver, Protocol>(){

            public Protocol call(ResourceResolver resolver) {
                return SslProtocolProvider.this.getProtocol(resolver, config, log);
            }
        });
    }

    public SslProtocolProvider() {
        this.resolverProvider = (ResourceResolverProvider)Util.initRef();
        this.keyStoreService = (KeyStoreService)Util.initRef();
    }

    private SslProtocolProvider(ResourceResolverProvider resolverProvider, KeyStoreService keyStoreService) {
        this.resolverProvider = resolverProvider;
        this.keyStoreService = keyStoreService;
    }

    private Protocol getProtocol(ResourceResolver resolver, AgentConfig config, ReplicationLog log) {
        Iterator i$ = this.getSocketFactory(resolver, config, log).iterator();
        if (i$.hasNext()) {
            ProtocolSocketFactory socketFactory = (ProtocolSocketFactory)i$.next();
            int port = 443;
            try {
                URL uri = Util.serverUrl(config.getTransportURI());
                port = uri.getPort();
            }
            catch (ReplicationException e) {
                log.warn("Port failed : " + e.getMessage() + ", port:" + port);
            }
            return new Protocol("https", socketFactory, port);
        }
        return Protocol.getProtocol((String)"https");
    }

    private Option<? extends ProtocolSocketFactory> getSocketFactory(ResourceResolver resolver, AgentConfig config, ReplicationLog log) {
        if (config.getProperties().get(TokenProviderImpl.KeyStoreConstants.keystoreAlias.name(), String.class) != null) {
            return Option.some((Object)new AuthSSLProtocolSocketFactory(null, null, this.disabledSuites, this.enabledSuites));
        }
        switch (config.getSSLConfig()) {
            case "relaxed": {
                log.debug("* Using Relaxed SSL configuration *");
                boolean allowExpired = config.allowsExpiredCertificates();
                log.debug("* Accept expired SSL certificates: %s", new Object[]{allowExpired});
                return Option.some((Object)new EasySSLProtocolSocketFactory(allowExpired, this.disabledSuites, this.enabledSuites));
            }
            case "clientauth": {
                log.info("* Using Client Auth SSL configuration *");
                KeyManager keyManager = this.keyStoreService.getKeyManager(resolver);
                TrustManager trustManager = this.keyStoreService.getTrustManager(resolver);
                return Option.some((Object)new AuthSSLProtocolSocketFactory(keyManager, trustManager, this.disabledSuites, this.enabledSuites));
            }
            case "default": {
                return Option.none();
            }
        }
        throw new UnsupportedOperationException("Unsupported SSL configuration: '" + config.getSSLConfig() + '\'');
    }

    protected void bindResolverProvider(ResourceResolverProvider resourceResolverProvider) {
        this.resolverProvider = resourceResolverProvider;
    }

    protected void unbindResolverProvider(ResourceResolverProvider resourceResolverProvider) {
        if (this.resolverProvider == resourceResolverProvider) {
            this.resolverProvider = null;
        }
    }

    protected void bindKeyStoreService(KeyStoreService keyStoreService) {
        this.keyStoreService = keyStoreService;
    }

    protected void unbindKeyStoreService(KeyStoreService keyStoreService) {
        if (this.keyStoreService == keyStoreService) {
            this.keyStoreService = null;
        }
    }

}