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/26 09:32:49 UTC

svn commit: r1063629 - in /mina/vysper/branches/xep0114/server/core/src: main/java/org/apache/vysper/mina/ main/java/org/apache/vysper/xmpp/modules/core/base/handler/ main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ main/java/org/a...

Author: ngn
Date: Wed Jan 26 08:32:48 2011
New Revision: 1063629

URL: http://svn.apache.org/viewvc?rev=1063629&view=rev
Log:
Completed component connection and handshake handling

Added:
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/mina/ComponentEndpoint.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentAuthentication.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentAuthenticationManagement.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/HandshakeHandler.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/InMemoryComponentAuthentication.java
    mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/
    mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentMain.java
    mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/HandshakeHandlerTestCase.java
    mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/InMemoryComponentAuthenticationTestCase.java
Modified:
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookup.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java
    mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/AbstractProtocolStateTestCase.java
    mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolInitiatedTestCase.java
    mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookupTestCase.java
    mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/server/response/ServerResponsesTestCase.java

Added: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/mina/ComponentEndpoint.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/mina/ComponentEndpoint.java?rev=1063629&view=auto
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/mina/ComponentEndpoint.java (added)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/mina/ComponentEndpoint.java Wed Jan 26 08:32:48 2011
@@ -0,0 +1,36 @@
+/*
+ *  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.mina;
+
+import org.apache.vysper.xmpp.server.SessionContext.SessionMode;
+
+
+/**
+ * Endpoint used for server-to-servr (s2s) connections
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class ComponentEndpoint extends AbstractTCPEndpoint {
+
+    public ComponentEndpoint() {
+        super(5275, SessionMode.COMPONENT_ACCEPT);
+    }
+    
+}

Modified: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java?rev=1063629&r1=1063628&r2=1063629&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java Wed Jan 26 08:32:48 2011
@@ -20,10 +20,11 @@
 
 package org.apache.vysper.xmpp.modules.core.base.handler;
 
-import org.apache.vysper.mina.MinaBackedSessionContext;
 import org.apache.vysper.xml.fragment.XMLElementVerifier;
+import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityFormatException;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.modules.extension.xep0114_component.ComponentAuthentication;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
@@ -32,13 +33,12 @@ import org.apache.vysper.xmpp.protocol.S
 import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.SessionContext.SessionMode;
 import org.apache.vysper.xmpp.server.SessionState;
 import org.apache.vysper.xmpp.server.XMPPVersion;
-import org.apache.vysper.xmpp.server.SessionContext.SessionMode;
 import org.apache.vysper.xmpp.server.response.ServerErrorResponses;
 import org.apache.vysper.xmpp.server.response.ServerResponses;
 import org.apache.vysper.xmpp.stanza.Stanza;
-import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 
 /**
  *
@@ -152,10 +152,20 @@ public class StreamStartHandler implemen
 
             responseStanza = new ServerResponses().getStreamOpenerForServerAcceptor(sessionContext.getServerJID(),
                     responseVersion, sessionContext, serverRuntimeContext.getSslContext() != null);
-        } else {
-            String descriptiveText = "one of the two namespaces must be present: " + NamespaceURIs.JABBER_CLIENT
-                    + " or " + NamespaceURIs.JABBER_SERVER;
-            return respondIllegalNamespaceError(descriptiveText);
+        } else if (sessionContext.isSessionMode(SessionMode.COMPONENT_ACCEPT)) {
+            Entity to = stanza.getTo();
+            
+            // check that component exists
+            ComponentAuthentication componentAuthentication = (ComponentAuthentication) serverRuntimeContext.getStorageProvider(ComponentAuthentication.class);
+            if(componentAuthentication == null || !componentAuthentication.exists(to)) {
+                return new ResponseStanzaContainerImpl(ServerErrorResponses.getStreamError(
+                        StreamErrorCondition.HOST_UNKNOWN, sessionContext.getXMLLang(),
+                        "Unknown component", null));
+            }
+            
+            sessionContext.setInitiatingEntity(to);
+            responseStanza = new ServerResponses().getStreamOpenerForComponentAcceptor(to,
+                    sessionContext);
         }
 
         // if all is correct, go to next phase

Added: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentAuthentication.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentAuthentication.java?rev=1063629&view=auto
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentAuthentication.java (added)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentAuthentication.java Wed Jan 26 08:32:48 2011
@@ -0,0 +1,36 @@
+/*
+ *  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.modules.extension.xep0114_component;
+
+import org.apache.vysper.storage.StorageProvider;
+import org.apache.vysper.xmpp.addressing.Entity;
+
+/**
+ * interface describing a service for authenticating components
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public interface ComponentAuthentication extends StorageProvider {
+
+    boolean verifyCredentials(Entity component, String handshake, String streamId);
+
+    boolean exists(Entity component);
+}

Added: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentAuthenticationManagement.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentAuthenticationManagement.java?rev=1063629&view=auto
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentAuthenticationManagement.java (added)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentAuthenticationManagement.java Wed Jan 26 08:32:48 2011
@@ -0,0 +1,35 @@
+/*
+ *  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.modules.extension.xep0114_component;
+
+import org.apache.vysper.storage.StorageProvider;
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.authorization.AccountCreationException;
+
+/**
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public interface ComponentAuthenticationManagement extends StorageProvider {
+    
+    void addComponent(Entity component, String secret) throws AccountCreationException;
+    
+    void changeSecret(Entity component, String secret) throws AccountCreationException;
+}

Added: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/HandshakeHandler.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/HandshakeHandler.java?rev=1063629&view=auto
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/HandshakeHandler.java (added)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/HandshakeHandler.java Wed Jan 26 08:32:48 2011
@@ -0,0 +1,91 @@
+/*
+ *  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.modules.extension.xep0114_component;
+
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
+import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.SessionContext.SessionTerminationCause;
+import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class HandshakeHandler implements StanzaHandler {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(HandshakeHandler.class);
+
+    
+    public String getName() {
+        return "handshake";
+    }
+
+    public boolean verify(Stanza stanza) {
+        if (stanza == null)
+            return false;
+        if (!getName().equals(stanza.getName()))
+            return false;
+        String namespaceURI = stanza.getNamespaceURI();
+        if (namespaceURI == null)
+            return false;
+        return namespaceURI.equals(NamespaceURIs.JABBER_COMPONENT_ACCEPT);
+    }
+
+    public boolean isSessionRequired() {
+        return false;
+    }
+
+    public ResponseStanzaContainer execute(Stanza stanza, ServerRuntimeContext serverRuntimeContext,
+            boolean isOutboundStanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder) {
+
+        if(stanza.getInnerText() != null) {
+            String handshake = stanza.getInnerText().getText();
+            ComponentAuthentication componentAuthentication = (ComponentAuthentication) serverRuntimeContext.getStorageProvider(ComponentAuthentication.class);
+            if(componentAuthentication != null) {
+                if(componentAuthentication.verifyCredentials(sessionContext.getInitiatingEntity(), handshake, sessionContext.getSessionId())) {
+                    sessionStateHolder.setState(SessionState.AUTHENTICATED);
+                    
+                    Stanza response = new StanzaBuilder("handshake", NamespaceURIs.JABBER_COMPONENT_ACCEPT).build();
+                    return new ResponseStanzaContainerImpl(response);
+                } else {
+                    sessionContext.endSession(SessionTerminationCause.STREAM_ERROR);
+                    return null;
+                }
+            } else {
+                sessionContext.endSession(SessionTerminationCause.STREAM_ERROR);
+                // TODO log warning
+                return null;
+            }
+        } else {
+            sessionContext.endSession(SessionTerminationCause.STREAM_ERROR);
+            return null;
+        }
+    }
+}

Added: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/InMemoryComponentAuthentication.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/InMemoryComponentAuthentication.java?rev=1063629&view=auto
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/InMemoryComponentAuthentication.java (added)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/InMemoryComponentAuthentication.java Wed Jan 26 08:32:48 2011
@@ -0,0 +1,61 @@
+/*
+ *  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.modules.extension.xep0114_component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.authorization.AccountCreationException;
+
+/**
+ * very simple in-memory {@link org.apache.vysper.xmpp.authorization.UserAuthorization} service
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class InMemoryComponentAuthentication implements ComponentAuthentication, ComponentAuthenticationManagement {
+
+    private final Map<Entity, String> userPasswordMap = new HashMap<Entity, String>();
+
+    public void addComponent(Entity component, String secret) throws AccountCreationException {
+        userPasswordMap.put(component, secret);
+    }
+
+    public void changeSecret(Entity component, String secret) throws AccountCreationException {
+        userPasswordMap.put(component, secret);
+    }
+
+    public boolean exists(Entity component) {
+        return userPasswordMap.containsKey(component);
+    }
+
+    public boolean verifyCredentials(Entity component, String handshake, String streamId) {
+        String secret = userPasswordMap.get(component);
+
+        if(secret != null) {
+            String expected = DigestUtils.shaHex(streamId + secret).toLowerCase();
+            
+            return expected.equals(handshake);
+        } else {
+            return false;
+        }
+    }
+}

Modified: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java?rev=1063629&r1=1063628&r2=1063629&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java Wed Jan 26 08:32:48 2011
@@ -44,7 +44,7 @@ public class NamespaceURIs {
 
     public static final String JABBER_CLIENT = "jabber:client";
 
-    public static final String JABBER_COMPONENT_ACCEPT = "jabber:component:accep";
+    public static final String JABBER_COMPONENT_ACCEPT = "jabber:component:accept";
 
     public static final String JABBER_SERVER = "jabber:server";
 

Modified: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java?rev=1063629&r1=1063628&r2=1063629&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java Wed Jan 26 08:32:48 2011
@@ -114,13 +114,14 @@ public class ProtocolWorker implements S
                 return;
             }
         }
-        
+
         // check as of RFC3920/4.3:
         if (sessionStateHolder.getState() != SessionState.AUTHENTICATED) {
             // is not authenticated...
             if (coreStanza != null
                     && !(stanzaHandler instanceof InBandRegistrationHandler)) {
                 // ... and is a IQ/PRESENCE/MESSAGE stanza!
+                // In-band registration uses IQ stanzas before the stream is authenticated
                 responseWriter.handleNotAuthorized(sessionContext, stanza);
                 return;
             }
@@ -163,7 +164,7 @@ public class ProtocolWorker implements S
                 // rewrite namespace
                 stanza = StanzaBuilder.rewriteNamespace(stanza, NamespaceURIs.JABBER_SERVER, NamespaceURIs.JABBER_CLIENT);
             }                
-        } else {
+        } else if(sessionContext.isSessionMode(SessionMode.CLIENT_2_SERVER)) { 
             // make sure that 'from' (if present) matches the bare authorized entity
             // else respond with a stanza error 'unknown-sender'
             // see rfc3920_draft-saintandre-rfc3920bis-04.txt#8.5.4
@@ -195,6 +196,8 @@ public class ProtocolWorker implements S
                     return;
                 }
             }
+        } else if(sessionContext.isSessionMode(SessionMode.COMPONENT_ACCEPT)) {
+            // TODO make sure that "from" is from the component
         }
         
         try {

Modified: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookup.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookup.java?rev=1063629&r1=1063628&r2=1063629&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookup.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookup.java Wed Jan 26 08:32:48 2011
@@ -27,6 +27,7 @@ import org.apache.vysper.xmpp.modules.co
 import org.apache.vysper.xmpp.modules.core.base.handler.StreamStartHandler;
 import org.apache.vysper.xmpp.modules.core.base.handler.XMLPrologHandler;
 import org.apache.vysper.xmpp.modules.core.im.handler.PresenceHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0114_component.HandshakeHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbResultHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbVerifyHandler;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
@@ -49,6 +50,8 @@ public class StanzaHandlerLookup extends
     private MessageHandler messageHandler = new MessageHandler();
 
     private PresenceHandler presenceHandler = new PresenceHandler();
+    
+    private HandshakeHandler handshakeHandler = new HandshakeHandler();
 
     private static final ServiceUnavailableStanzaErrorHandler SERVICE_UNAVAILABLE_STANZA_ERROR_HANDLER = new ServiceUnavailableStanzaErrorHandler();
 
@@ -84,6 +87,8 @@ public class StanzaHandlerLookup extends
                 return new DbVerifyHandler();
             } else if ("result".equals(name)) {
                 return new DbResultHandler();
+            } else if (handshakeHandler.verify(stanza)) {
+                return handshakeHandler;
             } else if (iqHandler.verify(stanza)) {
                 return getIQHandler(stanza);
             } else if (messageHandler.verify(stanza)) {

Modified: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java?rev=1063629&r1=1063628&r2=1063629&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java Wed Jan 26 08:32:48 2011
@@ -23,6 +23,7 @@ import org.apache.vysper.xmpp.modules.co
 import org.apache.vysper.xmpp.modules.core.base.handler.XMLPrologHandler;
 import org.apache.vysper.xmpp.modules.core.sasl.handler.AbstractSASLHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0077_inbandreg.InBandRegistrationHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0114_component.HandshakeHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbResultHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbVerifyHandler;
 import org.apache.vysper.xmpp.protocol.ResponseWriter;
@@ -60,6 +61,8 @@ public class EncryptedProtocolWorker ext
             return true;
         } else if (sessionContext.isSessionMode(SessionMode.SERVER_2_SERVER) && stanzaHandler instanceof DbVerifyHandler) {
             return true;
+        } else if (sessionContext.isSessionMode(SessionMode.COMPONENT_ACCEPT) && stanzaHandler instanceof HandshakeHandler) {
+            return true;
         }
         ResponseWriter.writeUnsupportedStanzaError(sessionContext);
         return false;

Modified: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java?rev=1063629&r1=1063628&r2=1063629&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java Wed Jan 26 08:32:48 2011
@@ -21,6 +21,7 @@ package org.apache.vysper.xmpp.protocol.
 
 import org.apache.vysper.xmpp.modules.core.starttls.handler.StartTLSHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0077_inbandreg.InBandRegistrationHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0114_component.HandshakeHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbResultHandler;
 import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbVerifyHandler;
 import org.apache.vysper.xmpp.protocol.ResponseWriter;
@@ -54,6 +55,8 @@ public class StartedProtocolWorker exten
             return true;
         } else if (sessionContext.isSessionMode(SessionMode.SERVER_2_SERVER) && stanzaHandler instanceof DbResultHandler) {
             return true;
+        } else if (sessionContext.isSessionMode(SessionMode.COMPONENT_ACCEPT) && stanzaHandler instanceof HandshakeHandler) {
+            return true;
         }
         ResponseWriter.writeUnsupportedStanzaError(sessionContext);
         return false;

Modified: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java?rev=1063629&r1=1063628&r2=1063629&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java Wed Jan 26 08:32:48 2011
@@ -27,7 +27,6 @@ import org.apache.vysper.xmpp.addressing
 import org.apache.vysper.xmpp.protocol.ProtocolException;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
-import org.apache.vysper.xmpp.server.SessionContext.SessionTerminationCause;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.state.resourcebinding.BindException;

Modified: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java?rev=1063629&r1=1063628&r2=1063629&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java Wed Jan 26 08:32:48 2011
@@ -41,7 +41,9 @@ import org.apache.vysper.xmpp.stanza.Sta
 public class ServerResponses {
 
     public Stanza getStreamOpenerForError(boolean forClient, Entity from, XMPPVersion version, Stanza errorStanza) {
-        return getStreamOpener(forClient, from, null, version, errorStanza).build();
+        String namespaceUri = (forClient) ? NamespaceURIs.JABBER_CLIENT : NamespaceURIs.JABBER_SERVER;
+        
+        return getStreamOpener(namespaceUri, from, null, version, errorStanza).build();
     }
 
     public Stanza getStreamOpenerForClient(Entity from, XMPPVersion version, SessionContext sessionContext) {
@@ -58,7 +60,7 @@ public class ServerResponses {
             throw new IllegalStateException("unsupported state for responding with stream opener");
         }
 
-        StanzaBuilder stanzaBuilder = getStreamOpener(true, from, sessionContext.getXMLLang(), version,
+        StanzaBuilder stanzaBuilder = getStreamOpener(NamespaceURIs.JABBER_CLIENT, from, sessionContext.getXMLLang(), version,
                 sessionContext.getSessionId(), innerFeatureStanza);
 
         return stanzaBuilder.build();
@@ -85,15 +87,23 @@ public class ServerResponses {
             features = featureBuilder.build();
         }
         
-        StanzaBuilder stanzaBuilder = getStreamOpener(false, from, sessionContext.getXMLLang(), version,
+        StanzaBuilder stanzaBuilder = getStreamOpener(NamespaceURIs.JABBER_SERVER, from, sessionContext.getXMLLang(), version,
                 sessionContext.getSessionId(), features);
 
         stanzaBuilder.declareNamespace("db", NamespaceURIs.JABBER_SERVER_DIALBACK);
         return stanzaBuilder.build();
     }
 
+    public Stanza getStreamOpenerForComponentAcceptor(Entity from, SessionContext sessionContext) {
+        
+        StanzaBuilder stanzaBuilder = getStreamOpener(NamespaceURIs.JABBER_COMPONENT_ACCEPT, from, sessionContext.getXMLLang(), null,
+                sessionContext.getSessionId(), null);
+        return stanzaBuilder.build();
+    }
+
+    
     public Stanza getStreamOpenerForServerConnector(Entity from, Entity to, XMPPVersion version, SessionContext sessionContext) {
-        StanzaBuilder stanzaBuilder = getStreamOpener(false, from, sessionContext.getXMLLang(), version,
+        StanzaBuilder stanzaBuilder = getStreamOpener(NamespaceURIs.JABBER_SERVER, from, sessionContext.getXMLLang(), version,
                 null, null);
         stanzaBuilder.addAttribute("to", to.getDomain());
         stanzaBuilder.declareNamespace("db", NamespaceURIs.JABBER_SERVER_DIALBACK);
@@ -101,15 +111,15 @@ public class ServerResponses {
     }
 
     
-    public StanzaBuilder getStreamOpener(boolean forClient, Entity from, String xmlLang, XMPPVersion version,
+    public StanzaBuilder getStreamOpener(String namespaceUri, Entity from, String xmlLang, XMPPVersion version,
             Stanza innerStanza) {
-        return getStreamOpener(forClient, from, xmlLang, version, null, innerStanza);
+        return getStreamOpener(namespaceUri, from, xmlLang, version, null, innerStanza);
     }
 
-    public StanzaBuilder getStreamOpener(boolean forClient, Entity from, String xmlLang, XMPPVersion version,
+    public StanzaBuilder getStreamOpener(String namespaceUri, Entity from, String xmlLang, XMPPVersion version,
             String sessionId, XMLElement innerStanza) {
         StanzaBuilder stanzaBuilder = new StanzaBuilder("stream", NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS,
-                "stream").declareNamespace("", forClient ? NamespaceURIs.JABBER_CLIENT : NamespaceURIs.JABBER_SERVER)
+                "stream").declareNamespace("", namespaceUri)
                 .addAttribute("from", from.getFullQualifiedName());
         if (xmlLang != null)
             stanzaBuilder.addAttribute(NamespaceURIs.XML, "lang", xmlLang);

Added: mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentMain.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentMain.java?rev=1063629&view=auto
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentMain.java (added)
+++ mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/ComponentMain.java Wed Jan 26 08:32:48 2011
@@ -0,0 +1,82 @@
+/*
+ *  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.modules.extension.xep0114_component;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+import org.apache.vysper.mina.C2SEndpoint;
+import org.apache.vysper.mina.ComponentEndpoint;
+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.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;
+
+/**
+ * starts the server as a standalone application
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class ComponentMain {
+
+    public static void main(String[] args) throws AccountCreationException, FileNotFoundException {
+
+       String domain = "vysper.org";
+        
+        StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();
+
+        final AccountManagement accountManagement = (AccountManagement) providerRegistry
+                .retrieve(AccountManagement.class);
+        Entity user = EntityImpl.parseUnchecked("user1@vysper.org");
+        accountManagement.addUser(user, "password");
+        
+        InMemoryComponentAuthentication componentAuthentication = new InMemoryComponentAuthentication();
+        componentAuthentication.addComponent(EntityImpl.parseUnchecked("hello.vysper.org"), "sekrit");
+        providerRegistry.add(componentAuthentication);
+
+        XMPPServer server = new XMPPServer(domain);
+        server.addEndpoint(new C2SEndpoint());
+        server.addEndpoint(new ComponentEndpoint());
+        server.setStorageProviderRegistry(providerRegistry);
+
+        server.setTLSCertificateInfo(new File("src/main/config/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/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/HandshakeHandlerTestCase.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/HandshakeHandlerTestCase.java?rev=1063629&view=auto
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/HandshakeHandlerTestCase.java (added)
+++ mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/HandshakeHandlerTestCase.java Wed Jan 26 08:32:48 2011
@@ -0,0 +1,128 @@
+/*
+ *  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.modules.extension.xep0114_component;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.authorization.AccountCreationException;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.SessionContext.SessionTerminationCause;
+import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.junit.Assert;
+import org.mockito.Mockito;
+
+/**
+ */
+public class HandshakeHandlerTestCase extends TestCase {
+
+    private SessionContext sessionContext = Mockito.mock(SessionContext.class);
+    private ServerRuntimeContext serverRuntimeContext = Mockito.mock(ServerRuntimeContext.class);
+    private SessionStateHolder sessionStateHolder = new SessionStateHolder();
+    private ComponentAuthentication componentAuthentication = Mockito.mock(ComponentAuthentication.class);
+
+    private static final Entity FROM = EntityImpl.parseUnchecked("from@vysper.org");
+    private static final String SECRET = "sekrit";
+    private static final String STREAM_ID = "123456";
+
+    private static final String HANDSHAKE = DigestUtils.sha256Hex(STREAM_ID + SECRET).toLowerCase();
+    
+    private HandshakeHandler handler = new HandshakeHandler();
+    
+    @Override
+    public void setUp() throws AccountCreationException {
+        Mockito.when(serverRuntimeContext.getStorageProvider(ComponentAuthentication.class)).thenReturn(componentAuthentication);
+        Mockito.when(componentAuthentication.verifyCredentials(FROM, HANDSHAKE, STREAM_ID)).thenReturn(true);
+        Mockito.when(sessionContext.getInitiatingEntity()).thenReturn(FROM);
+        
+        Mockito.when(sessionContext.getSessionId()).thenReturn(STREAM_ID);
+        
+        sessionStateHolder.setState(SessionState.INITIATED);
+    }
+    
+    public void testValid() throws AccountCreationException {
+        Stanza request = new StanzaBuilder("handshake", NamespaceURIs.JABBER_COMPONENT_ACCEPT).addText(HANDSHAKE).build();
+        
+        ResponseStanzaContainer container = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder);
+        
+        Assert.assertNotNull(container.getResponseStanza());
+        Assert.assertEquals(SessionState.AUTHENTICATED, sessionStateHolder.getState());
+    }
+
+    public void testInvalid() throws AccountCreationException {
+        Stanza request = new StanzaBuilder("handshake", NamespaceURIs.JABBER_COMPONENT_ACCEPT).addText("123").build();
+        
+        ResponseStanzaContainer container = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder);
+        
+        Assert.assertNull(container);
+        Mockito.verify(sessionContext).endSession(SessionTerminationCause.STREAM_ERROR);
+        Assert.assertEquals(SessionState.INITIATED, sessionStateHolder.getState());
+    }
+
+    public void testMissingComponentAuthentication() throws AccountCreationException {
+        Mockito.when(serverRuntimeContext.getStorageProvider(ComponentAuthentication.class)).thenReturn(null);
+        
+        Stanza request = new StanzaBuilder("handshake", NamespaceURIs.JABBER_COMPONENT_ACCEPT).addText(HANDSHAKE).build();
+        
+        ResponseStanzaContainer container = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder);
+        
+        Assert.assertNull(container);
+        Mockito.verify(sessionContext).endSession(SessionTerminationCause.STREAM_ERROR);
+        Assert.assertEquals(SessionState.INITIATED, sessionStateHolder.getState());
+    }
+
+    public void testNoText() throws AccountCreationException {
+        Stanza request = new StanzaBuilder("handshake", NamespaceURIs.JABBER_COMPONENT_ACCEPT).build();
+        
+        ResponseStanzaContainer container = handler.execute(request, serverRuntimeContext, true, sessionContext, sessionStateHolder);
+        
+        Assert.assertNull(container);
+        Mockito.verify(sessionContext).endSession(SessionTerminationCause.STREAM_ERROR);
+        Assert.assertEquals(SessionState.INITIATED, sessionStateHolder.getState());
+    }
+
+    public void testVerify() throws AccountCreationException {
+        Stanza stanza = new StanzaBuilder("handshake", NamespaceURIs.JABBER_COMPONENT_ACCEPT).build();
+
+        Assert.assertTrue(handler.verify(stanza));
+    }
+
+    public void testVerifyInvalidNamespace() throws AccountCreationException {
+        Stanza stanza = new StanzaBuilder("handshake", NamespaceURIs.JABBER_SERVER).build();
+
+        Assert.assertFalse(handler.verify(stanza));
+    }
+
+    public void testVerifyInvalidName() throws AccountCreationException {
+        Stanza stanza = new StanzaBuilder("dummy", NamespaceURIs.JABBER_COMPONENT_ACCEPT).build();
+
+        Assert.assertFalse(handler.verify(stanza));
+    }
+
+}

