blob: 059a530d9482bfe9019aa92aa334e5674aa497bf [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
package com.sun.star.wiki;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyStore;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.HttpClientError;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
class WikiProtocolSocketFactory implements SecureProtocolSocketFactory
{
private SSLContext m_aSSLContext;
public WikiProtocolSocketFactory()
{
super();
}
public synchronized SSLContext GetNotSoSecureSSLContext()
{
if ( m_aSSLContext == null )
{
TrustManager[] pTrustUnknownCerts = new TrustManager[]
{
new X509TrustManager() {
private X509TrustManager m_aOrgTrustManager;
private X509TrustManager GetOrgTrustManager()
{
if ( m_aOrgTrustManager == null )
{
try
{
TrustManagerFactory aFactory = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm() );
aFactory.init( (KeyStore)null );
TrustManager[] pTrustmanagers = aFactory.getTrustManagers();
if ( pTrustmanagers.length != 0 && pTrustmanagers[0] != null )
m_aOrgTrustManager = (X509TrustManager)pTrustmanagers[0];
}
catch( Exception e )
{
throw new RuntimeException( "No access to the default trust manager!" );
}
}
return m_aOrgTrustManager;
}
public X509Certificate[] getAcceptedIssuers()
{
return GetOrgTrustManager().getAcceptedIssuers();
}
public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException
{
GetOrgTrustManager().checkClientTrusted( certs, authType );
}
public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException
{
if ( certs == null || certs.length == 0 )
GetOrgTrustManager().checkServerTrusted( certs, authType );
else
for ( int nInd = 0; nInd < certs.length; nInd++ )
certs[nInd].checkValidity();
}
}
};
try
{
SSLContext aContext = SSLContext.getInstance("SSL");
if ( aContext != null )
{
aContext.init( null, pTrustUnknownCerts, null );
m_aSSLContext = aContext;
}
}
catch ( Exception e )
{
}
}
if ( m_aSSLContext == null )
throw new HttpClientError();
return m_aSSLContext;
}
public Socket createSocket( String sHost, int nPort, InetAddress clientHost, int clientPort )
throws IOException, UnknownHostException
{
return GetNotSoSecureSSLContext().getSocketFactory().createSocket( sHost, nPort, clientHost, clientPort );
}
public Socket createSocket( final String sHost, final int nPort, final InetAddress aLocalAddress, final int nLocalPort, final HttpConnectionParams params )
throws IOException, UnknownHostException, ConnectTimeoutException
{
if ( params == null )
return createSocket( sHost, nPort, aLocalAddress, nLocalPort );
int nTimeout = params.getConnectionTimeout();
Socket aSocket = GetNotSoSecureSSLContext().getSocketFactory().createSocket();
aSocket.bind( new InetSocketAddress( aLocalAddress, nLocalPort ) );
aSocket.connect( new InetSocketAddress( sHost, nPort ), nTimeout );
return aSocket;
}
public Socket createSocket( String sHost, int nPort )
throws IOException, UnknownHostException
{
return GetNotSoSecureSSLContext().getSocketFactory().createSocket( sHost, nPort );
}
public Socket createSocket( Socket aSocket, String sHost, int nPort, boolean bAutoClose )
throws IOException, UnknownHostException
{
return GetNotSoSecureSSLContext().getSocketFactory().createSocket( aSocket, sHost, nPort, bAutoClose );
}
public boolean equals(Object obj)
{
return ((obj != null) && obj.getClass().equals(WikiProtocolSocketFactory.class));
}
public int hashCode()
{
return WikiProtocolSocketFactory.class.hashCode();
}
};