diff --git a/backend/include/engine.h b/backend/include/engine.h index e96b284..0340655 100644 --- a/backend/include/engine.h +++ b/backend/include/engine.h @@ -2,6 +2,7 @@ #define PROTECTOR_ENGINE_H #include #include +#include #include #include "database.h" @@ -11,40 +12,56 @@ class BookStoreEngineClass { UserDataBase user_data_base; BookDataBase book_data_base; LogDataBase log_data_base; + std::unordered_map login_count; bool is_server; public: BookStoreEngineClass() = delete; BookStoreEngineClass(std::string __config_dir, bool __is_server); - std::vector Execute(const std::string &cmd, - std::stack> &login_stack); - std::vector ExecuteSu(const std::string &cmd, - std::stack> &login_stack); - std::vector ExecuteLogout(const std::string &cmd, - std::stack> &login_stack); + std::vector Execute( + const std::string &cmd, + std::stack> &login_stack); + std::vector ExecuteSu( + const std::string &cmd, + std::stack> &login_stack); + std::vector ExecuteLogout( + const std::string &cmd, + std::stack> &login_stack); std::vector ExecuteRegister( - const std::string &cmd, std::stack> &login_stack); - std::vector ExecutePasswd(const std::string &cmd, - std::stack> &login_stack); - std::vector ExecuteUserAdd(const std::string &cmd, - std::stack> &login_stack); - std::vector ExecuteDelete(const std::string &cmd, - std::stack> &login_stack); - std::vector ExecuteShow(const std::string &cmd, - std::stack> &login_stack); - std::vector ExecuteBuy(const std::string &cmd, - std::stack> &login_stack); - std::vector ExecuteSelect(const std::string &cmd, - std::stack> &login_stack); - std::vector ExecuteMOdify(const std::string &cmd, - std::stack> &login_stack); - std::vector ExecuteImport(const std::string &cmd, - std::stack> &login_stack); + const std::string &cmd, + std::stack> &login_stack); + std::vector ExecutePasswd( + const std::string &cmd, + std::stack> &login_stack); + std::vector ExecuteUserAdd( + const std::string &cmd, + std::stack> &login_stack); + std::vector ExecuteDelete( + const std::string &cmd, + std::stack> &login_stack); + std::vector ExecuteShow( + const std::string &cmd, + std::stack> &login_stack); + std::vector ExecuteBuy( + const std::string &cmd, + std::stack> &login_stack); + std::vector ExecuteSelect( + const std::string &cmd, + std::stack> &login_stack); + std::vector ExecuteMOdify( + const std::string &cmd, + std::stack> &login_stack); + std::vector ExecuteImport( + const std::string &cmd, + std::stack> &login_stack); std::vector ExecuteShowFinance( - const std::string &cmd, std::stack> &login_stack); - std::vector ExecuteLog(const std::string &cmd, - std::stack> &login_stack); - std::vector ExecuteReport(const std::string &cmd, - std::stack> &login_stack); + const std::string &cmd, + std::stack> &login_stack); + std::vector ExecuteLog( + const std::string &cmd, + std::stack> &login_stack); + std::vector ExecuteReport( + const std::string &cmd, + std::stack> &login_stack); }; #endif // PROTECTOR_ENGINE_H \ No newline at end of file diff --git a/backend/src/builtin-cli.cpp b/backend/src/builtin-cli.cpp index e2e5281..6679a82 100644 --- a/backend/src/builtin-cli.cpp +++ b/backend/src/builtin-cli.cpp @@ -17,9 +17,12 @@ void BookStoreMain(bool is_server, std::string config_dir) { std::string cmd; while (std::getline(std::cin, cmd)) { auto result = std::move(engine.Execute(cmd, login_stack)); + // debugPrint(cmd); for (auto &line : result) { std::cout << line << '\n'; + // debugPrint(line); } + // debugPrint(); if (BookStore_ZYM::shut_down) return; } } else { diff --git a/backend/src/engine.cpp b/backend/src/engine.cpp index 9109bda..63d4756 100644 --- a/backend/src/engine.cpp +++ b/backend/src/engine.cpp @@ -45,6 +45,10 @@ std::vector BookStoreEngineClass::Execute( std::string head = ""; ss >> head; if (head == "quit" || head == "exit") { + while (login_stack.size()) { + login_count[login_stack.top().first]--; + login_stack.pop(); + } if (!is_server) BookStore_ZYM::shut_down = true; return std::vector(); } @@ -115,11 +119,13 @@ std::vector BookStoreEngineClass::ExecuteSu( if (user_data_base.GetPrevilege(user_id) == -1) return std::vector({"Invalid"}); login_stack.push(std::make_pair(user_id, "")); + login_count[user_id]++; return std::vector(); } // debugPrint("Examining", user_id, password); if (user_data_base.PAM(user_id, password)) { login_stack.push(std::make_pair(user_id, "")); + login_count[user_id]++; return std::vector(); } return std::vector({"Invalid"}); @@ -129,6 +135,7 @@ std::vector BookStoreEngineClass::ExecuteLogout( const std::string &cmd, std::stack> &login_stack) { if (login_stack.empty()) return std::vector({"Invalid"}); + login_count[login_stack.top().first]--; login_stack.pop(); return std::vector(); } @@ -157,6 +164,10 @@ std::vector BookStoreEngineClass::ExecutePasswd( // debugPrint("begin checing authority"); if (login_stack.size() > 0 && user_data_base.GetPrevilege(login_stack.top().first) == 7) { + if (current_password != "") { + if (!user_data_base.PAM(user_id, current_password)) + return std::vector({"Invalid"}); + } user_data_base.ChangePassword(user_id, new_password); return std::vector(); } @@ -178,7 +189,7 @@ std::vector BookStoreEngineClass::ExecuteUserAdd( int privilege; if (!CommandUseraddLexer(cmd, user_id, password, privilege, user_name)) return std::vector({"Invalid"}); - if (privilege > own_previlege) return std::vector({"Invalid"}); + if (privilege >= own_previlege) return std::vector({"Invalid"}); if (user_data_base.GetPrevilege(user_id) != -1) return std::vector({"Invalid"}); user_data_base.AddUser(user_id, password, user_name, privilege); @@ -194,6 +205,7 @@ std::vector BookStoreEngineClass::ExecuteDelete( std::string user_id; if (!CommandDeleteLexer(cmd, user_id)) return std::vector({"Invalid"}); + if (login_count[user_id] > 0) return std::vector({"Invalid"}); if (user_data_base.GetPrevilege(user_id) == -1) return std::vector({"Invalid"}); user_data_base.DeleteUser(user_id);