summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2013-12-05 15:37:09 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2013-12-05 15:37:09 +0100
commitc513e4db1cd7fdbecd59c6d385bc5f970827401e (patch)
tree9ad3b55e30bbfc04d879e35ee8158410886d333b
parent4781ca61960a86f2cae8191c0bdcbdae0acb5d1d (diff)
Add login/logout.
-rw-r--r--src/connectionhandler.cc17
-rw-r--r--src/connectionhandler.h7
-rw-r--r--src/message.h10
-rw-r--r--src/messagehandler.cc15
-rw-r--r--src/messageparser.cc22
5 files changed, 68 insertions, 3 deletions
diff --git a/src/connectionhandler.cc b/src/connectionhandler.cc
index d78c053..fe83861 100644
--- a/src/connectionhandler.cc
+++ b/src/connectionhandler.cc
@@ -56,6 +56,23 @@ void ConnectionHandler::close(clientid_t clientid)
DEBUG(conn, "Removed connection\n");
}
+void ConnectionHandler::login(clientid_t clientid, std::string user, std::string password)
+{
+ authlist[clientid] = (password == "hundemad");
+ DEBUG(conn, "Authentication %d\n", authlist[clientid]);
+}
+
+void ConnectionHandler::logout(clientid_t clientid)
+{
+ authlist[clientid] = false;
+ DEBUG(conn, "Authentication %d\n", authlist[clientid]);
+}
+
+bool ConnectionHandler::authenticated(clientid_t clientid)
+{
+ return authlist.find(clientid) != authlist.end() && authlist[clientid];
+}
+
void ConnectionHandler::observe(clientid_t clientid, taskid_t taskid)
{
connlist[clientid].insert(taskid);
diff --git a/src/connectionhandler.h b/src/connectionhandler.h
index 7779b1f..402f531 100644
--- a/src/connectionhandler.h
+++ b/src/connectionhandler.h
@@ -38,6 +38,7 @@
typedef struct libwebsocket* clientid_t;
+typedef std::map<clientid_t, bool> AuthList;
typedef std::map<clientid_t, std::set<taskid_t> > ConnectionList;
typedef std::list<std::pair<clientid_t, taskid_t> > ObserverList;
@@ -47,6 +48,11 @@ public:
void init(clientid_t clientid);
void close(clientid_t clientid);
+
+ void login(clientid_t clientid, std::string user, std::string password);
+ void logout(clientid_t clientid);
+ bool authenticated(clientid_t clientid);
+
void observe(clientid_t clientid, taskid_t taskid);
void unobserve(clientid_t clientid, taskid_t taskid);
@@ -55,6 +61,7 @@ public:
private:
ConnectionList connlist;
+ AuthList authlist;
};
// Global ConnectionHandler
diff --git a/src/message.h b/src/message.h
index 92e58ac..6e1804d 100644
--- a/src/message.h
+++ b/src/message.h
@@ -41,11 +41,18 @@ namespace cmd {
move,
create,
remove,
- error
+ login,
+ logout,
+ error,
} cmd_t;
};
typedef struct {
+ std::string user;
+ std::string password;
+} login_t;
+
+typedef struct {
taskid_t id;
} observe_t;
@@ -83,6 +90,7 @@ typedef struct {
remove_t remove;
move_t move;
update_t update;
+ login_t login;
TaskIdList nodes;
diff --git a/src/messagehandler.cc b/src/messagehandler.cc
index d3c3420..c946bbe 100644
--- a/src/messagehandler.cc
+++ b/src/messagehandler.cc
@@ -44,6 +44,13 @@ MessageList handle_msg(MessageList msgList, clientid_t wsi) {
it++) {
message_t &m = *it;
+ if(m.cmd == cmd::login) {
+ connection_handler.login(wsi, m.login.user, m.login.password);
+ }
+
+ // If client is not authenticated; do not continue beyond this point...
+ if(!connection_handler.authenticated(wsi)) continue;
+
switch(m.cmd) {
case cmd::create:
{
@@ -166,6 +173,14 @@ MessageList handle_msg(MessageList msgList, clientid_t wsi) {
}
break;
+ case cmd::login:
+ // Already handled, before this switch ... case
+ break;
+
+ case cmd::logout:
+ connection_handler.logout(wsi);
+ break;
+
case cmd::error:
ERR(messagehandler, "An error occurred.\n");
break;
diff --git a/src/messageparser.cc b/src/messageparser.cc
index 4f047d9..409ffeb 100644
--- a/src/messageparser.cc
+++ b/src/messageparser.cc
@@ -94,7 +94,7 @@ inline static void parse_into_msg_tokens(std::string& data,
tokenVector.clear();
}
-
+ /* // WARNING: Enabling this will print passwords in plaintext...
// Debug: print tokens
DEBUG(parser, "tokenlists: %d\n", msgTokensList.size());
MsgTokensList::iterator j = msgTokensList.begin();
@@ -108,7 +108,7 @@ inline static void parse_into_msg_tokens(std::string& data,
}
j++;
}
-
+ */
}
static taskid_t getId(std::map<std::string, taskid_t> &sym, std::string token)
@@ -156,6 +156,8 @@ inline static void create_msg_list(MsgTokensList& msgTokensList,
if(t[origin] == "observe") m.cmd = cmd::observe;
else if(t[origin] == "unobserve") m.cmd = cmd::unobserve;
+ else if(t[origin] == "login") m.cmd = cmd::login;
+ else if(t[origin] == "logout") m.cmd = cmd::logout;
else if(t[origin] == "create") m.cmd = cmd::create;
else if(t[origin] == "remove") m.cmd = cmd::remove;
else if(t[origin] == "move") m.cmd = cmd::move;
@@ -180,6 +182,22 @@ inline static void create_msg_list(MsgTokensList& msgTokensList,
DEBUG(msgparser, "unobserve @ %d\n", m.unobserve.id);
break;
}
+ case cmd::login: {
+ if(t.size() != origin+1+2) {
+ DEBUG(msgparser, "Wrong number of parameters\n");
+ continue;
+ }
+ m.login.user = t[origin+1];
+ m.login.password = t[origin+2];
+ DEBUG(msgparser, "login %s\n", m.login.user.c_str());
+ break;
+ }
+ case cmd::logout:
+ if(t.size() != origin+1) {
+ DEBUG(msgparser, "Wrong number of parameters\n");
+ continue;
+ }
+ break;
case cmd::create: {
if(!clientmode && t.size() != origin+1+2) {
DEBUG(msgparser, "Wrong number of parameters\n");