You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ng...@apache.org on 2011/01/05 00:19:38 UTC
svn commit: r1055240 - in /mina/vysper/trunk/server:
core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/
core/src/main/java/org/apache/vysper/xmpp/protocol/
core/src/main/java/org/apache/vysper/xmpp/server/ core/src/tes...
Author: ngn
Date: Tue Jan 4 23:19:37 2011
New Revision: 1055240
URL: http://svn.apache.org/viewvc?rev=1055240&view=rev
Log:
Adding support for XMPP over web sockets (VYSPER-258)
Added:
mina/vysper/trunk/server/extensions/websockets/
mina/vysper/trunk/server/extensions/websockets/pom.xml
mina/vysper/trunk/server/extensions/websockets/src/
mina/vysper/trunk/server/extensions/websockets/src/examples/
mina/vysper/trunk/server/extensions/websockets/src/examples/client/
mina/vysper/trunk/server/extensions/websockets/src/examples/client/client.html
mina/vysper/trunk/server/extensions/websockets/src/examples/java/
mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/
mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/
mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/
mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/
mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/
mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/websockets/
mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/websockets/DemoServer.java
mina/vysper/trunk/server/extensions/websockets/src/main/
mina/vysper/trunk/server/extensions/websockets/src/main/java/
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/ServerMain.java
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsBackedSessionContext.java
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsEndpoint.java
mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebsocketsServlet.java
mina/vysper/trunk/server/extensions/websockets/src/main/resources/
mina/vysper/trunk/server/extensions/websockets/src/test/
mina/vysper/trunk/server/extensions/websockets/src/test/java/
mina/vysper/trunk/server/extensions/websockets/src/test/resources/
mina/vysper/trunk/server/extensions/websockets/src/test/resources/bogus_mina_tls.cert (with props)
mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore (with props)
mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore-README.txt
mina/vysper/trunk/server/extensions/websockets/src/test/resources/log4j.properties
Modified:
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java
mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/authorization/PlainTestCase.java
mina/vysper/trunk/server/extensions/pom.xml
Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java?rev=1055240&r1=1055239&r2=1055240&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java Tue Jan 4 23:19:37 2011
@@ -30,6 +30,7 @@ import org.apache.vysper.xmpp.protocol.S
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.SessionContext.SessionTerminationCause;
import org.apache.vysper.xmpp.server.s2s.XMPPServerConnector;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
@@ -111,11 +112,11 @@ public class DbVerifyHandler implements
builder.addAttribute("to", otherServer.getDomain());
builder.addAttribute("type", resultType);
- dialbackSessionContext.write(builder.build());
+ dialbackSessionContext.getResponseWriter().write(builder.build());
// }
// close this session as we are now done checking dialback
- sessionContext.close();
+ sessionContext.endSession(SessionTerminationCause.CLIENT_BYEBYE);
return null;
}
}
Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java?rev=1055240&r1=1055239&r2=1055240&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java Tue Jan 4 23:19:37 2011
@@ -89,7 +89,7 @@ public class ProtocolWorker implements S
throw new RuntimeException("cannot process NULL stanzas");
StanzaHandler stanzaHandler = serverRuntimeContext.getHandler(stanza);
-
+System.out.println(stanzaHandler);
if (stanzaHandler == null) {
responseWriter.handleUnsupportedStanzaType(sessionContext, stanza);
return;
Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java?rev=1055240&r1=1055239&r2=1055240&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java Tue Jan 4 23:19:37 2011
@@ -158,7 +158,6 @@ public abstract class AbstractSessionCon
// unbind session and remove from registry
serverRuntimeContext.getResourceRegistry().unbindSession(this);
-
sessionStateHolder.setState(SessionState.CLOSED); // no more traffic
// TODO close underlying transport (TCP socket)
Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java?rev=1055240&r1=1055239&r2=1055240&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java Tue Jan 4 23:19:37 2011
@@ -29,7 +29,7 @@ import org.apache.vysper.xmpp.writer.Sta
*
* @author The Apache MINA Project (dev@mina.apache.org)
*/
-public interface SessionContext extends StanzaWriter {
+public interface SessionContext {
static final String SESSION_ATTRIBUTE_MESSAGE_STANZA_NO_RECEIVE = "stanza.message.no_receive";
Modified: mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/authorization/PlainTestCase.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/authorization/PlainTestCase.java?rev=1055240&r1=1055239&r2=1055240&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/authorization/PlainTestCase.java (original)
+++ mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/authorization/PlainTestCase.java Tue Jan 4 23:19:37 2011
@@ -93,6 +93,11 @@ public class PlainTestCase extends TestC
assertNotNull(response.getSingleInnerElementsNamed(failureType));
assert stateHolder.getState() != SessionState.AUTHENTICATED;
}
+
+ public static void main(String[] args) {
+ PlainTestCase plain = new PlainTestCase();
+ System.out.println(plain.encode("user1@vysper.org", "password1"));
+ }
private String encode(String username, String password) {
return new String(Base64.encodeBase64(('\0' + username + '\0' + password).getBytes()));
Modified: mina/vysper/trunk/server/extensions/pom.xml
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/pom.xml?rev=1055240&r1=1055239&r2=1055240&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/pom.xml (original)
+++ mina/vysper/trunk/server/extensions/pom.xml Tue Jan 4 23:19:37 2011
@@ -34,6 +34,7 @@
<module>xep0060-pubsub</module>
<module>xep0045-muc</module>
<module>xep0124-xep0206-bosh</module>
+ <module>websockets</module>
</modules>
<profiles>
@@ -44,6 +45,7 @@
<module>xep0045-muc</module>
<module>xep0045-muc-inttest</module>
<module>xep0124-xep0206-bosh</module>
+ <module>websockets</module>
</modules>
</profile>
</profiles>
Added: mina/vysper/trunk/server/extensions/websockets/pom.xml
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/pom.xml?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/pom.xml (added)
+++ mina/vysper/trunk/server/extensions/websockets/pom.xml Tue Jan 4 23:19:37 2011
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <!--
+ 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.
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <artifactId>vysper-extensions</artifactId>
+ <groupId>org.apache.vysper</groupId>
+ <version>0.7-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.vysper.extensions</groupId>
+ <artifactId>websockets</artifactId>
+ <name>Apache Vysper Websockets support</name>
+ <version>0.7-SNAPSHOT</version>
+
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.vysper</groupId>
+ <artifactId>spec-compliance</artifactId>
+ <optional>true</optional>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.vysper</groupId>
+ <artifactId>vysper-core</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-websocket</artifactId>
+ <version>7.2.1.v20101111</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-servlet</artifactId>
+ <version>7.2.1.v20101111</version>
+ </dependency>
+
+ <!-- Runtime dependencies -->
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+
+ <!-- Test dependencies -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ <version>4.0.1</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+</project>
Added: mina/vysper/trunk/server/extensions/websockets/src/examples/client/client.html
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/examples/client/client.html?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/examples/client/client.html (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/examples/client/client.html Tue Jan 4 23:19:37 2011
@@ -0,0 +1,43 @@
+<html>
+ <head>
+ <script>
+ // This is a very simple client just to demo the technology
+
+ String.prototype.contains = function(it) { return this.indexOf(it) != -1; };
+
+ var streamStart = "<stream:stream from='user1@vysper.org' to='user2@vysper.org' version='1.0' xml:lang='en' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>"
+
+ var socket = new WebSocket("ws://localhost:8080/ws/ws", "xmpp");
+ socket.onopen = function(){
+ socket.send(streamStart)
+
+ }
+ socket.onmessage = function(msg){
+ var stanza = msg.data
+
+ console.log(stanza)
+ if(stanza.contains("<stream:features")) {
+ if(stanza.contains("<mechanism>PLAIN</mechanism>")) {
+ // SASL
+ socket.send("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>AHVzZXIxQHZ5c3Blci5vcmcAcGFzc3dvcmQx</auth>")
+ } else if(stanza.contains("<bind")) {
+ // resource binding
+ socket.send("<iq id='tn281v37' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/></iq>")
+ }
+ } else if(stanza.contains("<success")) {
+ // SASL success, restart stream
+ socket.send(streamStart)
+ } else if(stanza.contains("<iq")) {
+ if(stanza.contains("<bind")) {
+ // resource binding complete, off we go
+ // socket.send("<message to='protocol7@jabber.org'><body>Hello world</body></message>")
+ socket.close();
+ }
+ }
+ }
+
+ </script>
+ </head>
+<body>
+</body>
+</html>
Added: mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/websockets/DemoServer.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/websockets/DemoServer.java?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/websockets/DemoServer.java (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/websockets/DemoServer.java Tue Jan 4 23:19:37 2011
@@ -0,0 +1,112 @@
+/*
+ * 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.vysper.xmpp.extension.websockets;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+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.EntityFormatException;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.authorization.AccountCreationException;
+import org.apache.vysper.xmpp.authorization.AccountManagement;
+import org.apache.vysper.xmpp.modules.extension.xep0049_privatedata.PrivateDataModule;
+import org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp.VcardTempModule;
+import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule;
+import org.apache.vysper.xmpp.modules.extension.xep0119_xmppping.XmppPingModule;
+import org.apache.vysper.xmpp.modules.extension.xep0202_entity_time.EntityTimeModule;
+import org.apache.vysper.xmpp.server.XMPPServer;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.ResourceHandler;
+import org.eclipse.jetty.server.nio.SelectChannelConnector;
+
+/**
+ * starts the server as a standalone application
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class DemoServer {
+
+ /**
+ *
+ * @param args
+ */
+ public static void main(String[] args) throws AccountCreationException, EntityFormatException, FileNotFoundException {
+
+ // choose the storage you want to use
+ //StorageProviderRegistry providerRegistry = new JcrStorageProviderRegistry();
+ StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();
+
+ final AccountManagement accountManagement = (AccountManagement) providerRegistry
+ .retrieve(AccountManagement.class);
+
+ if (!accountManagement.verifyAccountExists(EntityImpl.parse("user1@vysper.org"))) {
+ accountManagement.addUser("user1@vysper.org", "password1");
+ }
+ if (!accountManagement.verifyAccountExists(EntityImpl.parse("user2@vysper.org"))) {
+ accountManagement.addUser("user2@vysper.org", "password1");
+ }
+ if (!accountManagement.verifyAccountExists(EntityImpl.parse("user3@vysper.org"))) {
+ accountManagement.addUser("user3@vysper.org", "password1");
+ }
+
+ Server jetty = new Server();
+ Connector connector = new SelectChannelConnector();
+ connector.setPort(8080);
+ jetty.addConnector(connector);
+
+ XMPPServer server = new XMPPServer("vysper.org");
+ // example of how you can combine Vysper with other resources
+ ResourceHandler resourceHandler = new ResourceHandler();
+ resourceHandler.setResourceBase("src/examples/client");
+ jetty.setHandler(resourceHandler);
+
+ server.addEndpoint(new TCPEndpoint());
+
+ WebsocketsEndpoint wsEndpoint = new WebsocketsEndpoint();
+
+ // provide our custom server to have the ResourceHandler added
+ wsEndpoint.setServer(jetty);
+ // wsEndpoint.setSSLEnabled(true);
+ // wsEndpoint.setSSLCertificateKeystore("src/test/resources/keystore.jks", "password");
+ wsEndpoint.setContextPath("/ws");
+ server.addEndpoint(wsEndpoint);
+
+ server.setStorageProviderRegistry(providerRegistry);
+
+ server.setTLSCertificateInfo(new File("src/test/resources/bogus_mina_tls.cert"), "boguspw");
+
+ try {
+ server.start();
+ System.out.println("vysper server is running...");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ server.addModule(new SoftwareVersionModule());
+ server.addModule(new EntityTimeModule());
+ server.addModule(new VcardTempModule());
+ server.addModule(new XmppPingModule());
+ server.addModule(new PrivateDataModule());
+ }
+}
Added: mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/ServerMain.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/ServerMain.java?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/ServerMain.java (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/ServerMain.java Tue Jan 4 23:19:37 2011
@@ -0,0 +1,143 @@
+/*
+ * 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.vysper.xmpp.extension.websockets;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.List;
+
+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.EntityFormatException;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.authorization.AccountCreationException;
+import org.apache.vysper.xmpp.authorization.AccountManagement;
+import org.apache.vysper.xmpp.modules.Module;
+import org.apache.vysper.xmpp.modules.extension.xep0049_privatedata.PrivateDataModule;
+import org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp.VcardTempModule;
+import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule;
+import org.apache.vysper.xmpp.modules.extension.xep0119_xmppping.XmppPingModule;
+import org.apache.vysper.xmpp.modules.extension.xep0202_entity_time.EntityTimeModule;
+import org.apache.vysper.xmpp.server.XMPPServer;
+
+/**
+ * starts the server as a standalone application
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class ServerMain {
+
+ /**
+ * boots the server as a standalone application
+ *
+ * adding a module from the command line:
+ * using a runtime property, one or more modules can be specified, like this:
+ * -Dvysper.add.module=org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PublishSubscribeModule,... more ...
+ *
+ * @param args
+ */
+ public static void main(String[] args) throws AccountCreationException, EntityFormatException, FileNotFoundException {
+
+ String addedModuleProperty = System.getProperty("vysper.add.module");
+ List<Module> listOfModules = null;
+ if (addedModuleProperty != null) {
+ String[] moduleClassNames = addedModuleProperty.split(",");
+ listOfModules = createModuleInstances(moduleClassNames);
+ }
+
+ // choose the storage you want to use
+ //StorageProviderRegistry providerRegistry = new JcrStorageProviderRegistry();
+ StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();
+
+ final AccountManagement accountManagement = (AccountManagement) providerRegistry
+ .retrieve(AccountManagement.class);
+
+ if (!accountManagement.verifyAccountExists(EntityImpl.parse("user1@vysper.org"))) {
+ accountManagement.addUser("user1@vysper.org", "password1");
+ }
+ if (!accountManagement.verifyAccountExists(EntityImpl.parse("user2@vysper.org"))) {
+ accountManagement.addUser("user2@vysper.org", "password1");
+ }
+ if (!accountManagement.verifyAccountExists(EntityImpl.parse("user3@vysper.org"))) {
+ accountManagement.addUser("user3@vysper.org", "password1");
+ }
+
+ XMPPServer server = new XMPPServer("vysper.org");
+
+ server.addEndpoint(new TCPEndpoint());
+
+ WebsocketsEndpoint wsEndpoint = new WebsocketsEndpoint();
+// wsEndpoint.setSSLEnabled(true);
+// wsEndpoint.setSSLCertificateKeystore("src/test/resources/keystore.jks", "password");
+ wsEndpoint.setContextPath("/ws");
+ server.addEndpoint(wsEndpoint);
+
+ server.setStorageProviderRegistry(providerRegistry);
+
+ server.setTLSCertificateInfo(new File("src/test/resources/bogus_mina_tls.cert"), "boguspw");
+
+ try {
+ server.start();
+ System.out.println("vysper server is running...");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ server.addModule(new SoftwareVersionModule());
+ server.addModule(new EntityTimeModule());
+ server.addModule(new VcardTempModule());
+ server.addModule(new XmppPingModule());
+ server.addModule(new PrivateDataModule());
+
+ if (listOfModules != null) {
+ for (Module module : listOfModules) {
+ server.addModule(module);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static List<Module> createModuleInstances(String[] moduleClassNames) {
+ List<Module> modules = new ArrayList<Module>();
+
+ for (String moduleClassName : moduleClassNames) {
+ Class<Module> moduleClass;
+ try {
+ moduleClass = (Class<Module>) Class.forName(moduleClassName);
+ } catch (ClassCastException e) {
+ System.err.println("not a Vysper module class: " + moduleClassName);
+ continue;
+ } catch (ClassNotFoundException e) {
+ System.err.println("could not load module class " + moduleClassName);
+ continue;
+ }
+ try {
+ Module module = moduleClass.newInstance();
+ modules.add(module);
+ } catch (Exception e) {
+ System.err.println("failed to instantiate module class " + moduleClassName);
+ continue;
+ }
+ }
+ return modules;
+ }
+}
Added: mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsBackedSessionContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsBackedSessionContext.java?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsBackedSessionContext.java (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsBackedSessionContext.java Tue Jan 4 23:19:37 2011
@@ -0,0 +1,158 @@
+/*
+ * 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.vysper.xmpp.extension.websockets;
+
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.vysper.mina.codec.StanzaBuilderFactory;
+import org.apache.vysper.xml.decoder.XMPPContentHandler;
+import org.apache.vysper.xml.decoder.XMPPContentHandler.StanzaListener;
+import org.apache.vysper.xml.fragment.Renderer;
+import org.apache.vysper.xml.fragment.XMLElement;
+import org.apache.vysper.xml.sax.NonBlockingXMLReader;
+import org.apache.vysper.xml.sax.impl.DefaultNonBlockingXMLReader;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
+import org.apache.vysper.xmpp.server.AbstractSessionContext;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.response.ServerErrorResponses;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.writer.StanzaWriter;
+import org.eclipse.jetty.websocket.WebSocket;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+
+/**
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class WebsocketsBackedSessionContext extends AbstractSessionContext implements WebSocket, StanzaListener, StanzaWriter {
+
+ private final static Charset CHARSET = Charset.forName("UTF-8");
+ private final static CharsetDecoder CHARSET_DECODER = CHARSET.newDecoder();
+
+ private final static Logger LOG = LoggerFactory.getLogger(WebsocketsBackedSessionContext.class);
+
+ private Outbound outbound;
+ private NonBlockingXMLReader xmlReader = new DefaultNonBlockingXMLReader();
+
+ public WebsocketsBackedSessionContext(ServerRuntimeContext serverRuntimeContext,
+ SessionStateHolder sessionStateHolder) {
+ super(serverRuntimeContext, sessionStateHolder);
+
+ XMPPContentHandler contentHandler = new XMPPContentHandler(new StanzaBuilderFactory());
+ contentHandler.setListener(this);
+
+ try {
+ // we need to check the jabber:client/jabber:server NS declarations
+ xmlReader.setFeature(DefaultNonBlockingXMLReader.FEATURE_NAMESPACE_PREFIXES, true);
+ // allow parser to restart XML stream
+ xmlReader.setFeature(DefaultNonBlockingXMLReader.FEATURE_RESTART_ALLOWED, true);
+ xmlReader.setProperty(DefaultNonBlockingXMLReader.PROPERTY_RESTART_QNAME, "stream:stream");
+ } catch (SAXException e) {
+ // should never happen
+ throw new RuntimeException(e);
+ }
+
+ xmlReader.setContentHandler(contentHandler);
+ }
+
+ public StanzaWriter getResponseWriter() {
+ return this;
+ }
+
+ public void switchToTLS(boolean delayed, boolean clientTls) {
+ // n/a
+ }
+
+ public void setIsReopeningXMLStream() {
+ // n/a
+ }
+
+ public void onConnect(Outbound outbound) {
+ LOG.info("WebSocket client connected");
+ this.outbound = outbound;
+
+ // set to encrypted to skip TLS
+ sessionStateHolder.setState(SessionState.ENCRYPTED);
+ }
+
+ public void onMessage(byte frame, String data) {
+ LOG.info("< " + data);
+ try {
+ xmlReader.parse(IoBuffer.wrap(data.getBytes(CHARSET)), CHARSET_DECODER);
+ } catch (IOException e) {
+ // should never happen since we read from a string
+ throw new RuntimeException(e);
+ } catch (SAXException e) {
+ Stanza errorStanza = ServerErrorResponses.getInstance().getStreamError(StreamErrorCondition.XML_NOT_WELL_FORMED,
+ getXMLLang(), "Stanza not well-formed", null);
+ write(errorStanza);
+ endSession(SessionTerminationCause.STREAM_ERROR);
+ }
+ }
+
+
+ public void onDisconnect() {
+ LOG.info("WebSocket client disconnected");
+ endSession(SessionTerminationCause.CONNECTION_ABORT);
+ }
+
+ public void stanza(XMLElement element) {
+ // on parsed stanzas
+ serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, this, (Stanza) element, sessionStateHolder);
+ }
+
+ public void write(Stanza stanza) {
+ // handle stream open
+ Renderer renderer = new Renderer(stanza);
+ String xml;
+ if("stream".equals(stanza.getName()) && NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS.equals(stanza.getNamespaceURI())) {
+ xml = renderer.getOpeningElement() + renderer.getElementContent();
+ } else {
+ xml = renderer.getComplete();
+ }
+ try {
+ LOG.info("> " + xml);
+ outbound.sendMessage(xml);
+ } catch (IOException e) {
+ // communication with client broken, close session
+ endSession(SessionTerminationCause.CONNECTION_ABORT);
+ }
+ }
+
+ public void close() {
+ // TODO how to handle?
+ }
+
+ public void onMessage(byte frame, byte[] data, int offset, int length) {
+ // binary data, should not happen, ignore
+ }
+
+ public void onFragment(boolean more, byte opcode, byte[] data, int offset, int length) {
+ System.out.println("onFragment");
+ }
+}
Added: mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsEndpoint.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsEndpoint.java?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsEndpoint.java (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsEndpoint.java Tue Jan 4 23:19:37 2011
@@ -0,0 +1,190 @@
+/*
+ * 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.vysper.xmpp.extension.websockets;
+
+import java.io.IOException;
+
+import org.apache.vysper.xmpp.server.Endpoint;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.HandlerCollection;
+import org.eclipse.jetty.server.nio.SelectChannelConnector;
+import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Allows HTTP clients to communicate via the WebSocket protocol with Vysper.
+ * <p>
+ * See http://tools.ietf.org/html/draft-moffitt-xmpp-over-websocket-00
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class WebsocketsEndpoint implements Endpoint {
+
+ protected final static Logger logger = LoggerFactory.getLogger(WebsocketsEndpoint.class);
+
+ protected ServerRuntimeContext serverRuntimeContext;
+
+ protected int port = 8080;
+
+ protected Server server;
+
+ protected boolean isSSLEnabled;
+
+ protected String sslKeystorePath;
+
+ protected String sslKeystorePassword;
+
+ protected String contextPath = "/";
+
+ public void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext) {
+ this.serverRuntimeContext = serverRuntimeContext;
+ }
+
+ /**
+ * Setter for the listen port
+ * @param port
+ */
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ /**
+ * Configures the SSL keystore
+ * <p>
+ * Required if SSL is enabled. Also, setting the keystore password is
+ * required.
+ * @see #setSSLCertificateKeystorePassword
+ * @param keystorePath the path to the Java keystore
+ */
+ public void setSSLCertificateKeystore(String keystorePath, String password) {
+ sslKeystorePath = keystorePath;
+ sslKeystorePassword = password;
+ }
+
+ /**
+ * Enables/disables SSL for this endpoint.
+ * <p>
+ * If SSL is enabled it requires SSL certificate information that can be
+ * configured with {@link #setSSLCertificateInfo(String, String)}
+ * @param value
+ */
+ public void setSSLEnabled(boolean value) {
+ isSSLEnabled = value;
+ }
+
+ /**
+ * Determines the context URI where the BOSH transport will be accessible.
+ * The default is as 'root context' under '/'.
+ * @param contextPath
+ */
+ public void setContextPath(String contextPath) {
+ if (contextPath == null) contextPath = "/";
+ this.contextPath = contextPath;
+ }
+
+ /**
+ * Provide a custom Jetty Server
+ * @param server
+ */
+ public void setServer(Server server) {
+ this.server = server;
+ }
+
+ /**
+ * create a basic Jetty server including a connector on the configured port
+ * override in subclass to create a different kind of setup or to reuse an existing instance
+ * @return
+ */
+ protected Server createJettyServer() {
+ Server server = new Server();
+
+ Connector connector;
+ if (isSSLEnabled) {
+ SslSelectChannelConnector sslConnector = new SslSelectChannelConnector();
+ sslConnector.setKeystore(sslKeystorePath);
+ sslConnector.setPassword(sslKeystorePassword);
+ sslConnector.setKeyPassword(sslKeystorePassword);
+ connector = sslConnector;
+ } else {
+ connector = new SelectChannelConnector();
+ }
+ connector.setPort(port);
+ server.setConnectors(new Connector[] { connector });
+ return server;
+ }
+
+ /**
+ * create handler for BOSH.
+ * for a different handler setup, override in a subclass.
+ * for more than one handler, add them to a org.eclipse.jetty.server.handler.ContextHandlerCollection
+ * and return the collection
+ * @return
+ */
+ protected Handler createHandler() {
+ ServletContextHandler boshContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
+ boshContext.setContextPath(contextPath);
+
+ XmppWebsocketsServlet boshServlet = new XmppWebsocketsServlet(serverRuntimeContext);
+ boshContext.addServlet(new ServletHolder(boshServlet), "/ws");
+
+ return boshContext;
+ }
+
+ /**
+ * @throws IOException
+ * @throws RuntimeException a wrapper of the possible
+ * {@link java.lang.Exception} that Jetty can throw at start-up
+ */
+ public void start() throws IOException {
+ HandlerCollection handlers = new HandlerCollection();
+ if(server != null) {
+ Handler handler = server.getHandler();
+ if(handler != null) {
+ handlers.addHandler(handler);
+ }
+ } else {
+ server = createJettyServer();
+ }
+ Handler handler = createHandler();
+ handlers.addHandler(handler);
+
+ server.setHandler(handlers);
+ try {
+ server.start();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void stop() {
+ try {
+ server.stop();
+ } catch (Exception e) {
+ logger.warn("Could not stop the Jetty server", e);
+ }
+ }
+
+}
Added: mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebsocketsServlet.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebsocketsServlet.java?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebsocketsServlet.java (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebsocketsServlet.java Tue Jan 4 23:19:37 2011
@@ -0,0 +1,59 @@
+/*
+ * 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.vysper.xmpp.extension.websockets;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.eclipse.jetty.websocket.WebSocket;
+import org.eclipse.jetty.websocket.WebSocketServlet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class XmppWebsocketsServlet extends WebSocketServlet {
+
+ private final static Logger LOG = LoggerFactory.getLogger(XmppWebsocketsServlet.class);
+
+ private static final long serialVersionUID = 197413099255392883L;
+ private static final String SUB_PROTOCOL = "xmpp";
+
+ private final ServerRuntimeContext serverRuntimeContext;
+
+ public XmppWebsocketsServlet(ServerRuntimeContext serverRuntimeContext) {
+ this.serverRuntimeContext = serverRuntimeContext;
+ }
+
+
+ protected WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
+ if(SUB_PROTOCOL.equals(protocol)) {
+ SessionStateHolder sessionStateHolder = new SessionStateHolder();
+ WebsocketsBackedSessionContext sessionContext = new WebsocketsBackedSessionContext(serverRuntimeContext, sessionStateHolder);
+ return sessionContext;
+ } else {
+ LOG.warn("Unsupported WebSocket sub protocol, must be \"xmpp\"");
+ return null;
+ }
+ }
+}
Added: mina/vysper/trunk/server/extensions/websockets/src/test/resources/bogus_mina_tls.cert
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/test/resources/bogus_mina_tls.cert?rev=1055240&view=auto
==============================================================================
Binary file - no diff available.
Propchange: mina/vysper/trunk/server/extensions/websockets/src/test/resources/bogus_mina_tls.cert
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore?rev=1055240&view=auto
==============================================================================
Binary file - no diff available.
Propchange: mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore-README.txt
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore-README.txt?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore-README.txt (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore-README.txt Tue Jan 4 23:19:37 2011
@@ -0,0 +1,34 @@
+The keystore contains a private key and its associated self-signed certificate
+that can be used by SSL. This keystore is provided to be used only for testing this software.
+In non-test environments it is highly recommended to use real certificates signed by a Certification Authority (CA).
+
+The keystore was generated with the following command:
+
+ $ keytool -keystore keystore -alias jetty -genkey -keyalg RSA
+ Enter keystore password: password
+ Re-enter new password: password
+ What is your first and last name?
+ [Unknown]: vysper.org
+ What is the name of your organizational unit?
+ [Unknown]:
+ What is the name of your organization?
+ [Unknown]: Vysper
+ What is the name of your City or Locality?
+ [Unknown]:
+ What is the name of your State or Province?
+ [Unknown]:
+ What is the two-letter country code for this unit?
+ [Unknown]:
+ Is CN=vysper.org, OU=Unknown, O=Vysper, L=Unknown, ST=Unknown, C=Unknown correct?
+ [no]: yes
+ Enter key password for <jetty>
+ (RETURN if same as keystore password):
+
+The password for the keystore and for the key is "password" and the Common Name (CN) is "vysper.org".
+The CN must be the domain name used by the clients to connect to the Vysper server (otherwise
+the browser will warn the user that the certificate is issued for another domain name)
+
+Using the self-signed certificate (from the keystore) will make the web browser warn you that the certificate is self-signed,
+but for testing purposes you can add an exception for the browser to accept it.
+
+More information about keytool: http://java.sun.com/javase/6/docs/technotes/tools/windows/keytool.html
\ No newline at end of file
Added: mina/vysper/trunk/server/extensions/websockets/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/test/resources/log4j.properties?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/test/resources/log4j.properties (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/test/resources/log4j.properties Tue Jan 4 23:19:37 2011
@@ -0,0 +1,28 @@
+# 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.
+
+log4j.rootLogger=debug, C
+
+log4j.logger.org.apache.vysper.mina.XmppIoHandlerAdapter=WARN,C
+log4j.logger.org.apache.mina.filter.executor.ExecutorFilter=WARN,C
+log4j.logger.org.apache.http=DEBUG
+
+
+log4j.appender.C=org.apache.log4j.ConsoleAppender
+log4j.appender.C.layout=org.apache.log4j.PatternLayout
+log4j.appender.C.layout.ConversionPattern=%m%n
+