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 2008/09/24 13:47:54 UTC

svn commit: r698528 - in /labs/vysper/src: main/java/org/apache/vysper/xmpp/authorization/ main/java/org/apache/vysper/xmpp/modules/core/sasl/ main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/ main/java/org/apache/vysper/xmpp/protocol/excepti...

Author: berndf
Date: Wed Sep 24 04:47:54 2008
New Revision: 698528

URL: http://svn.apache.org/viewvc?rev=698528&view=rev
Log:
add <abort /> to authorization
unit tests for authorization
implement auth failure counter
add attributes store to session context


Added:
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/AuthorizationRetriesCounter.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java   (contents, props changed)
      - copied, changed from r672387, labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbstractSASLHandler.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/AuthorizationFailedException.java   (contents, props changed)
      - copied, changed from r671604, labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/TLSException.java
    labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/
    labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/
    labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandlerTestCase.java
    labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerPlainMechanismTestCase.java   (contents, props changed)
      - copied, changed from r672387, labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandlerTestCase.java
    labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerUnavailableMechanismTestCase.java
Modified:
    labs/vysper/src/main/java/org/apache/vysper/xmpp/authorization/Plain.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/server/ServerFeatures.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/authorization/Plain.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/authorization/Plain.java?rev=698528&r1=698527&r2=698528&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/authorization/Plain.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/authorization/Plain.java Wed Sep 24 04:47:54 2008
@@ -16,24 +16,26 @@
  ***********************************************************************/
 package org.apache.vysper.xmpp.authorization;
 
+import org.apache.commons.codec.binary.Base64;
+import org.apache.vysper.xmpp.addressing.EntityFormatException;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.modules.core.sasl.SASLFailureType;
+import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
-import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.xmlfragment.XMLText;
-import org.apache.vysper.xmpp.modules.core.sasl.SASLFailureType;
-import org.apache.vysper.xmpp.addressing.Entity;
-import org.apache.vysper.xmpp.addressing.EntityImpl;
-import org.apache.vysper.xmpp.addressing.EntityFormatException;
-import org.apache.commons.codec.binary.Base64;
 
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  * handles SASL PLAIN mechanism. this mechanism is standardized in RFC4616
  */
 public class Plain implements SASLMechanism {
+    
+    private static final AuthorizationResponses AUTHORIZATION_RESPONSES = new AuthorizationResponses();
+
     public String getName() {
         return "PLAIN";
     }
@@ -42,14 +44,14 @@
         // TODO assure, that connection is secured via TLS. if not, reject SASL PLAIN 
         
         List<XMLText> innerTexts = authStanza.getInnerTexts();
-        if (innerTexts == null || innerTexts.isEmpty()) return new AuthorizationResponses().getFailureMalformedRequest();
+        if (innerTexts == null || innerTexts.isEmpty()) return AUTHORIZATION_RESPONSES.getFailureMalformedRequest();
 
         XMLText base64Encoded = innerTexts.get(0);
         byte[] decoded = new byte[0];
         try {
             decoded = Base64.decodeBase64(base64Encoded.getText().getBytes());
         } catch (Throwable e) {
-            return new AuthorizationResponses().getFailure(SASLFailureType.INCORRECT_ENCODING);
+            return AUTHORIZATION_RESPONSES.getFailure(SASLFailureType.INCORRECT_ENCODING);
         }
 
         List<String> decodedParts = new ArrayList<String>();
@@ -66,7 +68,7 @@
         }
 
         if (decodedParts.size() != 3) {
-            return new AuthorizationResponses().getFailureMalformedRequest();  
+            return AUTHORIZATION_RESPONSES.getFailureMalformedRequest();  
         }
         
         String alias = decodedParts.get(0); // "authorization identity (identity to act as)", currently unused
@@ -78,7 +80,7 @@
         try {
             initiatingEntity = EntityImpl.parse(username);
         } catch (EntityFormatException e) {
-            return new AuthorizationResponses().getFailureNotAuthorized();
+            return AUTHORIZATION_RESPONSES.getFailureNotAuthorized();
         }
 
         boolean authorized = sessionContext.getServerRuntimeContext().getUserAuthorization().verifyCredentials(username, password, null);
@@ -86,9 +88,9 @@
         if (authorized) {
             sessionContext.setInitiatingEntity(initiatingEntity);
             sessionStateHolder.setState(SessionState.AUTHENTICATED);
-            return new AuthorizationResponses().getSuccess();
+            return AUTHORIZATION_RESPONSES.getSuccess();
         } else {
-            return new AuthorizationResponses().getFailureNotAuthorized();
+            return AUTHORIZATION_RESPONSES.getFailureNotAuthorized();
         }
     }
 }

