/**
* 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.xmpp;
import java.io.InputStream;
import java.net.InetAddress;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.util.Arrays;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.test.AvailablePortFinder;
import org.apache.camel.util.ObjectHelper;
import org.apache.vysper.mina.TCPEndpoint;
import org.apache.vysper.storage.StorageProviderRegistry;
import org.apache.vysper.storage.inmemory.MemoryStorageProviderRegistry;
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.addressing.EntityImpl;
import org.apache.vysper.xmpp.authorization.AccountManagement;
import org.apache.vysper.xmpp.authorization.Anonymous;
import org.apache.vysper.xmpp.authorization.SASLMechanism;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.MUCModule;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Conference;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.RoomType;
import org.apache.vysper.xmpp.server.XMPPServer;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jxmpp.jid.impl.JidCreate;
public final class EmbeddedXmppTestServer {
private static EmbeddedXmppTestServer instance;
private XMPPServer xmppServer;
private TCPEndpoint endpoint;
private int port;
// restricted to singleton
private EmbeddedXmppTestServer() { }
public static EmbeddedXmppTestServer instance() {
if (instance == null) {
instance = new EmbeddedXmppTestServer();
instance.initializeXmppServer();
}
return instance;
}
private void initializeXmppServer() {
try {
if (xmppServer == null) {
xmppServer = new XMPPServer("apache.camel");
StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();
AccountManagement accountManagement = (AccountManagement) providerRegistry.retrieve(AccountManagement.class);
Entity user = EntityImpl.parseUnchecked("camel_consumer@apache.camel");
accountManagement.addUser(user, "secret");
Entity user2 = EntityImpl.parseUnchecked("camel_producer@apache.camel");
accountManagement.addUser(user2, "secret");
Entity user3 = EntityImpl.parseUnchecked("camel_producer1@apache.camel");
accountManagement.addUser(user3, "secret");
xmppServer.setStorageProviderRegistry(providerRegistry);
if (endpoint == null) {
endpoint = new TCPEndpoint();
this.port = AvailablePortFinder.getNextAvailable(5222);
endpoint.setPort(port);
}
xmppServer.addEndpoint(endpoint);
InputStream stream = ObjectHelper.loadResourceAsStream("xmppServer.jks");
xmppServer.setTLSCertificateInfo(stream, "secret");
// allow anonymous logins
xmppServer.setSASLMechanisms(Arrays.asList(new SASLMechanism[]{new Anonymous()}));
xmppServer.start();
// add the multi-user chat module and create a few test rooms
Conference conference = new Conference("test conference");
conference.createRoom(EntityImpl.parseUnchecked("camel-anon@apache.camel"), "camel-anon", RoomType.FullyAnonymous);
conference.createRoom(EntityImpl.parseUnchecked("camel-test@apache.camel"), "camel-test", RoomType.Public);
xmppServer.addModule(new MUCModule("conference", conference));
}
} catch (Exception e) {
throw new RuntimeException("An error occurred when initializing the XMPP Test Server.", e);
}
}
public void startXmppEndpoint() throws Exception {
endpoint.start();
}
public void stopXmppEndpoint() {
endpoint.stop();
}
public int getXmppPort() {
return port;
}
public void bindSSLContextTo(JndiRegistry registry) throws Exception {
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(ObjectHelper.loadResourceAsStream("xmppServer.jks"), "secret".toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
ConnectionConfiguration connectionConfig = XMPPTCPConnectionConfiguration.builder()
.setXmppDomain(JidCreate.domainBareFrom("apache.camel"))
.setHostAddress(InetAddress.getLocalHost())
.setPort(getXmppPort())
.setCustomSSLContext(sslContext)
.setHostnameVerifier((hostname, session) -> true)
.build();
registry.bind("customConnectionConfig", connectionConfig);
}
}