summaryrefslogtreecommitdiff
path: root/qpid/cpp/src
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2013-08-15 20:10:48 +0000
committerGordon Sim <gsim@apache.org>2013-08-15 20:10:48 +0000
commitccb4bc1e6fc19bb7275164820d2f4a072aea96ee (patch)
tree1adc69ad56291c806966a33405661e758a3f2422 /qpid/cpp/src
parent7057688d9214cffd217781db3c51abef5e227c93 (diff)
downloadqpid-python-ccb4bc1e6fc19bb7275164820d2f4a072aea96ee.tar.gz
QPID-5077: improvement to SASL logic to handle entirely asynchronous dialogue
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1514465 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r--qpid/cpp/src/qpid/broker/amqp/SaslClient.cpp8
-rw-r--r--qpid/cpp/src/qpid/broker/amqp/SaslClient.h1
-rwxr-xr-xqpid/cpp/src/tests/interlink_tests.py10
3 files changed, 14 insertions, 5 deletions
diff --git a/qpid/cpp/src/qpid/broker/amqp/SaslClient.cpp b/qpid/cpp/src/qpid/broker/amqp/SaslClient.cpp
index 678fddbba9..4317d18525 100644
--- a/qpid/cpp/src/qpid/broker/amqp/SaslClient.cpp
+++ b/qpid/cpp/src/qpid/broker/amqp/SaslClient.cpp
@@ -36,7 +36,7 @@ namespace amqp {
SaslClient::SaslClient(qpid::sys::OutputControl& out_, const std::string& id, boost::shared_ptr<Interconnect> c, std::auto_ptr<qpid::Sasl> s,
const std::string& hostname_, const std::string& mechs, const qpid::sys::SecuritySettings& t)
: qpid::amqp::SaslClient(id), out(out_), connection(c), sasl(s),
- hostname(hostname_), allowedMechanisms(mechs), transport(t), readHeader(true), writeHeader(false), haveOutput(false), state(NONE) {}
+ hostname(hostname_), allowedMechanisms(mechs), transport(t), readHeader(true), writeHeader(false), haveOutput(false), initialised(false), state(NONE) {}
SaslClient::~SaslClient()
{
@@ -67,8 +67,10 @@ std::size_t SaslClient::encode(char* buffer, std::size_t size)
encoded += writeProtocolHeader(buffer, size);
writeHeader = !encoded;
}
- if (state == NONE && encoded < size) {
- encoded += write(buffer + encoded, size - encoded);
+ if ((!initialised || state == NONE) && encoded < size) {
+ size_t extra = write(buffer + encoded, size - encoded);
+ encoded += extra;
+ initialised = extra > 0;
} else if (state == SUCCEEDED) {
if (securityLayer.get()) encoded += securityLayer->encode(buffer + encoded, size - encoded);
else encoded += connection->encode(buffer + encoded, size - encoded);
diff --git a/qpid/cpp/src/qpid/broker/amqp/SaslClient.h b/qpid/cpp/src/qpid/broker/amqp/SaslClient.h
index 4d802f6f65..fca293879e 100644
--- a/qpid/cpp/src/qpid/broker/amqp/SaslClient.h
+++ b/qpid/cpp/src/qpid/broker/amqp/SaslClient.h
@@ -64,6 +64,7 @@ class SaslClient : public qpid::sys::ConnectionCodec, qpid::amqp::SaslClient
bool readHeader;
bool writeHeader;
bool haveOutput;
+ bool initialised;
enum {
NONE, FAILED, SUCCEEDED
} state;
diff --git a/qpid/cpp/src/tests/interlink_tests.py b/qpid/cpp/src/tests/interlink_tests.py
index 129283ac24..0d2b757152 100755
--- a/qpid/cpp/src/tests/interlink_tests.py
+++ b/qpid/cpp/src/tests/interlink_tests.py
@@ -218,16 +218,22 @@ class AmqpBrokerTest(BrokerTest):
assert len(domains) == 1
assert domains[0].name == "BrokerB"
- def test_incoming_link(self):
+ def incoming_link(self, mechanism):
brokerB = self.amqp_broker()
agentB = BrokerAgent(brokerB.connect())
self.agent.create("queue", "q")
agentB.create("queue", "q")
- self.agent.create("domain", "BrokerB", {"url":brokerB.host_port(), "sasl_mechanisms":"NONE"})
+ self.agent.create("domain", "BrokerB", {"url":brokerB.host_port(), "sasl_mechanisms":mechanism})
self.agent.create("incoming", "Link1", {"domain":"BrokerB","source":"q","target":"q"})
#send to brokerB, receive from brokerA
self.send_and_receive(send_config=Config(brokerB))
+ def test_incoming_link_anonymous(self):
+ self.incoming_link("ANONYMOUS")
+
+ def test_incoming_link_nosasl(self):
+ self.incoming_link("NONE")
+
def test_outgoing_link(self):
brokerB = self.amqp_broker()
agentB = BrokerAgent(brokerB.connect())