diff options
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/qpid/broker/Connection.cpp | 10 | ||||
-rw-r--r-- | cpp/src/qpid/broker/Connection.h | 4 | ||||
-rw-r--r-- | cpp/src/qpid/broker/ConnectionHandler.cpp | 26 |
3 files changed, 36 insertions, 4 deletions
diff --git a/cpp/src/qpid/broker/Connection.cpp b/cpp/src/qpid/broker/Connection.cpp index fbe018e8ae..5ede40c825 100644 --- a/cpp/src/qpid/broker/Connection.cpp +++ b/cpp/src/qpid/broker/Connection.cpp @@ -181,6 +181,16 @@ Manageable::status_t Connection::ManagementMethod (uint32_t methodId, return status; } +void Connection::setUserId(const string& uid) +{ + userId = uid; + QPID_LOG (debug, "UserId is " << userId); +} + +const string& Connection::getUserId() const +{ + return userId; +} }} diff --git a/cpp/src/qpid/broker/Connection.h b/cpp/src/qpid/broker/Connection.h index cbe7addec2..65ed1d731e 100644 --- a/cpp/src/qpid/broker/Connection.h +++ b/cpp/src/qpid/broker/Connection.h @@ -95,6 +95,9 @@ class Connection : public sys::ConnectionInputHandler, management::Manageable::status_t ManagementMethod (uint32_t methodId, management::Args& args); + void setUserId(const string& uid); + const string& getUserId() const; + private: typedef boost::ptr_map<framing::ChannelId, SessionHandler> ChannelMap; typedef std::vector<Queue::shared_ptr>::iterator queue_iterator; @@ -109,6 +112,7 @@ class Connection : public sys::ConnectionInputHandler, ConnectionHandler adapter; management::Client::shared_ptr mgmtObject; bool mgmtClosing; + string userId; }; }} diff --git a/cpp/src/qpid/broker/ConnectionHandler.cpp b/cpp/src/qpid/broker/ConnectionHandler.cpp index dd645b595e..45c2f29d87 100644 --- a/cpp/src/qpid/broker/ConnectionHandler.cpp +++ b/cpp/src/qpid/broker/ConnectionHandler.cpp @@ -29,10 +29,17 @@ using namespace qpid; using namespace qpid::broker; using namespace qpid::framing; + +namespace +{ +const std::string PLAIN = "PLAIN"; +const std::string en_US = "en_US"; +} + void ConnectionHandler::init(const framing::ProtocolInitiation& header) { FieldTable properties; - string mechanisms("PLAIN"); - string locales("en_US"); + string mechanisms(PLAIN); + string locales(en_US); handler->client.start(header.getMajor(), header.getMinor(), properties, mechanisms, locales); } @@ -59,9 +66,20 @@ ConnectionHandler::ConnectionHandler(Connection& connection) : handler(new Hand ConnectionHandler::Handler:: Handler(Connection& c) : client(c.getOutput()), connection(c) {} void ConnectionHandler::Handler::startOk(const FieldTable& /*clientProperties*/, - const string& /*mechanism*/, - const string& /*response*/, const string& /*locale*/) + const string& mechanism, + const string& response, const string& /*locale*/) { + //TODO: handle SASL mechanisms more cleverly + if (mechanism == PLAIN) { + if (response.size() > 0 && response[0] == (char) 0) { + string temp = response.substr(1); + string::size_type i = temp.find((char)0); + string uid = temp.substr(0, i); + string pwd = temp.substr(i + 1); + //TODO: authentication + connection.setUserId(uid); + } + } client.tune(framing::CHANNEL_MAX, connection.getFrameMax(), connection.getHeartbeat()); } |