151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage javax.net.ssl;
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.*;
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport javax.net.SocketFactory;
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException;
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.*;
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Locale;
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.action.GetPropertyAction;
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>SSLSocketFactory</code>s create <code>SSLSocket</code>s.
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SSLSocket
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author David Brownell
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class SSLSocketFactory extends SocketFactory
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{
47554120a75937f01424d0a8aea712ff0e21b1b050Piotr Jastrzebski    private static SSLSocketFactory defaultSocketFactory;
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
49b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski    private static int lastVersion = -1;
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static final boolean DEBUG;
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static {
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        String s = java.security.AccessController.doPrivileged(
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            new GetPropertyAction("javax.net.debug", "")).toLowerCase(
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                                            Locale.ENGLISH);
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        DEBUG = s.contains("all") || s.contains("ssl");
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private static void log(String msg) {
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (DEBUG) {
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            System.out.println(msg);
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Constructor is used only by subclasses.
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public SSLSocketFactory() {
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the default SSL socket factory.
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>The first time this method is called, the security property
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * "ssl.SocketFactory.provider" is examined. If it is non-null, a class by
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * that name is loaded and instantiated. If that is successful and the
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * object is an instance of SSLSocketFactory, it is made the default SSL
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * socket factory.
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <p>Otherwise, this method returns
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * <code>SSLContext.getDefault().getSocketFactory()</code>. If that
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * call fails, an inoperative factory is returned.
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return the default <code>SocketFactory</code>
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see SSLContext#getDefault
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public static synchronized SocketFactory getDefault() {
89b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski        // Android-changed: Use security version instead of propertyChecked.
90554120a75937f01424d0a8aea712ff0e21b1b050Piotr Jastrzebski        if (defaultSocketFactory != null && lastVersion == Security.getVersion()) {
91554120a75937f01424d0a8aea712ff0e21b1b050Piotr Jastrzebski            return defaultSocketFactory;
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
94b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski        lastVersion = Security.getVersion();
95d9e00231d7e07145660d2482eda54e744015d874Sergio Giro        SSLSocketFactory previousDefaultSocketFactory = defaultSocketFactory;
96554120a75937f01424d0a8aea712ff0e21b1b050Piotr Jastrzebski        defaultSocketFactory = null;
97b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski
98b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski        String clsName = getSecurityProperty("ssl.SocketFactory.provider");
99d9e00231d7e07145660d2482eda54e744015d874Sergio Giro
100b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski        if (clsName != null) {
101d9e00231d7e07145660d2482eda54e744015d874Sergio Giro            // The instance for the default socket factory is checked for updates quite
102d9e00231d7e07145660d2482eda54e744015d874Sergio Giro            // often (for instance, every time a security provider is added). Which leads
103d9e00231d7e07145660d2482eda54e744015d874Sergio Giro            // to unnecessary overload and excessive error messages in case of class-loading
104d9e00231d7e07145660d2482eda54e744015d874Sergio Giro            // errors. Avoid creating a new object if the class name is the same as before.
105d9e00231d7e07145660d2482eda54e744015d874Sergio Giro            if (previousDefaultSocketFactory != null
106d9e00231d7e07145660d2482eda54e744015d874Sergio Giro                    && clsName.equals(previousDefaultSocketFactory.getClass().getName())) {
107d9e00231d7e07145660d2482eda54e744015d874Sergio Giro                defaultSocketFactory = previousDefaultSocketFactory;
108d9e00231d7e07145660d2482eda54e744015d874Sergio Giro                return defaultSocketFactory;
109d9e00231d7e07145660d2482eda54e744015d874Sergio Giro            }
110b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski            log("setting up default SSLSocketFactory");
111b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski            try {
112b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                Class cls = null;
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                try {
114b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                    cls = Class.forName(clsName);
115b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                } catch (ClassNotFoundException e) {
116b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                    // Android-changed; Try the contextClassLoader first.
117b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                    ClassLoader cl = Thread.currentThread().getContextClassLoader();
118b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                    if (cl == null) {
119b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                        cl = ClassLoader.getSystemClassLoader();
120b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                    }
121b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski
122b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                    if (cl != null) {
123b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                        cls = Class.forName(clsName, true, cl);
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
125b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                }
126b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                log("class " + clsName + " is loaded");
127554120a75937f01424d0a8aea712ff0e21b1b050Piotr Jastrzebski                defaultSocketFactory = (SSLSocketFactory)cls.newInstance();
128b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                log("instantiated an instance of class " + clsName);
129554120a75937f01424d0a8aea712ff0e21b1b050Piotr Jastrzebski                if (defaultSocketFactory != null) {
130554120a75937f01424d0a8aea712ff0e21b1b050Piotr Jastrzebski                    return defaultSocketFactory;
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
132b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski            } catch (Exception e) {
133b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski                log("SSLSocketFactory instantiation failed: " + e.toString());
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
137b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski        // Android-changed: Allow for {@code null} SSLContext.getDefault.
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
139b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski            SSLContext context = SSLContext.getDefault();
140b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski            if (context != null) {
141554120a75937f01424d0a8aea712ff0e21b1b050Piotr Jastrzebski                defaultSocketFactory = context.getSocketFactory();
142b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski            }
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } catch (NoSuchAlgorithmException e) {
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
145b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski
146554120a75937f01424d0a8aea712ff0e21b1b050Piotr Jastrzebski        if (defaultSocketFactory == null) {
147554120a75937f01424d0a8aea712ff0e21b1b050Piotr Jastrzebski            defaultSocketFactory = new DefaultSSLSocketFactory(new IllegalStateException("No factory found."));
148b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski        }
149b47f3e5f7ec445172d61af99e3ece07319a0c886Piotr Jastrzebski
150554120a75937f01424d0a8aea712ff0e21b1b050Piotr Jastrzebski        return defaultSocketFactory;
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    static String getSecurityProperty(final String name) {
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return AccessController.doPrivileged(new PrivilegedAction<String>() {
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            public String run() {
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                String s = java.security.Security.getProperty(name);
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                if (s != null) {
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    s = s.trim();
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    if (s.length() == 0) {
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                        s = null;
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                    }
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                }
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                return s;
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            }
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        });
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the list of cipher suites which are enabled by default.
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Unless a different list is enabled, handshaking on an SSL connection
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * will use one of these cipher suites.  The minimum quality of service
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * for these defaults requires confidentiality protection and server
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * authentication (that is, no anonymous cipher suites).
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getSupportedCipherSuites()
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return array of the cipher suites enabled by default
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract String [] getDefaultCipherSuites();
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns the names of the cipher suites which could be enabled for use
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * on an SSL connection.  Normally, only a subset of these will actually
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * be enabled by default, since this list may include cipher suites which
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * do not meet quality of service requirements for those defaults.  Such
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * cipher suites are useful in specialized applications.
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see #getDefaultCipherSuites()
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return an array of cipher suite names
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract String [] getSupportedCipherSuites();
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Returns a socket layered over an existing socket connected to the named
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * host, at the given port.  This constructor can be used when tunneling SSL
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * through a proxy or when negotiating the use of SSL over an existing
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * socket. The host and port refer to the logical peer destination.
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * This socket is configured using the socket options established for
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * this factory.
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param s the existing socket
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param host the server host
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param port the server port
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param autoClose close the underlying socket when this socket is closed
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return a socket connected to the specified host and port
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws IOException if an I/O error occurs when creating the socket
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @throws NullPointerException if the parameter s is null
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public abstract Socket createSocket(Socket s, String host,
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                        int port, boolean autoClose)
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    throws IOException;
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// file private
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass DefaultSSLSocketFactory extends SSLSocketFactory
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private Exception reason;
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    DefaultSSLSocketFactory(Exception reason) {
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.reason = reason;
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private Socket throwException() throws SocketException {
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        throw (SocketException)
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            new SocketException(reason.toString()).initCause(reason);
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Socket createSocket()
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    throws IOException
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return throwException();
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Socket createSocket(String host, int port)
23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    throws IOException
23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return throwException();
23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Socket createSocket(Socket s, String host,
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski                                int port, boolean autoClose)
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    throws IOException
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return throwException();
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Socket createSocket(InetAddress address, int port)
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    throws IOException
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return throwException();
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Socket createSocket(String host, int port,
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        InetAddress clientAddress, int clientPort)
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    throws IOException
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return throwException();
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Socket createSocket(InetAddress address, int port,
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        InetAddress clientAddress, int clientPort)
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    throws IOException
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return throwException();
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String [] getDefaultCipherSuites() {
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new String[0];
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public String [] getSupportedCipherSuites() {
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return new String[0];
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
275