#include "engine.h" #include #include #include #include #include "bs-utility.h" BookStoreEngineClass::BookStoreEngineClass(std::string __config_dir, bool __is_server) { config_dir = __config_dir; user_data_base.Open(config_dir + "user"); book_data_base.Open(config_dir + "book"); log_data_base.Open(config_dir + "log"); is_server = __is_server; if (user_data_base.GetPrevilege("root") == -1) { // debugPrint("Creating root user"); user_data_base.AddUser("root", "sjtu", "root", 7); // debugPrint("Now root's previlege is", // user_data_base.GetPrevilege("root")); } } std::vector BookStoreEngineClass::Execute( const std::string &cmd, std::stack> &login_stack) { for (int i = 0; i < cmd.length(); i++) if (std::isspace(cmd[i]) && cmd[i] != ' ') return std::vector({"Invalid"}); static std::unordered_map operation_map = { {"su", OperationType::__Ksu}, {"logout", OperationType::__Klogout}, {"useradd", OperationType::__Kuseradd}, {"register", OperationType::__Kregister}, {"delete", OperationType::__Kdelete}, {"passwd", OperationType::__Kpasswd}, {"select", OperationType::__Kselect}, {"modify", OperationType::__Kmodify}, {"import", OperationType::__Kimport}, {"show", OperationType::__Kshow}, {"buy", OperationType::__Kbuy}, {"report", OperationType::__Kreport}, {"log", OperationType::__Klog}}; std::stringstream ss(cmd); 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(); } if (operation_map.find(head) == operation_map.end()) { for (int i = 0; i < cmd.length(); i++) if (cmd[i] != ' ') return std::vector({"Invalid"}); return std::vector(); } switch (operation_map[head]) { case OperationType::__Ksu: { return ExecuteSu(cmd, login_stack); } case OperationType::__Klogout: { return ExecuteLogout(cmd, login_stack); } case OperationType::__Kuseradd: { return ExecuteUserAdd(cmd, login_stack); } case OperationType::__Kregister: { return ExecuteRegister(cmd, login_stack); } case OperationType::__Kdelete: { return ExecuteDelete(cmd, login_stack); } case OperationType::__Kpasswd: { return ExecutePasswd(cmd, login_stack); } case OperationType::__Kselect: { return ExecuteSelect(cmd, login_stack); } case OperationType::__Kmodify: { return ExecuteMOdify(cmd, login_stack); } case OperationType::__Kimport: { return ExecuteImport(cmd, login_stack); } case OperationType::__Kshow: { ss >> head; if (head == "finance") goto dst_showfinance; return ExecuteShow(cmd, login_stack); } case OperationType::__Kshowfinance: { dst_showfinance:; return ExecuteShowFinance(cmd, login_stack); } case OperationType::__Kbuy: { return ExecuteBuy(cmd, login_stack); } case OperationType::__Kreport: { return ExecuteReport(cmd, login_stack); } case OperationType::__Klog: { return ExecuteLog(cmd, login_stack); } } throw FatalError("Unknown Command", 5); return std::vector({cmd}); } std::vector BookStoreEngineClass::ExecuteSu( const std::string &cmd, std::stack> &login_stack) { std::string user_id, password; if (!CommandSuLexer(cmd, user_id, password)) return std::vector({"Invalid"}); if (login_stack.size() > 0 && user_data_base.GetPrevilege(login_stack.top().first) == 7) { 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"}); } 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(); } std::vector BookStoreEngineClass::ExecuteRegister( const std::string &cmd, std::stack> &login_stack) { std::string user_id, password, user_name; if (!CommandRegisterLexer(cmd, user_id, password, user_name)) return std::vector({"Invalid"}); if (user_data_base.GetPrevilege(cmd) != -1) return std::vector({"Invalid"}); user_data_base.AddUser(user_id, password, user_name, 1); return std::vector(); } std::vector BookStoreEngineClass::ExecutePasswd( const std::string &cmd, std::stack> &login_stack) { std::string user_id, current_password, new_password; if (!CommandPasswdLexer(cmd, user_id, current_password, new_password)) return std::vector({"Invalid"}); // debugPrint("sucessfully lexed passwd"); if (user_data_base.GetPrevilege(user_id) == -1) return std::vector({"Invalid"}); // 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(); } if (!user_data_base.PAM(user_id, current_password)) return std::vector({"Invalid"}); user_data_base.ChangePassword(user_id, new_password); return std::vector(); } std::vector BookStoreEngineClass::ExecuteUserAdd( const std::string &cmd, std::stack> &login_stack) { int own_previlege = 0; if (login_stack.size() > 0) own_previlege = user_data_base.GetPrevilege(login_stack.top().first); if (login_stack.empty() || own_previlege < 3) return std::vector({"Invalid"}); std::string user_id, password, user_name; int privilege; if (!CommandUseraddLexer(cmd, user_id, password, privilege, user_name)) 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); return std::vector(); } std::vector BookStoreEngineClass::ExecuteDelete( const std::string &cmd, std::stack> &login_stack) { if (login_stack.empty() || user_data_base.GetPrevilege(login_stack.top().first) < 7) return std::vector({"Invalid"}); 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); return std::vector(); } std::vector BookStoreEngineClass::ExecuteShow( const std::string &cmd, std::stack> &login_stack) { return std::vector(); } std::vector BookStoreEngineClass::ExecuteBuy( const std::string &cmd, std::stack> &login_stack) { return std::vector(); } std::vector BookStoreEngineClass::ExecuteSelect( const std::string &cmd, std::stack> &login_stack) { return std::vector(); } std::vector BookStoreEngineClass::ExecuteMOdify( const std::string &cmd, std::stack> &login_stack) { return std::vector(); } std::vector BookStoreEngineClass::ExecuteImport( const std::string &cmd, std::stack> &login_stack) { return std::vector(); } std::vector BookStoreEngineClass::ExecuteShowFinance( const std::string &cmd, std::stack> &login_stack) { return std::vector(); } std::vector BookStoreEngineClass::ExecuteLog( const std::string &cmd, std::stack> &login_stack) { return std::vector(); } std::vector BookStoreEngineClass::ExecuteReport( const std::string &cmd, std::stack> &login_stack) { return std::vector(); }