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);
}