Author: dvaleri Date: Tue Nov 15 15:29:04 2011 New Revision: 1202242 URL: http://svn.apache.org/viewvc?rev=1202242&view=rev Log: [CAMEL-4679] [CAMEL-4664] Corrrected URI parsing issues with password and port settings. Added support for JSSE Config Utility.
Added: camel/trunk/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/SslContextParametersCometdProducerConsumerTest.java (with props) camel/trunk/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/SslContextParametersInUriCometdProducerConsumerTest.java (with props) camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/CamelSSLIRCConnection.java (with props) camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcsWithSslContextParamsRouteTest.java (with props) camel/trunk/components/camel-irc/src/test/resources/localhost.ks (with props) camel/trunk/components/camel-irc/src/test/unrealircd/ camel/trunk/components/camel-irc/src/test/unrealircd/ircd.motd (with props) camel/trunk/components/camel-irc/src/test/unrealircd/server.cert.pem (with props) camel/trunk/components/camel-irc/src/test/unrealircd/server.key.pem (with props) camel/trunk/components/camel-irc/src/test/unrealircd/unrealircd.conf (with props) Modified: camel/trunk/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdComponent.java camel/trunk/components/camel-irc/pom.xml camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcComponent.java camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcConfiguration.java camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcEndpoint.java camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcRouteTest.java camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcsRouteTest.java camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java Modified: camel/trunk/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdComponent.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdComponent.java?rev=1202242&r1=1202241&r2=1202242&view=diff ============================================================================== --- camel/trunk/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdComponent.java (original) +++ camel/trunk/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdComponent.java Tue Nov 15 15:29:04 2011 @@ -22,12 +22,17 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import javax.net.ssl.SSLContext; + import org.apache.camel.Endpoint; +import org.apache.camel.RuntimeCamelException; import org.apache.camel.impl.DefaultComponent; +import org.apache.camel.util.jsse.SSLContextParameters; import org.cometd.bayeux.server.BayeuxServer; import org.cometd.bayeux.server.SecurityPolicy; import org.cometd.server.BayeuxServerImpl; import org.cometd.server.CometdServlet; +import org.eclipse.jetty.http.ssl.SslContextFactory; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandlerCollection; @@ -56,6 +61,7 @@ public class CometdComponent extends Def private SslSocketConnector sslSocketConnector; private SecurityPolicy securityPolicy; private List<BayeuxServer.Extension> extensions; + private SSLContextParameters sslContextParameters; class ConnectorRef { Connector connector; @@ -197,16 +203,28 @@ public class CometdComponent extends Def } public synchronized SslSocketConnector getSslSocketConnector() { - if (sslSocketConnector == null) { - sslSocketConnector = new SslSocketConnector(); - // with default null values, jetty ssl system properties - // and console will be read by jetty implementation - sslSocketConnector.getSslContextFactory().setKeyManagerPassword(sslPassword); - sslSocketConnector.getSslContextFactory().setKeyStorePassword(sslKeyPassword); - if (sslKeystore != null) { - sslSocketConnector.getSslContextFactory().setKeyStore(sslKeystore); + if (sslContextParameters != null && sslSocketConnector == null) { + SslContextFactory sslContextFactory = new CometdComponentSslContextFactory(); + try { + sslContextFactory.setSslContext(sslContextParameters.createSSLContext()); + } catch (Exception e) { + throw new RuntimeCamelException("Error initiating SSLContext.", e); + } + sslSocketConnector = new SslSocketConnector(sslContextFactory); + } + else { + if (sslSocketConnector == null) { + sslSocketConnector = new SslSocketConnector(); + // with default null values, jetty ssl system properties + // and console will be read by jetty implementation + sslSocketConnector.getSslContextFactory().setKeyManagerPassword(sslPassword); + sslSocketConnector.getSslContextFactory().setKeyStorePassword(sslKeyPassword); + if (sslKeystore != null) { + sslSocketConnector.getSslContextFactory().setKeyStore(sslKeystore); + } } } + return sslSocketConnector; } @@ -267,6 +285,14 @@ public class CometdComponent extends Def } extensions.add(extension); } + + public SSLContextParameters getSslContextParameters() { + return sslContextParameters; + } + + public void setSslContextParameters(SSLContextParameters sslContextParameters) { + this.sslContextParameters = sslContextParameters; + } protected Server createServer() throws Exception { Server server = new Server(); @@ -292,4 +318,14 @@ public class CometdComponent extends Def protected void doStart() throws Exception { super.doStart(); } + + /** + * Override the key/trust store check method as it does not account for a factory that has + * a pre-configured {@link SSLContext}. + */ + private static final class CometdComponentSslContextFactory extends SslContextFactory { + @Override + public void checkKeyStore() { + } + } } Added: camel/trunk/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/SslContextParametersCometdProducerConsumerTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/SslContextParametersCometdProducerConsumerTest.java?rev=1202242&view=auto ============================================================================== --- camel/trunk/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/SslContextParametersCometdProducerConsumerTest.java (added) +++ camel/trunk/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/SslContextParametersCometdProducerConsumerTest.java Tue Nov 15 15:29:04 2011 @@ -0,0 +1,120 @@ +/** + * 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.cometd; + +import java.util.List; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.AvailablePortFinder; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.apache.camel.util.jsse.KeyManagersParameters; +import org.apache.camel.util.jsse.KeyStoreParameters; +import org.apache.camel.util.jsse.SSLContextParameters; +import org.apache.camel.util.jsse.TrustManagersParameters; +import org.junit.Before; +import org.junit.Test; + +/** + * Unit testing for using a CometdProducer and a CometdConsumer + */ +public class SslContextParametersCometdProducerConsumerTest extends CamelTestSupport { + + private int port; + private String uri; + + @Test + public void testProducer() throws Exception { + Person person = new Person("David", "Greco"); + template.requestBody("direct:input", person); + MockEndpoint ep = (MockEndpoint) context.getEndpoint("mock:test"); + List<Exchange> exchanges = ep.getReceivedExchanges(); + for (Exchange exchange : exchanges) { + Person person1 = (Person) exchange.getIn().getBody(); + assertEquals("David", person1.getName()); + assertEquals("Greco", person1.getSurname()); + } + } + + @Override + @Before + public void setUp() throws Exception { + port = AvailablePortFinder.getNextAvailable(23500); + uri = "cometds://127.0.0.1:" + port + "/service/test?baseResource=file:./target/test-classes/webapp&" + + "timeout=240000&interval=0&maxInterval=30000&multiFrameInterval=1500&jsonCommented=true&logLevel=2"; + + super.setUp(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + KeyStoreParameters ksp = new KeyStoreParameters(); + ksp.setResource("jsse/localhost.ks"); + ksp.setPassword("changeit"); + + KeyManagersParameters kmp = new KeyManagersParameters(); + kmp.setKeyPassword("changeit"); + kmp.setKeyStore(ksp); + + TrustManagersParameters tmp = new TrustManagersParameters(); + tmp.setKeyStore(ksp); + + SSLContextParameters sslContextParameters = new SSLContextParameters(); + sslContextParameters.setKeyManagers(kmp); + sslContextParameters.setTrustManagers(tmp); + + CometdComponent component = (CometdComponent) context.getComponent("cometds"); + component.setSslContextParameters(sslContextParameters); + + from("direct:input").to(uri); + + from(uri).to("mock:test"); + } + }; + } + + public static class Person { + + private String name; + private String surname; + + Person(String name, String surname) { + this.name = name; + this.surname = surname; + } + + public String getName() { + return name; + } + + public String getSurname() { + return surname; + } + + public void setName(String name) { + this.name = name; + } + + public void setSurname(String surname) { + this.surname = surname; + } + } +} Propchange: camel/trunk/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/SslContextParametersCometdProducerConsumerTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: camel/trunk/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/SslContextParametersInUriCometdProducerConsumerTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/SslContextParametersInUriCometdProducerConsumerTest.java?rev=1202242&view=auto ============================================================================== --- camel/trunk/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/SslContextParametersInUriCometdProducerConsumerTest.java (added) +++ camel/trunk/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/SslContextParametersInUriCometdProducerConsumerTest.java Tue Nov 15 15:29:04 2011 @@ -0,0 +1,126 @@ +/** + * 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.cometd; + +import java.util.List; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.impl.JndiRegistry; +import org.apache.camel.test.AvailablePortFinder; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.apache.camel.util.jsse.KeyManagersParameters; +import org.apache.camel.util.jsse.KeyStoreParameters; +import org.apache.camel.util.jsse.SSLContextParameters; +import org.apache.camel.util.jsse.TrustManagersParameters; +import org.junit.Before; +import org.junit.Test; + +/** + * Unit testing for using a CometdProducer and a CometdConsumer + */ +public class SslContextParametersInUriCometdProducerConsumerTest extends CamelTestSupport { + + private int port; + private String uri; + + @Override + protected JndiRegistry createRegistry() throws Exception { + KeyStoreParameters ksp = new KeyStoreParameters(); + ksp.setResource("jsse/localhost.ks"); + ksp.setPassword("changeit"); + + KeyManagersParameters kmp = new KeyManagersParameters(); + kmp.setKeyPassword("changeit"); + kmp.setKeyStore(ksp); + + TrustManagersParameters tmp = new TrustManagersParameters(); + tmp.setKeyStore(ksp); + + SSLContextParameters sslContextParameters = new SSLContextParameters(); + sslContextParameters.setKeyManagers(kmp); + sslContextParameters.setTrustManagers(tmp); + + JndiRegistry registry = super.createRegistry(); + registry.bind("sslContextParameters", sslContextParameters); + return registry; + } + + @Test + public void testProducer() throws Exception { + Person person = new Person("David", "Greco"); + template.requestBody("direct:input", person); + MockEndpoint ep = (MockEndpoint) context.getEndpoint("mock:test"); + List<Exchange> exchanges = ep.getReceivedExchanges(); + for (Exchange exchange : exchanges) { + Person person1 = (Person) exchange.getIn().getBody(); + assertEquals("David", person1.getName()); + assertEquals("Greco", person1.getSurname()); + } + } + + @Override + @Before + public void setUp() throws Exception { + port = AvailablePortFinder.getNextAvailable(23500); + uri = "cometds://127.0.0.1:" + port + "/service/test?baseResource=file:./target/test-classes/webapp&" + + "timeout=240000&interval=0&maxInterval=30000&multiFrameInterval=1500&jsonCommented=true&logLevel=2&" + + "sslContextParameters=#sslContextParameters"; + + super.setUp(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:input").to(uri); + + from(uri).to("mock:test"); + } + }; + } + + public static class Person { + + private String name; + private String surname; + + Person(String name, String surname) { + this.name = name; + this.surname = surname; + } + + public String getName() { + return name; + } + + public String getSurname() { + return surname; + } + + public void setName(String name) { + this.name = name; + } + + public void setSurname(String surname) { + this.surname = surname; + } + } +} Propchange: camel/trunk/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/SslContextParametersInUriCometdProducerConsumerTest.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: camel/trunk/components/camel-irc/pom.xml URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/pom.xml?rev=1202242&r1=1202241&r2=1202242&view=diff ============================================================================== --- camel/trunk/components/camel-irc/pom.xml (original) +++ camel/trunk/components/camel-irc/pom.xml Tue Nov 15 15:29:04 2011 @@ -70,18 +70,4 @@ <scope>test</scope> </dependency> </dependencies> - - <build> - <plugins> - <plugin> - <artifactId>maven-surefire-plugin</artifactId> - <configuration> - <excludes> - <exclude>**/IrcsRouteTest.*</exclude> - </excludes> - </configuration> - </plugin> - </plugins> - </build> - </project> Added: camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/CamelSSLIRCConnection.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/CamelSSLIRCConnection.java?rev=1202242&view=auto ============================================================================== --- camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/CamelSSLIRCConnection.java (added) +++ camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/CamelSSLIRCConnection.java Tue Nov 15 15:29:04 2011 @@ -0,0 +1,111 @@ +/** + * 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.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; + + 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) { + super(host, ports, pass, nick, username, realname); + this.sslContextParameters = sslContextParameters; + } + + @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(); + } 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; + } +} Propchange: camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/CamelSSLIRCConnection.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcComponent.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcComponent.java?rev=1202242&r1=1202241&r2=1202242&view=diff ============================================================================== --- camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcComponent.java (original) +++ camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcComponent.java Tue Nov 15 15:29:04 2011 @@ -21,7 +21,6 @@ import java.util.Map; import org.apache.camel.RuntimeCamelException; import org.apache.camel.impl.DefaultComponent; -import org.apache.camel.util.UnsafeUriCharactersEncoder; import org.schwering.irc.lib.IRCConnection; import org.schwering.irc.lib.IRCEventListener; import org.schwering.irc.lib.ssl.SSLIRCConnection; @@ -66,16 +65,23 @@ public class IrcComponent extends Defaul IRCEventListener ircLogger; if (configuration.getUsingSSL()) { + if (LOG.isDebugEnabled()) { LOG.debug("Creating SSL Connection to {} destination(s): {} nick: {} user: {}", new Object[]{configuration.getHostname(), configuration.getListOfChannels(), configuration.getNickname(), configuration.getUsername()}); } - SSLIRCConnection sconn = new SSLIRCConnection(configuration.getHostname(), configuration.getPorts(), configuration.getPassword(), - configuration.getNickname(), configuration.getUsername(), configuration.getRealname()); - - sconn.addTrustManager(configuration.getTrustManager()); - conn = sconn; + + if (configuration.getSslContextParameters() != null) { + conn = new CamelSSLIRCConnection(configuration.getHostname(), configuration.getPorts(), configuration.getPassword(), + configuration.getNickname(), configuration.getUsername(), configuration.getRealname(), + configuration.getSslContextParameters()); + } else { + SSLIRCConnection sconn = new SSLIRCConnection(configuration.getHostname(), configuration.getPorts(), configuration.getPassword(), + configuration.getNickname(), configuration.getUsername(), configuration.getRealname()); + sconn.addTrustManager(configuration.getTrustManager()); + conn = sconn; + } } else { if (LOG.isDebugEnabled()) { LOG.debug("Creating Connection to {} destination(s): {} nick: {} user: {}", Modified: camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcConfiguration.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcConfiguration.java?rev=1202242&r1=1202241&r2=1202242&view=diff ============================================================================== --- camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcConfiguration.java (original) +++ camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcConfiguration.java Tue Nov 15 15:29:04 2011 @@ -22,19 +22,14 @@ import java.net.URISyntaxException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; -import java.util.Dictionary; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import org.apache.camel.RuntimeCamelException; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.URISupport; import org.apache.camel.util.UnsafeUriCharactersEncoder; +import org.apache.camel.util.jsse.SSLContextParameters; import org.schwering.irc.lib.ssl.SSLDefaultTrustManager; import org.schwering.irc.lib.ssl.SSLTrustManager; import org.slf4j.Logger; @@ -64,6 +59,7 @@ public class IrcConfiguration implements private boolean onPrivmsg = true; private boolean autoRejoin = true; private int[] ports = {6667, 6668, 6669}; + private SSLContextParameters sslContextParameters; public IrcConfiguration() { } @@ -121,9 +117,30 @@ public class IrcConfiguration implements URI uri = new URI(uriStr); - setNickname(uri.getUserInfo()); - setUsername(uri.getUserInfo()); - setRealname(uri.getUserInfo()); + // Because we can get a "sanitized" URI, we need to deal with the situation where the + // user info includes the username and password together or else we get a mangled username + // that includes the user's secret being sent to the server. + String userInfo = uri.getUserInfo(); + String username = null; + String password = null; + if (userInfo != null) { + int colonIndex = userInfo.indexOf(":"); + if (colonIndex != -1) { + username = userInfo.substring(0, colonIndex); + password = userInfo.substring(colonIndex + 1); + } else { + username = userInfo; + } + } + + if (uri.getPort() != -1) { + setPorts(new int[] {uri.getPort()}); + } + + setNickname(username); + setUsername(username); + setRealname(username); + setPassword(password); setHostname(uri.getHost()); String path = uri.getPath(); @@ -314,6 +331,14 @@ public class IrcConfiguration implements public void setAutoRejoin(boolean autoRejoin) { this.autoRejoin = autoRejoin; } + + public SSLContextParameters getSslContextParameters() { + return sslContextParameters; + } + + public void setSslContextParameters(SSLContextParameters sslContextParameters) { + this.sslContextParameters = sslContextParameters; + } public String toString() { return "IrcConfiguration[hostname: " + hostname + ", ports=" + Arrays.toString(ports) + ", username=" + username + "]"; Modified: camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcEndpoint.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcEndpoint.java?rev=1202242&r1=1202241&r2=1202242&view=diff ============================================================================== --- camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcEndpoint.java (original) +++ camel/trunk/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcEndpoint.java Tue Nov 15 15:29:04 2011 @@ -16,8 +16,6 @@ */ package org.apache.camel.component.irc; -import java.util.List; - import org.apache.camel.Exchange; import org.apache.camel.ExchangePattern; import org.apache.camel.Processor; Modified: camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcRouteTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcRouteTest.java?rev=1202242&r1=1202241&r2=1202242&view=diff ============================================================================== --- camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcRouteTest.java (original) +++ camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcRouteTest.java Tue Nov 15 15:29:04 2011 @@ -23,7 +23,6 @@ import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.junit4.CamelTestSupport; -import org.junit.Ignore; import org.junit.Test; /** @@ -35,7 +34,7 @@ public class IrcRouteTest extends CamelT protected String body2 = "Message Two"; private boolean sentMessages; - @Ignore("test manual") + @Test public void testIrcMessages() throws Exception { resultEndpoint = (MockEndpoint) context.getEndpoint("mock:result"); @@ -67,11 +66,11 @@ public class IrcRouteTest extends CamelT } protected String sendUri() { - return "irc://camel-...@irc.codehaus.org:6667/#camel-test?nickname=camel-prd"; + return "irc://camel-prd-u...@irc.codehaus.org:6667/#camel-test?nickname=camel-prd"; } protected String fromUri() { - return "irc://camel-...@irc.codehaus.org:6667/#camel-test?nickname=camel-con"; + return "irc://camel-con-u...@irc.codehaus.org:6667/#camel-test?nickname=camel-con"; } /** Modified: camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcsRouteTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcsRouteTest.java?rev=1202242&r1=1202241&r2=1202242&view=diff ============================================================================== --- camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcsRouteTest.java (original) +++ camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcsRouteTest.java Tue Nov 15 15:29:04 2011 @@ -16,6 +16,9 @@ */ package org.apache.camel.component.irc; +import org.junit.Ignore; + +@Ignore public class IrcsRouteTest extends IrcRouteTest { // TODO This test is disabled until we can find a public SSL enabled IRC Added: camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcsWithSslContextParamsRouteTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcsWithSslContextParamsRouteTest.java?rev=1202242&view=auto ============================================================================== --- camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcsWithSslContextParamsRouteTest.java (added) +++ camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcsWithSslContextParamsRouteTest.java Tue Nov 15 15:29:04 2011 @@ -0,0 +1,68 @@ +/** + * 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 org.apache.camel.impl.JndiRegistry; +import org.apache.camel.util.jsse.KeyStoreParameters; +import org.apache.camel.util.jsse.SSLContextParameters; +import org.apache.camel.util.jsse.TrustManagersParameters; +import org.junit.Ignore; + +@Ignore +public class IrcsWithSslContextParamsRouteTest extends IrcRouteTest { + + // TODO This test is disabled until we can find a public SSL enabled IRC + // server to test against. To use this test, follow the following procedures: + // 1) Download and install UnrealIRCd 3.2.9 from http://www.unrealircd.com/ + // 2) Copy the contents of the src/test/unrealircd folder into the installation + // folder of UnrealIRCd. + // 3) Start UnrealIRCd and execute this test. Often the test executes quicker than + // the IRC server responds and the assertion will fail. In order to get the test to + // pass reliably, you may need to set a break point in IrcEndpoint#joinChanel in order + // to slow the route creation down enough for the event listener to be in place + // when camel-con joins the room. + + @Override + protected JndiRegistry createRegistry() throws Exception { + KeyStoreParameters ksp = new KeyStoreParameters(); + ksp.setResource("localhost.ks"); + ksp.setPassword("changeit"); + + TrustManagersParameters tmp = new TrustManagersParameters(); + tmp.setKeyStore(ksp); + + SSLContextParameters sslContextParameters = new SSLContextParameters(); + sslContextParameters.setTrustManagers(tmp); + + + JndiRegistry registry = super.createRegistry(); + registry.bind("sslContextParameters", sslContextParameters); + + return registry; + } + + @Override + protected String sendUri() { + return "ircs://camel-prd-user@localhost:6669/#camel-test?nickname=camel-prd&password=password&sslContextParameters=#sslContextParameters"; + } + + @Override + protected String fromUri() { + return "ircs://camel-con-user@localhost:6669/#camel-test?nickname=camel-con&password=password&sslContextParameters=#sslContextParameters"; + } + +} \ No newline at end of file Propchange: camel/trunk/components/camel-irc/src/test/java/org/apache/camel/component/irc/IrcsWithSslContextParamsRouteTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: camel/trunk/components/camel-irc/src/test/resources/localhost.ks URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/src/test/resources/localhost.ks?rev=1202242&view=auto ============================================================================== Binary file - no diff available. Propchange: camel/trunk/components/camel-irc/src/test/resources/localhost.ks ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: camel/trunk/components/camel-irc/src/test/unrealircd/ircd.motd URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/src/test/unrealircd/ircd.motd?rev=1202242&view=auto ============================================================================== --- camel/trunk/components/camel-irc/src/test/unrealircd/ircd.motd (added) +++ camel/trunk/components/camel-irc/src/test/unrealircd/ircd.motd Tue Nov 15 15:29:04 2011 @@ -0,0 +1 @@ +Hi! \ No newline at end of file Propchange: camel/trunk/components/camel-irc/src/test/unrealircd/ircd.motd ------------------------------------------------------------------------------ svn:executable = * Added: camel/trunk/components/camel-irc/src/test/unrealircd/server.cert.pem URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/src/test/unrealircd/server.cert.pem?rev=1202242&view=auto ============================================================================== --- camel/trunk/components/camel-irc/src/test/unrealircd/server.cert.pem (added) +++ camel/trunk/components/camel-irc/src/test/unrealircd/server.cert.pem Tue Nov 15 15:29:04 2011 @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICZTCCAc6gAwIBAgIJAKNUHEnxsizpMA0GCSqGSIb3DQEBBQUAMGkxCzAJBgNV +BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHQXNoYnVybjESMBAG +A1UEChMJSVJDIGdlZWtzMQ0wCwYDVQQLEwRJUkNkMRIwEAYDVQQDEwlsb2NhbGhv +c3QwHhcNMTExMTE0MTY0MzM5WhcNMTIxMTEzMTY0MzM5WjBpMQswCQYDVQQGEwJV +UzERMA8GA1UECBMIVmlyZ2luaWExEDAOBgNVBAcTB0FzaGJ1cm4xEjAQBgNVBAoT +CUlSQyBnZWVrczENMAsGA1UECxMESVJDZDESMBAGA1UEAxMJbG9jYWxob3N0MIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqibJ+VZBEgXjDdnD4fJ+1CW+hKs7s +Ndxv0LFQTvS67W/WAZHKxuief4UcR8gVNWGxj2TbvM9wWQGkfzZ+sWhiJY/HjgaY +y9XEh/UtHTZ6pFGY0jp7ZlkNNHMj9qlprGNqz1XcrMghQGlfW7KfZqQ8nOYawjWZ +1Nwvwqs9vLQXiwIDAQABoxUwEzARBglghkgBhvhCAQEEBAMCBkAwDQYJKoZIhvcN +AQEFBQADgYEABvJJnG0Q+iHBU3GOLbZ+kW9TylXvOYa0jlV+rPVcjHi/MwZUPjW2 +0ehllVrsm/NnpLq/H9074rVCr2hPl+rShLeQLghyh0kw2QI+wJtXbtht35F241TL +1kHwODDYx4nclTUR2QT561b3WywECXcPFC49Gp4jv5K77hIcu39jKYA= +-----END CERTIFICATE----- Propchange: camel/trunk/components/camel-irc/src/test/unrealircd/server.cert.pem ------------------------------------------------------------------------------ svn:executable = * Added: camel/trunk/components/camel-irc/src/test/unrealircd/server.key.pem URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/src/test/unrealircd/server.key.pem?rev=1202242&view=auto ============================================================================== --- camel/trunk/components/camel-irc/src/test/unrealircd/server.key.pem (added) +++ camel/trunk/components/camel-irc/src/test/unrealircd/server.key.pem Tue Nov 15 15:29:04 2011 @@ -0,0 +1,16 @@ +-----BEGIN PRIVATE KEY----- +MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKqJsn5VkESBeMN2 +cPh8n7UJb6Eqzuw13G/QsVBO9Lrtb9YBkcrG6J5/hRxHyBU1YbGPZNu8z3BZAaR/ +Nn6xaGIlj8eOBpjL1cSH9S0dNnqkUZjSOntmWQ00cyP2qWmsY2rPVdysyCFAaV9b +sp9mpDyc5hrCNZnU3C/Cqz28tBeLAgMBAAECgYBLJoLRyULZ7XQaLod5+PEoBhB7 +JTIqRVHutDhu+1w9Q4SU+fwVL7Iypl8yJy+0qOF0LYx0iK+hApgGtUh+bA9i+HNK +1t7B87M6Tyy3dT3EwP0MTeDtUqQWEJHi4YgtjiHUdVO+86Y2Kj0b+Pusf2zyRdZO +atYQcJIC3zV956yxgQJBANqZlifOSQUT7aK8sKWYJt/PW2RSKRIIRp14cOhSLqES +T50mBEUIMZfLV5+x7oI9DvLeCuwS1M8MbyZqrHsmfiUCQQDHtwzb/oJjJdiTdx2R +Gemw66RxDWGdfIYEQiZ5UrNCNbXeApBuy570Uxb/cfaSxKDN1oatrM91jOu3IB1E +AxfvAkEA16GfK77h6p9gzyHAQmjXF/kMVuZw2vfM6HKxNYozsvFEFWk11v6hJPIR +ilbTRieCwnHjZkGhKGhEkCmz4Hr0/QJBAKzi1Hn5J6xmzcZSfkDnGrryMoc/Wzp2 +2pkDHsU2B0IQtuB6fce78110NFtrr1U8bCvkQvBDwc/z7vW3Ej6XIvcCQB3YhPif +JMZBlWCX9ouOnequEC9BXybeXcb46hWnkTS+KmjwpEXA0lbBwmOpq7Y7yAbsezuY +xT9i1Ry944+nRLU= +-----END PRIVATE KEY----- Propchange: camel/trunk/components/camel-irc/src/test/unrealircd/server.key.pem ------------------------------------------------------------------------------ svn:executable = * Added: camel/trunk/components/camel-irc/src/test/unrealircd/unrealircd.conf URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-irc/src/test/unrealircd/unrealircd.conf?rev=1202242&view=auto ============================================================================== --- camel/trunk/components/camel-irc/src/test/unrealircd/unrealircd.conf (added) +++ camel/trunk/components/camel-irc/src/test/unrealircd/unrealircd.conf Tue Nov 15 15:29:04 2011 @@ -0,0 +1,184 @@ +loadmodule "modules/commands.dll"; +loadmodule "modules/cloak.dll"; + +include "help.conf"; +include "badwords.channel.conf"; +include "badwords.message.conf"; +include "badwords.quit.conf"; +include "spamfilter.conf"; + +me +{ + name "localhost.net"; + info "FooNet Server"; + numeric 1; +}; + +admin { + "Bob Smith"; + "bob"; + "wid...@used.name"; +}; + +class clients +{ + pingfreq 90; + maxclients 500; + sendq 100000; + recvq 8000; +}; + +allow { + ip *@*; + hostname *@*; + class clients; + password "password"; + maxperip 5; +}; + +allow channel { + channel "#camel-test"; +}; + +listen *:6667 +{ + options + { + clientsonly; + }; +}; + +listen *:6669 +{ + options + { + ssl; + clientsonly; + }; +}; + +files +{ + /* The Message Of The Day shown to users who log in: */ + motd ircd.motd; + + /* + * A short MOTD. If this file exists, it will be displayed to + * the user in place of the MOTD. Users can still view the + * full MOTD by using the /MOTD command. + */ + /* shortmotd ircd.smotd; */ + + /* Shown when an operator /OPERs up */ + /* opermotd oper.motd; */ + + /* Services MOTD append. */ + /* svsmotd ircd.svsmotd; */ + + /* Bot MOTD */ + /* botmotd bot.motd; */ + + /* Shown upon /RULES */ + /* rules ircd.rules; */ + + /* + * Where the IRCd stores and loads a few values which should + * be persistent across server restarts. Must point to an + * existing file which the IRCd has permission to alter or to + * a file in a folder within which the IRCd may create files. + */ + /* tunefile ircd.tune; */ + + /* Where to save the IRCd's pid. Should be writable by the IRCd. */ + /* pidfile ircd.pid; */ +}; + +/* Network configuration */ +set { + network-name "TestNet"; + default-server "irc.roxnet.org"; + services-server "junk.org"; + help-channel "#TestNet"; + hiddenhost-prefix "rox"; + /* prefix-quit "no"; */ + /* Cloak keys should be the same at all servers on the network. + * They are used for generating masked hosts and should be kept secret. + * The keys should be 3 random strings of 5-100 characters + * (10-20 chars is just fine) and must consist of lowcase (a-z), + * upcase (A-Z) and digits (0-9) [see first key example]. + * HINT: On *NIX, you can run './unreal gencloak' in your shell to let + * Unreal generate 3 random strings for you. + */ + cloak-keys { + "aoAr1HnR6gl3sJ7hVz4Zb7x4YwpW"; + "aoAr1HnR6gl3sJ7hVz4Zb7x4YwpD"; + "aoAr1HnR6gl3sJ7hVz4Zb7x4YwpF"; + }; + /* on-oper host */ + hosts { + local "locop.roxnet.org"; + global "ircop.roxnet.org"; + coadmin "coadmin.roxnet.org"; + admin "admin.roxnet.org"; + servicesadmin "csops.roxnet.org"; + netadmin "netadmin.roxnet.org"; + host-on-oper-up "no"; + }; +}; + +/* Server specific configuration */ + +set { + kline-address "s...@mailinator.com"; + modes-on-connect "+xw"; + modes-on-oper "+xwgs"; + oper-auto-join "#opers"; + options { + hide-ulines; + /* You can enable ident checking here if you want */ + /* identd-check; */ + show-connect-info; + }; + + maxchannelsperuser 10; + /* The minimum time a user must be connected before being allowed to use a QUIT message, + * This will hopefully help stop spam */ + anti-spam-quit-message-time 10s; + /* Make the message in static-quit show in all quits - meaning no + custom quits are allowed on local server */ + /* static-quit "Client quit"; */ + + /* You can also block all part reasons by uncommenting this and say 'yes', + * or specify some other text (eg: "Bye bye!") to always use as a comment.. */ + /* static-part yes; */ + + /* This allows you to make certain stats oper only, use * for all stats, + * leave it out to allow users to see all stats. Type '/stats' for a full list. + * Some admins might want to remove the 'kGs' to allow normal users to list + * klines, glines and shuns. + */ + oper-only-stats "okfGsMRUEelLCXzdD"; + + /* Throttling: this example sets a limit of 3 connection attempts per 60s (per host). */ + throttle { + connections 50; + period 60s; + }; + + /* Anti flood protection */ + anti-flood { + nick-flood 3:60; /* 3 nickchanges per 60 seconds (the default) */ + }; + + /* Spam filter */ + spamfilter { + ban-time 1d; /* default duration of a *line ban set by spamfilter */ + ban-reason "Spam/Advertising"; /* default reason */ + virus-help-channel "#help"; /* channel to use for 'viruschan' action */ + /* except "#help"; channel to exempt from filtering */ + }; + ssl { + certificate "C:\Program Files\Unreal3.2\server.cert.pem"; + key "C:\Program Files\Unreal3.2\server.key.pem"; + }; +}; \ No newline at end of file Propchange: camel/trunk/components/camel-irc/src/test/unrealircd/unrealircd.conf ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-irc/src/test/unrealircd/unrealircd.conf ------------------------------------------------------------------------------ svn:executable = * Modified: camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java?rev=1202242&r1=1202241&r2=1202242&view=diff ============================================================================== --- camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java (original) +++ camel/trunk/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailConfiguration.java Tue Nov 15 15:29:04 2011 @@ -24,8 +24,10 @@ import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; +import javax.net.ssl.SSLContext; import org.apache.camel.RuntimeCamelException; +import org.apache.camel.util.jsse.SSLContextParameters; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSenderImpl; @@ -63,6 +65,7 @@ public class MailConfiguration implement private boolean useInlineAttachments; private boolean ignoreUnsupportedCharset; private boolean disconnect; + private SSLContextParameters sslContextParameters; public MailConfiguration() { } @@ -176,8 +179,16 @@ public class MailConfiguration implement // add more debug for the SSL communication as well properties.put("javax.net.debug", "all"); } - - if (dummyTrustManager && isSecureProtocol()) { + + if (sslContextParameters != null && isSecureProtocol()) { + SSLContext sslContext; + try { + sslContext = sslContextParameters.createSSLContext(); + } catch (Exception e) { + throw new RuntimeCamelException("Error initializing SSLContext.", e); + } + properties.put("mail." + protocol + ".socketFactory", sslContext.getSocketFactory()); + } else if (dummyTrustManager && isSecureProtocol()) { // set the custom SSL properties properties.put("mail." + protocol + ".socketFactory.class", "org.apache.camel.component.mail.security.DummySSLSocketFactory"); properties.put("mail." + protocol + ".socketFactory.fallback", "false"); @@ -463,7 +474,7 @@ public class MailConfiguration implement public void setIgnoreUnsupportedCharset(boolean ignoreUnsupportedCharset) { this.ignoreUnsupportedCharset = ignoreUnsupportedCharset; } - + public boolean isDisconnect() { return disconnect; } @@ -471,4 +482,12 @@ public class MailConfiguration implement public void setDisconnect(boolean disconnect) { this.disconnect = disconnect; } + + public SSLContextParameters getSslContextParameters() { + return sslContextParameters; + } + + public void setSslContextParameters(SSLContextParameters sslContextParameters) { + this.sslContextParameters = sslContextParameters; + } }