001    /*
002     * Copyright 2010 the original author or authors.
003     * 
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package com.hs.mail.container.server.socket;
017    
018    import java.io.IOException;
019    import java.net.InetAddress;
020    import java.net.ServerSocket;
021    
022    import javax.net.ssl.SSLContext;
023    import javax.net.ssl.SSLServerSocket;
024    import javax.net.ssl.SSLServerSocketFactory;
025    
026    /**
027     * 
028     * @author Won Chul Doh
029     * @since Jul 29, 2010
030     *
031     */
032    public class TLSServerSocketFactory implements ServerSocketFactory {
033    
034            protected SSLServerSocketFactory factory;
035            
036            private boolean authenticateClient = false;
037    
038            public TLSServerSocketFactory(SSLContext context) {
039                    factory = context.getServerSocketFactory();
040            }
041    
042            public void setAuthenticateClient(boolean b) {
043                    this.authenticateClient = b;
044            }
045    
046            public ServerSocket createServerSocket(int port) throws IOException {
047                    final ServerSocket serverSocket = factory.createServerSocket(port);
048                    initServerSocket(serverSocket);
049                    return serverSocket;
050            }
051    
052            public ServerSocket createServerSocket(int port, int backLog)
053                            throws IOException {
054                    final ServerSocket serverSocket = factory.createServerSocket(port,
055                                    backLog);
056                    initServerSocket(serverSocket);
057                    return serverSocket;
058            }
059    
060            public ServerSocket createServerSocket(int port, int backLog,
061                            InetAddress bindAddress) throws IOException {
062                    final ServerSocket serverSocket = factory.createServerSocket(port,
063                                    backLog, bindAddress);
064                    initServerSocket(serverSocket);
065                    return serverSocket;
066            }
067    
068            private void initServerSocket(final ServerSocket serverSocket) {
069                    final SSLServerSocket socket = (SSLServerSocket) serverSocket;
070                    
071                    // Enable all available cipher suites when the socket is connected
072                    final String[] cipherSuites = socket.getSupportedCipherSuites();
073                    socket.setEnabledCipherSuites(cipherSuites);
074                    
075                    // Set client authentication if necessary
076                    socket.setNeedClientAuth(authenticateClient);
077            }
078            
079    }