write server mode
This commit is contained in:
@ -96,9 +96,11 @@ class ReadWriteLock {
|
||||
};
|
||||
class SessionClass {
|
||||
public:
|
||||
std::stack<std::string> login_stack;
|
||||
std::stack<std::pair<std::string, int>> login_stack;
|
||||
std::string SessionToken;
|
||||
std::string OuthorizationKey;
|
||||
SessionClass(std::string _SessionToken, std::string _OuthorizationKey)
|
||||
: SessionToken(_SessionToken), OuthorizationKey(_OuthorizationKey) {}
|
||||
};
|
||||
|
||||
void debugPrint();
|
||||
@ -158,4 +160,6 @@ enum OperationType {
|
||||
__Klog,
|
||||
__Kreport,
|
||||
};
|
||||
|
||||
std::string GenerateRandomString(int length);
|
||||
#endif // PROTECTOR_UTILITY_H
|
@ -18,6 +18,7 @@ class BookStoreEngineClass {
|
||||
public:
|
||||
BookStoreEngineClass() = delete;
|
||||
BookStoreEngineClass(std::string __config_dir, bool __is_server);
|
||||
std::string QueryUserInfo(const std::string &user_name);
|
||||
std::vector<std::string> Execute(
|
||||
const std::string &cmd,
|
||||
std::stack<std::pair<std::string, int>> &login_stack);
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "bs-utility.h"
|
||||
|
||||
#include <random>
|
||||
namespace BookStore_ZYM {
|
||||
std::mutex debug_Print_Mutex;
|
||||
bool shut_down = false;
|
||||
@ -78,4 +79,21 @@ void Respond(BlockingStringStream *output_ptr, std::string SessionToken,
|
||||
for (int i = 0; i < ret.size(); i++) (*output_ptr) << ret[i] << '\n';
|
||||
(*output_ptr).unreadlock();
|
||||
output_mutex.unlock();
|
||||
}
|
||||
|
||||
std::string GenerateRandomString(int length) {
|
||||
static std::random_device rd;
|
||||
static std::mt19937 gen(rd());
|
||||
static std::uniform_int_distribution<> dis(0, 61);
|
||||
std::string ret;
|
||||
for (int i = 0; i < length; i++) {
|
||||
int x = dis(gen);
|
||||
if (x < 10)
|
||||
ret += '0' + x;
|
||||
else if (x < 36)
|
||||
ret += 'a' + x - 10;
|
||||
else
|
||||
ret += 'A' + x - 36;
|
||||
}
|
||||
return ret;
|
||||
}
|
@ -26,7 +26,89 @@ void BookStoreMain(bool is_server, std::string config_dir) {
|
||||
if (BookStore_ZYM::shut_down) return;
|
||||
}
|
||||
} else {
|
||||
throw FatalError("Server mode has not been implemented yet", 1);
|
||||
// throw FatalError("Server mode has not been implemented yet", 1);
|
||||
std::unordered_map<std::string, SessionClass> session_map;
|
||||
std::string cmd;
|
||||
while (std::getline(std::cin, cmd)) {
|
||||
if (cmd[1] == 'O') //`#OpenSession [TempChannelID]`
|
||||
{
|
||||
std::string new_session_token = GenerateRandomString(10);
|
||||
std::string new_outh_token = GenerateRandomString(16);
|
||||
session_map[new_session_token] =
|
||||
SessionClass(new_session_token, new_outh_token);
|
||||
std::stringstream ss(cmd);
|
||||
std::string temp_channel_id;
|
||||
ss >> temp_channel_id;
|
||||
ss >> temp_channel_id;
|
||||
std::cout << temp_channel_id << " Init 1\n"
|
||||
<< new_session_token << ' ' << new_outh_token << std::endl;
|
||||
} else if (cmd[1] == 'S')
|
||||
return;
|
||||
else if (cmd[1] == 'C') {
|
||||
std::stringstream ss(cmd);
|
||||
std::string session_token, operation_token, authentic_key;
|
||||
ss >> session_token;
|
||||
ss >> session_token >> operation_token >> authentic_key;
|
||||
if (session_map.find(session_token) == session_map.end()) {
|
||||
std::cout << session_token << ' ' << operation_token << " -1"
|
||||
<< std::endl;
|
||||
continue;
|
||||
}
|
||||
if (session_map[session_token].OuthorizationKey != authentic_key) {
|
||||
std::cout << session_token << ' ' << operation_token << " -1"
|
||||
<< std::endl;
|
||||
continue;
|
||||
}
|
||||
session_map.erase(session_token);
|
||||
std::cout << session_token << ' ' << operation_token << " 0"
|
||||
<< std::endl;
|
||||
} else if (cmd[1] == 'W') {
|
||||
std::stringstream ss(cmd);
|
||||
std::string session_token, operation_token, authentic_key;
|
||||
ss >> session_token;
|
||||
ss >> session_token >> operation_token >> authentic_key;
|
||||
if (session_map.find(session_token) == session_map.end()) {
|
||||
std::cout << session_token << ' ' << operation_token << " -1"
|
||||
<< std::endl;
|
||||
continue;
|
||||
}
|
||||
if (session_map[session_token].OuthorizationKey != authentic_key) {
|
||||
std::cout << session_token << ' ' << operation_token << " -1"
|
||||
<< std::endl;
|
||||
continue;
|
||||
}
|
||||
if (session_map[session_token].login_stack.size())
|
||||
std::cout << session_token << ' ' << operation_token << " 1\n"
|
||||
<< engine.QueryUserInfo(
|
||||
session_map[session_token].login_stack.top().first)
|
||||
<< std::endl;
|
||||
else {
|
||||
std::cout << session_token << ' ' << operation_token
|
||||
<< " 1\n[nobody] -1" << std::endl;
|
||||
}
|
||||
} else if (cmd[1] == 'R') {
|
||||
std::stringstream ss(cmd);
|
||||
std::string session_token, operation_token, authentic_key;
|
||||
ss >> session_token;
|
||||
ss >> session_token >> operation_token >> authentic_key;
|
||||
if (session_map.find(session_token) == session_map.end()) {
|
||||
std::cout << session_token << ' ' << operation_token << " -1"
|
||||
<< std::endl;
|
||||
continue;
|
||||
}
|
||||
if (session_map[session_token].OuthorizationKey != authentic_key) {
|
||||
std::cout << session_token << ' ' << operation_token << " -1"
|
||||
<< std::endl;
|
||||
continue;
|
||||
}
|
||||
std::getline(std::cin, cmd);
|
||||
auto ret = std::move(
|
||||
engine.ExecuteRegister(cmd,
|
||||
session_map[session_token].login_stack));
|
||||
std::cout << session_token << ' ' << operation_token << " "
|
||||
<< ret.size() << std::endl;
|
||||
for (auto &line : ret) std::cout << line << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -451,4 +451,8 @@ std::vector<std::string> BookStoreEngineClass::ExecuteReport(
|
||||
return ret;
|
||||
}
|
||||
return std::vector<std::string>();
|
||||
}
|
||||
|
||||
std::string BookStoreEngineClass::QueryUserInfo(const std::string &user_name) {
|
||||
return user_name + std::to_string(user_data_base.GetPrevilege(user_name));
|
||||
}
|
@ -69,7 +69,7 @@ memoryriver类维护一个缓存,简单地缓存高频访问和连续访问;
|
||||
### 前端向后端
|
||||
- `#OpenSession [TempChannelID]`:向调度模块申请一个新会话
|
||||
- `#CloseSession [SessionToken] [OperationToken] [OuthenticationKey]`:显示地告知调度模块停止某个会话
|
||||
- `#Request [SessionToken] [OperationToken] [OuthenticationKey] [UserCommand]`:向后端发送一个请求
|
||||
- `#Request [SessionToken] [OperationToken] [OuthenticationKey]\n[UserCommand]`:向后端发送一个请求
|
||||
- `#Who [SessionToken] [OperationToken] [OuthenticationKey]`:查询自己是谁和权限
|
||||
- `#ShutDownSystem`:关闭整个系统
|
||||
|
||||
|
Reference in New Issue
Block a user