Added: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/AuthorizationRetriesCounter.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/AuthorizationRetriesCounter.java?rev=698528&view=auto
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/AuthorizationRetriesCounter.java (added)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/AuthorizationRetriesCounter.java Wed Sep 24 04:47:54 2008
@@ -0,0 +1,55 @@
+package org.apache.vysper.xmpp.modules.core.sasl;
+
+import org.apache.vysper.xmpp.server.SessionContext;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * used to count authentication retries.
+ * after the count is down to zero
+ */
+public class AuthorizationRetriesCounter {
+    
+    public static final String SESSION_ATTRIBUTE_ABORTION_COUNTER = "authorizationRetriesCounter";
+
+    public static AuthorizationRetriesCounter getFromSession(SessionContext sessionContext) {
+        AuthorizationRetriesCounter counter = (AuthorizationRetriesCounter) sessionContext.getAttribute(SESSION_ATTRIBUTE_ABORTION_COUNTER);
+
+        synchronized (sessionContext) {
+            if (counter == null) {
+                int retries = sessionContext.getServerRuntimeContext().getServerFeatures().getAuthenticationRetries();
+                counter = new AuthorizationRetriesCounter(retries);
+                sessionContext.putAttribute(SESSION_ATTRIBUTE_ABORTION_COUNTER, counter);
+            }
+        }
+        return counter;
+    }
+
+    public static void removeFromSession(SessionContext sessionContext) {
+        sessionContext.putAttribute(SESSION_ATTRIBUTE_ABORTION_COUNTER, null);
+    }
+    
+    AtomicInteger counter;
+
+    public AuthorizationRetriesCounter(int counter) {
+        if (counter <= 0) throw new IllegalArgumentException("counter must be positive");
+        this.counter = new AtomicInteger(counter);
+    }
+    
+    public boolean hasTriesLeft() {
+        return counter.intValue() > 0;
+    }
+
+    /**
+     * 
+     * @return TRUE has tries left, FALSE has no tries left, should lead to session termination
+     */
+    public boolean countFailedTry() {
+        if (!hasTriesLeft()) return false;
+        return counter.decrementAndGet() > 0;
+    }
+    
+    public int getTriesLeft() {
+        return counter.intValue();
+    }
+}

Copied: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java (from r672387, labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java)
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java?p2=labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java&p1=labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java&r1=672387&r2=698528&rev=698528&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java Wed Sep 24 04:47:54 2008
@@ -17,65 +17,30 @@
 
 package org.apache.vysper.xmpp.modules.core.sasl.handler;
 
-import org.apache.vysper.xmpp.authorization.SASLMechanism;
-import org.apache.vysper.xmpp.modules.core.sasl.SASLFailureType;
-import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.modules.core.sasl.AuthorizationRetriesCounter;
 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.SessionContext;
-import org.apache.vysper.xmpp.server.SessionState;
-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.xmlfragment.Attribute;
-import org.apache.vysper.xmpp.xmlfragment.XMLElementVerifier;
-
-import java.util.List;
 
 /**
  */
