diff options
| author | Gordon Sim <gsim@apache.org> | 2013-08-15 20:10:48 +0000 |
|---|---|---|
| committer | Gordon Sim <gsim@apache.org> | 2013-08-15 20:10:48 +0000 |
| commit | ccb4bc1e6fc19bb7275164820d2f4a072aea96ee (patch) | |
| tree | 1adc69ad56291c806966a33405661e758a3f2422 /qpid/cpp/src | |
| parent | 7057688d9214cffd217781db3c51abef5e227c93 (diff) | |
| download | qpid-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.cpp | 8 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/broker/amqp/SaslClient.h | 1 | ||||
| -rwxr-xr-x | qpid/cpp/src/tests/interlink_tests.py | 10 |
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()) |
