From d68902f54016f30e8859ebb041e6ecf5ce75cf82 Mon Sep 17 00:00:00 2001 From: Luna Date: Fri, 16 May 2025 06:03:14 +0200 Subject: [PATCH 1/6] the files are processed in chunks --- main.cpp | 50 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/main.cpp b/main.cpp index 187a418..f24d9aa 100644 --- a/main.cpp +++ b/main.cpp @@ -144,7 +144,7 @@ std::string get_filename(std::string data) void write_file(const std::string& filename, char *start_data, char *end_data) { - FILE *fd = fopen(filename.c_str(), "wb"); + FILE *fd = fopen(filename.c_str(), "ab"); while (start_data != end_data) { fwrite(start_data, sizeof(char), 1, fd); @@ -153,6 +153,14 @@ void write_file(const std::string& filename, char *start_data, char *end_data) fclose(fd); } +void write_file_size(const std::string& filename, char *start_data, size_t size) +{ + FILE *fd = fopen(filename.c_str(), "ab"); + int index = 0; + fwrite(start_data, sizeof(char), size, fd); + fclose(fd); +} + char *search_substring(char *start_data, const char *substring, size_t size) { size_t index = 0; @@ -251,28 +259,34 @@ int main() { std::string line_str = std::string(line1); std::string line_str2 = std::string(line); + std::string line_str3 = std::string(line2); + std::string line_str4 = std::string(line3); auto h = parse_header(line_str); std::vector file_ = split(h.begin()->second, "; "); std::string filename = get_filename(file_.back()); - size_t size = file_size - (line_str.size() + std::string(line2).size() + std::string(line3).size() + (line_str2.size())); - char *file_data = server.receive_data_ensured(user, size); - if (!file_data) - throw std::runtime_error("Getting file data failed"); - std::string final_boundary = std::format("\r\n--{}--", boundary); - char *end = search_substring(file_data, final_boundary.c_str(), file_size); - if (!end) + int size_to_get = line_str.size() + line_str2.size() + line_str3.size() + line_str4.size(); + size_to_get = file_size - size_to_get; + int chunks_to_get = (size_to_get / 2048) + 1; + int last_chunk_size = size_to_get % 2048; + while (chunks_to_get > 0) { - std::println("Couldn't find ending for the file"); - free(line); - free(line1); - free(line2); - free(line3); - break; + if (chunks_to_get == 1) + { + char *chunk = server.receive_data_ensured(user, last_chunk_size); + std::string final_boundary = std::format("\r\n--{}--", boundary); + char *end = search_substring(chunk, final_boundary.c_str(), file_size); + write_file(filename, chunk, end); + free(chunk); + } + else + { + char *chunk = server.receive_data_ensured(user, 2048); + write_file_size(filename, chunk, 2048); + free(chunk); + } + chunks_to_get--; + std::println("Chunks left: {}", chunks_to_get); } - write_file(filename, file_data, end); - print_map(h); - free(file_data); - std::println("File {} received", filename); } free(line); free(line1); From c0e798996b47a5abba203b3f59d66ccf81c89cfd Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 17 May 2025 03:22:19 +0200 Subject: [PATCH 2/6] applied memory cap capability from netlib --- main.cpp | 2 +- netlib | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/main.cpp b/main.cpp index f24d9aa..a59ca98 100644 --- a/main.cpp +++ b/main.cpp @@ -183,7 +183,7 @@ char *search_substring(char *start_data, const char *substring, size_t size) int main() { - netlib::server_raw server(false, 0); + netlib::server_raw server(150000000); server.open_server("0.0.0.0", 8080); while (true) diff --git a/netlib b/netlib index 57b7a51..992d224 160000 --- a/netlib +++ b/netlib @@ -1 +1 @@ -Subproject commit 57b7a51ebbec052c421ecbab66884319faaad26f +Subproject commit 992d224bc0b0d51bca487581e123bbf9dc5e5939 From a123d0a22d0bc430616d4765477c247f4067ec03 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 17 May 2025 03:33:02 +0200 Subject: [PATCH 3/6] added some security features --- main.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/main.cpp b/main.cpp index a59ca98..8cfd0bf 100644 --- a/main.cpp +++ b/main.cpp @@ -126,6 +126,16 @@ std::map parse_headers(const std::vector return ret; } +std::string filename_sanitation(std::string filename) +{ + std::filesystem::path p(filename); + std::string ret = p.filename().string(); + if (ret == "" || ret == "." || ret == "..") + return "generic_file.txt"; + + return ret; +} + std::string get_filename(std::string data) { bool started_quote = false; @@ -139,6 +149,7 @@ std::string get_filename(std::string data) else if (started_quote) ret.push_back(x); } + ret = filename_sanitation(ret); return ret; } @@ -181,6 +192,8 @@ char *search_substring(char *start_data, const char *substring, size_t size) return NULL; } + + int main() { netlib::server_raw server(150000000); @@ -243,6 +256,8 @@ int main() else if (h.contains("Content-Length:")) { file_size = atoi_newline(h["Content-Length:"].c_str()); + if (file_size > 1000000000) //1GB + server.disconnect_user(user); } else if (line_str.contains(boundary) && boundary.contains("----")) { From 900bbd94b29ab54024a702a44fc470f9f72d8518 Mon Sep 17 00:00:00 2001 From: Luna Date: Mon, 19 May 2025 04:54:05 +0200 Subject: [PATCH 4/6] improved settings for throughput --- main.cpp | 12 ++++++------ netlib | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/main.cpp b/main.cpp index 8cfd0bf..62ea27e 100644 --- a/main.cpp +++ b/main.cpp @@ -196,13 +196,13 @@ char *search_substring(char *start_data, const char *substring, size_t size) int main() { - netlib::server_raw server(150000000); + netlib::server_raw server(15000000); server.open_server("0.0.0.0", 8080); while (true) { std::vector readable = server.wait_readable(); - std::this_thread::sleep_for(std::chrono::milliseconds(50)); + //std::this_thread::sleep_for(std::chrono::milliseconds(50)); for (auto user: readable) { char * data = server.get_line(user); @@ -281,8 +281,8 @@ int main() std::string filename = get_filename(file_.back()); int size_to_get = line_str.size() + line_str2.size() + line_str3.size() + line_str4.size(); size_to_get = file_size - size_to_get; - int chunks_to_get = (size_to_get / 2048) + 1; - int last_chunk_size = size_to_get % 2048; + int chunks_to_get = (size_to_get / 8198) + 1; + int last_chunk_size = size_to_get % 8198; while (chunks_to_get > 0) { if (chunks_to_get == 1) @@ -295,8 +295,8 @@ int main() } else { - char *chunk = server.receive_data_ensured(user, 2048); - write_file_size(filename, chunk, 2048); + char *chunk = server.receive_data_ensured(user, 8198); + write_file_size(filename, chunk, 8198); free(chunk); } chunks_to_get--; diff --git a/netlib b/netlib index 992d224..07f574f 160000 --- a/netlib +++ b/netlib @@ -1 +1 @@ -Subproject commit 992d224bc0b0d51bca487581e123bbf9dc5e5939 +Subproject commit 07f574f5210c3a4ee3e8fcd701a05097743faa8d From c7ae4ffeb48d621ead01f9e1f312d8d0177d27f3 Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 21 May 2025 06:09:03 +0200 Subject: [PATCH 5/6] added whitelist and removed ai crap from html --- main.cpp | 62 +++++++++++++++++++- test.html | 172 +++++++++++++----------------------------------------- 2 files changed, 101 insertions(+), 133 deletions(-) diff --git a/main.cpp b/main.cpp index 62ea27e..c6a8fc7 100644 --- a/main.cpp +++ b/main.cpp @@ -192,19 +192,79 @@ char *search_substring(char *start_data, const char *substring, size_t size) return NULL; } +bool isNumber(std::string a) +{ + if (a.empty()) + return false; + for (int i = 0; i < a.length(); i++) + { + if (isdigit(a[i]) == 0) + return false; + } + return true; +} +bool check_ip(const char* ip) +{ + std::string buff; + std::vector tokens; + if (strcmp(ip, "localhost") == 0) + return true; + buff = ip; + tokens = split(ip, "."); + if (tokens.size() != 4) + return false; + for (int i = 0; i < tokens.size(); i++) + { + if (isNumber(tokens[i]) == false) + return false; + else if (atoi(tokens[i].c_str()) > 255) + return false; + } + return true; +} + +std::vector load_whitelist(const std::string &filename) +{ + std::vector ret; + std::ifstream file(filename); + std::string line; + while (std::getline(file, line)) + { + if (check_ip(line.c_str())) + ret.push_back(line); + } + return ret; +} int main() { netlib::server_raw server(15000000); server.open_server("0.0.0.0", 8080); - + std::vector whitelist = load_whitelist("whitelist.txt"); + std::println("{} ips found in whitelist", whitelist.size()); while (true) { std::vector readable = server.wait_readable(); //std::this_thread::sleep_for(std::chrono::milliseconds(50)); for (auto user: readable) { + sockaddr_in addr = {0}; + unsigned int addr_size = sizeof(addr); + char str[INET_ADDRSTRLEN]; + getpeername(user, (struct sockaddr *)&addr, &addr_size); + strcpy(str, inet_ntoa(addr.sin_addr)); + bool in_whitelist = false; + for (const auto& x: whitelist) + { + if (x == str) + in_whitelist = true; + } + if (in_whitelist == false) + { + std::println("Ip {} not in whitelist!", str); + server.disconnect_user(user); + } char * data = server.get_line(user); if (data) { diff --git a/test.html b/test.html index 544a663..20c8056 100644 --- a/test.html +++ b/test.html @@ -1,177 +1,85 @@ -//THIS IS NOT MY CODE, THIS IS AN AI GENERATED CODE TO TEST MY SERVER AND SEE HOW EVERYTHING WORKS -//I WILL CHANGE IT TO MY OWN WHEN MY SERVER WORKS PROPERLY - - - Drag and Drop File Upload + Sube musica -

Simple File Upload via Drag & Drop

-
-

Drag one or more files to this drop zone.

-
- From afaad60e509a37d8b44a798c53b64edb03756e84 Mon Sep 17 00:00:00 2001 From: Luna Date: Wed, 21 May 2025 21:42:28 +0200 Subject: [PATCH 6/6] removed whitelist from the server and to netlib, fixed test website --- main.cpp | 17 +---------------- netlib | 2 +- test.html | 5 +++++ 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/main.cpp b/main.cpp index c6a8fc7..2e7e2f1 100644 --- a/main.cpp +++ b/main.cpp @@ -242,6 +242,7 @@ int main() netlib::server_raw server(15000000); server.open_server("0.0.0.0", 8080); std::vector whitelist = load_whitelist("whitelist.txt"); + server.add_whitelist(whitelist); std::println("{} ips found in whitelist", whitelist.size()); while (true) { @@ -249,22 +250,6 @@ int main() //std::this_thread::sleep_for(std::chrono::milliseconds(50)); for (auto user: readable) { - sockaddr_in addr = {0}; - unsigned int addr_size = sizeof(addr); - char str[INET_ADDRSTRLEN]; - getpeername(user, (struct sockaddr *)&addr, &addr_size); - strcpy(str, inet_ntoa(addr.sin_addr)); - bool in_whitelist = false; - for (const auto& x: whitelist) - { - if (x == str) - in_whitelist = true; - } - if (in_whitelist == false) - { - std::println("Ip {} not in whitelist!", str); - server.disconnect_user(user); - } char * data = server.get_line(user); if (data) { diff --git a/netlib b/netlib index 07f574f..5a4d644 160000 --- a/netlib +++ b/netlib @@ -1 +1 @@ -Subproject commit 07f574f5210c3a4ee3e8fcd701a05097743faa8d +Subproject commit 5a4d644261435c9ea6ca40369f55ce849fbab3ae diff --git a/test.html b/test.html index 20c8056..6567d23 100644 --- a/test.html +++ b/test.html @@ -28,6 +28,7 @@ id="drop_zone" ondrop="dropHandler(event);" ondragover="dragOverHandler(event);" + ondragenter="dragEnterHandler(event);" > @@ -64,6 +65,10 @@ { ev.preventDefault(); } + function dragEnterHandler(ev) + { + ev.preventDefault(); + } function uploadFile(file)