-public class AuthHandler implements StanzaHandler {
+public class AbortHandler extends AbstractSASLHandler {
     public String getName() {
-        return "auth";
-    }
-
-    public boolean verify(Stanza stanza) {
-        if (stanza == null) return false;
-        if (!getName().equals(stanza.getName())) return false;
-        return true;
+        return "abort";
     }
 
-    public ResponseStanzaContainer execute(Stanza stanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder) {
-        XMLElementVerifier xmlElementVerifier = stanza.getVerifier();
-        boolean saslNamespace = xmlElementVerifier.namespacePresent(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
-
-        if (!saslNamespace) {
-            return respondSASLFailure();
-        }
-        if (sessionStateHolder.getState() != SessionState.ENCRYPTED) {
-            return respondSASLFailure();
-        }
-
-        Attribute attribute = stanza.getAttribute("mechanism");
-        String requestedMechanism = attribute.getValue();
-        SASLMechanism identifiedMechanism = null;
-
-        List<SASLMechanism> list = sessionContext.getServerRuntimeContext().getServerFeatures().getAuthenticationMethods();
-        for (SASLMechanism saslMechanism : list) {
-            if (saslMechanism.getName().equals(requestedMechanism)) {
-                identifiedMechanism = saslMechanism;
-                break;
-            }
-        }
-        if (identifiedMechanism == null) throw new RuntimeException("return error");
-
-        Stanza responseStanza = identifiedMechanism.started(sessionContext, sessionStateHolder, stanza);
+    @Override
+    public ResponseStanzaContainer executeWorker(Stanza stanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder) {
         
-        return new ResponseStanzaContainerImpl(responseStanza);
-    }
+        AuthorizationRetriesCounter counter = AuthorizationRetriesCounter.getFromSession(sessionContext);
+        boolean moreTriesLeft = counter.countFailedTry(); // record that client aborted
+        
+        // TODO do more clean-ups as mechanism requires.
 
-    private ResponseStanzaContainer respondSASLFailure() {
-        return new ResponseStanzaContainerImpl(ServerErrorResponses.getInstance().getSASLFailure(SASLFailureType.MALFORMED_REQUEST));
+        return new ResponseStanzaContainerImpl(new ServerResponses().getAuthAborted());
     }
+
 }
\ No newline at end of file

Propchange: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Added: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbstractSASLHandler.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbstractSASLHandler.java?rev=698528&view=auto
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbstractSASLHandler.java (added)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbstractSASLHandler.java Wed Sep 24 04:47:54 2008
@@ -0,0 +1,52 @@
+package org.apache.vysper.xmpp.modules.core.sasl.handler;
+
+import org.apache.vysper.xmpp.protocol.StanzaHandler;
+import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
+import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
+import org.apache.vysper.xmpp.protocol.exception.AuthorizationFailedException;
+import org.apache.vysper.xmpp.stanza.Stanza;
+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.modules.core.sasl.AuthorizationRetriesCounter;
+import org.apache.vysper.xmpp.modules.core.sasl.SASLFailureType;
+import org.apache.vysper.xmpp.xmlfragment.XMLElementVerifier;
+
+/**
+ */
+public abstract class AbstractSASLHandler implements StanzaHandler {
+    public boolean verify(Stanza stanza) {
+        if (stanza == null) return false;
+        if (!getName().equals(stanza.getName())) return false;
+        return true;
+    }
+
+    public ResponseStanzaContainer execute(Stanza stanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder) throws AuthorizationFailedException {
+        if (!AuthorizationRetriesCounter.getFromSession(sessionContext).hasTriesLeft()) {
+            AuthorizationFailedException failedException = new AuthorizationFailedException("too many retries");
+            failedException.setErrorStanza(ServerErrorResponses.getInstance().getStreamError(StreamErrorCondition.POLICY_VIOLATION, null, null, null));
+            throw failedException;
+        }
+
+        XMLElementVerifier xmlElementVerifier = stanza.getVerifier();
+        boolean saslNamespace = xmlElementVerifier.namespacePresent(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
+
+        if (!saslNamespace) {
+            return respondSASLFailure();
+        }
+        if (sessionStateHolder.getState() != SessionState.ENCRYPTED) {
+            return respondSASLFailure();
+        }
+
+        return executeWorker(stanza, sessionContext, sessionStateHolder);
+    }
+
+    protected ResponseStanzaContainer respondSASLFailure() {
+        return new ResponseStanzaContainerImpl(ServerErrorResponses.getInstance().getSASLFailure(SASLFailureType.MALFORMED_REQUEST));
+    }
+    
+    protected abstract ResponseStanzaContainer executeWorker(Stanza stanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder);
+}

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java?rev=698528&r1=698527&r2=698528&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandler.java Wed Sep 24 04:47:54 2008
@@ -18,47 +18,32 @@
 package org.apache.vysper.xmpp.modules.core.sasl.handler;
 
 import org.apache.vysper.xmpp.authorization.SASLMechanism;
-import org.apache.vysper.xmpp.modules.core.sasl.SASLFailureType;
-import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.modules.core.sasl.AuthorizationRetriesCounter;
 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.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.xmlfragment.Attribute;
-import org.apache.vysper.xmpp.xmlfragment.XMLElementVerifier;
 
 import java.util.List;
 
 /**
  */
-public class AuthHandler implements StanzaHandler {
+public class AuthHandler extends AbstractSASLHandler {
     public String getName() {
         return "auth";
     }
 
-    public boolean verify(Stanza stanza) {
-        if (stanza == null) return false;
-        if (!getName().equals(stanza.getName())) return false;
-        return true;
-    }
-
-    public ResponseStanzaContainer execute(Stanza stanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder) {
-        XMLElementVerifier xmlElementVerifier = stanza.getVerifier();
-        boolean saslNamespace = xmlElementVerifier.namespacePresent(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
-
-        if (!saslNamespace) {
-            return respondSASLFailure();
-        }
-        if (sessionStateHolder.getState() != SessionState.ENCRYPTED) {
+    @Override
+    protected ResponseStanzaContainer executeWorker(Stanza stanza, SessionContext sessionContext, SessionStateHolder sessionStateHolder) {
+        Attribute attribute = stanza.getAttribute("mechanism");
+        if (attribute == null || attribute.getValue() == null) {
             return respondSASLFailure();
         }
-
-        Attribute attribute = stanza.getAttribute("mechanism");
         String requestedMechanism = attribute.getValue();
+
         SASLMechanism identifiedMechanism = null;
 
         List<SASLMechanism> list = sessionContext.getServerRuntimeContext().getServerFeatures().getAuthenticationMethods();
@@ -71,11 +56,13 @@
         if (identifiedMechanism == null) throw new RuntimeException("return error");
 
         Stanza responseStanza = identifiedMechanism.started(sessionContext, sessionStateHolder, stanza);
-        
+        if (sessionStateHolder.getState() == SessionState.AUTHENTICATED) {
+            AuthorizationRetriesCounter.removeFromSession(sessionContext);
+        } else {
+            AuthorizationRetriesCounter.getFromSession(sessionContext).countFailedTry();
+        }
+
         return new ResponseStanzaContainerImpl(responseStanza);
     }
 
-    private ResponseStanzaContainer respondSASLFailure() {
-        return new ResponseStanzaContainerImpl(ServerErrorResponses.getInstance().getSASLFailure(SASLFailureType.MALFORMED_REQUEST));
-    }
 }
\ No newline at end of file

Copied: labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/AuthorizationFailedException.java (from r671604, labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/TLSException.java)
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/AuthorizationFailedException.java?p2=labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/AuthorizationFailedException.java&p1=labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/TLSException.java&r1=671604&r2=698528&rev=698528&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/TLSException.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/AuthorizationFailedException.java Wed Sep 24 04:47:54 2008
@@ -22,20 +22,20 @@
 /**
  *
  */
-public class TLSException extends ProtocolException {
-    public TLSException() {
+public class AuthorizationFailedException extends ProtocolException {
+    public AuthorizationFailedException() {
         super();
     }
 
-    public TLSException(String string) {
+    public AuthorizationFailedException(String string) {
         super(string);
     }
 
-    public TLSException(String string, Throwable throwable) {
+    public AuthorizationFailedException(String string, Throwable throwable) {
         super(string, throwable);
     }
 
-    public TLSException(Throwable throwable) {
+    public AuthorizationFailedException(Throwable throwable) {
         super(throwable);
     }
 }
\ No newline at end of file

Propchange: labs/vysper/src/main/java/org/apache/vysper/xmpp/protocol/exception/AuthorizationFailedException.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

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=698528&r1=698527&r2=698528&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 Wed Sep 24 04:47:54 2008
@@ -18,7 +18,7 @@
 package org.apache.vysper.xmpp.protocol.worker;
 
 import org.apache.vysper.xmpp.modules.core.base.handler.StreamStartHandler;
-import org.apache.vysper.xmpp.modules.core.sasl.handler.AuthHandler;
+import org.apache.vysper.xmpp.modules.core.sasl.handler.AbstractSASLHandler;
 import org.apache.vysper.xmpp.protocol.ResponseWriter;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
@@ -38,7 +38,7 @@
     @Override
     protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza, StanzaHandler stanzaHandler, ResponseWriter responseWriter) {
         if (stanzaHandler instanceof StreamStartHandler) return true;
-        if (stanzaHandler instanceof AuthHandler) return true;
+        if (stanzaHandler instanceof AbstractSASLHandler) return true;
         responseWriter.writeUnsupportedStanzaError(sessionContext);
         return false;
     }

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java?rev=698528&r1=698527&r2=698528&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java Wed Sep 24 04:47:54 2008
@@ -24,6 +24,9 @@
 import org.apache.vysper.xmpp.uuid.UUIDGenerator;
 import org.apache.vysper.xmpp.writer.StanzaWriter;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * provides default session context behavior
  */
@@ -37,6 +40,7 @@
     protected Entity serverEntity;
     private Entity initiatingEntity;
     private boolean serverToServer = false;
+    private Map<String, Object> attributeMap = new HashMap<String, Object>();
 
     public AbstractSessionContext(ServerRuntimeContext serverRuntimeContext, SessionStateHolder sessionStateHolder) {
         this.serverRuntimeContext = serverRuntimeContext;
@@ -113,4 +117,12 @@
     public String nextSequenceValue() {
     	return sequence.create();
     }
+
+    public Object putAttribute(String key, Object value) {
+        return attributeMap.put(key, value);
+    }
+
+    public Object getAttribute(String key) {
+        return attributeMap.get(key);
+    }
 }

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/server/ServerFeatures.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/server/ServerFeatures.java?rev=698528&r1=698527&r2=698528&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/server/ServerFeatures.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/server/ServerFeatures.java Wed Sep 24 04:47:54 2008
@@ -44,7 +44,12 @@
     /**
      * flag indicating whether stanzas are sent to remote servers or not
      */
-    private boolean relayToFederationServers = false; 
+    private boolean relayToFederationServers = false;
+
+    /**
+     * counter, how many times a session can try authentication before session is terminated 
+     */
+    private int authenticationRetries = 3;
 
     public ServerFeatures() {
         // default constructor
@@ -66,6 +71,10 @@
         return Collections.unmodifiableList(authenticationMethods);
     }
 
+    public int getAuthenticationRetries() {
+        return authenticationRetries;
+    }
+
     public boolean isRelayingMessages() {
         return relayMessages;
     }

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java?rev=698528&r1=698527&r2=698528&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java Wed Sep 24 04:47:54 2008
@@ -138,4 +138,20 @@
 	 */
 	String nextSequenceValue();
 
+    /**
+     * put arbitrary object into the session
+     * @param key identifier used to retrieve the object
+     * @param value NULL to not store an object with the key
+     * @return previous stored value object, or NULL
+     */
+    Object putAttribute(String key, Object value);
+
+    /**
+     * retrieve object 
+     * @param key retrieve a previously stored attribute
+     * @return stored object for the given key, or NULL
+     * @see org.apache.vysper.xmpp.server.SessionContext#putAttribute(String, Object) 
+     */
+    Object getAttribute(String key);
+    
 }

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=698528&r1=698527&r2=698528&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 Wed Sep 24 04:47:54 2008
@@ -121,4 +121,11 @@
         return stanzaBuilder.getFinalStanza();
     }
 
+    public Stanza getAuthAborted() {
+
+        StanzaBuilder stanzaBuilder = new StanzaBuilder("aborted");
+        stanzaBuilder.addNamespaceAttribute(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS);
+        return stanzaBuilder.getFinalStanza();
+    }
+
 }

Added: labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandlerTestCase.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandlerTestCase.java?rev=698528&view=auto
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandlerTestCase.java (added)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandlerTestCase.java Wed Sep 24 04:47:54 2008
@@ -0,0 +1,120 @@
+/***********************************************************************
+ * Copyright (c) 2006-2007 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.core.sasl.handler;
+
+import junit.framework.TestCase;
+import org.apache.vysper.xmpp.authorization.Plain;
+import org.apache.vysper.xmpp.authorization.SASLMechanism;
+import org.apache.vysper.xmpp.authorization.SimpleUserAuthorization;
+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.exception.AuthorizationFailedException;
+import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.TestSessionContext;
+import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
+import org.apache.vysper.xmpp.modules.core.sasl.AuthorizationRetriesCounter;
+import org.apache.commons.codec.binary.Base64;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ */
+public class AbortHandlerTestCase extends TestCase {
+    private TestSessionContext sessionContext;
+
+    private SessionStateHolder sessionStateHolder = new SessionStateHolder();
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        sessionContext = new TestSessionContext(sessionStateHolder);
+        sessionContext.setSessionState(SessionState.ENCRYPTED);
+
+        List<SASLMechanism> methods = new ArrayList<SASLMechanism>();
+        methods.add(new Plain());
+        
+        sessionContext.getServerRuntimeContext().getServerFeatures().setAuthenticationMethods(methods);
+        SimpleUserAuthorization users = new SimpleUserAuthorization();
+        users.addUser("user007@test", "pass007");
+        ((DefaultServerRuntimeContext) sessionContext.getServerRuntimeContext()).setUserAuthorization(users);
+    }
+    public void testAbort() throws XMLSemanticError, AuthorizationFailedException {
+
+        executeAbortAuthorization_3Times();
+        
+        StanzaBuilder stanzaBuilder = createAbort();
+        Stanza abortPlainStanza = stanzaBuilder.getFinalStanza();
+
+        stanzaBuilder = new StanzaBuilder("auth");
+        stanzaBuilder.addNamespaceAttribute(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
+        stanzaBuilder.addAttribute("mechanism", "PLAIN");
+        stanzaBuilder.addText(new String(Base64.encodeBase64("dummy\0user007\0pass007".getBytes())));
+        Stanza authPlainStanza = stanzaBuilder.getFinalStanza();
+
+        // correct credential no longer work - no retries left
+        AuthHandler authHandler = new AuthHandler();
+        try {
+            ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext, sessionStateHolder);
+            fail("should raise error - no tries left");
+        } catch (AuthorizationFailedException e) {
+            // test succeeded
+        }
+
+    }
+
+    private void executeAbortAuthorization_3Times() throws AuthorizationFailedException {
+        Stanza responseStanza = executeAbort();
+        assertTrue(responseStanza.getVerifier().nameEquals("aborted"));
+        assertTrue(sessionStateHolder.getState() == SessionState.ENCRYPTED);
+        assertEquals(2, AuthorizationRetriesCounter.getFromSession(sessionContext).getTriesLeft());
+
+        responseStanza = executeAbort();
+        assertTrue(responseStanza.getVerifier().nameEquals("aborted"));
+        assertTrue(sessionStateHolder.getState() == SessionState.ENCRYPTED);
+        assertEquals(1, AuthorizationRetriesCounter.getFromSession(sessionContext).getTriesLeft());
+
+        responseStanza = executeAbort();
+        assertTrue(responseStanza.getVerifier().nameEquals("aborted"));
+        assertTrue(sessionStateHolder.getState() == SessionState.ENCRYPTED);
+        assertEquals(0, AuthorizationRetriesCounter.getFromSession(sessionContext).getTriesLeft());
+    }
+
+    private Stanza executeAbort() throws AuthorizationFailedException {
+        StanzaBuilder stanzaBuilder = createAbort();
+
+        Stanza abortStanza = stanzaBuilder.getFinalStanza();
+
+        AbortHandler abortHandler = new AbortHandler();
+        ResponseStanzaContainer responseContainer = abortHandler.execute(abortStanza, sessionContext, sessionStateHolder);
+        Stanza responseStanza = responseContainer.getResponseStanza();
+        return responseStanza;
+    }
+
+    private StanzaBuilder createAbort() {
+        StanzaBuilder stanzaBuilder = new StanzaBuilder("abort");
+        stanzaBuilder.addNamespaceAttribute(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
+        return stanzaBuilder;
+    }
+
+
+}
\ No newline at end of file

Copied: labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerPlainMechanismTestCase.java (from r672387, labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandlerTestCase.java)
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerPlainMechanismTestCase.java?p2=labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerPlainMechanismTestCase.java&p1=labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandlerTestCase.java&r1=672387&r2=698528&rev=698528&view=diff
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandlerTestCase.java (original)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerPlainMechanismTestCase.java Wed Sep 24 04:47:54 2008
@@ -15,21 +15,31 @@
  * permissions and limitations under the License.                      *
  ***********************************************************************/
 
-package org.apache.vysper.xmpp.modules.core.starttls.handler;
+package org.apache.vysper.xmpp.modules.core.sasl.handler;
 
 import junit.framework.TestCase;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.vysper.xmpp.authorization.Plain;
+import org.apache.vysper.xmpp.authorization.SASLMechanism;
+import org.apache.vysper.xmpp.authorization.SimpleUserAuthorization;
 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.exception.AuthorizationFailedException;
+import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionState;
 import org.apache.vysper.xmpp.server.TestSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
-import org.apache.vysper.xmpp.xmlfragment.XMLElementVerifier;
+import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
+import org.apache.vysper.xmpp.modules.core.sasl.AuthorizationRetriesCounter;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  */
-public class StartTLSHandlerTestCase extends TestCase {
+public class AuthHandlerPlainMechanismTestCase extends TestCase {
     private TestSessionContext sessionContext;
 
     private SessionStateHolder sessionStateHolder = new SessionStateHolder();
@@ -38,65 +48,110 @@
     protected void setUp() throws Exception {
         super.setUp();
         sessionContext = new TestSessionContext(sessionStateHolder);
+        sessionContext.setSessionState(SessionState.ENCRYPTED);
+
+        List<SASLMechanism> methods = new ArrayList<SASLMechanism>();
+        methods.add(new Plain());
+        
+        sessionContext.getServerRuntimeContext().getServerFeatures().setAuthenticationMethods(methods);
+        SimpleUserAuthorization users = new SimpleUserAuthorization();
+        users.addUser("user007@test", "pass007");
+        ((DefaultServerRuntimeContext) sessionContext.getServerRuntimeContext()).setUserAuthorization(users);
     }
 
-    public void testAppropriateSessionState() {
-        StanzaBuilder stanzaBuilder = new StanzaBuilder("starttls");
-        stanzaBuilder.addNamespaceAttribute(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS);
-        Stanza starttlsStanza = stanzaBuilder.getFinalStanza();
-
-        TestSessionContext sessionContext = this.sessionContext;
-        sessionContext.setServerToServer();
-
-        sessionContext.setSessionState(SessionState.INITIATED);
-        Stanza responseStanza = executeStartTLSHandler(starttlsStanza, sessionContext);
-        XMLElementVerifier verifier = responseStanza.getVerifier();
-        assertTrue("session state to low failure", verifier.nameEquals("failure"));
-        assertFalse("tls init", sessionContext.isSwitchToTLSCalled());
-                  
-        sessionContext.setSessionState(SessionState.ENCRYPTION_STARTED);
-        responseStanza = executeStartTLSHandler(starttlsStanza, sessionContext);
-        verifier = responseStanza.getVerifier();
-        assertTrue("session state too high failure", verifier.nameEquals("failure"));
-        assertFalse("tls init", sessionContext.isSwitchToTLSCalled());
-
-        sessionContext.setSessionState(SessionState.STARTED);
-        responseStanza = executeStartTLSHandler(starttlsStanza, sessionContext);
-        verifier = responseStanza.getVerifier();
-        assertTrue("session state ready", verifier.nameEquals("proceed"));
-        assertEquals("session stat is encryption started", SessionState.ENCRYPTION_STARTED, sessionStateHolder.getState());
-        assertTrue("tls init", sessionContext.isSwitchToTLSCalled());
-    }
-
-    private Stanza executeStartTLSHandler(Stanza starttlsStanza, TestSessionContext sessionContext) {
-        StartTLSHandler startTLSHandler = new StartTLSHandler();
-        ResponseStanzaContainer responseStanzaContainer = startTLSHandler.execute(starttlsStanza, sessionContext, sessionStateHolder);
-        Stanza responseStanza = responseStanzaContainer.getResponseStanza();
-        return responseStanza;
+    public void testAuthPlainNoInitialResponse() throws AuthorizationFailedException {
+        StanzaBuilder stanzaBuilder = createAuthPlain();
+        Stanza authPlainStanza = stanzaBuilder.getFinalStanza();
+
+        AuthHandler authHandler = new AuthHandler();
+        ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext, sessionStateHolder);
+
+        assertTrue(responseContainer.getResponseStanza().getVerifier().nameEquals("failure"));
+        assertTrue(sessionStateHolder.getState() == SessionState.ENCRYPTED);
+    }
+
+    public void testAuthPlainEmptyInitialResponse() throws AuthorizationFailedException {
+        StanzaBuilder stanzaBuilder = createAuthPlain();
+        stanzaBuilder.addText("=");
+        Stanza authPlainStanza = stanzaBuilder.getFinalStanza();
+
+        AuthHandler authHandler = new AuthHandler();
+        ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext, sessionStateHolder);
+
+        assertTrue(responseContainer.getResponseStanza().getVerifier().nameEquals("failure"));
+        assertTrue(sessionStateHolder.getState() == SessionState.ENCRYPTED);
     }
-    
-    public void testNamespace() {
-        sessionContext.setSessionState(SessionState.STARTED);
+
+    public void testAuthPlainAuthorizedCredentialsResponse() throws XMLSemanticError, AuthorizationFailedException {
+        StanzaBuilder stanzaBuilder = createAuthPlain();
+        stanzaBuilder.addText(new String(Base64.encodeBase64("dummy\0user007\0pass007".getBytes())));
+        
+        Stanza authPlainStanza = stanzaBuilder.getFinalStanza();
+
+        assertEquals(3, AuthorizationRetriesCounter.getFromSession(sessionContext).getTriesLeft());
+
+        AuthHandler authHandler = new AuthHandler();
+        ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext, sessionStateHolder);
+        Stanza responseStanza = responseContainer.getResponseStanza();
         
-        StanzaBuilder stanzaBuilder = new StanzaBuilder("starttls");
-        stanzaBuilder.addNamespaceAttribute(NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS);
-        Stanza wrongNSStanza = stanzaBuilder.getFinalStanza();
-
-        stanzaBuilder = new StanzaBuilder("starttls");
-        stanzaBuilder.addNamespaceAttribute(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS);
-        Stanza correctNSStanza = stanzaBuilder.getFinalStanza();
-
-        TestSessionContext sessionContext = this.sessionContext;
-
-        Stanza responseStanza = executeStartTLSHandler(wrongNSStanza, sessionContext);
-        XMLElementVerifier verifier = responseStanza.getVerifier();
-        assertTrue("namespace wrong failure", verifier.nameEquals("failure"));
-        assertFalse("tls init", sessionContext.isSwitchToTLSCalled());
-
-        responseStanza = executeStartTLSHandler(correctNSStanza, sessionContext);
-        verifier = responseStanza.getVerifier();
-        assertTrue("namespace correct proceed", verifier.nameEquals("proceed"));
-        assertTrue("tls init", sessionContext.isSwitchToTLSCalled());
+        assertTrue(responseStanza.getVerifier().nameEquals("success"));
+        assertTrue(sessionStateHolder.getState() == SessionState.AUTHENTICATED);
+        assertNull(sessionContext.getAttribute(AuthorizationRetriesCounter.SESSION_ATTRIBUTE_ABORTION_COUNTER));
     }
-    
+
+    public void testAuthPlainWrongCredentialsResponse() throws XMLSemanticError, AuthorizationFailedException {
+
+        executeWrongPlainAuthorization_3Times();
+        
+        StanzaBuilder stanzaBuilder = createAuthPlain();
+        stanzaBuilder.addText(new String(Base64.encodeBase64("dummy\0user007\0pass007".getBytes())));
+        Stanza authPlainStanza = stanzaBuilder.getFinalStanza();
+
+        // correct credential no longer work - no retries left
+        AuthHandler authHandler = new AuthHandler();
+        try {
+            ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext, sessionStateHolder);
+            fail("should raise error - no tries left");
+        } catch (AuthorizationFailedException e) {
+            // test succeeded
+        }
+
+    }
+
+    private void executeWrongPlainAuthorization_3Times() throws AuthorizationFailedException {
+        Stanza responseStanza = executeWrongPlainAuthorization();
+        assertTrue(responseStanza.getVerifier().nameEquals("failure"));
+        assertTrue(sessionStateHolder.getState() == SessionState.ENCRYPTED);
+        assertEquals(2, AuthorizationRetriesCounter.getFromSession(sessionContext).getTriesLeft());
+
+        responseStanza = executeWrongPlainAuthorization();
+        assertTrue(responseStanza.getVerifier().nameEquals("failure"));
+        assertTrue(sessionStateHolder.getState() == SessionState.ENCRYPTED);
+        assertEquals(1, AuthorizationRetriesCounter.getFromSession(sessionContext).getTriesLeft());
+
+        responseStanza = executeWrongPlainAuthorization();
+        assertTrue(responseStanza.getVerifier().nameEquals("failure"));
+        assertTrue(sessionStateHolder.getState() == SessionState.ENCRYPTED);
+        assertEquals(0, AuthorizationRetriesCounter.getFromSession(sessionContext).getTriesLeft());
+    }
+
+    private Stanza executeWrongPlainAuthorization() throws AuthorizationFailedException {
+        StanzaBuilder stanzaBuilder = createAuthPlain();
+        stanzaBuilder.addText(new String(Base64.encodeBase64("dummy\0user008\0pass007".getBytes())));
+
+        Stanza authPlainStanza = stanzaBuilder.getFinalStanza();
+
+        AuthHandler authHandler = new AuthHandler();
+        ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext, sessionStateHolder);
+        Stanza responseStanza = responseContainer.getResponseStanza();
+        return responseStanza;
+    }
+
+    private StanzaBuilder createAuthPlain() {
+        StanzaBuilder stanzaBuilder = new StanzaBuilder("auth");
+        stanzaBuilder.addNamespaceAttribute(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
+        stanzaBuilder.addAttribute("mechanism", "PLAIN");
+        return stanzaBuilder;
+    }
+
 }
\ No newline at end of file

Propchange: labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerPlainMechanismTestCase.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Added: labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerUnavailableMechanismTestCase.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerUnavailableMechanismTestCase.java?rev=698528&view=auto
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerUnavailableMechanismTestCase.java (added)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerUnavailableMechanismTestCase.java Wed Sep 24 04:47:54 2008
@@ -0,0 +1,86 @@
+/***********************************************************************
+ * Copyright (c) 2006-2007 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.core.sasl.handler;
+
+import junit.framework.TestCase;
+import org.apache.vysper.xmpp.authorization.SASLMechanism;
+import org.apache.vysper.xmpp.authorization.Plain;
+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.exception.AuthorizationFailedException;
+import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.TestSessionContext;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ */
+public class AuthHandlerUnavailableMechanismTestCase extends TestCase {
+    private TestSessionContext sessionContext;
+
+    private SessionStateHolder sessionStateHolder = new SessionStateHolder();
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        sessionContext = new TestSessionContext(sessionStateHolder);
+        sessionContext.setSessionState(SessionState.ENCRYPTED);
+
+        List<SASLMechanism> methods = new ArrayList<SASLMechanism>();
+        methods.add(new Plain());
+        
+        sessionContext.getServerRuntimeContext().getServerFeatures().setAuthenticationMethods(methods);
+    }
+
+    public void testAuthPlainWrongCase() throws AuthorizationFailedException {
+        StanzaBuilder stanzaBuilder = new StanzaBuilder("auth");
+        stanzaBuilder.addNamespaceAttribute(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
+        stanzaBuilder.addAttribute("mechanism", "plain"); // 'PLAIN' would be correct
+        Stanza authPlainStanza = stanzaBuilder.getFinalStanza();
+
+        AuthHandler authHandler = new AuthHandler();
+        try {
+            ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext, sessionStateHolder);
+
+            fail("should raise exception");
+        } catch (RuntimeException e) {
+            // test succeeded
+        }
+    }
+    
+    public void testAuthPlainUnavailableMechanism() throws AuthorizationFailedException {
+        StanzaBuilder stanzaBuilder = new StanzaBuilder("auth");
+        stanzaBuilder.addNamespaceAttribute(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_SASL);
+        stanzaBuilder.addAttribute("mechanism", "EXTERNAL"); 
+        Stanza authPlainStanza = stanzaBuilder.getFinalStanza();
+
+        AuthHandler authHandler = new AuthHandler();
+        try {
+            ResponseStanzaContainer responseContainer = authHandler.execute(authPlainStanza, sessionContext, sessionStateHolder);
+
+            fail("should raise exception");
+        } catch (RuntimeException e) {
+            // test succeeded
+        }
+    }
+
+}
\ No newline at end of file



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