You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ta...@apache.org on 2023/02/14 22:43:24 UTC

[qpid-protonj2] branch main updated: PROTON-2681 Add linked resource APIs to the SASL context types

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

tabish pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-protonj2.git


The following commit(s) were added to refs/heads/main by this push:
     new 18059a6d PROTON-2681 Add linked resource APIs to the SASL context types
18059a6d is described below

commit 18059a6d1dd966606e556fc4e88dd3459b5015c8
Author: Timothy Bish <ta...@gmail.com>
AuthorDate: Tue Feb 14 17:42:32 2023 -0500

    PROTON-2681 Add linked resource APIs to the SASL context types
    
    Allows a resource to be linked for repeated use during SASL authentication
---
 .../engine/impl/sasl/ProtonSaslContext.java        | 18 +++++++++++++
 .../qpid/protonj2/engine/sasl/SaslContext.java     | 30 ++++++++++++++++++++++
 .../engine/impl/sasl/ProtonSaslServerTest.java     | 10 ++++++++
 3 files changed, 58 insertions(+)

diff --git a/protonj2/src/main/java/org/apache/qpid/protonj2/engine/impl/sasl/ProtonSaslContext.java b/protonj2/src/main/java/org/apache/qpid/protonj2/engine/impl/sasl/ProtonSaslContext.java
index 2a2bc882..a90e9d93 100644
--- a/protonj2/src/main/java/org/apache/qpid/protonj2/engine/impl/sasl/ProtonSaslContext.java
+++ b/protonj2/src/main/java/org/apache/qpid/protonj2/engine/impl/sasl/ProtonSaslContext.java
@@ -36,6 +36,7 @@ abstract class ProtonSaslContext implements SaslContext {
     protected final ProtonSaslHandler saslHandler;
 
     private ProtonAttachments attachments;
+    private Object linkedResource;
 
     // Client negotiations tracking.
     protected Symbol[] serverMechanisms;
@@ -55,6 +56,23 @@ abstract class ProtonSaslContext implements SaslContext {
         return attachments == null ? attachments = new ProtonAttachments() : attachments;
     }
 
+    @Override
+    public ProtonSaslContext setLinkedResource(Object resource) {
+        this.linkedResource = resource;
+        return this;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T> T getLinkedResource() {
+        return (T) linkedResource;
+    }
+
+    @Override
+    public <T> T getLinkedResource(Class<T> typeClass) {
+        return typeClass.cast(linkedResource);
+    }
+
     /**
      * Return the Role of the context implementation.
      *
diff --git a/protonj2/src/main/java/org/apache/qpid/protonj2/engine/sasl/SaslContext.java b/protonj2/src/main/java/org/apache/qpid/protonj2/engine/sasl/SaslContext.java
index 1e301a5c..347d9f2e 100644
--- a/protonj2/src/main/java/org/apache/qpid/protonj2/engine/sasl/SaslContext.java
+++ b/protonj2/src/main/java/org/apache/qpid/protonj2/engine/sasl/SaslContext.java
@@ -30,6 +30,36 @@ public interface SaslContext {
      */
     enum Role { CLIENT, SERVER }
 
+    /**
+     * Links a given resource to this {@link SaslContext}.
+     *
+     * @param resource
+     *      The resource to link to this {@link SaslContext}.
+     *
+     * @return this {@link SaslContext} instance.
+     */
+    SaslContext setLinkedResource(Object resource);
+
+    /**
+     * @param <T> The type that the linked resource should be cast to on return.
+     *
+     * @return the user set linked resource for this {@link SaslContext} instance.
+     */
+    <T> T getLinkedResource();
+
+    /**
+     * Gets the linked resource (if set) and returns it using the type information
+     * provided to cast the returned value.
+     *
+     * @param <T> The type to cast the linked resource to if one is set.
+     * @param typeClass the type's Class which is used for casting the returned value.
+     *
+     * @return the user set linked resource for this Context instance.
+     *
+     * @throws ClassCastException if the linked resource cannot be cast to the type requested.
+     */
+    <T> T getLinkedResource(Class<T> typeClass);
+
     /**
      * Returns a mutable context that the application layer can use to store meaningful data for itself
      * in relation to this specific SASL context object.
diff --git a/protonj2/src/test/java/org/apache/qpid/protonj2/engine/impl/sasl/ProtonSaslServerTest.java b/protonj2/src/test/java/org/apache/qpid/protonj2/engine/impl/sasl/ProtonSaslServerTest.java
index 1af0bde4..373c34a5 100644
--- a/protonj2/src/test/java/org/apache/qpid/protonj2/engine/impl/sasl/ProtonSaslServerTest.java
+++ b/protonj2/src/test/java/org/apache/qpid/protonj2/engine/impl/sasl/ProtonSaslServerTest.java
@@ -210,6 +210,10 @@ public class ProtonSaslServerTest extends ProtonEngineTestSupport {
 
             @Override
             public void handleSaslInit(SaslServerContext context, Symbol mechanism, ProtonBuffer initResponse) {
+                if (!"ANONYMOUS".equals(context.getLinkedResource(String.class))) {
+                    throw new AssertionError("SASL context did not preserve the linked resource");
+                }
+
                 if (mechanism.equals(Symbol.valueOf("ANONYMOUS"))) {
                     context.sendOutcome(SaslOutcome.SASL_OK, null);
                 } else {
@@ -219,6 +223,7 @@ public class ProtonSaslServerTest extends ProtonEngineTestSupport {
 
             @Override
             public void handleSaslHeader(SaslServerContext context, AMQPHeader header) {
+                context.setLinkedResource("ANONYMOUS");
                 context.sendMechanisms(new Symbol[] { Symbol.valueOf("ANONYMOUS") });
             }
         };
@@ -234,6 +239,10 @@ public class ProtonSaslServerTest extends ProtonEngineTestSupport {
 
             @Override
             public void handleSaslInit(SaslServerContext context, Symbol mechanism, ProtonBuffer initResponse) {
+                if (!"PLAIN".equals(context.getLinkedResource(String.class))) {
+                    throw new AssertionError("SASL context did not preserve the linked resource");
+                }
+
                 if (mechanism.equals(Symbol.valueOf("PLAIN"))) {
                     context.sendOutcome(SaslOutcome.SASL_OK, null);
                 } else {
@@ -243,6 +252,7 @@ public class ProtonSaslServerTest extends ProtonEngineTestSupport {
 
             @Override
             public void handleSaslHeader(SaslServerContext context, AMQPHeader header) {
+                context.setLinkedResource("PLAIN");
                 context.sendMechanisms(new Symbol[] { Symbol.valueOf("PLAIN") });
             }
         };


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