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/01 23:05:12 UTC
svn commit: r1054300 - in /mina/vysper/branches/s2s/server/core/src:
main/java/org/apache/vysper/xmpp/modules/core/base/handler/
main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/
main/java/org/apache/vysper/xmpp/protocol/ main...
Author: ngn
Date: Sat Jan 1 22:05:11 2011
New Revision: 1054300
URL: http://svn.apache.org/viewvc?rev=1054300&view=rev
Log:
Fixed relaying of incoming stanzas. Stanzas can now be sent back and forth
Added:
mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DialbackIdGenerator.java
- copied, changed from r1050961, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DailbackIdGenerator.java
Removed:
mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DailbackIdGenerator.java
Modified:
mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java
mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbResultHandler.java
mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java
mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java
mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/IdTest.java
mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/Server2Server.java
Modified: mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java?rev=1054300&r1=1054299&r2=1054300&view=diff
==============================================================================
--- mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java (original)
+++ mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java Sat Jan 1 22:05:11 2011
@@ -70,6 +70,7 @@ public class StreamStartHandler implemen
boolean clientCall = xmlElementVerifier.namespacePresent(NamespaceURIs.JABBER_CLIENT);
boolean serverCall = xmlElementVerifier.namespacePresent(NamespaceURIs.JABBER_SERVER);
+ // TODO is it better to derive c2s or s2s from the type of endpoint and verify the namespace here?
if (clientCall && serverCall)
serverCall = false; // silently ignore ambiguous attributes
if (serverCall)
Modified: mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbResultHandler.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbResultHandler.java?rev=1054300&r1=1054299&r2=1054300&view=diff
==============================================================================
--- mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbResultHandler.java (original)
+++ mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbResultHandler.java Sat Jan 1 22:05:11 2011
@@ -76,6 +76,7 @@ public class DbResultHandler implements
builder.addAttribute("to", receiving.getDomain());
builder.addAttribute("type", "valid");
+ sessionContext.setInitiatingEntity(receiving);
sessionStateHolder.setState(SessionState.AUTHENTICATED);
return new ResponseStanzaContainerImpl(builder.build());
Modified: mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java?rev=1054300&r1=1054299&r2=1054300&view=diff
==============================================================================
--- mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java (original)
+++ mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java Sat Jan 1 22:05:11 2011
@@ -37,7 +37,7 @@ import org.apache.vysper.xmpp.stanza.Sta
* @author The Apache MINA Project (dev@mina.apache.org)
*/
public class DbVerifyHandler implements StanzaHandler {
- private DailbackIdGenerator dailbackIdGenerator = new DailbackIdGenerator();
+ private DialbackIdGenerator dailbackIdGenerator = new DialbackIdGenerator();
public String getName() {
return "verify";
Copied: mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DialbackIdGenerator.java (from r1050961, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DailbackIdGenerator.java)
URL: http://svn.apache.org/viewvc/mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DialbackIdGenerator.java?p2=mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DialbackIdGenerator.java&p1=mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DailbackIdGenerator.java&r1=1050961&r2=1054300&rev=1054300&view=diff
==============================================================================
--- mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DailbackIdGenerator.java (original)
+++ mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DialbackIdGenerator.java Sat Jan 1 22:05:11 2011
@@ -12,14 +12,14 @@ import org.apache.commons.codec.digest.D
import org.apache.vysper.xmpp.addressing.Entity;
-public class DailbackIdGenerator {
+public class DialbackIdGenerator {
// generates a shared secret within the server
private static final String SECRET = UUID.randomUUID().toString();
private SecretKeySpec signingKey = new SecretKeySpec(DigestUtils.sha256(SECRET), "HmacSHA256");
private Mac mac;
- public DailbackIdGenerator() {
+ public DialbackIdGenerator() {
try {
mac = Mac.getInstance("HmacSHA256");
mac.init(signingKey);
Modified: mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java?rev=1054300&r1=1054299&r2=1054300&view=diff
==============================================================================
--- mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java (original)
+++ mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java Sat Jan 1 22:05:11 2011
@@ -35,7 +35,11 @@ import org.apache.vysper.xmpp.protocol.w
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.response.ServerErrorResponses;
import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.stanza.StanzaErrorCondition;
+import org.apache.vysper.xmpp.stanza.StanzaErrorType;
import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
import org.apache.vysper.xmpp.writer.DenseStanzaLogRenderer;
import org.slf4j.Logger;
@@ -109,39 +113,79 @@ public class ProtocolWorker implements S
}
}
- // 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
Entity from = stanza.getFrom();
- if (from != null && sessionContext.getInitiatingEntity() != null) {
- Entity fromBare = from.getBareJID();
- Entity initiatingEntity = sessionContext.getInitiatingEntity();
- if (!initiatingEntity.equals(fromBare)) {
- responseWriter.handleWrongFromJID(sessionContext, stanza);
- return;
+ if(sessionContext.isServerToServer()) {
+ XMPPCoreStanza coreStanza = XMPPCoreStanza.getWrapper(stanza);
+
+ if(coreStanza != null) {
+ // stanza must come from the origin server
+ if(from == null) {
+ Stanza errorStanza = ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.UNKNOWN_SENDER,
+ coreStanza, StanzaErrorType.MODIFY, "Missing from attribute", null, null);
+ ResponseWriter.writeResponse(sessionContext, errorStanza);
+ return;
+ } else if(!from.getDomain().equals(sessionContext.getInitiatingEntity().getDomain())) {
+ // make sure the from attribute refers to the correct remote server
+
+ Stanza errorStanza = ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.UNKNOWN_SENDER,
+ coreStanza, StanzaErrorType.MODIFY, "Incorrect from attribute", null, null);
+ ResponseWriter.writeResponse(sessionContext, errorStanza);
+ return;
+ }
+
+ Entity to = stanza.getTo();
+ if(to == null) {
+ // TODO what's the appropriate error?
+ Stanza errorStanza = ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.BAD_REQUEST,
+ coreStanza, StanzaErrorType.MODIFY, "Missing to attribute", null, null);
+ ResponseWriter.writeResponse(sessionContext, errorStanza);
+ return;
+ } else if(!to.getDomain().equals(serverRuntimeContext.getServerEnitity().getDomain())) {
+ // TODO what's the appropriate error?
+ Stanza errorStanza = ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.BAD_REQUEST,
+ coreStanza, StanzaErrorType.MODIFY, "Invalid to attribute", null, null);
+ ResponseWriter.writeResponse(sessionContext, errorStanza);
+ return;
+
+ }
+
+ // rewrite namespace
+ stanza = StanzaBuilder.rewriteNamespace(stanza, NamespaceURIs.JABBER_SERVER, NamespaceURIs.JABBER_CLIENT);
+ }
+ } else {
+ // 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
+ if (from != null && sessionContext.getInitiatingEntity() != null) {
+ Entity fromBare = from.getBareJID();
+ Entity initiatingEntity = sessionContext.getInitiatingEntity();
+ if (!initiatingEntity.equals(fromBare)) {
+ responseWriter.handleWrongFromJID(sessionContext, stanza);
+ return;
+ }
}
- }
- // make sure that there is a bound resource entry for that from's resource id attribute!
- if (from != null && from.getResource() != null) {
- List<String> boundResources = sessionContext.getServerRuntimeContext().getResourceRegistry()
- .getBoundResources(from, false);
- if (boundResources.size() == 0) {
- responseWriter.handleWrongFromJID(sessionContext, stanza);
- return;
+ // make sure that there is a bound resource entry for that from's resource id attribute!
+ if (from != null && from.getResource() != null) {
+ List<String> boundResources = sessionContext.getServerRuntimeContext().getResourceRegistry()
+ .getBoundResources(from, false);
+ if (boundResources.size() == 0) {
+ responseWriter.handleWrongFromJID(sessionContext, stanza);
+ return;
+ }
}
- }
- // make sure that there is a full from entity given in cases where more than one resource is bound
- // in the same session.
- // see rfc3920_draft-saintandre-rfc3920bis-04.txt#8.5.4
- if (from != null && from.getResource() == null) {
- List<String> boundResources = sessionContext.getServerRuntimeContext().getResourceRegistry()
- .getResourcesForSession(sessionContext);
- if (boundResources.size() > 1) {
- responseWriter.handleWrongFromJID(sessionContext, stanza);
- return;
+ // make sure that there is a full from entity given in cases where more than one resource is bound
+ // in the same session.
+ // see rfc3920_draft-saintandre-rfc3920bis-04.txt#8.5.4
+ if (from != null && from.getResource() == null) {
+ List<String> boundResources = sessionContext.getServerRuntimeContext().getResourceRegistry()
+ .getResourcesForSession(sessionContext);
+ if (boundResources.size() > 1) {
+ responseWriter.handleWrongFromJID(sessionContext, stanza);
+ return;
+ }
}
}
-
+
try {
stateAwareProtocolWorker.processStanza(sessionContext, sessionStateHolder, stanza, stanzaHandler);
} catch (Exception e) {
Modified: mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java?rev=1054300&r1=1054299&r2=1054300&view=diff
==============================================================================
--- mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java (original)
+++ mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java Sat Jan 1 22:05:11 2011
@@ -77,12 +77,12 @@ public interface SessionContext {
boolean isRemotelyInitiatedSession();
/**
- * @return the initiating {@link Entity}
+ * @return the initiating {@link Entity}. For c2s, this is the client {@link Entity}. For s2s, this is the server {@link Entity}
*/
Entity getInitiatingEntity();
/**
- * Sets the initiating entity.
+ * Sets the initiating entity. For c2s, this is the client {@link Entity}. For s2s, this is the server {@link Entity}
*
* @param entity
*/
Modified: mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java?rev=1054300&r1=1054299&r2=1054300&view=diff
==============================================================================
--- mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java (original)
+++ mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java Sat Jan 1 22:05:11 2011
@@ -22,7 +22,7 @@ import org.apache.vysper.xmpp.delivery.f
import org.apache.vysper.xmpp.delivery.failure.RemoteServerTimeoutException;
import org.apache.vysper.xmpp.modules.extension.xep0119_xmppping.XmppPingListener;
import org.apache.vysper.xmpp.modules.extension.xep0119_xmppping.XmppPingModule;
-import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DailbackIdGenerator;
+import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DialbackIdGenerator;
import org.apache.vysper.xmpp.protocol.NamespaceURIs;
import org.apache.vysper.xmpp.protocol.SessionStateHolder;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
@@ -209,7 +209,7 @@ public class DefaultXMPPServerConnector
} else if(dialbackSupported(msg)) {
Entity originating = serverRuntimeContext.getServerEnitity();
- String dailbackId = new DailbackIdGenerator().generate(otherServer, originating, sessionContext.getSessionId());
+ String dailbackId = new DialbackIdGenerator().generate(otherServer, originating, sessionContext.getSessionId());
Stanza dbResult = new StanzaBuilder("result", NamespaceURIs.JABBER_SERVER_DIALBACK, "db")
.addAttribute("from", originating.getDomain())
Modified: mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/IdTest.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/IdTest.java?rev=1054300&r1=1054299&r2=1054300&view=diff
==============================================================================
--- mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/IdTest.java (original)
+++ mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/IdTest.java Sat Jan 1 22:05:11 2011
@@ -4,7 +4,7 @@ import junit.framework.TestCase;
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.addressing.EntityImpl;
-import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DailbackIdGenerator;
+import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DialbackIdGenerator;
public class IdTest extends TestCase {
@@ -14,7 +14,7 @@ public class IdTest extends TestCase {
private String streamId = "D60000229F";
public void testId() {
- DailbackIdGenerator generator = new DailbackIdGenerator();
+ DialbackIdGenerator generator = new DialbackIdGenerator();
String id = generator.generate(receiving, originating, streamId);
Assert.assertTrue(generator.verify(id, receiving, originating, streamId));
@@ -22,7 +22,7 @@ public class IdTest extends TestCase {
}
public void testNotValidId() {
- DailbackIdGenerator generator = new DailbackIdGenerator();
+ DialbackIdGenerator generator = new DialbackIdGenerator();
Assert.assertFalse(generator.verify("1234567890", receiving, originating, streamId));
}
}
Modified: mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/Server2Server.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/Server2Server.java?rev=1054300&r1=1054299&r2=1054300&view=diff
==============================================================================
--- mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/Server2Server.java (original)
+++ mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/Server2Server.java Sat Jan 1 22:05:11 2011
@@ -13,8 +13,11 @@ import org.apache.vysper.xmpp.server.XMP
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
import org.jivesoftware.smack.ConnectionConfiguration;
+import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.XMPPConnection;
+import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smack.packet.Packet;
public class Server2Server {
@@ -24,12 +27,13 @@ public class Server2Server {
Entity localUser = EntityImpl.parseUnchecked(args[1]);
Entity remoteServer = EntityImpl.parseUnchecked(args[2]);
Entity remoteUser = EntityImpl.parseUnchecked(args[3]);
+ String remotePassword = args[4];
String keystorePath;
String keystorePassword;
- if(args.length > 4) {
- keystorePath = args[4];
- keystorePassword = args[5];
+ if(args.length > 5) {
+ keystorePath = args[5];
+ keystorePassword = args[6];
} else {
keystorePath = "src/main/config/bogus_mina_tls.cert";
keystorePassword = "boguspw";
@@ -79,27 +83,46 @@ public class Server2Server {
//
// connector.write(stanza);
-
- ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("localhost", 5222);
- connectionConfiguration.setKeystorePath(keystorePath);
- connectionConfiguration.setTruststorePath(keystorePath);
- connectionConfiguration.setTruststorePassword(keystorePassword);
- XMPPConnection client = new XMPPConnection(connectionConfiguration);
+ ConnectionConfiguration localConnectionConfiguration = new ConnectionConfiguration("localhost", 5222);
+ localConnectionConfiguration.setKeystorePath(keystorePath);
+ localConnectionConfiguration.setTruststorePath(keystorePath);
+ localConnectionConfiguration.setTruststorePassword(keystorePassword);
+ XMPPConnection localClient = new XMPPConnection(localConnectionConfiguration);
+
+ localClient.connect();
+ localClient.login(localUser.getNode(), "password1");
+ localClient.addPacketListener(new PacketListener() {
+ public void processPacket(Packet packet) {
+ System.out.println("# " + packet);
+ }
+ }, new PacketFilter() {
+ public boolean accept(Packet arg0) {
+ return true;
+ }
+ });
+
+
+ ConnectionConfiguration remoteConnectionConfiguration = new ConnectionConfiguration(remoteServer.getFullQualifiedName(), 5222);
+ remoteConnectionConfiguration.setKeystorePath(keystorePath);
+ remoteConnectionConfiguration.setTruststorePath(keystorePath);
+ remoteConnectionConfiguration.setTruststorePassword(keystorePassword);
+ XMPPConnection remoteClient = new XMPPConnection(remoteConnectionConfiguration);
- client.connect();
- client.login(localUser.getNode(), "password1");
+ remoteClient.connect();
+ remoteClient.login(remoteUser.getNode(), remotePassword);
Thread.sleep(3000);
- //Message msg = new Message(remoteUser.getFullQualifiedName());
- Message msg = new Message("foo@sadfsdgdsfgdfsgfd.com");
+// Message msg = new Message(remoteUser.getFullQualifiedName());
+ Message msg = new Message(localUser.getFullQualifiedName());
msg.setBody("Hello world");
- client.sendPacket(msg);
+ remoteClient.sendPacket(msg);
Thread.sleep(8000);
- client.disconnect();
+ remoteClient.disconnect();
+ localClient.disconnect();
Thread.sleep(50000);