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