Compare commits

...
Author SHA1 Message Date
Adam Honse 003c3e0af1 Sanitize filenames from clients in NetworkServer 2026-07-31 19:01:25 -05:00
3 changed files with 41 additions and 11 deletions
+12 -11
View File
@@ -8,6 +8,7 @@
#include "NetworkServer.h" #include "NetworkServer.h"
#include "LogManager.h" #include "LogManager.h"
#include "StringUtils.h"
#include <cstring> #include <cstring>
#ifndef WIN32 #ifndef WIN32
@@ -266,7 +267,7 @@ void NetworkServer::StartServer()
for(res = result; res && socket_count < MAXSOCK; res = res->ai_next) for(res = result; res && socket_count < MAXSOCK; res = res->ai_next)
{ {
server_sock[socket_count] = socket(res->ai_family, res->ai_socktype, res->ai_protocol); server_sock[socket_count] = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if(server_sock[socket_count] == INVALID_SOCKET) if(server_sock[socket_count] == INVALID_SOCKET)
{ {
printf("Error: network socket could not be created\n"); printf("Error: network socket could not be created\n");
@@ -320,7 +321,7 @@ void NetworkServer::StartServer()
freeaddrinfo(result); freeaddrinfo(result);
server_online = true; server_online = true;
/*-------------------------------------------------*\ /*-------------------------------------------------*\
| Start the connection thread | | Start the connection thread |
\*-------------------------------------------------*/ \*-------------------------------------------------*/
@@ -430,7 +431,7 @@ void NetworkServer::ConnectionThreadFunction(int socket_idx)
socklen_t len; socklen_t len;
len = sizeof(tmp_addr); len = sizeof(tmp_addr);
getpeername(client_info->client_sock, (struct sockaddr*)&tmp_addr, &len); getpeername(client_info->client_sock, (struct sockaddr*)&tmp_addr, &len);
if(tmp_addr.ss_family == AF_INET) if(tmp_addr.ss_family == AF_INET)
{ {
struct sockaddr_in *s_4 = (struct sockaddr_in *)&tmp_addr; struct sockaddr_in *s_4 = (struct sockaddr_in *)&tmp_addr;
@@ -780,7 +781,7 @@ void NetworkServer::ListenThreadFunction(NetworkClientInfo * client_info)
if(profile_manager) if(profile_manager)
{ {
profile_manager->SaveProfile(data); profile_manager->SaveProfile(StringUtils::make_filename(data));
} }
break; break;
@@ -793,7 +794,7 @@ void NetworkServer::ListenThreadFunction(NetworkClientInfo * client_info)
if(profile_manager) if(profile_manager)
{ {
profile_manager->LoadProfile(data); profile_manager->LoadProfile(StringUtils::make_filename(data));
} }
for(RGBController* controller : controllers) for(RGBController* controller : controllers)
@@ -811,7 +812,7 @@ void NetworkServer::ListenThreadFunction(NetworkClientInfo * client_info)
if(profile_manager) if(profile_manager)
{ {
profile_manager->DeleteProfile(data); profile_manager->DeleteProfile(StringUtils::make_filename(data));
} }
break; break;
@@ -1028,7 +1029,7 @@ void NetworkServer::SendReply_PluginList(SOCKET client_sock)
{ {
unsigned int data_size = 0; unsigned int data_size = 0;
unsigned int data_ptr = 0; unsigned int data_ptr = 0;
/*---------------------------------------------------------*\ /*---------------------------------------------------------*\
| Calculate data size | | Calculate data size |
\*---------------------------------------------------------*/ \*---------------------------------------------------------*/
@@ -1045,12 +1046,12 @@ void NetworkServer::SendReply_PluginList(SOCKET client_sock)
data_size += strlen(plugins[i].version.c_str()) + 1; data_size += strlen(plugins[i].version.c_str()) + 1;
data_size += sizeof(unsigned int) * 2; data_size += sizeof(unsigned int) * 2;
} }
/*---------------------------------------------------------*\ /*---------------------------------------------------------*\
| Create data buffer | | Create data buffer |
\*---------------------------------------------------------*/ \*---------------------------------------------------------*/
unsigned char *data_buf = new unsigned char[data_size]; unsigned char *data_buf = new unsigned char[data_size];
/*---------------------------------------------------------*\ /*---------------------------------------------------------*\
| Copy in data size | | Copy in data size |
\*---------------------------------------------------------*/ \*---------------------------------------------------------*/
@@ -1103,14 +1104,14 @@ void NetworkServer::SendReply_PluginList(SOCKET client_sock)
\*---------------------------------------------------------*/ \*---------------------------------------------------------*/
memcpy(&data_buf[data_ptr], &i, sizeof(unsigned int)); memcpy(&data_buf[data_ptr], &i, sizeof(unsigned int));
data_ptr += sizeof(unsigned int); data_ptr += sizeof(unsigned int);
/*---------------------------------------------------------*\ /*---------------------------------------------------------*\
| Copy in plugin sdk version (data) | | Copy in plugin sdk version (data) |
\*---------------------------------------------------------*/ \*---------------------------------------------------------*/
memcpy(&data_buf[data_ptr], &plugins[i].protocol_version, sizeof(int)); memcpy(&data_buf[data_ptr], &plugins[i].protocol_version, sizeof(int));
data_ptr += sizeof(int); data_ptr += sizeof(int);
} }
NetPacketHeader reply_hdr; NetPacketHeader reply_hdr;
unsigned int reply_size; unsigned int reply_size;
+28
View File
@@ -38,3 +38,31 @@ const char* StringUtils::wchar_to_char(const wchar_t* pwchar)
return filePathC; return filePathC;
} }
std::string StringUtils::make_filename(std::string input)
{
/*-----------------------------------------------------*\
| Replace : characters with - characters |
\*-----------------------------------------------------*/
input = std::regex_replace(input, std::regex(":"), "-");
/*-----------------------------------------------------*\
| Remove all other characters |
\*-----------------------------------------------------*/
input = std::regex_replace(input, std::regex("[#%&\\{\\}\\\\<>\\*\\?/!`';@+|=]"), "");
/*-----------------------------------------------------*\
| Remove leading . characters |
\*-----------------------------------------------------*/
input = std::regex_replace(input, std::regex("^\\.+"), "");
/*-----------------------------------------------------*\
| Remove control characters |
\*-----------------------------------------------------*/
input = std::regex_replace(input, std::regex("[\\x00-\\x1F\\x7F]"), "");
/*-----------------------------------------------------*\
| Return complete string |
\*-----------------------------------------------------*/
return(input);
}
+1
View File
@@ -5,6 +5,7 @@ class StringUtils
{ {
public: public:
static const char* wchar_to_char(const wchar_t* pwchar); static const char* wchar_to_char(const wchar_t* pwchar);
static std::string make_filename(std::string input);
}; };
#endif // STRING_UTILS_H #endif // STRING_UTILS_H