fix: fix some bug in user maintain

This commit is contained in:
2023-12-13 10:53:42 +00:00
parent 702f8072dc
commit a6b6c483a2
3 changed files with 61 additions and 29 deletions

View File

@ -2,6 +2,7 @@
#define PROTECTOR_ENGINE_H #define PROTECTOR_ENGINE_H
#include <stack> #include <stack>
#include <string> #include <string>
#include <unordered_map>
#include <vector> #include <vector>
#include "database.h" #include "database.h"
@ -11,40 +12,56 @@ class BookStoreEngineClass {
UserDataBase user_data_base; UserDataBase user_data_base;
BookDataBase book_data_base; BookDataBase book_data_base;
LogDataBase log_data_base; LogDataBase log_data_base;
std::unordered_map<std::string, int> login_count;
bool is_server; bool is_server;
public: public:
BookStoreEngineClass() = delete; BookStoreEngineClass() = delete;
BookStoreEngineClass(std::string __config_dir, bool __is_server); BookStoreEngineClass(std::string __config_dir, bool __is_server);
std::vector<std::string> Execute(const std::string &cmd, std::vector<std::string> Execute(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteSu(const std::string &cmd, std::vector<std::string> ExecuteSu(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteLogout(const std::string &cmd, std::vector<std::string> ExecuteLogout(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteRegister( std::vector<std::string> ExecuteRegister(
const std::string &cmd, std::stack<std::pair<std::string, std::string>> &login_stack); const std::string &cmd,
std::vector<std::string> ExecutePasswd(const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteUserAdd(const std::string &cmd, std::vector<std::string> ExecutePasswd(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteDelete(const std::string &cmd, std::vector<std::string> ExecuteUserAdd(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteShow(const std::string &cmd, std::vector<std::string> ExecuteDelete(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteBuy(const std::string &cmd, std::vector<std::string> ExecuteShow(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteSelect(const std::string &cmd, std::vector<std::string> ExecuteBuy(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteMOdify(const std::string &cmd, std::vector<std::string> ExecuteSelect(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteImport(const std::string &cmd, std::vector<std::string> ExecuteMOdify(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteImport(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteShowFinance( std::vector<std::string> ExecuteShowFinance(
const std::string &cmd, std::stack<std::pair<std::string, std::string>> &login_stack); const std::string &cmd,
std::vector<std::string> ExecuteLog(const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteReport(const std::string &cmd, std::vector<std::string> ExecuteLog(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack);
std::vector<std::string> ExecuteReport(
const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack); std::stack<std::pair<std::string, std::string>> &login_stack);
}; };
#endif // PROTECTOR_ENGINE_H #endif // PROTECTOR_ENGINE_H

View File

@ -17,9 +17,12 @@ void BookStoreMain(bool is_server, std::string config_dir) {
std::string cmd; std::string cmd;
while (std::getline(std::cin, cmd)) { while (std::getline(std::cin, cmd)) {
auto result = std::move(engine.Execute(cmd, login_stack)); auto result = std::move(engine.Execute(cmd, login_stack));
// debugPrint(cmd);
for (auto &line : result) { for (auto &line : result) {
std::cout << line << '\n'; std::cout << line << '\n';
// debugPrint(line);
} }
// debugPrint();
if (BookStore_ZYM::shut_down) return; if (BookStore_ZYM::shut_down) return;
} }
} else { } else {

View File

@ -45,6 +45,10 @@ std::vector<std::string> BookStoreEngineClass::Execute(
std::string head = ""; std::string head = "";
ss >> head; ss >> head;
if (head == "quit" || head == "exit") { 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; if (!is_server) BookStore_ZYM::shut_down = true;
return std::vector<std::string>(); return std::vector<std::string>();
} }
@ -115,11 +119,13 @@ std::vector<std::string> BookStoreEngineClass::ExecuteSu(
if (user_data_base.GetPrevilege(user_id) == -1) if (user_data_base.GetPrevilege(user_id) == -1)
return std::vector<std::string>({"Invalid"}); return std::vector<std::string>({"Invalid"});
login_stack.push(std::make_pair(user_id, "")); login_stack.push(std::make_pair(user_id, ""));
login_count[user_id]++;
return std::vector<std::string>(); return std::vector<std::string>();
} }
// debugPrint("Examining", user_id, password); // debugPrint("Examining", user_id, password);
if (user_data_base.PAM(user_id, password)) { if (user_data_base.PAM(user_id, password)) {
login_stack.push(std::make_pair(user_id, "")); login_stack.push(std::make_pair(user_id, ""));
login_count[user_id]++;
return std::vector<std::string>(); return std::vector<std::string>();
} }
return std::vector<std::string>({"Invalid"}); return std::vector<std::string>({"Invalid"});
@ -129,6 +135,7 @@ std::vector<std::string> BookStoreEngineClass::ExecuteLogout(
const std::string &cmd, const std::string &cmd,
std::stack<std::pair<std::string, std::string>> &login_stack) { std::stack<std::pair<std::string, std::string>> &login_stack) {
if (login_stack.empty()) return std::vector<std::string>({"Invalid"}); if (login_stack.empty()) return std::vector<std::string>({"Invalid"});
login_count[login_stack.top().first]--;
login_stack.pop(); login_stack.pop();
return std::vector<std::string>(); return std::vector<std::string>();
} }
@ -157,6 +164,10 @@ std::vector<std::string> BookStoreEngineClass::ExecutePasswd(
// debugPrint("begin checing authority"); // debugPrint("begin checing authority");
if (login_stack.size() > 0 && if (login_stack.size() > 0 &&
user_data_base.GetPrevilege(login_stack.top().first) == 7) { user_data_base.GetPrevilege(login_stack.top().first) == 7) {
if (current_password != "") {
if (!user_data_base.PAM(user_id, current_password))
return std::vector<std::string>({"Invalid"});
}
user_data_base.ChangePassword(user_id, new_password); user_data_base.ChangePassword(user_id, new_password);
return std::vector<std::string>(); return std::vector<std::string>();
} }
@ -178,7 +189,7 @@ std::vector<std::string> BookStoreEngineClass::ExecuteUserAdd(
int privilege; int privilege;
if (!CommandUseraddLexer(cmd, user_id, password, privilege, user_name)) if (!CommandUseraddLexer(cmd, user_id, password, privilege, user_name))
return std::vector<std::string>({"Invalid"}); return std::vector<std::string>({"Invalid"});
if (privilege > own_previlege) return std::vector<std::string>({"Invalid"}); if (privilege >= own_previlege) return std::vector<std::string>({"Invalid"});
if (user_data_base.GetPrevilege(user_id) != -1) if (user_data_base.GetPrevilege(user_id) != -1)
return std::vector<std::string>({"Invalid"}); return std::vector<std::string>({"Invalid"});
user_data_base.AddUser(user_id, password, user_name, privilege); user_data_base.AddUser(user_id, password, user_name, privilege);
@ -194,6 +205,7 @@ std::vector<std::string> BookStoreEngineClass::ExecuteDelete(
std::string user_id; std::string user_id;
if (!CommandDeleteLexer(cmd, user_id)) if (!CommandDeleteLexer(cmd, user_id))
return std::vector<std::string>({"Invalid"}); return std::vector<std::string>({"Invalid"});
if (login_count[user_id] > 0) return std::vector<std::string>({"Invalid"});
if (user_data_base.GetPrevilege(user_id) == -1) if (user_data_base.GetPrevilege(user_id) == -1)
return std::vector<std::string>({"Invalid"}); return std::vector<std::string>({"Invalid"});
user_data_base.DeleteUser(user_id); user_data_base.DeleteUser(user_id);