From 8db5ff97ffe34aa42f71b5c8aebfa0878e5fde89 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 4 Jul 2020 16:58:08 +0200 Subject: Add error message support and reporting on all commands. --- src/messagehandler.cc | 79 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 56 insertions(+), 23 deletions(-) (limited to 'src/messagehandler.cc') diff --git a/src/messagehandler.cc b/src/messagehandler.cc index 9a00e46..d20c963 100644 --- a/src/messagehandler.cc +++ b/src/messagehandler.cc @@ -34,6 +34,8 @@ #include "messageparser.h" +#include "errorcodes.h" + MessageList handle_msg(MessageList msgList, clientid_t wsi) { @@ -47,11 +49,19 @@ MessageList handle_msg(MessageList msgList, clientid_t wsi) if(m.cmd == cmd::login) { connection_handler.login(wsi, m.login.user, m.login.password); + if(!connection_handler.authenticated(wsi)) + { + outmsgs.push_back(create_msg_error(ErrorCode::LoginFailed, + "Bad username or password.", wsi)); + continue; + } } // If client is not authenticated; do not continue beyond this point... if(!connection_handler.authenticated(wsi)) { + outmsgs.push_back(create_msg_error(ErrorCode::Unauthorized, + "Not authorized.", wsi)); continue; } @@ -59,12 +69,19 @@ MessageList handle_msg(MessageList msgList, clientid_t wsi) { case cmd::login: // Already handled, before this switch ... case + INFO(messagehandler, "Handling login command\n"); break; case cmd::logout: + INFO(messagehandler, "Handling logout command\n"); connection_handler.logout(wsi); break; + case cmd::create_with_attributes: + // Never sent to the server + INFO(messagehandler, "Handling create_with_attributes command\n"); + break; + case cmd::create: { INFO(messagehandler, "Handling create command\n"); @@ -74,9 +91,15 @@ MessageList handle_msg(MessageList msgList, clientid_t wsi) m.create.insertbeforeid); outmsgs.push_back(m); } - catch (std::exception& e) + catch (const ErrorMessage& e) { - DEBUG(messagehandler, "Error creating node\n"); + // Set client id (wsi) and forward upstream + outmsgs.push_back(create_msg_error(e, wsi)); + } + catch (...) + { + outmsgs.push_back(create_msg_error(ErrorCode::Unknown, + "Unknown create error", wsi)); } } break; @@ -99,9 +122,15 @@ MessageList handle_msg(MessageList msgList, clientid_t wsi) id++; } } - catch (std::exception& e) + catch (const ErrorMessage& e) + { + // Set client id (wsi) and forward upstream + outmsgs.push_back(create_msg_error(e, wsi)); + } + catch (...) { - DEBUG(messagehandler, "Error remove node\n"); + outmsgs.push_back(create_msg_error(ErrorCode::Unknown, + "Unknown remove error", wsi)); } } break; @@ -113,7 +142,8 @@ MessageList handle_msg(MessageList msgList, clientid_t wsi) { node_t removenode = node_manager.node(m.move.id); NodeIdListPair tilpair = - node_manager.moveNode(m.move.id, m.move.parentid, m.move.insertbeforeid); + node_manager.moveNode(m.move.id, m.move.parentid, + m.move.insertbeforeid); node_t createnode = node_manager.node(m.move.id); message_t removemsg = create_msg_remove(removenode); @@ -143,24 +173,27 @@ MessageList handle_msg(MessageList msgList, clientid_t wsi) outmsgs.push_back(removemsg); outmsgs.push_back(createmsg); } - catch (std::exception& e) + catch (const ErrorMessage& e) { - DEBUG(messagehandler, "Error moving node\n"); + // Set client id (wsi) and forward upstream + outmsgs.push_back(create_msg_error(e, wsi)); + } + catch (...) + { + outmsgs.push_back(create_msg_error(ErrorCode::Unknown, + "Unknown move error", wsi)); } } break; case cmd::subscribe: - { - //connection_handler.subscribe(wsi, m.subscribe.id); - outmsgs.push_back(m); - } + INFO(messagehandler, "Handling subscribe command\n"); + outmsgs.push_back(m); break; case cmd::unsubscribe: - //connection_handler.unsubscribe(wsi, m.subscribe.id); + INFO(messagehandler, "Handling unsubscribe command\n"); outmsgs.push_back(m); - DEBUG(handler, "unsubscribe: %d\n", (int)m.unsubscribe.id); break; case cmd::update: @@ -173,24 +206,24 @@ MessageList handle_msg(MessageList msgList, clientid_t wsi) m.update.value); outmsgs.push_back(m); } - catch (std::exception& e) + catch (const ErrorMessage& e) { - DEBUG(messagehandler, "Error updating node\n"); + // Set client id (wsi) and forward upstream + outmsgs.push_back(create_msg_error(e, wsi)); + } + catch (...) + { + outmsgs.push_back(create_msg_error(ErrorCode::Unknown, + "Unknown update error", wsi)); } } break; case cmd::error: - ERR(messagehandler, "An error occurred.\n"); - break; - - default: - WARN(messagehandler, "!!! Unknown command %d\n", m.cmd); + INFO(messagehandler, "Handling error command\n"); + outmsgs.push_back(m); // Just forward the error message break; } - node_manager.tree.toStdOut(); - DEBUG(messagehandler, "%d affected nodes registered\n", - (int)m.nodes.size()); } return outmsgs; -- cgit v1.2.3