aboutsummaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
authorauth <[email protected]>2020-07-14 16:16:02 +0200
committerauth <[email protected]>2020-07-14 16:16:02 +0200
commit275010eaa0a46012fec547efdd76256b25e47f54 (patch)
tree00d9e0a19424c3e3d81e2ed74d7986da987123d1 /server/src
parentForum integration. (diff)
downloadloader-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.h16
-rw-r--r--server/src/client/client.h5
-rw-r--r--server/src/forum/forum.cpp47
-rw-r--r--server/src/forum/forum.h9
-rw-r--r--server/src/main.cpp65
-rw-r--r--server/src/server/packet.h2
-rw-r--r--server/src/server/server.cpp13
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()) {