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