6  * ==================================================================== 
   8  *  Licensed to the Apache Software Foundation (ASF) under one or more 
   9  *  contributor license agreements.  See the NOTICE file distributed with 
  10  *  this work for additional information regarding copyright ownership. 
  11  *  The ASF licenses this file to You under the Apache License, Version 2.0 
  12  *  (the "License"); you may not use this file except in compliance with 
  13  *  the License.  You may obtain a copy of the License at 
  15  *      http://www.apache.org/licenses/LICENSE-2.0 
  17  *  Unless required by applicable law or agreed to in writing, software 
  18  *  distributed under the License is distributed on an "AS IS" BASIS, 
  19  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  20  *  See the License for the specific language governing permissions and 
  21  *  limitations under the License. 
  22  * ==================================================================== 
  24  * This software consists of voluntary contributions made by many 
  25  * individuals on behalf of the Apache Software Foundation.  For more 
  26  * information on the Apache Software Foundation, please see 
  27  * <http://www.apache.org/>. 
  31 package eu
.alefzero
.owncloud
.authenticator
; 
  33 import java
.io
.IOException
; 
  34 import java
.net
.InetAddress
; 
  35 import java
.net
.InetSocketAddress
; 
  36 import java
.net
.Socket
; 
  37 import java
.net
.SocketAddress
; 
  38 import java
.net
.UnknownHostException
; 
  40 import javax
.net
.SocketFactory
; 
  41 import javax
.net
.ssl
.SSLContext
; 
  42 import javax
.net
.ssl
.TrustManager
; 
  44 import org
.apache
.commons
.httpclient
.ConnectTimeoutException
; 
  45 import org
.apache
.commons
.httpclient
.HttpClientError
; 
  46 import org
.apache
.commons
.httpclient
.params
.HttpConnectionParams
; 
  47 import org
.apache
.commons
.httpclient
.protocol
.ProtocolSocketFactory
; 
  48 import org
.apache
.commons
.httpclient
.protocol
.SecureProtocolSocketFactory
; 
  50 import android
.util
.Log
; 
  54  * EasySSLProtocolSocketFactory can be used to creats SSL {@link Socket}s that 
  55  * accept self-signed certificates. 
  58  * This socket factory SHOULD NOT be used for productive systems due to security 
  59  * reasons, unless it is a concious decision and you are perfectly aware of 
  60  * security implications of accepting self-signed certificates 
  64  * Example of using custom protocol socket factory for a specific host: 
  67  * Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 
  70  * URI uri = new URI("https://localhost/", true); 
  71  * // use relative url only 
  72  * GetMethod httpget = new GetMethod(uri.getPathQuery()); 
  73  * HostConfiguration hc = new HostConfiguration(); 
  74  * hc.setHost(uri.getHost(), uri.getPort(), easyhttps); 
  75  * HttpClient client = new HttpClient(); 
  76  * client.executeMethod(hc, httpget); 
  81  * Example of using custom protocol socket factory per default instead of the 
  85  * Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 
  87  * Protocol.registerProtocol("https", easyhttps); 
  89  * HttpClient client = new HttpClient(); 
  90  * GetMethod httpget = new GetMethod("https://localhost/"); 
  91  * client.executeMethod(httpget); 
  96  * @author <a href="mailto:oleg -at- ural.ru">Oleg Kalnichevski</a> 
  99  *         DISCLAIMER: HttpClient developers DO NOT actively support this 
 100  *         component. The component is provided as a reference material, which 
 101  *         may be inappropriate for use without additional customization. 
 105 public class EasySSLSocketFactory 
implements ProtocolSocketFactory 
{ 
 107     private static final String TAG 
= "EasySSLSocketFactory"; 
 108     private SSLContext sslcontext 
= null
; 
 111      * Constructor for EasySSLProtocolSocketFactory. 
 113     public EasySSLSocketFactory() { 
 117     private static SSLContext 
createEasySSLContext() { 
 119             SSLContext context 
= SSLContext
.getInstance("TLS"); 
 120             context
.init(null
, new TrustManager
[] { new EasyX509TrustManager( 
 123         } catch (Exception er
) { 
 124             Log
.e(TAG
, er
.getMessage() + ""); 
 125             throw new HttpClientError(er
.toString()); 
 129     private SSLContext 
getSSLContext() { 
 130         if (this.sslcontext 
== null
) { 
 131             this.sslcontext 
= createEasySSLContext(); 
 133         return this.sslcontext
; 
 137      * @see SecureProtocolSocketFactory#createSocket(java.lang.String,int,java.net.InetAddress,int) 
 139     public Socket 
createSocket(String host
, int port
, InetAddress clientHost
, 
 140             int clientPort
) throws IOException
, UnknownHostException 
{ 
 142         return getSSLContext().getSocketFactory().createSocket(host
, port
, 
 143                 clientHost
, clientPort
); 
 147      * Attempts to get a new socket connection to the given host within the 
 150      * To circumvent the limitations of older JREs that do not support connect 
 151      * timeout a controller thread is executed. The controller thread attempts 
 152      * to create a new socket within the given limit of time. If socket 
 153      * constructor does not return until the timeout expires, the controller 
 154      * terminates and throws an {@link ConnectTimeoutException} 
 157      * @param host the host name/IP 
 158      * @param port the port on the host 
 159      * @param clientHost the local host name/IP to bind the socket to 
 160      * @param clientPort the port on the local machine 
 161      * @param params {@link HttpConnectionParams Http connection parameters} 
 163      * @return Socket a new socket 
 165      * @throws IOException if an I/O error occurs while creating the socket 
 166      * @throws UnknownHostException if the IP address of the host cannot be 
 169     public Socket 
createSocket(final String host
, final int port
, 
 170             final InetAddress localAddress
, final int localPort
, 
 171             final HttpConnectionParams params
) throws IOException
, 
 172             UnknownHostException
, ConnectTimeoutException 
{ 
 173         if (params 
== null
) { 
 174             throw new IllegalArgumentException("Parameters may not be null"); 
 176         int timeout 
= params
.getConnectionTimeout(); 
 177         SocketFactory socketfactory 
= getSSLContext().getSocketFactory(); 
 179             return socketfactory
.createSocket(host
, port
, localAddress
, 
 182             Socket socket 
= socketfactory
.createSocket(); 
 183             SocketAddress localaddr 
= new InetSocketAddress(localAddress
, 
 185             SocketAddress remoteaddr 
= new InetSocketAddress(host
, port
); 
 186             socket
.bind(localaddr
); 
 187             socket
.connect(remoteaddr
, timeout
); 
 193      * @see SecureProtocolSocketFactory#createSocket(java.lang.String,int) 
 195     public Socket 
createSocket(String host
, int port
) throws IOException
, 
 196             UnknownHostException 
{ 
 197         return getSSLContext().getSocketFactory().createSocket(host
, port
); 
 201      * @see SecureProtocolSocketFactory#createSocket(java.net.Socket,java.lang.String,int,boolean) 
 203     public Socket 
createSocket(Socket socket
, String host
, int port
, 
 204             boolean autoClose
) throws IOException
, UnknownHostException 
{ 
 205         return getSSLContext().getSocketFactory().createSocket(socket
, host
, 
 209     public boolean equals(Object obj
) { 
 210         return ((obj 
!= null
) && obj
.getClass().equals( 
 211                 EasySSLSocketFactory
.class)); 
 214     public int hashCode() { 
 215         return EasySSLSocketFactory
.class.hashCode();