Added: mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/InMemoryComponentAuthenticationTestCase.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/InMemoryComponentAuthenticationTestCase.java?rev=1063629&view=auto
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/InMemoryComponentAuthenticationTestCase.java (added)
+++ mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0114_component/InMemoryComponentAuthenticationTestCase.java Wed Jan 26 08:32:48 2011
@@ -0,0 +1,70 @@
+/*
+ *  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.modules.extension.xep0114_component;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.authorization.AccountCreationException;
+import org.junit.Assert;
+
+/**
+ */
+public class InMemoryComponentAuthenticationTestCase extends TestCase {
+
+    private static final Entity COMPONENT = EntityImpl.parseUnchecked("comp.vysper.org");
+    private static final String SECRET = "sekrit";
+    private static final String STREAM_ID = "123456";
+
+    private InMemoryComponentAuthentication componentAuthentication = new InMemoryComponentAuthentication();
+    
+    @Override
+    public void setUp() throws AccountCreationException {
+    }
+    
+    public void testVerifyCredentials() throws AccountCreationException {
+        componentAuthentication.addComponent(COMPONENT, SECRET);
+        String handshake = DigestUtils.shaHex(STREAM_ID + SECRET).toLowerCase();
+        
+        Assert.assertTrue(componentAuthentication.verifyCredentials(COMPONENT, handshake, STREAM_ID));
+    }
+
+    public void testVerifyUppercaseCredentials() throws AccountCreationException {
+        componentAuthentication.addComponent(COMPONENT, SECRET);
+        String handshake = DigestUtils.shaHex(STREAM_ID + SECRET).toUpperCase();
+        
+        Assert.assertFalse(componentAuthentication.verifyCredentials(COMPONENT, handshake, STREAM_ID));
+    }
+
+    public void testVerifyCredentialsMissingComponent() throws AccountCreationException {
+        String handshake = DigestUtils.shaHex(STREAM_ID + SECRET).toUpperCase();
+        
+        Assert.assertFalse(componentAuthentication.verifyCredentials(COMPONENT, handshake, STREAM_ID));
+    }
+
+    public void testVerifyComponent() throws AccountCreationException {
+        componentAuthentication.addComponent(COMPONENT, SECRET);
+        Assert.assertTrue(componentAuthentication.exists(COMPONENT));
+    }
+    
+}

