This is an automated email from the ASF dual-hosted git repository.

ralaoui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mina-vysper.git


The following commit(s) were added to refs/heads/master by this push:
     new 4a94400  StateAwareProtocolWorker logic prevents StanzaHandler 
proxying (#8)
4a94400 is described below

commit 4a944000381ae1b46945de5ba673c0a717405626
Author: Réda Housni Alaoui <rala...@apache.org>
AuthorDate: Sat Aug 17 09:16:51 2019 +0200

    StateAwareProtocolWorker logic prevents StanzaHandler proxying (#8)
---
 .../org/apache/vysper/xmpp/protocol/ProtocolWorker.java   |  2 +-
 .../org/apache/vysper/xmpp/protocol/StanzaHandler.java    | 11 +++++++++++
 .../xmpp/protocol/worker/AuthenticatedProtocolWorker.java |  2 +-
 .../xmpp/protocol/worker/EncryptedProtocolWorker.java     | 15 ++++++++-------
 .../xmpp/protocol/worker/InitiatedProtocolWorker.java     |  5 +++--
 .../xmpp/protocol/worker/StartedProtocolWorker.java       | 11 ++++++-----
 6 files changed, 30 insertions(+), 16 deletions(-)

diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
index 9f98c12..f9a229d 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
@@ -108,7 +108,7 @@ public class ProtocolWorker implements StanzaProcessor {
         if (sessionStateHolder.getState() != SessionState.AUTHENTICATED) {
             // is not authenticated...
             if (XMPPCoreStanza.getWrapper(stanza) != null
-                    && !(stanzaHandler instanceof InBandRegistrationHandler)) {
+                    && 
!(InBandRegistrationHandler.class.isAssignableFrom(stanzaHandler.unwrapType())))
 {
                 // ... and is a IQ/PRESENCE/MESSAGE stanza!
                 responseWriter.handleNotAuthorized(sessionContext, stanza);
                 return;
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandler.java 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandler.java
index 12d2ede..1640bf8 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandler.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandler.java
@@ -39,6 +39,17 @@ public interface StanzaHandler {
     public String getName();
 
     /**
+     * Allows to check the type of the handler by maintaining compatibility 
with
+     * delegating handlers. Delegating handlers are expected to delegate this 
call
+     * to their delegates.
+     * 
+     * @return The type wrapped by this handler
+     */
+    default Class<?> unwrapType() {
+        return getClass();
+    }
+
+    /**
      * verifies if the stanza is processed by this handler
      * @param stanza
      * @return true, if it is processed, false otherwise
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AuthenticatedProtocolWorker.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AuthenticatedProtocolWorker.java
index 2100203..8181185 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AuthenticatedProtocolWorker.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/AuthenticatedProtocolWorker.java
@@ -36,7 +36,7 @@ public class AuthenticatedProtocolWorker extends 
AbstractStateAwareProtocolWorke
     @Override
     protected boolean checkState(SessionContext sessionContext, 
SessionStateHolder sessionStateHolder, Stanza stanza,
             StanzaHandler stanzaHandler) {
-        if (stanzaHandler instanceof StreamStartHandler)
+        if 
(StreamStartHandler.class.isAssignableFrom(stanzaHandler.unwrapType()))
             return true;
         if (stanzaHandler.verify(stanza))
             return true;
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
index 9cb7f5b..9a47003 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
@@ -47,17 +47,18 @@ public class EncryptedProtocolWorker extends 
AbstractStateAwareProtocolWorker {
     protected boolean checkState(SessionContext sessionContext, 
SessionStateHolder sessionStateHolder, Stanza stanza,
             StanzaHandler stanzaHandler) {
 
-        if (stanzaHandler instanceof StreamStartHandler) {
+        Class<?> handlerUnwrappedType = stanzaHandler.unwrapType();
+        if (StreamStartHandler.class.isAssignableFrom(handlerUnwrappedType)) {
             return true;
-        } else if (stanzaHandler instanceof AbstractSASLHandler) {
+        } else if 
(AbstractSASLHandler.class.isAssignableFrom(handlerUnwrappedType)) {
             return true;
-        } else if (stanzaHandler instanceof XMLPrologHandler) {
-            return true; // PSI client sends that. 
-        } else if (stanzaHandler instanceof InBandRegistrationHandler) {
+        } else if 
(XMLPrologHandler.class.isAssignableFrom(handlerUnwrappedType)) {
+            return true; // PSI client sends that.
+        } else if 
(InBandRegistrationHandler.class.isAssignableFrom(handlerUnwrappedType)) {
             return true;
-        } else if (sessionContext.isServerToServer() && stanzaHandler 
instanceof DbResultHandler) {
+        } else if (sessionContext.isServerToServer() && 
DbResultHandler.class.isAssignableFrom(handlerUnwrappedType)) {
             return true;
-        } else if (sessionContext.isServerToServer() && stanzaHandler 
instanceof DbVerifyHandler) {
+        } else if (sessionContext.isServerToServer() && 
DbVerifyHandler.class.isAssignableFrom(handlerUnwrappedType)) {
             return true;
         }
         ResponseWriter.writeUnsupportedStanzaError(sessionContext);
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InitiatedProtocolWorker.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InitiatedProtocolWorker.java
index 9add8aa..5ace273 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InitiatedProtocolWorker.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/InitiatedProtocolWorker.java
@@ -42,9 +42,10 @@ public class InitiatedProtocolWorker extends 
AbstractStateAwareProtocolWorker {
     @Override
     protected boolean checkState(SessionContext sessionContext, 
SessionStateHolder sessionStateHolder, Stanza stanza,
             StanzaHandler stanzaHandler) {
-        if (stanzaHandler instanceof XMLPrologHandler)
+        Class<?> handlerUnwrappedType = stanzaHandler.unwrapType();
+        if (XMLPrologHandler.class.isAssignableFrom(handlerUnwrappedType))
             return true;
-        if (stanzaHandler instanceof StreamStartHandler)
+        if (StreamStartHandler.class.isAssignableFrom(handlerUnwrappedType))
             return true;
         ResponseWriter.writeUnsupportedStanzaError(sessionContext);
         return false;
diff --git 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java
 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java
index 920df40..c8073db 100644
--- 
a/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java
+++ 
b/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java
@@ -45,14 +45,15 @@ public class StartedProtocolWorker extends 
AbstractStateAwareProtocolWorker {
     protected boolean checkState(SessionContext sessionContext, 
SessionStateHolder sessionStateHolder, Stanza stanza,
             StanzaHandler stanzaHandler) {
 
-        if (stanzaHandler instanceof StartTLSHandler) {
+        Class<?> handlerUnwrappedType = stanzaHandler.unwrapType();
+        if (StartTLSHandler.class.isAssignableFrom(handlerUnwrappedType)) {
             return true;
-        } else if (stanzaHandler instanceof AbstractSASLHandler && 
-            
!sessionContext.getServerRuntimeContext().getServerFeatures().isStartTLSRequired())
 {
+        } else if 
(AbstractSASLHandler.class.isAssignableFrom(handlerUnwrappedType)
+                && 
!sessionContext.getServerRuntimeContext().getServerFeatures().isStartTLSRequired())
 {
             return true;
-        } else if (sessionContext.isServerToServer() && stanzaHandler 
instanceof DbVerifyHandler) {
+        } else if (sessionContext.isServerToServer() && 
DbVerifyHandler.class.isAssignableFrom(handlerUnwrappedType)) {
             return true;
-        } else if (sessionContext.isServerToServer() && stanzaHandler 
instanceof DbResultHandler) {
+        } else if (sessionContext.isServerToServer() && 
DbResultHandler.class.isAssignableFrom(handlerUnwrappedType)) {
             return true;
         }
         ResponseWriter.writeUnsupportedStanzaError(sessionContext);

Reply via email to