summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/qpid/broker/Connection.cpp10
-rw-r--r--cpp/src/qpid/broker/Connection.h4
-rw-r--r--cpp/src/qpid/broker/ConnectionHandler.cpp26
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());
}