001/*
002 * $HeadURL: file:///opt/dev/not-yet-commons-ssl-SVN-repo/tags/commons-ssl-0.3.17/src/java/org/apache/commons/ssl/SSLWrapperFactory.java $
003 * $Revision: 155 $
004 * $Date: 2009-09-17 14:00:58 -0700 (Thu, 17 Sep 2009) $
005 *
006 * ====================================================================
007 * Licensed to the Apache Software Foundation (ASF) under one
008 * or more contributor license agreements.  See the NOTICE file
009 * distributed with this work for additional information
010 * regarding copyright ownership.  The ASF licenses this file
011 * to you under the Apache License, Version 2.0 (the
012 * "License"); you may not use this file except in compliance
013 * with the License.  You may obtain a copy of the License at
014 *
015 *   http://www.apache.org/licenses/LICENSE-2.0
016 *
017 * Unless required by applicable law or agreed to in writing,
018 * software distributed under the License is distributed on an
019 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
020 * KIND, either express or implied.  See the License for the
021 * specific language governing permissions and limitations
022 * under the License.
023 * ====================================================================
024 *
025 * This software consists of voluntary contributions made by many
026 * individuals on behalf of the Apache Software Foundation.  For more
027 * information on the Apache Software Foundation, please see
028 * <http://www.apache.org/>.
029 *
030 */
031
032package org.apache.commons.ssl;
033
034import javax.net.ssl.SSLServerSocket;
035import javax.net.ssl.SSLSocket;
036import java.io.IOException;
037import java.net.Socket;
038
039/**
040 * @author Credit Union Central of British Columbia
041 * @author <a href="http://www.cucbc.com/">www.cucbc.com</a>
042 * @author <a href="mailto:juliusdavies@cucbc.com">juliusdavies@cucbc.com</a>
043 * @since 19-Sep-2006
044 */
045public interface SSLWrapperFactory {
046
047    /**
048     * Wraps an SSLSSocket.
049     *
050     * @param s SSLSocket to wrap.
051     * @return The new wrapped SSLSocket.
052     * @throws IOException if wrapping failed
053     */
054    public Socket wrap(Socket s) throws IOException;
055
056    /**
057     * Wraps an SSLServerSocket.
058     *
059     * @param s   The SSLServerSocket to wrap.
060     * @param ssl The SSL object that created the SSLServerSocket.
061     *            This way some important commons-ssl config can be applied
062     *            to the returned socket.
063     * @return The new wrapped SSLServerSocket.
064     * @throws IOException if wrapping failed
065     */
066    public SSLServerSocket wrap(SSLServerSocket s, SSL ssl)
067        throws IOException;
068
069
070    /**
071     * NO_WRAP doesn't wrap the SSLSocket.  It does wrap the SSLServerSocket
072     * so that we can do the usual housekeeping after accept() that we like to
073     * do on every socket.  E.g. setSoTimeout, setEnabledProtocols,
074     * setEnabledCiphers, setUseClientMode, and the hostname verifier (which
075     * should be very rare on SSLServerSockets!).
076     */
077    public final static SSLWrapperFactory NO_WRAP = new SSLWrapperFactory() {
078        // Notice!  No wrapping!
079        public Socket wrap(Socket s) { return s; }
080
081        // We still wrap the ServerSocket, but we don't wrap the result of the
082        // the accept() call.
083        public SSLServerSocket wrap(SSLServerSocket s, SSL ssl)
084            throws IOException {
085            // Can't wrap with Java 1.3 because SSLServerSocket's constructor has
086            // default access instead of protected access in Java 1.3.
087            boolean java13 = JavaImpl.isJava13();
088            return java13 ? s : new SSLServerSocketWrapper(s, ssl, this);
089        }
090    };
091
092    /**
093     * DUMB_WRAP is useful to make sure that wrapping the sockets doesn't break
094     * anything.  It doesn't actually do anything interesting in its wrapped
095     * implementations.
096     */
097    public final static SSLWrapperFactory DUMB_WRAP = new SSLWrapperFactory() {
098        public Socket wrap(Socket s) { return new SSLSocketWrapper(s); }
099
100        public SSLServerSocket wrap(SSLServerSocket s, SSL ssl)
101            throws IOException {
102            // Can't wrap with Java 1.3 because SSLServerSocket's constructor has
103            // default access instead of protected access in Java 1.3.
104            boolean java13 = JavaImpl.isJava13();
105            return java13 ? s : new SSLServerSocketWrapper(s, ssl, this);
106        }
107    };
108
109
110}