| /** |
| * 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 org.apache.camel.component.irc; |
| |
| import java.io.IOException; |
| import java.net.SocketException; |
| import java.security.GeneralSecurityException; |
| |
| import javax.net.ssl.SSLContext; |
| import javax.net.ssl.SSLSocket; |
| import javax.net.ssl.SSLSocketFactory; |
| |
| import org.apache.camel.CamelContext; |
| import org.apache.camel.RuntimeCamelException; |
| import org.apache.camel.util.jsse.SSLContextParameters; |
| import org.schwering.irc.lib.ssl.SSLIRCConnection; |
| import org.schwering.irc.lib.ssl.SSLNotSupportedException; |
| |
| /** |
| * Customized version of {@link SSLIRCConnection} used to support the use of an {@link SSLContextParameters} instance |
| * for JSSE configuration. |
| */ |
| public class CamelSSLIRCConnection extends SSLIRCConnection { |
| |
| private SSLContextParameters sslContextParameters; |
| private CamelContext camelContext; |
| |
| public CamelSSLIRCConnection(String host, int portMin, int portMax, String pass, |
| String nick, String username, String realname, |
| SSLContextParameters sslContextParameters) { |
| super(host, portMin, portMax, pass, nick, username, realname); |
| this.sslContextParameters = sslContextParameters; |
| } |
| |
| public CamelSSLIRCConnection(String host, int[] ports, String pass, |
| String nick, String username, String realname, |
| SSLContextParameters sslContextParameters, CamelContext camelContext) { |
| super(host, ports, pass, nick, username, realname); |
| this.sslContextParameters = sslContextParameters; |
| this.camelContext = camelContext; |
| } |
| |
| @Override |
| public void connect() throws IOException { |
| |
| if (sslContextParameters == null) { |
| super.connect(); |
| } else { |
| if (level != 0) { |
| throw new SocketException("Socket closed or already open (" + level + ")"); |
| } |
| |
| IOException exception = null; |
| |
| final SSLContext sslContext; |
| try { |
| sslContext = sslContextParameters.createSSLContext(camelContext); |
| } catch (GeneralSecurityException e) { |
| throw new RuntimeCamelException("Error in SSLContextParameters configuration or instantiation.", e); |
| } |
| |
| final SSLSocketFactory sf = sslContext.getSocketFactory(); |
| |
| SSLSocket s = null; |
| |
| for (int i = 0; i < ports.length && s == null; i++) { |
| try { |
| s = (SSLSocket)sf.createSocket(host, ports[i]); |
| s.startHandshake(); |
| exception = null; |
| } catch (SSLNotSupportedException exc) { |
| if (s != null) { |
| s.close(); |
| } |
| s = null; |
| throw exc; |
| } catch (IOException exc) { |
| if (s != null) { |
| s.close(); |
| } |
| s = null; |
| exception = exc; |
| } |
| } |
| if (exception != null) { |
| throw exception; // connection wasn't successful at any port |
| } |
| |
| prepare(s); |
| } |
| } |
| |
| public SSLContextParameters getSslContextParameters() { |
| return sslContextParameters; |
| } |
| |
| public void setSslContextParameters(SSLContextParameters sslContextParameters) { |
| this.sslContextParameters = sslContextParameters; |
| } |
| } |