diff --git a/src/auth/auth.cpp b/src/auth/auth.cpp index 46911b7..1185f33 100644 --- a/src/auth/auth.cpp +++ b/src/auth/auth.cpp @@ -31,6 +31,7 @@ void auth(const httplib::Request& request, httplib::Response& response) const std::string request_username = json_body["username"]; const std::string request_password = json_body["password"]; + std::lock_guard lock(usersfilemutex); std::ifstream usersfile(USERS_FILE); nlohmann::json all_users = nlohmann::json::parse(usersfile); usersfile.close(); diff --git a/src/includes.hpp b/src/includes.hpp index 440222d..dd5dfe8 100644 --- a/src/includes.hpp +++ b/src/includes.hpp @@ -11,5 +11,6 @@ #define CHANGE_USER_REQUIRED_STRING R"({"required":"[token] or if you superuser [token,userid]","optional":"[username,password,is_superuser,group]"})" #define DELETE_USER_REQUIRED_STRING R"({"required":"[token] or if you superuser [token,userid]"})" #define USERS_FILE "users.json" +static std::mutex usersfilemutex; #endif // INCLUDES_HPP diff --git a/src/users/add_user.cpp b/src/users/add_user.cpp index aef5cc9..004a36e 100644 --- a/src/users/add_user.cpp +++ b/src/users/add_user.cpp @@ -61,10 +61,13 @@ void add_user(const httplib::Request& request, httplib::Response& response) syslog(LOG_ERR, "access reject in add user request"); return; } - - std::ifstream usersfile(USERS_FILE); - nlohmann::json all_users = nlohmann::json::parse(usersfile); - usersfile.close(); + nlohmann::json all_users; + { + std::lock_guard lock(usersfilemutex); + std::ifstream usersfile(USERS_FILE); + all_users = nlohmann::json::parse(usersfile); + usersfile.close(); + } nlohmann::json response_user_data = nullptr; for (nlohmann::json& user : all_users) { @@ -102,6 +105,7 @@ void add_user(const httplib::Request& request, httplib::Response& response) new_user_data += "}"; all_users.push_back(nlohmann::json::parse(new_user_data)); + std::lock_guard lock(usersfilemutex); std::ofstream usersfilew(USERS_FILE); usersfilew << all_users.dump(4); usersfilew.close(); diff --git a/src/users/change_password.cpp b/src/users/change_password.cpp index 7670fad..9924f72 100644 --- a/src/users/change_password.cpp +++ b/src/users/change_password.cpp @@ -58,10 +58,13 @@ void change_password(const httplib::Request& request, httplib::Response& respons syslog(LOG_ERR, "access reject in change password request"); return; } - - std::ifstream usersfile(USERS_FILE); - nlohmann::json all_users = nlohmann::json::parse(usersfile); - usersfile.close(); + nlohmann::json all_users; + { + std::lock_guard lock(usersfilemutex); + std::ifstream usersfile(USERS_FILE); + all_users = nlohmann::json::parse(usersfile); + usersfile.close(); + } std::string changepassuserid = userid; if (json_body["userid"] != nullptr) { @@ -112,6 +115,7 @@ void change_password(const httplib::Request& request, httplib::Response& respons syslog(LOG_ERR, "can't find this user in change password request"); return; } + std::lock_guard lock(usersfilemutex); std::ofstream usersfilew(USERS_FILE); usersfilew << all_users.dump(4); usersfilew.close(); diff --git a/src/users/change_user.cpp b/src/users/change_user.cpp index 386104f..9fb75d2 100644 --- a/src/users/change_user.cpp +++ b/src/users/change_user.cpp @@ -46,11 +46,13 @@ void change_user(const httplib::Request& request, httplib::Response& response) syslog(LOG_ERR, "access reject in change user request"); return; } - - std::ifstream usersfile(USERS_FILE); - nlohmann::json all_users = nlohmann::json::parse(usersfile); - usersfile.close(); - + nlohmann::json all_users; + { + std::lock_guard lock(usersfilemutex); + std::ifstream usersfile(USERS_FILE); + all_users = nlohmann::json::parse(usersfile); + usersfile.close(); + } std::string changeusruserid = userid; if (json_body["userid"] != nullptr) { changeusruserid = json_body["userid"]; @@ -103,6 +105,7 @@ void change_user(const httplib::Request& request, httplib::Response& response) syslog(LOG_ERR, "can't find this user in change user request"); return; } + std::lock_guard lock(usersfilemutex); std::ofstream usersfilew(USERS_FILE); usersfilew << all_users.dump(4); usersfilew.close(); diff --git a/src/users/delete_user.cpp b/src/users/delete_user.cpp index 720169b..e1449ca 100644 --- a/src/users/delete_user.cpp +++ b/src/users/delete_user.cpp @@ -38,11 +38,13 @@ void delete_user(const httplib::Request& request, httplib::Response& response) syslog(LOG_ERR, "access reject in delete user request"); return; } - - std::ifstream usersfile(USERS_FILE); - nlohmann::json all_users = nlohmann::json::parse(usersfile); - usersfile.close(); - + nlohmann::json all_users; + { + std::lock_guard lock(usersfilemutex); + std::ifstream usersfile(USERS_FILE); + all_users = nlohmann::json::parse(usersfile); + usersfile.close(); + } std::string deluserid = userid; if (json_body["userid"] != nullptr) { deluserid = json_body["userid"]; @@ -79,6 +81,7 @@ void delete_user(const httplib::Request& request, httplib::Response& response) syslog(LOG_ERR, "can't find this user in delete user request"); return; } + std::lock_guard lock(usersfilemutex); std::ofstream usersfilew(USERS_FILE); usersfilew << all_users.dump(4); usersfilew.close(); diff --git a/src/users/get_all_users.cpp b/src/users/get_all_users.cpp index 30fcc1a..63805cb 100644 --- a/src/users/get_all_users.cpp +++ b/src/users/get_all_users.cpp @@ -33,6 +33,7 @@ void get_all_users(const httplib::Request& request, httplib::Response& response) syslog(LOG_ERR, "access reject in get all user request"); return; } + std::lock_guard lock(usersfilemutex); std::ifstream usersfile(USERS_FILE); nlohmann::json all_users = nlohmann::json::parse(usersfile); usersfile.close(); diff --git a/src/users/get_user.cpp b/src/users/get_user.cpp index 3106887..5ac932a 100644 --- a/src/users/get_user.cpp +++ b/src/users/get_user.cpp @@ -33,6 +33,7 @@ void get_user(const httplib::Request& request, httplib::Response& response) syslog(LOG_ERR, "access reject in get user request"); return; } + std::lock_guard lock(usersfilemutex); std::ifstream usersfile(USERS_FILE); nlohmann::json all_users = nlohmann::json::parse(usersfile); usersfile.close();