Modified: mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/AbstractProtocolStateTestCase.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/AbstractProtocolStateTestCase.java?rev=1063629&r1=1063628&r2=1063629&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/AbstractProtocolStateTestCase.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/AbstractProtocolStateTestCase.java Wed Jan 26 08:32:48 2011
@@ -67,7 +67,7 @@ public abstract class AbstractProtocolSt
         Stanza stanza;
         Stanza recordedResponse;
         XMLElementVerifier responseVerifier;
-        stanza = new ServerResponses().getStreamOpener(true, testFrom, xmlLang, XMPPVersion.VERSION_1_0, null).build();
+        stanza = new ServerResponses().getStreamOpener(NamespaceURIs.JABBER_CLIENT, testFrom, xmlLang, XMPPVersion.VERSION_1_0, null).build();
         protocolWorker.processStanza(sessionContext.getServerRuntimeContext(), sessionContext, stanza,
                 sessionStateHolder);
 

Modified: mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolInitiatedTestCase.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolInitiatedTestCase.java?rev=1063629&r1=1063628&r2=1063629&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolInitiatedTestCase.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolInitiatedTestCase.java Wed Jan 26 08:32:48 2011
@@ -78,7 +78,7 @@ public class ProtocolInitiatedTestCase e
 
     protected void openClientSession() {
         sessionContext.setSessionState(getDefaultState());
-        Stanza stanza = new ServerResponses().getStreamOpener(true, testFrom, sessionContext.getXMLLang(),
+        Stanza stanza = new ServerResponses().getStreamOpener(NamespaceURIs.JABBER_CLIENT, testFrom, sessionContext.getXMLLang(),
                 XMPPVersion.VERSION_1_0, null).build();
         protocolWorker.processStanza(sessionContext.getServerRuntimeContext(), sessionContext, stanza,
                 sessionStateHolder);
@@ -154,7 +154,7 @@ public class ProtocolInitiatedTestCase e
     }
 
     protected Stanza getVersionResponse(XMPPVersion versionSent) {
-        Stanza stanza = new ServerResponses().getStreamOpener(true, testFrom, null, versionSent, null).build();
+        Stanza stanza = new ServerResponses().getStreamOpener(NamespaceURIs.JABBER_CLIENT, testFrom, null, versionSent, null).build();
         protocolWorker.processStanza(sessionContext.getServerRuntimeContext(), sessionContext, stanza,
                 sessionStateHolder);
 

Modified: mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookupTestCase.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookupTestCase.java?rev=1063629&r1=1063628&r2=1063629&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookupTestCase.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookupTestCase.java Wed Jan 26 08:32:48 2011
@@ -30,6 +30,7 @@ import org.apache.vysper.xmpp.modules.co
 import org.apache.vysper.xmpp.modules.core.base.handler.MessageHandler;
 import org.apache.vysper.xmpp.modules.core.base.handler.TestIQHandler;
 import org.apache.vysper.xmpp.modules.core.im.handler.PresenceHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0114_component.HandshakeHandler;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 
@@ -137,6 +138,18 @@ public class StanzaHandlerLookupTestCase
         assertTrue("iq handler found", handler instanceof MessageHandler);
     }
 
+    public void testLookupComponentHandshakeHandler() {
+        StanzaHandlerLookup stanzaHandlerLookup = initStanzaHandlerLookup();
+        stanzaHandlerLookup.addDictionary(new BaseStreamStanzaDictionary());
+
+        Stanza stanza = new StanzaBuilder("handshake", NamespaceURIs.JABBER_COMPONENT_ACCEPT).build();
+        StanzaHandler handler = stanzaHandlerLookup.getHandler(stanza);
+
+        assertNotNull("handler found", handler);
+        assertTrue("handshake handler found", handler instanceof HandshakeHandler);
+    }
+
+    
     public void testLookupSpecializedIQHandler() {
         StanzaHandlerLookup stanzaHandlerLookup = initStanzaHandlerLookup();
         stanzaHandlerLookup.addDictionary(new BaseStreamStanzaDictionary());

Modified: mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/server/response/ServerResponsesTestCase.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/server/response/ServerResponsesTestCase.java?rev=1063629&r1=1063628&r2=1063629&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/server/response/ServerResponsesTestCase.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/test/java/org/apache/vysper/xmpp/server/response/ServerResponsesTestCase.java Wed Jan 26 08:32:48 2011
@@ -23,9 +23,6 @@ package org.apache.vysper.xmpp.server.re
 import java.util.ArrayList;
 import java.util.List;
 
-import junit.framework.TestCase;
-
-import org.apache.vysper.xml.fragment.Renderer;
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.authorization.Anonymous;
@@ -139,6 +136,22 @@ public class ServerResponsesTestCase {
         Stanza actual = new ServerResponses().getStreamOpenerForServerAcceptor(FROM, VERSION, sessionContext, true);
         Assert.assertEquals(expected, actual);
     }
+    
+    @Test
+    public void getStreamOpenerForComponentAcceptor() throws ParsingException {
+        Mockito.when(sessionContext.getState()).thenReturn(SessionState.INITIATED);
+        
+        Stanza expected = new StanzaBuilder("stream", NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS, "stream")
+            .addAttribute("from", FROM.getFullQualifiedName())
+            .declareNamespace("", NamespaceURIs.JABBER_COMPONENT_ACCEPT)
+            .build();
+
+        Stanza actual = new ServerResponses().getStreamOpenerForComponentAcceptor(FROM, sessionContext);
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+
 
     @Test
     public void getStreamOpenerForServerConnector() throws ParsingException {
@@ -154,8 +167,6 @@ public class ServerResponsesTestCase {
             .build();
 
         Stanza actual = new ServerResponses().getStreamOpenerForServerConnector(FROM, TO, VERSION, sessionContext);
-        System.out.println(new Renderer(expected).getComplete());
-        System.out.println(new Renderer(actual).getComplete());
         Assert.assertEquals(expected, actual);
     }