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/03 23:29:10 UTC

svn commit: r1054811 - in /mina/vysper/branches/s2s/server/core/src: main/java/org/apache/vysper/xmpp/modules/core/base/handler/ main/java/org/apache/vysper/xmpp/server/response/ main/java/org/apache/vysper/xmpp/server/s2s/ test/java/org/apache/vysper/...

Author: ngn
Date: Mon Jan  3 22:29:10 2011
New Revision: 1054811

URL: http://svn.apache.org/viewvc?rev=1054811&view=rev
Log:
Fix s2s interoperability with older servers (e.g. GTalk)

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/server/response/ServerResponses.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/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=1054811&r1=1054810&r2=1054811&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 Mon Jan  3 22:29:10 2011
@@ -20,6 +20,7 @@
 
 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.EntityFormatException;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
@@ -158,9 +159,7 @@ public class StreamStartHandler implemen
                             "could not parse incoming stanza's FROM attribute", null));
                 }
             }
-            
-            // TODO set version correctly
-            responseVersion = XMPPVersion.VERSION_1_0;
+
             responseStanza = new ServerResponses().getStreamOpenerForServerAcceptor(sessionContext.getServerJID(),
                     responseVersion, sessionContext, serverRuntimeContext.getSslContext() != null);
         } else {

Modified: mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java?rev=1054811&r1=1054810&r2=1054811&view=diff
==============================================================================
--- mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java (original)
+++ mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java Mon Jan  3 22:29:10 2011
@@ -62,19 +62,26 @@ public class ServerResponses {
     }
 
     public Stanza getStreamOpenerForServerAcceptor(Entity from, XMPPVersion version, SessionContext sessionContext, boolean tlsConfigured) {
-        StanzaBuilder featureBuilder = startFeatureStanza();
-        if (sessionContext.getState() == SessionState.INITIATED) {
-            featureBuilder.startInnerElement("starttls", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS).endInnerElement();
-            featureBuilder.startInnerElement("dialback", NamespaceURIs.URN_XMPP_FEATURES_DIALBACK).endInnerElement();
-
-        } else if (sessionContext.getState() == SessionState.ENCRYPTED) {
-            featureBuilder.startInnerElement("dialback", NamespaceURIs.URN_XMPP_FEATURES_DIALBACK).endInnerElement();
-        } else {
-            throw new IllegalStateException("unsupported state for responding with stream opener");
+        
+        Stanza features = null;
+        
+        // only include <features> if the other server support version 1.0
+        if(XMPPVersion.VERSION_1_0.equals(version)) {
+            StanzaBuilder featureBuilder = startFeatureStanza();
+            if (sessionContext.getState() == SessionState.INITIATED) {
+                featureBuilder.startInnerElement("starttls", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS).endInnerElement();
+                featureBuilder.startInnerElement("dialback", NamespaceURIs.URN_XMPP_FEATURES_DIALBACK).endInnerElement();
+                
+            } else if (sessionContext.getState() == SessionState.ENCRYPTED) {
+                featureBuilder.startInnerElement("dialback", NamespaceURIs.URN_XMPP_FEATURES_DIALBACK).endInnerElement();
+            } else {
+                throw new IllegalStateException("unsupported state for responding with stream opener");
+            }
+            features = featureBuilder.build();
         }
         
         StanzaBuilder stanzaBuilder = getStreamOpener(false, from, sessionContext.getXMLLang(), version,
-                sessionContext.getSessionId(), featureBuilder.build());
+                sessionContext.getSessionId(), features);
 
         stanzaBuilder.declareNamespace("db", NamespaceURIs.JABBER_SERVER_DIALBACK);
         return stanzaBuilder.build();

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=1054811&r1=1054810&r2=1054811&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 Mon Jan  3 22:29:10 2011
@@ -25,6 +25,8 @@ import org.apache.vysper.xmpp.modules.ex
 import org.apache.vysper.xmpp.modules.extension.xep0119_xmppping.XmppPingModule;
 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.modules.extension.xep0220_server_dailback.DialbackIdGenerator;
+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.protocol.StanzaHandler;
@@ -35,6 +37,7 @@ import org.apache.vysper.xmpp.server.XMP
 import org.apache.vysper.xmpp.server.response.ServerResponses;
 import org.apache.vysper.xmpp.server.s2s.XmppEndpointResolver.ResolvedAddress;
 import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -243,14 +246,27 @@ public class DefaultXMPPServerConnector 
                 // none of the handlers matched, stream start is handled separately
                 } else if(stanza.getName().equals("stream")) {
                     sessionContext.setSessionId(stanza.getAttributeValue("id"));
-                    sessionContext.setInitiatingEntity(stanza.getFrom());
+                    sessionContext.setInitiatingEntity(otherServer);
+                    
+                    String version = stanza.getAttributeValue("version");
+                    if(version == null) {
+                        // old protocol, assume dialback
+                        String dailbackId = new DialbackIdGenerator().generate(otherServer, serverRuntimeContext.getServerEnitity(), sessionContext.getSessionId());
+                        
+                        Stanza dbResult = new StanzaBuilder("result", NamespaceURIs.JABBER_SERVER_DIALBACK, "db")
+                            .addAttribute("from", serverRuntimeContext.getServerEnitity().getDomain())
+                            .addAttribute("to", otherServer.getDomain())
+                            .addText(dailbackId)
+                            .build();
+                        write(dbResult);
+                    }
                     
                     if(dialbackSessionContext != null) {
                         // connector is being used for dialback verification, don't do further authentication
                         sessionContext.putAttribute("DIALBACK_SESSION_CONTEXT", dialbackSessionContext);
                         sessionContext.putAttribute("DIALBACK_SESSION_STATE_HOLDER", dialbackSessionStateHolder);
                      
-                        sessionContext.setInitiatingEntity(stanza.getFrom());
+                        sessionContext.setInitiatingEntity(otherServer);
                         sessionStateHolder.setState(SessionState.AUTHENTICATED);
                         authenticatedLatch.countDown();
                     }

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=1054811&r1=1054810&r2=1054811&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 Mon Jan  3 22:29:10 2011
@@ -15,6 +15,7 @@ import org.apache.vysper.xmpp.stanza.Sta
 import org.jivesoftware.smack.ConnectionConfiguration;
 import org.jivesoftware.smack.PacketListener;
 import org.jivesoftware.smack.XMPPConnection;
+import org.jivesoftware.smack.XMPPException;
 import org.jivesoftware.smack.filter.PacketFilter;
 import org.jivesoftware.smack.packet.Message;
 import org.jivesoftware.smack.packet.Packet;
@@ -69,20 +70,30 @@ public class Server2Server {
         
         Thread.sleep(2000);
 
-//        XMPPServerConnectorRegistry registry = serverRuntimeContext.getServerConnectorRegistry();
-//        
-//        XMPPServerConnector connector = registry.getConnector(remoteServer);
-//        
-//        Stanza stanza = new StanzaBuilder("message", NamespaceURIs.JABBER_SERVER)
-//            .addAttribute("from", localUser.getFullQualifiedName())
-//            .addAttribute("to", remoteUser.getFullQualifiedName())
-//            .startInnerElement("body", NamespaceURIs.JABBER_SERVER)
-//            .addText("Hello world")
-//            .endInnerElement()
-//            .build();
-//            
-//        connector.write(stanza);
+        XMPPServerConnectorRegistry registry = serverRuntimeContext.getServerConnectorRegistry();
         
+        XMPPServerConnector connector = registry.connect(remoteServer);
+        
+        Stanza stanza = new StanzaBuilder("message", NamespaceURIs.JABBER_SERVER)
+            .addAttribute("from", localUser.getFullQualifiedName())
+            .addAttribute("to", remoteUser.getFullQualifiedName())
+            .startInnerElement("body", NamespaceURIs.JABBER_SERVER)
+            .addText("Hello world")
+            .endInnerElement()
+            .build();
+            
+        connector.write(stanza);
+        
+        //sendMessagesUsingClients(localUser, remoteServer, remoteUser, remotePassword, keystorePath, keystorePassword);
+        
+        Thread.sleep(50000);
+        
+        server.stop();
+    }
+
+    private static void sendMessagesUsingClients(Entity localUser, Entity remoteServer, Entity remoteUser,
+            String remotePassword, String keystorePath, String keystorePassword) throws XMPPException,
+            InterruptedException {
         ConnectionConfiguration localConnectionConfiguration = new ConnectionConfiguration("localhost", 5222);
         localConnectionConfiguration.setKeystorePath(keystorePath);
         localConnectionConfiguration.setTruststorePath(keystorePath);
@@ -124,10 +135,6 @@ public class Server2Server {
         Thread.sleep(8000);
         remoteClient.disconnect();
         localClient.disconnect();
-        
-        Thread.sleep(50000);
-        
-        server.stop();
     }
     
 }