diff options
| author | auth <[email protected]> | 2020-07-14 16:16:02 +0200 |
|---|---|---|
| committer | auth <[email protected]> | 2020-07-14 16:16:02 +0200 |
| commit | 275010eaa0a46012fec547efdd76256b25e47f54 (patch) | |
| tree | 00d9e0a19424c3e3d81e2ed74d7986da987123d1 /server/src | |
| parent | Forum integration. (diff) | |
| download | loader-275010eaa0a46012fec547efdd76256b25e47f54.tar.xz loader-275010eaa0a46012fec547efdd76256b25e47f54.zip | |
Client login handling on server.
More error handling for forum responses.
Diffstat (limited to 'server/src')
| -rw-r--r-- | server/src/client/blacklist.h | 16 | ||||
| -rw-r--r-- | server/src/client/client.h | 5 | ||||
| -rw-r--r-- | server/src/forum/forum.cpp | 47 | ||||
| -rw-r--r-- | server/src/forum/forum.h | 9 | ||||
| -rw-r--r-- | server/src/main.cpp | 65 | ||||
| -rw-r--r-- | server/src/server/packet.h | 2 | ||||
| -rw-r--r-- | server/src/server/server.cpp | 13 |
7 files changed, 98 insertions, 59 deletions
diff --git a/server/src/client/blacklist.h b/server/src/client/blacklist.h index 70f5c7a..b2bc9f8 100644 --- a/server/src/client/blacklist.h +++ b/server/src/client/blacklist.h @@ -1,10 +1,5 @@ #pragma once -struct blacklist_data { - std::string ip; - std::string hwid; -}; - class blacklist { nlohmann::json m_data; std::string m_name; @@ -24,9 +19,8 @@ class blacklist { m_data = nlohmann::json::parse(data); } - void add(const blacklist_data &data) { - m_data["ips"].emplace_back(data.ip); - m_data["hwids"].emplace_back(data.hwid); + void add(const std::string_view hwid) { + m_data["hwids"].emplace_back(hwid); save(); } @@ -38,12 +32,6 @@ class blacklist { } bool find(const std::string &key) { - for (auto &item : m_data["ips"]) { - if (item.get<std::string>() == key) { - return true; - } - } - for (auto &item : m_data["hwids"]) { if (item.get<std::string>() == key) { return true; diff --git a/server/src/client/client.h b/server/src/client/client.h index 2777a0d..0f8c338 100644 --- a/server/src/client/client.h +++ b/server/src/client/client.h @@ -7,11 +7,12 @@ enum client_state { idle = 0, logged_in, waiting, injected }; -enum login_result { +enum client_response { login_fail = 15494, hwid_mismatch = 11006, login_success = 61539, - banned = 28618 + banned = 28618, + server_error = 98679 }; class client { diff --git a/server/src/forum/forum.cpp b/server/src/forum/forum.cpp index 57eff72..ed2ae58 100644 --- a/server/src/forum/forum.cpp +++ b/server/src/forum/forum.cpp @@ -2,23 +2,25 @@ #include "../util/io.h" #include "forum.h" -void xenforo_forum::init(const std::string_view link, const std::string_view key) { - m_link = link; - m_api = key; +void xenforo_forum::init(const std::string_view link, + const std::string_view key) { + m_link = link; + m_api = key; - m_header = cpr::Header{{"Content-Type", "application/x-www-form-urlencoded"}, + m_header = cpr::Header{{"Content-Type", "application/x-www-form-urlencoded"}, {"XF-Api-Key", m_api.data()}, {"XF-Api-User", "1"}, {"api_bypass_permissions", "1"}}; } int xenforo_forum::check_login(const std::string_view username, - const std::string_view password, user_data &data) { - auto url = fmt::format("{}{}", m_link, "/auth/"); + const std::string_view password, + user_data &data) { + auto url = fmt::format("{}{}", m_link, "/auth/"); auto post_data = fmt::format("login={}&password={}", username, password); auto req = cpr::Post(cpr::Url{url}, cpr::Body{post_data}, cpr::Timeout{10000}, - m_header); + m_header); if (req.elapsed >= 10) { io::logger->warn("login request on {} timed out.", username); @@ -29,19 +31,36 @@ int xenforo_forum::check_login(const std::string_view username, auto response = req.text; if (!nlohmann::json::accept(response)) { - io::logger->error("login response on {} isnt valid json.", username); - return forum_response::api_fail; + io::logger->error("invalid json response from forum.", username); + return forum_response::api_fail; } if (status_code >= 400) { return forum_response::api_error; } - auto j = nlohmann::json::parse(response); - - data.banned = j["user"]["is_banned"].get<bool>(); - // data.active = check user group - data.hwid = j["user"]["custom_fields"]["hwid"].get<std::string>(); + auto json = nlohmann::json::parse(response); + + data.banned = json["user"]["is_banned"].get<bool>(); + // data.active = check user groupm + auto custom_fields = json["user"]["custom_fields"]; + if (custom_fields.contains("hwid")) { + data.hwid = json["user"]["custom_fields"]["hwid"].get<std::string>(); + } else { + io::logger->warn("hwid field doesn't exist for {}.", username); + } + + data.id = json["user"]["user_id"].get<int>(); return forum_response::api_success; +} + +bool xenforo_forum::edit(const int uid, const std::string_view field, + const std::string_view val) { + const auto url = fmt::format("{}{}{}/", m_link, "/users/", uid); + const auto post = fmt::format("{}={}", field, val); + + auto req = + cpr::Post(cpr::Url{url}, cpr::Body{post}, cpr::Timeout{10000}, m_header); + return req.status_code == 200; }
\ No newline at end of file diff --git a/server/src/forum/forum.h b/server/src/forum/forum.h index df18cb4..d0b1a31 100644 --- a/server/src/forum/forum.h +++ b/server/src/forum/forum.h @@ -4,9 +4,10 @@ // XenForo forum api wrapper struct user_data { - std::string hwid; - bool banned; - bool active; + std::string hwid; + bool banned; + bool active; + int id; }; enum forum_response { api_fail = 0, api_error, api_timeout, api_success }; @@ -21,4 +22,6 @@ class xenforo_forum { void init(const std::string_view link, const std::string_view key); int check_login(const std::string_view username, const std::string_view password, user_data &data); + bool edit(const int uid, const std::string_view field, + const std::string_view val); };
\ No newline at end of file diff --git a/server/src/main.cpp b/server/src/main.cpp index 0947b75..d70b4cf 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -50,14 +50,14 @@ int main(int argc, char* argv[]) { if (!packet) { io::logger->warn("{} sent invalid packet.", ip); - // client_server.disconnect_event.call(client); + client_server.disconnect_event.call(client); return; } if (packet_session != session) { io::logger->warn("{} sent wrong session id.", ip); - // client_server.disconnect_event.call(client); + client_server.disconnect_event.call(client); return; } @@ -66,13 +66,14 @@ int main(int argc, char* argv[]) { if (id == tcp::packet_id::hwid) { client.hwid = message; - // client_server.bl().add({ip, message}); - io::logger->info("got hwid from {} : {}", ip, message); if (client_server.bl().find(message)) { io::logger->warn("{} is hwid banned.", ip); + client.write(tcp::packet_t(message, tcp::packet_type::write, session, + tcp::packet_id::ban)); + client_server.disconnect_event.call(client); return; } @@ -89,46 +90,80 @@ int main(int argc, char* argv[]) { auto pass = message.substr(pos + 1); user_data data{}; - //int ret = client_server.forum().check_login(user, pass, data); - int ret = forum_response::api_success; - if (ret == forum_response::api_success) { + nlohmann::json json; - nlohmann::json j; + io::logger->info("{} is trying to login from {}.", user, ip); + // int ret = forum_response::api_error; + int ret = client_server.forum().check_login(user, pass, data); + if (ret == forum_response::api_success) { if (data.banned) { io::logger->warn("{} is forum banned, dropping...", user); - j["result"] = tcp::login_result::banned; + json["result"] = tcp::client_response::banned; - client.write(tcp::packet_t(j.dump(), tcp::packet_type::write, + client.write(tcp::packet_t(json.dump(), tcp::packet_type::write, session, tcp::packet_id::login_resp)); client_server.disconnect_event.call(client); return; } + // new user/no hwid, register the hwid on the forums if (data.hwid.empty()) { + io::logger->info("{} is new, registering hwid...", user); + if (!client_server.forum().edit(data.id, "custom_fields[hwid]", + client.hwid)) { + io::logger->warn("failed to register hwid for {}.", user); + } + data.hwid = client.hwid; } // invalid hwid if (data.hwid != client.hwid) { + io::logger->warn("{}'s hwid doesn't match."); + if (!client_server.forum().edit(data.id, "custom_fields[new_hwid]", + client.hwid)) { + io::logger->warn("failed to write new hwid for {}.", user); + } - j["result"] = tcp::login_result::hwid_mismatch; + json["result"] = tcp::client_response::hwid_mismatch; - client.write(tcp::packet_t(j.dump(), tcp::packet_type::write, + client.write(tcp::packet_t(json.dump(), tcp::packet_type::write, session, tcp::packet_id::login_resp)); client_server.disconnect_event.call(client); return; } - j["result"] = tcp::login_result::banned; + json["result"] = tcp::client_response::login_success; - client.write(tcp::packet_t(j.dump(), tcp::packet_type::write, - session, tcp::packet_id::login_resp)); + client.write(tcp::packet_t(json.dump(), tcp::packet_type::write, + session, tcp::packet_id::login_resp)); client.state = tcp::client_state::logged_in; + + io::logger->info("{} logged in successfuly.", user); + } + + if (ret == forum_response::api_timeout || + ret == forum_response::api_fail) { + json["result"] = tcp::client_response::server_error; + + io::logger->info("internal server error on {}'s login request.", user); + + client.write(tcp::packet_t(json.dump(), tcp::packet_type::write, + session, tcp::packet_id::login_resp)); + } + + if (ret == forum_response::api_error) { + json["result"] = tcp::client_response::login_fail; + + io::logger->info("{} failed to login.", user); + + client.write(tcp::packet_t(json.dump(), tcp::packet_type::write, + session, tcp::packet_id::login_resp)); } } } diff --git a/server/src/server/packet.h b/server/src/server/packet.h index c0aab12..203382e 100644 --- a/server/src/server/packet.h +++ b/server/src/server/packet.h @@ -9,7 +9,7 @@ constexpr size_t message_len = 512; enum packet_type { write = 0, read }; -enum packet_id { message = 0, hwid, session, login_req, login_resp, process_list }; +enum packet_id { message = 0, hwid, session, login_req, login_resp, process_list, ban }; struct packet_t { std::string message; diff --git a/server/src/server/server.cpp b/server/src/server/server.cpp index 91176e1..736740a 100644 --- a/server/src/server/server.cpp +++ b/server/src/server/server.cpp @@ -5,6 +5,9 @@ void tcp::server::start() { m_blacklist.init(); + m_forum.init("https://4caadda66a19b663.demo-xenforo.com/2110p2/index.php/api", + "_UePnLLI348xDobabe-kyfJuosCt3kqG"); + io::logger->info("starting server on port {}...", m_port.data()); ssl ctx("ssl/server.crt", "ssl/server.key", "ssl/rootCA.crt"); @@ -110,16 +113,6 @@ void tcp::server::accept_client() { return; } - //m_blacklist.add({"127.0.0.1", "ahahaahhahaha"}); - - // check for blacklist ip entry - if (m_blacklist.find(ip)) { - io::logger->info("{} is blacklisted, dropping...", ip); - cli.cleanup(); - return; - } - - // check for an existing connection /*auto it = std::find_if(client_stack.begin(), client_stack.end(), [&](client& c) { return c.get_ip() == ip; }); if (it != client_stack.end()) { |