blob: 37960681996f8a61ffc9e03a055be7a4d715670c [file] [log] [blame]
/*
* 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());
}
}