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