aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorauth <[email protected]>2020-06-30 23:31:36 +0200
committerauth <[email protected]>2020-06-30 23:31:36 +0200
commitd96c27220ad100b61332a0ac91bdb0300ef7e3be (patch)
tree3cd6289e6aa4c2a16621a2914ab68c2f723c6f00
parentAdded json. (diff)
downloadloader-d96c27220ad100b61332a0ac91bdb0300ef7e3be.tar.xz
loader-d96c27220ad100b61332a0ac91bdb0300ef7e3be.zip
Added json implementation for packets.
Added useful operators for packet and server class for easier access.
-rw-r--r--client/src/client/packet.h30
-rw-r--r--client/src/main.cpp5
-rw-r--r--server/src/main.cpp25
-rw-r--r--server/src/server/packet.h30
-rw-r--r--server/src/server/server.h3
5 files changed, 42 insertions, 51 deletions
diff --git a/client/src/client/packet.h b/client/src/client/packet.h
index d1b7001..39b17de 100644
--- a/client/src/client/packet.h
+++ b/client/src/client/packet.h
@@ -1,15 +1,16 @@
#pragma once
#include "enc.h"
+#include <json.hpp>
+
namespace tcp {
constexpr size_t session_id_len = 10;
-constexpr size_t message_len = 256 + session_id_len;
+constexpr size_t message_len = 1024;
enum packet_type : int { write = 0, read };
struct packet_t {
std::string message;
- char action;
std::string session_id;
int id;
@@ -19,29 +20,21 @@ struct packet_t {
if (type == read) {
++id;
- if (msg.size() < session_id_len) {
- io::logger->error("packet message invalid!");
- return;
- }
-
message = msg;
enc::decrypt_message(message);
- session_id = message.substr(0, session_id_len);
+ auto json = nlohmann::json::parse(message);
+ message = json["message"];
+ session_id = json["session_id"];
- action = message[session_id_len];
- message = message.substr(session_id_len);
} else {
- session_id = session;
+ nlohmann::json json;
+ json["session_id"] = session;
+ json["message"] = msg.data();
- message = fmt::format("{}{}", session_id, msg);
+ message = json.dump();
+ session_id = session;
- if (msg.size() > message_len) {
- io::logger->error("packet message exceeds limit");
- message.clear();
- session_id.clear();
- return;
- }
enc::encrypt_message(message);
}
}
@@ -52,5 +45,6 @@ struct packet_t {
}
operator bool() const { return !message.empty() && !session_id.empty(); }
+ auto &operator()() { return message; }
};
}; // namespace tcp
diff --git a/client/src/main.cpp b/client/src/main.cpp
index 220afd6..c932b44 100644
--- a/client/src/main.cpp
+++ b/client/src/main.cpp
@@ -14,20 +14,21 @@ int main(int argc, char* argv[]) {
client.receive_event.add([&](tcp::packet_t& packet) {
if (!packet) return;
+ auto message = packet();
// first packet is the session id and current version
if (packet.id == 1) {
client.session_id = packet.session_id;
tcp::version_t v{0, 1, 0};
auto version = fmt::format("{}.{}.{}", v.major, v.minor, v.patch);
- if(version != packet.message) {
+ if(version != message) {
io::logger->error("please update your client");
client.shutdown();
}
return;
}
- io::logger->info("{}:{}->{}", packet.id, packet.session_id, packet.message);
+ io::logger->info("{}:{}->{}", packet.id, packet.session_id, message);
});
while (client) {
diff --git a/server/src/main.cpp b/server/src/main.cpp
index 7b96ff3..f5b58be 100644
--- a/server/src/main.cpp
+++ b/server/src/main.cpp
@@ -9,15 +9,6 @@ constexpr std::string_view client_version{"0.1.0"};
int main(int argc, char* argv[]) {
io::init(false);
- pe::image test("out");
-
- for(auto&[mod, imports] : test.imports()) {
- io::logger->info(mod);
- for(auto &i : imports) {
- io::logger->info(" {}->{:x}", i.name, i.rva);
- }
- }
-
tcp::server client_server("6666");
client_server.start();
@@ -32,12 +23,12 @@ int main(int argc, char* argv[]) {
});
client_server.disconnect_event.add([&](tcp::client& client) {
- auto it = std::find_if(client_server.client_stack.begin(),
- client_server.client_stack.end(), [&](tcp::client& c) {
- return client.get_socket() == client.get_socket();
+ auto it = std::find_if(client_server().begin(),
+ client_server().end(), [&](tcp::client& c) {
+ return client.get_socket() == c.get_socket();
});
- client_server.client_stack.erase(it);
+ client_server().erase(it);
client.cleanup();
io::logger->info("{} disconnected", client.get_ip());
@@ -47,10 +38,10 @@ int main(int argc, char* argv[]) {
auto session = client.get_session();
auto packet_session = packet.session_id;
auto ip = client.get_ip();
- auto message = packet.message;
+ auto message = packet();
if (!packet) {
- io::logger->info("{} sent invalid packet", ip);
+ io::logger->info("{} sent invalid packet, id {}", ip, packet.id);
return;
}
@@ -59,9 +50,9 @@ int main(int argc, char* argv[]) {
return;
}
- io::logger->info("{} : {}", packet_session, packet.message);
+ io::logger->info("{} : {}", packet_session, message);
- tcp::packet_t resp(packet.message, tcp::packet_type::write,
+ tcp::packet_t resp(message, tcp::packet_type::write,
client.get_session());
client.write(resp);
diff --git a/server/src/server/packet.h b/server/src/server/packet.h
index 3c27c2d..a385960 100644
--- a/server/src/server/packet.h
+++ b/server/src/server/packet.h
@@ -1,41 +1,44 @@
#pragma once
#include "enc.h"
+#include <json.hpp>
+
namespace tcp {
constexpr size_t session_id_len = 10;
-constexpr size_t message_len = 256 + session_id_len;
+constexpr size_t message_len = 1024;
enum packet_type : int { write = 0, read };
struct packet_t {
std::string message;
- char action;
std::string session_id;
+ int id;
packet_t() {}
packet_t(const std::string_view msg, const packet_type& type,
std::string_view session = "") {
if (type == read) {
- if (msg.size() < session_id_len) {
- io::logger->error("packet message invalid!");
- return;
- }
+ ++id;
message = msg;
enc::decrypt_message(message);
- session_id = message.substr(0, session_id_len);
- action = message[session_id_len];
- message = message.substr(session_id_len);
- } else {
- if (msg.size() > message_len) {
- io::logger->error("packet message exceeds limit");
+ if (!nlohmann::json::accept(message)) {
+ io::logger->error("message isn't valid json");
return;
}
+ auto json = nlohmann::json::parse(message);
+ message = json["message"];
+ session_id = json["session_id"];
+ } else {
+ nlohmann::json json;
+ json["session_id"] = session;
+ json["message"] = msg.data();
+
+ message = json.dump();
session_id = session;
- message = fmt::format("{}{}", session_id, msg);
enc::encrypt_message(message);
}
}
@@ -46,5 +49,6 @@ struct packet_t {
}
operator bool() const { return !message.empty() && !session_id.empty(); }
+ auto &operator()() { return message; }
};
}; // namespace tcp
diff --git a/server/src/server/server.h b/server/src/server/server.h
index 9d594a0..90c31f7 100644
--- a/server/src/server/server.h
+++ b/server/src/server/server.h
@@ -17,8 +17,8 @@ class server {
std::atomic<bool> m_active;
- public:
std::vector<tcp::client> client_stack;
+ public:
event<client&> connect_event;
event<packet_t&, client&> receive_event;
@@ -34,6 +34,7 @@ class server {
void stop();
operator bool() const { return m_active; }
+ auto &operator()() { return client_stack; }
static void monitor(server& srv) {
while (srv) {