summaryrefslogtreecommitdiff
path: root/qpid/cpp/src
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2013-11-29 19:17:59 +0000
committerGordon Sim <gsim@apache.org>2013-11-29 19:17:59 +0000
commit89a43fd0c7b87583dad52dab2e97d8dc1f51005e (patch)
tree77ae720fbf46561f4f9e1587a44d684e4405e514 /qpid/cpp/src
parentdf00f9ea35f786b9a8c7186e40c24a3c64c84cff (diff)
downloadqpid-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.cpp7
-rw-r--r--qpid/cpp/src/qpid/amqp/Sasl.h1
-rw-r--r--qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp23
-rw-r--r--qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.h13
-rw-r--r--qpid/cpp/src/qpid/messaging/amqp/Sasl.cpp7
-rw-r--r--qpid/cpp/src/qpid/messaging/amqp/Sasl.h2
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