/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * under the License. */ package org.apache.karaf.jaas.modules.ldap; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.util.Comparator; import javax.net.ssl.SSLSocketFactory; public class ManagedSSLSocketFactory extends SSLSocketFactory implements Comparator<Object> { private static final ThreadLocal<SSLSocketFactory> factories = new ThreadLocal<SSLSocketFactory>(); public static void setSocketFactory(SSLSocketFactory factory) { factories.set(factory); } public static SSLSocketFactory getDefault() { SSLSocketFactory factory = factories.get(); if (factory == null) { throw new IllegalStateException("No SSLSocketFactory parameters have been set!"); } return factory; } private SSLSocketFactory delegate; // When <code>java.naming.ldap.factory.socket</code> property configures custom // {@link SSLSocketFactory}, LdapCtx invokes special compare method to enable pooling. public ManagedSSLSocketFactory(SSLSocketFactory delegate) { this.delegate = delegate; } public String[] getDefaultCipherSuites() { return delegate.getDefaultCipherSuites(); } public String[] getSupportedCipherSuites() { return delegate.getSupportedCipherSuites(); } public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { return delegate.createSocket(s, host, port, autoClose); } public Socket createSocket(String host, int port) throws IOException { return delegate.createSocket(host, port); } public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { return delegate.createSocket(host, port, localHost, localPort); } public Socket createSocket(InetAddress host, int port) throws IOException { return delegate.createSocket(host, port); } public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { return delegate.createSocket(address, port, localAddress, localPort); } /** * For com.sun.jndi.ldap.ClientId#invokeComparator(com.sun.jndi.ldap.ClientId, com.sun.jndi.ldap.ClientId) * @param f1 * @param f2 * @return */ public int compare(Object f1, Object f2) { if (f1 == null && f2 == null) { return 0; } if (f1 == null) { return 1; } if (f2 == null) { return -1; } // com.sun.jndi.ldap.ClientId#invokeComparator() passes com.sun.jndi.ldap.ClientId.socketFactory as f1 and f2 // these are String values if (f1 instanceof String && f2 instanceof String) { return ((String) f1).compareTo((String) f2); } // fallback to undefined behavior return f1.toString().compareTo(f2.toString()); } }