PROTON-518: add setter and getter for using the sasl hostname field

Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/485b23d5
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/485b23d5
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/485b23d5

Branch: refs/heads/cjansen-cpp-client
Commit: 485b23d5009302a35988f9d5fc55ca0217db0bf0
Parents: 8c86c6f
Author: Robert Gemmell <[email protected]>
Authored: Fri May 29 17:02:08 2015 +0100
Committer: Robert Gemmell <[email protected]>
Committed: Fri May 29 17:02:45 2015 +0100

----------------------------------------------------------------------
 .../org/apache/qpid/proton/engine/Sasl.java     |  13 +++
 .../qpid/proton/engine/impl/SaslImpl.java       |  22 ++++
 .../qpid/proton/systemtests/SaslTest.java       | 100 +++++++++++++++++++
 3 files changed, 135 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/485b23d5/proton-j/src/main/java/org/apache/qpid/proton/engine/Sasl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/Sasl.java 
b/proton-j/src/main/java/org/apache/qpid/proton/engine/Sasl.java
index dd63321..16043b9 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/Sasl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/Sasl.java
@@ -97,6 +97,19 @@ public interface Sasl
     String[] getRemoteMechanisms();
 
     /**
+     * Set the remote hostname to indicate the host being connected to when
+     * sending a SaslInit to the server.
+     */
+    void setRemoteHostname(String hostname);
+
+    /**
+     * Retrieve the hostname indicated by the client when sending its SaslInit.
+     *
+     * @return the hostname indicated by the remote client, or null if none 
specified.
+     */
+    String getHostname();
+
+    /**
      * Determine the size of the bytes available via recv().
      *
      * Returns the size in bytes available via recv().

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/485b23d5/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
----------------------------------------------------------------------
diff --git 
a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java 
b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
index ed8891e..053c21f 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
@@ -704,4 +704,26 @@ public class SaslImpl implements Sasl, 
SaslFrameBody.SaslFrameBodyHandler<Void>,
             _underlyingOutput.close_head();
         }
     }
+
+    @Override
+    public String getHostname()
+    {
+        if(_role != null)
+        {
+            checkRole(Role.SERVER);
+        }
+
+        return _hostname;
+    }
+
+    @Override
+    public void setRemoteHostname(String hostname)
+    {
+        if(_role != null)
+        {
+            checkRole(Role.CLIENT);
+        }
+
+        _hostname = hostname;
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/485b23d5/proton-j/src/test/java/org/apache/qpid/proton/systemtests/SaslTest.java
----------------------------------------------------------------------
diff --git 
a/proton-j/src/test/java/org/apache/qpid/proton/systemtests/SaslTest.java 
b/proton-j/src/test/java/org/apache/qpid/proton/systemtests/SaslTest.java
new file mode 100644
index 0000000..2980565
--- /dev/null
+++ b/proton-j/src/test/java/org/apache/qpid/proton/systemtests/SaslTest.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.qpid.proton.systemtests;
+
+import static org.apache.qpid.proton.systemtests.TestLoggingHelper.bold;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import java.util.logging.Logger;
+
+import org.apache.qpid.proton.Proton;
+import org.apache.qpid.proton.engine.Sasl;
+import org.junit.Test;
+
+public class SaslTest extends EngineTestBase
+{
+    private static final Logger LOGGER = 
Logger.getLogger(SaslTest.class.getName());
+
+    @Test
+    public void testSaslHostnamePropagationAndRetrieval() throws Exception
+    {
+        LOGGER.fine(bold("======== About to create transports"));
+
+        getClient().transport = Proton.transport();
+        ProtocolTracerEnabler.setProtocolTracer(getClient().transport, 
TestLoggingHelper.CLIENT_PREFIX);
+
+        Sasl clientSasl = getClient().transport.sasl();
+        clientSasl.client();
+
+        // Set the server hostname we are connecting to from the client
+        String hostname = "my-remote-host-123";
+        clientSasl.setRemoteHostname(hostname);
+
+        // Verify we can't get the hostname on the client
+        try
+        {
+            clientSasl.getHostname();
+            fail("should have throw IllegalStateException");
+        }
+        catch (IllegalStateException ise)
+        {
+            // expected
+        }
+
+        getServer().transport = Proton.transport();
+        ProtocolTracerEnabler.setProtocolTracer(getServer().transport, "       
     " + TestLoggingHelper.SERVER_PREFIX);
+
+        // Configure the server to do ANONYMOUS
+        Sasl serverSasl = getServer().transport.sasl();
+        serverSasl.server();
+        serverSasl.setMechanisms("ANONYMOUS");
+
+        // Verify we can't set the hostname on the server
+        try
+        {
+            serverSasl.setRemoteHostname("some-other-host");
+            fail("should have throw IllegalStateException");
+        }
+        catch (IllegalStateException ise)
+        {
+            // expected
+        }
+
+        assertNull(serverSasl.getHostname());
+        assertArrayEquals(new String[0], clientSasl.getRemoteMechanisms());
+
+        pumpClientToServer();
+        pumpServerToClient();
+
+        // Verify we got the mechs, set the chosen mech, and verify the
+        // server still doesnt know the hostname set/requested by the client
+        assertArrayEquals(new String[] {"ANONYMOUS"} , 
clientSasl.getRemoteMechanisms());
+        clientSasl.setMechanisms("ANONYMOUS");
+        assertNull(serverSasl.getHostname());
+
+        pumpClientToServer();
+
+        // Verify the server now knows that the client set the hostname field
+        assertEquals(hostname, serverSasl.getHostname());
+    }
+
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to