diff options
| author | Gordon Sim <gsim@apache.org> | 2013-11-29 19:17:59 +0000 |
|---|---|---|
| committer | Gordon Sim <gsim@apache.org> | 2013-11-29 19:17:59 +0000 |
| commit | 89a43fd0c7b87583dad52dab2e97d8dc1f51005e (patch) | |
| tree | 77ae720fbf46561f4f9e1587a44d684e4405e514 /qpid/cpp/src | |
| parent | df00f9ea35f786b9a8c7186e40c24a3c64c84cff (diff) | |
| download | qpid-python-89a43fd0c7b87583dad52dab2e97d8dc1f51005e.tar.gz | |
QPID-5379: fix security layer for 1.0 client
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1546628 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src')
| -rw-r--r-- | qpid/cpp/src/qpid/amqp/Sasl.cpp | 7 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/amqp/Sasl.h | 1 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp | 23 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.h | 13 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/messaging/amqp/Sasl.cpp | 7 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/messaging/amqp/Sasl.h | 2 |
6 files changed, 50 insertions, 3 deletions
diff --git a/qpid/cpp/src/qpid/amqp/Sasl.cpp b/qpid/cpp/src/qpid/amqp/Sasl.cpp index 7b0779fe94..a7c2eea35b 100644 --- a/qpid/cpp/src/qpid/amqp/Sasl.cpp +++ b/qpid/cpp/src/qpid/amqp/Sasl.cpp @@ -59,7 +59,7 @@ void Sasl::endFrame(void* frame) std::size_t Sasl::read(const char* data, size_t available) { size_t consumed = 0; - while (available - consumed > 4/*framesize*/) { + while (!stopReading() && available - consumed > 4/*framesize*/) { Decoder decoder(data+consumed, available-consumed); //read frame-header uint32_t frameSize = decoder.readUInt(); @@ -133,4 +133,9 @@ std::size_t Sasl::writeProtocolHeader(char* buffer, std::size_t size) } } +bool Sasl::stopReading() +{ + return false; +} + }} // namespace qpid::amqp diff --git a/qpid/cpp/src/qpid/amqp/Sasl.h b/qpid/cpp/src/qpid/amqp/Sasl.h index 8235a9b9ed..5df03e858a 100644 --- a/qpid/cpp/src/qpid/amqp/Sasl.h +++ b/qpid/cpp/src/qpid/amqp/Sasl.h @@ -48,6 +48,7 @@ class Sasl : protected Reader void* startFrame(); void endFrame(void*); + virtual bool stopReading(); }; }} // namespace qpid::amqp diff --git a/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp b/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp index e1d72a3af7..e5fb1b9f76 100644 --- a/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp +++ b/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp @@ -34,6 +34,7 @@ #include "qpid/framing/ProtocolInitiation.h" #include "qpid/framing/Uuid.h" #include "qpid/log/Statement.h" +#include "qpid/sys/SecurityLayer.h" #include "qpid/sys/SystemInfo.h" #include "qpid/sys/Time.h" #include <vector> @@ -53,7 +54,8 @@ ConnectionContext::ConnectionContext(const std::string& url, const qpid::types:: writeHeader(false), readHeader(false), haveOutput(false), - state(DISCONNECTED) + state(DISCONNECTED), + codecAdapter(*this) { urls.insert(urls.begin(), url); if (pn_transport_bind(engine, connection)) { @@ -997,5 +999,24 @@ bool ConnectionContext::restartSessions() } } +void ConnectionContext::initSecurityLayer(qpid::sys::SecurityLayer& s) +{ + s.init(&codecAdapter); +} + +ConnectionContext::CodecAdapter::CodecAdapter(ConnectionContext& c) : context(c) {} +std::size_t ConnectionContext::CodecAdapter::decode(const char* buffer, std::size_t size) +{ + return context.decodePlain(buffer, size); +} +std::size_t ConnectionContext::CodecAdapter::encode(char* buffer, std::size_t size) +{ + return context.encodePlain(buffer, size); +} +bool ConnectionContext::CodecAdapter::canEncode() +{ + return context.canEncodePlain(); +} + }}} // namespace qpid::messaging::amqp diff --git a/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.h b/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.h index b31ffe62e9..0f5509930e 100644 --- a/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.h +++ b/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.h @@ -45,6 +45,7 @@ namespace framing { class ProtocolVersion; } namespace sys { +class SecurityLayer; struct SecuritySettings; } namespace messaging { @@ -112,9 +113,20 @@ class ConnectionContext : public qpid::sys::ConnectionCodec, public qpid::messag void reconnect(); std::string getUrl() const; const qpid::sys::SecuritySettings* getTransportSecuritySettings(); + void initSecurityLayer(qpid::sys::SecurityLayer&); private: typedef std::map<std::string, boost::shared_ptr<SessionContext> > SessionMap; + class CodecAdapter : public qpid::sys::Codec + { + public: + CodecAdapter(ConnectionContext&); + std::size_t decode(const char* buffer, std::size_t size); + std::size_t encode(char* buffer, std::size_t size); + bool canEncode(); + private: + ConnectionContext& context; + }; boost::shared_ptr<DriverImpl> driver; boost::shared_ptr<Transport> transport; @@ -134,6 +146,7 @@ class ConnectionContext : public qpid::sys::ConnectionCodec, public qpid::messag CONNECTED } state; std::auto_ptr<Sasl> sasl; + CodecAdapter codecAdapter; void check(); void wait(); diff --git a/qpid/cpp/src/qpid/messaging/amqp/Sasl.cpp b/qpid/cpp/src/qpid/messaging/amqp/Sasl.cpp index 4b21f7b0d2..9c198f81af 100644 --- a/qpid/cpp/src/qpid/messaging/amqp/Sasl.cpp +++ b/qpid/cpp/src/qpid/messaging/amqp/Sasl.cpp @@ -131,11 +131,16 @@ void Sasl::outcome(uint8_t result) securityLayer = sasl->getSecurityLayer(context.maxFrameSize); if (securityLayer.get()) { - securityLayer->init(&context); + context.initSecurityLayer(*securityLayer); } context.activateOutput(); } +bool Sasl::stopReading() +{ + return state != NONE; +} + qpid::sys::Codec* Sasl::getSecurityLayer() { return securityLayer.get(); diff --git a/qpid/cpp/src/qpid/messaging/amqp/Sasl.h b/qpid/cpp/src/qpid/messaging/amqp/Sasl.h index 1e6209bca5..b306454f9a 100644 --- a/qpid/cpp/src/qpid/messaging/amqp/Sasl.h +++ b/qpid/cpp/src/qpid/messaging/amqp/Sasl.h @@ -67,6 +67,8 @@ class Sasl : public qpid::sys::Codec, qpid::amqp::SaslClient void challenge(); //null != empty string void outcome(uint8_t result, const std::string&); void outcome(uint8_t result); + protected: + bool stopReading(); }; }}} // namespace qpid::messaging::amqp |
