You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by be...@apache.org on 2007/12/08 23:47:35 UTC

svn commit: r602571 - in /labs/vysper/src/main/java/org/apache/vysper: mina/ xmpp/applicationdomains/base/handler/ xmpp/protocol/ xmpp/protocol/exception/ xmpp/protocol/worker/ xmpp/server/response/ xmpp/writer/ xmpp/xmlfragment/

Author: berndf
Date: Sat Dec  8 14:47:34 2007
New Revision: 602571

URL: http://svn.apache.org/viewvc?rev=602571&view=rev
Log:
[vysper] StartTLS stream securing is working

Added:
    labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/TLSException.java
      - copied, changed from r542950, labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/BadXMLException.java
Modified:
    labs/vysper/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java
    labs/vysper/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/applicationdomains/base/handler/StreamStartHandler.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptionStartedProtocolWorker.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/writer/DenseStanzaLogRenderer.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLElement.java

Modified: labs/vysper/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java?rev=602571&r1=602570&r2=602571&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java Sat Dec  8 14:47:34 2007
@@ -56,7 +56,7 @@
         if (switchToTLS) {
             minaSession.setTrafficMask(TrafficMask.WRITE);
             SSLFilter filter = new SSLFilter(getServerRuntimeContext().getSslContext());
-            filter.setUseClientMode(true);
+            filter.setUseClientMode(false);
             minaSession.getFilterChain().addFirst("sslFilter", filter);
             minaSession.setAttribute(SSLFilter.DISABLE_ENCRYPTION_ONCE, Boolean.TRUE);
             minaSession.setAttribute(SSLFilter.USE_NOTIFICATION, Boolean.TRUE);

Modified: labs/vysper/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java?rev=602571&r1=602570&r2=602571&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java Sat Dec  8 14:47:34 2007
@@ -19,6 +19,7 @@
 import org.apache.mina.common.IdleStatus;
 import org.apache.mina.common.IoHandler;
 import org.apache.mina.common.IoSession;
+import org.apache.mina.filter.SSLFilter;
 import org.apache.vysper.xmpp.protocol.ProtocolWorker;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
@@ -43,12 +44,28 @@
 
     public void messageReceived(IoSession ioSession, Object message) throws Exception {
         if (!(message instanceof Stanza)) {
-            throw new IllegalArgumentException("xmpp handler only accepts Stanza-typed messages");
+            messageReceivedNoStanza(ioSession, message);
+            return;
         }
-        Stanza stanza = (Stanza) message;
 
+        Stanza stanza = (Stanza) message;
         SessionContext session = extractSession(ioSession);
-        protocolWorker.processStanza(session, stanza, (SessionStateHolder)ioSession.getAttribute(ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER));
+        SessionStateHolder stateHolder = (SessionStateHolder) ioSession.getAttribute(ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER);
+
+        protocolWorker.processStanza(session, stanza, stateHolder);
+    }
+
+    private void messageReceivedNoStanza(IoSession ioSession, Object message) {
+        if (message == SSLFilter.SESSION_SECURED) {
+            SessionContext session = extractSession(ioSession);
+            SessionStateHolder stateHolder = (SessionStateHolder) ioSession.getAttribute(ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER);
+            protocolWorker.processTLSEstablished(session, stateHolder);
+            return;
+        } else if (message == SSLFilter.SESSION_UNSECURED) {
+            throw new IllegalStateException("server must close session!"); // TODO
+        }
+
+        throw new IllegalArgumentException("xmpp handler only accepts Stanza-typed messages");
     }
 
     private SessionContext extractSession(IoSession ioSession) {
@@ -57,6 +74,7 @@
 
     public void messageSent(IoSession ioSession, Object o) throws Exception {
         // TODO implement
+        System.err.println("*** message sent");
     }
 
     public void sessionCreated(IoSession ioSession) throws Exception {
@@ -68,17 +86,21 @@
 
     public void sessionOpened(IoSession ioSession) throws Exception {
         // TODO implement
+        System.err.println("*** session opened");
     }
 
     public void sessionClosed(IoSession ioSession) throws Exception {
         // TODO implement
+        System.err.println("*** session closed");
     }
 
     public void sessionIdle(IoSession ioSession, IdleStatus idleStatus) throws Exception {
         // TODO implement
+        System.err.println("*** session idle");
     }
 
     public void exceptionCaught(IoSession ioSession, Throwable throwable) throws Exception {
         // TODO implement
+        throwable.printStackTrace(System.err);
     }
 }

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/applicationdomains/base/handler/StreamStartHandler.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/applicationdomains/base/handler/StreamStartHandler.java?rev=602571&r1=602570&r2=602571&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/applicationdomains/base/handler/StreamStartHandler.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/applicationdomains/base/handler/StreamStartHandler.java Sat Dec  8 14:47:34 2007
@@ -56,7 +56,8 @@
         if (clientCall && serverCall) serverCall = false; // silently ignore ambigous attributes
         if (serverCall) sessionContext.setServerToServer(); else sessionContext.setClientToServer();
 
-        if (sessionStateHolder.getState() != SessionState.INITIATED) {
+        if (sessionStateHolder.getState() != SessionState.INITIATED && 
+            sessionStateHolder.getState() != SessionState.ENCRYPTED ) {
             return respondUnsupportedStanzaType("unexpected stream start");
         } 
         

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java?rev=602571&r1=602570&r2=602571&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java Sat Dec  8 14:47:34 2007
@@ -19,6 +19,7 @@
 
 import org.apache.vysper.xmpp.parser.ParsingException;
 import org.apache.vysper.xmpp.parser.StreamParser;
+import org.apache.vysper.xmpp.protocol.exception.TLSException;
 import org.apache.vysper.xmpp.protocol.worker.AuthenticatedProtocolWorker;
 import org.apache.vysper.xmpp.protocol.worker.EncryptedProtocolWorker;
 import org.apache.vysper.xmpp.protocol.worker.EncryptionStartedProtocolWorker;
@@ -116,6 +117,14 @@
         stateAwareProtocolWorker.processStanza(sessionContext, sessionStateHolder,
                                                stanza, stanzaHandler,
                                                responseWriter);
+    }
+    
+    public void processTLSEstablished(SessionContext sessionContext, SessionStateHolder sessionStateHolder) {
+        if (sessionContext.getState() != SessionState.ENCRYPTION_STARTED) {
+            responseWriter.handleProtocolError(new TLSException(), sessionContext, null);
+            return;
+        }
+        sessionStateHolder.setState(SessionState.ENCRYPTED);
     }
 
 

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java?rev=602571&r1=602570&r2=602571&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/ResponseWriter.java Sat Dec  8 14:47:34 2007
@@ -61,7 +61,8 @@
     }
 
     public void handleProtocolError(ProtocolException protocolException, SessionContext sessionContext, Stanza receivedStanza) {
-        Stanza errorStanza = protocolException.getErrorStanza();
+        Stanza errorStanza = null;
+        if (protocolException != null) errorStanza = protocolException.getErrorStanza();
 
         if (errorStanza == null) {
             errorStanza = ServerErrorResponses.getInstance().getError(StreamErrorCondition.BAD_FORMAT,

Copied: labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/TLSException.java (from r542950, labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/BadXMLException.java)
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/TLSException.java?p2=labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/TLSException.java&p1=labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/BadXMLException.java&r1=542950&r2=602571&rev=602571&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/BadXMLException.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/TLSException.java Sat Dec  8 14:47:34 2007
@@ -22,20 +22,20 @@
 /**
  *
  */
-public class BadXMLException extends ProtocolException {
-    public BadXMLException() {
+public class TLSException extends ProtocolException {
+    public TLSException() {
         super();
     }
 
-    public BadXMLException(String string) {
+    public TLSException(String string) {
         super(string);
     }
 
-    public BadXMLException(String string, Throwable throwable) {
+    public TLSException(String string, Throwable throwable) {
         super(string, throwable);
     }
 
-    public BadXMLException(Throwable throwable) {
+    public TLSException(Throwable throwable) {
         super(throwable);
     }
-}
+}
\ No newline at end of file

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java?rev=602571&r1=602570&r2=602571&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java Sat Dec  8 14:47:34 2007
@@ -23,6 +23,7 @@
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
 import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.applicationdomains.base.handler.StreamStartHandler;
 
 /**
  */
@@ -33,6 +34,8 @@
     }
 
     protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza, StanzaHandler stanzaHandler, ResponseWriter responseWriter) {
-        throw new RuntimeException("worker not implemented");
+        if (stanzaHandler instanceof StreamStartHandler) return true;
+        responseWriter.writeStreamNotOpenedError(sessionContext);
+        return false;
     }
 }

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptionStartedProtocolWorker.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptionStartedProtocolWorker.java?rev=602571&r1=602570&r2=602571&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptionStartedProtocolWorker.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptionStartedProtocolWorker.java Sat Dec  8 14:47:34 2007
@@ -33,6 +33,9 @@
     }
 
     protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza, StanzaHandler stanzaHandler, ResponseWriter responseWriter) {
+        // StartTLS is currently completely handled on the protocol side.
+        // anyway, there are no stanzas to be parsed between ENCRYPTION_STARTED and ENCRYPTED.
+        // the state change is handeld in ProtocolWorker.processTLSEstablished()
         throw new RuntimeException("worker not implemented");
     }
 }

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java?rev=602571&r1=602570&r2=602571&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java Sat Dec  8 14:47:34 2007
@@ -22,6 +22,7 @@
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.server.XMPPVersion;
 import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.server.SessionState;
 import org.apache.vysper.xmpp.addressing.Entity;
 
 /**
@@ -33,7 +34,11 @@
     }
 
     public Stanza getStreamOpener(boolean forClient, Entity from, XMPPVersion version, SessionContext sessionContext) {
-        Stanza innerFeatureStanza = getFeaturesForEncryption(sessionContext);
+        Stanza innerFeatureStanza;
+        if (sessionContext.getState() == SessionState.INITIATED) innerFeatureStanza = getFeaturesForEncryption(sessionContext);
+        else if (sessionContext.getState() == SessionState.ENCRYPTED) innerFeatureStanza = getFeaturesForAuthentication(); 
+        else throw new IllegalStateException("unsupported state for responding with stream opener"); 
+        
         StanzaBuilder stanzaBuilder = getStreamOpener(forClient, from, sessionContext.getXMLLang(), version, sessionContext.getSessionId(), innerFeatureStanza);
         
         return stanzaBuilder.getFinalStanza();

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/writer/DenseStanzaLogRenderer.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/writer/DenseStanzaLogRenderer.java?rev=602571&r1=602570&r2=602571&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/writer/DenseStanzaLogRenderer.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/writer/DenseStanzaLogRenderer.java Sat Dec  8 14:47:34 2007
@@ -21,6 +21,9 @@
 import org.apache.vysper.xmpp.xmlfragment.XMLText;
 import org.apache.vysper.xmpp.xmlfragment.Attribute;
 
+import java.util.List;
+import java.util.Iterator;
+
 /**
  * renders only reduced digest stanza information for logging output
  */
@@ -30,20 +33,48 @@
     private static final String EQUALS = "=";
 
     public static String render(XMLElement stanza) {
-        StringBuilder stringBuilder = new StringBuilder();
-        String outerName = stanza.getName();
-        stringBuilder.append(outerName);
-        XMLElement firstInnerElement = stanza.getFirstInnerElement();
+        try {
+            StringBuilder stringBuilder = new StringBuilder();
+            String outerName = stanza.getName();
+            stringBuilder.append(outerName);
+            XMLElement firstInnerElement = stanza.getFirstInnerElement();
+
+            if ("stream".equals(outerName)) {
+                renderStreamStart(stringBuilder, stanza, firstInnerElement);
+            } else if ("message".equals(outerName)) {
+                renderMessage(stringBuilder, stanza, firstInnerElement);
+            } else if ("error".equals(outerName)) {
+                renderError(stringBuilder, stanza, firstInnerElement);
+            } else if ("presence".equals(outerName)) {
+                renderPresence(stringBuilder, stanza, firstInnerElement);
+            }
+
+            return stringBuilder.toString();
+        } catch (Exception e) {
+            return "*render-exception*";
+        }
+    }
 
-        if ("message".equals(outerName)) {
-            renderMessage(stringBuilder, stanza, firstInnerElement);
-        } else if ("error".equals(outerName)) {
-            renderError(stringBuilder, stanza, firstInnerElement);
-        } else if ("presence".equals(outerName)) {
-            renderPresence(stringBuilder, stanza, firstInnerElement);
+    private static void renderStreamStart(StringBuilder stringBuilder, XMLElement stanza, XMLElement firstInnerElement) {
+        try {
+            XMLElement features = stanza.getSingleInnerElementsNamed("features");
+            if (features != null) {
+                XMLElement mechanisms = features.getSingleInnerElementsNamed("mechanisms");
+                if (mechanisms != null) {
+                    stringBuilder.append(ELEMENT_SEPARATOR);
+                    stringBuilder.append("features.mechanisms[");
+                    List<XMLElement> list = mechanisms.getInnerElementsNamed("mechanism");
+                    for (Iterator<XMLElement> it = list.iterator(); it.hasNext();) {
+                        XMLElement element = it.next();
+                        stringBuilder.append(element.getSingleInnerText().getText());
+                        if (it.hasNext()) stringBuilder.append(",");
+                    }
+                    stringBuilder.append("]");
+                }
+            }
+        } catch (XMLSemanticError xmlSemanticError) {
+            stringBuilder.append("*error*");
         }
-        
-        return stringBuilder.toString();
     }
 
     private static void renderError(StringBuilder stringBuilder, XMLElement stanza, XMLElement firstInnerElement) {

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLElement.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLElement.java?rev=602571&r1=602570&r2=602571&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLElement.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/xmlfragment/XMLElement.java Sat Dec  8 14:47:34 2007
@@ -129,6 +129,7 @@
     public List<XMLElement> getInnerElementsNamed(String name) {
         if (name == null) return null;
         List<XMLElement> innerElements = getInnerElements();
+        if (innerElements == null) return null;
         Iterator<XMLElement> elementIterator = innerElements.iterator(); // this List will be modified now!
         while (elementIterator.hasNext()) {
             XMLElement xmlElement =  elementIterator.next();
@@ -139,6 +140,7 @@
 
     public XMLElement getSingleInnerElementsNamed(String name) throws XMLSemanticError {
         List<XMLElement> innerElements = getInnerElementsNamed(name);
+        if (innerElements == null) return null;
         if (innerElements.isEmpty()) return null;
         if (innerElements.size() > 1) throw new XMLSemanticError("element has more than one inner element named: " + name);
         return innerElements.get(0);



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org