aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/java/sip/communicator/impl/ldap/LdapSSLSocketFactoryDelegate.java
blob: 35320a0575861f7b456d4d291a92a74937f7ddf8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
 * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */
package net.java.sip.communicator.impl.ldap;

import java.io.*;
import java.net.*;
import java.security.*;

import javax.net.*;

import net.java.sip.communicator.service.certificate.*;
import net.java.sip.communicator.util.*;

/**
 * Utility class to delegate the creation of sockets to LDAP servers to our
 * {@link CertificateService}.
 * <p>
 * Note that the documentation says to extend {@link SocketFactory}, but the
 * LDAP directory context tries to create an unconnected socket without a
 * hostname first by calling <tt>createSocket</tt>. It would be impossible to
 * validate the hostname against the certificate, which leads to an insecure
 * communication. It only calls {@link #createSocket(String, int)} when
 * <tt>createSocket</tt> is not found
 * 
 * @author Ingo Bauersachs
 */
public class LdapSSLSocketFactoryDelegate
{
    private final static Logger logger =
        Logger.getLogger(LdapSSLSocketFactoryDelegate.class);

    public static Object getDefault()
    {
        return new LdapSSLSocketFactoryDelegate();
    }

    /**
     * Creates a socket for the specified destination host and port.
     * 
     * @param host The hostname that the socket connects to.
     * @param port The port that the socket connects to.
     * @return The created socket.
     * @throws IOException
     * @throws UnknownHostException When the hostname cannot be resolved to an
     *             IP address.
     */
    public Socket createSocket(String host, int port)
        throws IOException,
        UnknownHostException
    {
        try
        {
            return LdapServiceImpl
                .getCertificateService()
                .getSSLContext(
                    LdapServiceImpl.getCertificateService().getTrustManager(
                        host)).getSocketFactory().createSocket(host, port);
        }
        catch (GeneralSecurityException e)
        {
            logger.error(
                "unable to create socket through the certificate service", e);
            throw new IOException(e.getMessage());
        }
    }
}