Merge "Revert "email: add support for Server Name Indication (SNI)""
diff --git a/emailcommon/Android.mk b/emailcommon/Android.mk
index 14ea550..654e20d 100644
--- a/emailcommon/Android.mk
+++ b/emailcommon/Android.mk
@@ -42,7 +42,7 @@
 LOCAL_SRC_FILES += $(imported_unified_email_files)
 LOCAL_SRC_FILES += $(call all-java-files-under, $(unified_email_src_dir)/com/android/emailcommon)
 
-LOCAL_SDK_VERSION := 17
+LOCAL_SDK_VERSION := 14
 
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 
diff --git a/emailcommon/src/com/android/emailcommon/utility/SSLSocketFactory.java b/emailcommon/src/com/android/emailcommon/utility/SSLSocketFactory.java
index 433cef8..b7a59b8 100644
--- a/emailcommon/src/com/android/emailcommon/utility/SSLSocketFactory.java
+++ b/emailcommon/src/com/android/emailcommon/utility/SSLSocketFactory.java
@@ -33,10 +33,6 @@
 
 package com.android.emailcommon.utility;
 
-import android.annotation.TargetApi;
-import android.net.SSLCertificateSocketFactory;
-import android.os.Build;
-
 import org.apache.http.conn.scheme.HostNameResolver;
 import org.apache.http.conn.scheme.LayeredSocketFactory;
 import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
@@ -46,6 +42,7 @@
 import org.apache.http.params.HttpConnectionParams;
 import org.apache.http.params.HttpParams;
 
+import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.KeyManager;
 import javax.net.ssl.KeyManagerFactory;
 import javax.net.ssl.SSLContext;
@@ -159,9 +156,21 @@
 
     public static final X509HostnameVerifier STRICT_HOSTNAME_VERIFIER
         = new StrictHostnameVerifier();
+    /**
+     * The factory using the default JVM settings for secure connections.
+     */
+    private static final SSLSocketFactory DEFAULT_FACTORY = new SSLSocketFactory();
+
+    /**
+     * Gets an singleton instance of the SSLProtocolSocketFactory.
+     * @return a SSLProtocolSocketFactory
+     */
+    public static SSLSocketFactory getSocketFactory() {
+        return DEFAULT_FACTORY;
+    }
 
     private final SSLContext sslcontext;
-    private final SSLCertificateSocketFactory socketfactory;
+    private final javax.net.ssl.SSLSocketFactory socketfactory;
     private final HostNameResolver nameResolver;
     private X509HostnameVerifier hostnameVerifier = BROWSER_COMPATIBLE_HOSTNAME_VERIFIER;
 
@@ -188,7 +197,7 @@
         }
         sslcontext = SSLContext.getInstance(algorithm);
         sslcontext.init(keymanagers, trustmanagers, random);
-        socketfactory = (SSLCertificateSocketFactory) sslcontext.getSocketFactory();
+        socketfactory = sslcontext.getSocketFactory();
         this.nameResolver = nameResolver;
     }
 
@@ -217,13 +226,25 @@
      * Constructs an HttpClient SSLSocketFactory backed by the given JSSE
      * SSLSocketFactory.
      */
-    public SSLSocketFactory(SSLCertificateSocketFactory socketfactory) {
+    public SSLSocketFactory(javax.net.ssl.SSLSocketFactory socketfactory) {
         super();
         sslcontext = null;
         this.socketfactory = socketfactory;
         nameResolver = null;
     }
 
+    /**
+     * Creates the default SSL socket factory.
+     * This constructor is used exclusively to instantiate the factory for
+     * {@link #getSocketFactory getSocketFactory}.
+     */
+    private SSLSocketFactory() {
+        super();
+        sslcontext = null;
+        socketfactory = HttpsURLConnection.getDefaultSSLSocketFactory();
+        nameResolver = null;
+    }
+
     private static KeyManager[] createKeyManagers(final KeyStore keystore, final String password)
         throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException {
         if (keystore == null) {
@@ -259,7 +280,6 @@
 
     // non-javadoc, see interface org.apache.http.conn.SocketFactory
     @Override
-    @TargetApi(17)
     public Socket connectSocket(
         final Socket sock,
         final String host,
@@ -303,12 +323,6 @@
         sslsock.connect(remoteAddress, connTimeout);
 
         sslsock.setSoTimeout(soTimeout);
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
-            // Turn on Server Name Indication (SNI)
-            socketfactory.setHostname(sslsock, host);
-        }
-
         try {
             hostnameVerifier.verify(host, sslsock);
             // verifyHostName() didn't blowup - good!
@@ -360,43 +374,19 @@
 
     // non-javadoc, see interface LayeredSocketFactory
     @Override
-    @TargetApi(17)
     public Socket createSocket(
         final Socket socket,
         final String host,
         final int port,
         final boolean autoClose
     ) throws IOException, UnknownHostException {
-        // Close the plain socket if requested. The underlaying socket factory will
-        // create a new socket.
-        if (autoClose) {
-            socket.close();
-        }
-
-        // We don't want to verify the hostname from the previous socket here (we must call
-        // setHostname in order to proper get SNI working), so just create a new ssl socket
-        // based in the previous socket
         SSLSocket sslSocket = (SSLSocket) socketfactory.createSocket(
-              socket.getInetAddress(),
-              port
+              socket,
+              host,
+              port,
+              autoClose
         );
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
-            // Turn on Server Name Indication (SNI)
-            socketfactory.setHostname(sslSocket, host);
-        }
-
-        try {
-            hostnameVerifier.verify(host, sslSocket);
-            // verifyHostName() didn't blowup - good!
-        } catch (IOException iox) {
-            // close the socket before re-throwing the exception
-            if (autoClose) {
-                try { sslSocket.close(); } catch (Exception x) { /*ignore*/ }
-            }
-            throw iox;
-        }
-
+        hostnameVerifier.verify(host, sslSocket);
         // verifyHostName() didn't blowup - good!
         return sslSocket;
     }