xref: /AOO41X/main/swext/mediawiki/src/com/sun/star/wiki/WikiProtocolSocketFactory.java (revision e6e6073ddaad3a04a985e8f05823629a884eb203)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package com.sun.star.wiki;
25 
26 import java.io.IOException;
27 import java.net.InetAddress;
28 import java.net.InetSocketAddress;
29 import java.net.Socket;
30 import java.net.UnknownHostException;
31 import java.security.KeyStore;
32 import javax.net.ssl.SSLContext;
33 import javax.net.ssl.TrustManager;
34 import javax.net.ssl.TrustManagerFactory;
35 import javax.net.ssl.X509TrustManager;
36 import java.security.cert.CertificateException;
37 import java.security.cert.X509Certificate;
38 import org.apache.commons.httpclient.ConnectTimeoutException;
39 import org.apache.commons.httpclient.HttpClientError;
40 import org.apache.commons.httpclient.params.HttpConnectionParams;
41 import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
42 
43 class WikiProtocolSocketFactory implements SecureProtocolSocketFactory
44 {
45     private SSLContext m_aSSLContext;
46 
47     public WikiProtocolSocketFactory()
48     {
49         super();
50     }
51 
52     public synchronized SSLContext GetNotSoSecureSSLContext()
53     {
54         if ( m_aSSLContext == null )
55         {
56             TrustManager[] pTrustUnknownCerts = new TrustManager[]
57             {
58                 new X509TrustManager() {
59                     private X509TrustManager m_aOrgTrustManager;
60 
61                     private X509TrustManager GetOrgTrustManager()
62                     {
63                         if ( m_aOrgTrustManager == null )
64                         {
65                             try
66                             {
67                                 TrustManagerFactory aFactory = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm() );
68                                 aFactory.init( (KeyStore)null );
69                                 TrustManager[] pTrustmanagers = aFactory.getTrustManagers();
70                                 if ( pTrustmanagers.length != 0 && pTrustmanagers[0] != null )
71                                     m_aOrgTrustManager = (X509TrustManager)pTrustmanagers[0];
72                             }
73                             catch( Exception e )
74                             {
75                                 throw new RuntimeException( "No access to the default trust manager!" );
76                             }
77                         }
78 
79                         return m_aOrgTrustManager;
80                     }
81 
82                     public X509Certificate[] getAcceptedIssuers()
83                     {
84                         return GetOrgTrustManager().getAcceptedIssuers();
85                     }
86 
87                     public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException
88                     {
89                         GetOrgTrustManager().checkClientTrusted( certs, authType );
90                     }
91 
92                     public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException
93                     {
94                         if ( certs == null || certs.length == 0 )
95                             GetOrgTrustManager().checkServerTrusted( certs, authType );
96                         else
97                             for ( int nInd = 0; nInd < certs.length; nInd++ )
98                                 certs[nInd].checkValidity();
99                     }
100                 }
101             };
102 
103             try
104             {
105                 SSLContext aContext = SSLContext.getInstance("SSL");
106                 if ( aContext != null )
107                 {
108                     aContext.init( null, pTrustUnknownCerts, null );
109                     m_aSSLContext = aContext;
110                 }
111             }
112             catch ( Exception e )
113             {
114             }
115         }
116 
117         if ( m_aSSLContext == null )
118             throw new HttpClientError();
119 
120         return m_aSSLContext;
121     }
122 
123     public Socket createSocket( String sHost, int nPort, InetAddress clientHost, int clientPort )
124         throws IOException, UnknownHostException
125     {
126         return GetNotSoSecureSSLContext().getSocketFactory().createSocket( sHost, nPort, clientHost, clientPort );
127     }
128 
129     public Socket createSocket( final String sHost, final int nPort, final InetAddress aLocalAddress, final int nLocalPort, final HttpConnectionParams params )
130         throws IOException, UnknownHostException, ConnectTimeoutException
131     {
132         if ( params == null )
133             return createSocket( sHost, nPort, aLocalAddress, nLocalPort );
134 
135         int nTimeout = params.getConnectionTimeout();
136         Socket aSocket = GetNotSoSecureSSLContext().getSocketFactory().createSocket();
137         aSocket.bind( new InetSocketAddress( aLocalAddress, nLocalPort ) );
138         aSocket.connect( new InetSocketAddress( sHost, nPort ), nTimeout );
139         return aSocket;
140     }
141 
142     public Socket createSocket( String sHost, int nPort )
143         throws IOException, UnknownHostException
144     {
145         return GetNotSoSecureSSLContext().getSocketFactory().createSocket( sHost, nPort );
146     }
147 
148     public Socket createSocket( Socket aSocket, String sHost, int nPort, boolean bAutoClose )
149         throws IOException, UnknownHostException
150     {
151         return GetNotSoSecureSSLContext().getSocketFactory().createSocket( aSocket, sHost, nPort, bAutoClose );
152     }
153 
154     public boolean equals(Object obj)
155     {
156         return ((obj != null) && obj.getClass().equals(WikiProtocolSocketFactory.class));
157     }
158 
159     public int hashCode()
160     {
161         return WikiProtocolSocketFactory.class.hashCode();
162     }
163 };
164 
165