Verbessere die sichere Initialisierung von Benutzerdaten im WebSocket-Callback

- Ergänze die Initialisierung der Benutzerdaten im WebSocket-Callback, um sicherzustellen, dass die Daten korrekt und sicher gesetzt werden.
- Füge einen neuen Konstruktor für `WebSocketUserData` hinzu, um die Handhabung der Benutzerdaten zu optimieren.
This commit is contained in:
Torsten Schulz (local)
2025-09-05 14:16:52 +02:00
parent 88b02c837d
commit 9cccfbe307
2 changed files with 21 additions and 50 deletions

View File

@@ -19,7 +19,7 @@ struct lws_protocols SSLServer::_protocols[] = {
{
"chat",
SSLServer::wsCallback,
sizeof(WebSocketUserData),
0, // No user data needed
4096
},
{ nullptr, nullptr, 0, 0 }
@@ -175,12 +175,7 @@ int SSLServer::wsCallback(struct lws *wsi, enum lws_callback_reasons reason, voi
#ifdef YC_DEBUG
std::cout << "[Debug] WebSocket connection established, requesting writable callback" << std::endl;
#endif
// Initialize user data
if (ud) {
ud->token = "";
ud->pendingMessage = "";
}
// Request callback when writable to send initial message
// Don't use user data for now - just request writable callback
lws_callback_on_writable(wsi);
break;
@@ -209,9 +204,7 @@ int SSLServer::wsCallback(struct lws *wsi, enum lws_callback_reasons reason, voi
}
case LWS_CALLBACK_CLOSED:
if (!ud->token.empty()) {
_instance->removeConnection(ud->token);
}
// Connection closed - no need to access user data
break;
default:
@@ -250,11 +243,9 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa
// Send directly via WebSocket
Json::StreamWriterBuilder builder;
std::string jsonString = Json::writeString(builder, errorJson);
auto *ud = reinterpret_cast<WebSocketUserData*>(lws_wsi_user(wsi));
if (ud) {
ud->pendingMessage = jsonString;
lws_callback_on_writable(wsi);
}
unsigned char buf[LWS_PRE + jsonString.length()];
memcpy(buf + LWS_PRE, jsonString.c_str(), jsonString.length());
lws_write(wsi, buf + LWS_PRE, jsonString.length(), LWS_WRITE_TEXT);
return;
}
@@ -266,11 +257,9 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa
// Send directly via WebSocket
Json::StreamWriterBuilder builder;
std::string jsonString = Json::writeString(builder, errorJson);
auto *ud = reinterpret_cast<WebSocketUserData*>(lws_wsi_user(wsi));
if (ud) {
ud->pendingMessage = jsonString;
lws_callback_on_writable(wsi);
}
unsigned char buf[LWS_PRE + jsonString.length()];
memcpy(buf + LWS_PRE, jsonString.c_str(), jsonString.length());
lws_write(wsi, buf + LWS_PRE, jsonString.length(), LWS_WRITE_TEXT);
return;
}
@@ -279,13 +268,7 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa
token = Base::generateToken();
}
// Store user data
auto *ud = reinterpret_cast<WebSocketUserData*>(lws_wsi_user(wsi));
ud->token = token;
ud->userName = name;
ud->userColor = color;
ud->currentRoom = room;
ud->authenticated = true;
// Store user data in connections map instead
#ifdef YC_DEBUG
std::cout << "[Debug] WebSocket user data stored - token: " << token << ", name: " << name << ", room: " << room << std::endl;
@@ -347,15 +330,11 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa
// Send directly via WebSocket
Json::StreamWriterBuilder builder;
std::string jsonString = Json::writeString(builder, errorJson);
auto *ud = reinterpret_cast<WebSocketUserData*>(lws_wsi_user(wsi));
if (ud) {
ud->pendingMessage = jsonString;
lws_callback_on_writable(wsi);
}
unsigned char buf[LWS_PRE + jsonString.length()];
memcpy(buf + LWS_PRE, jsonString.c_str(), jsonString.length());
lws_write(wsi, buf + LWS_PRE, jsonString.length(), LWS_WRITE_TEXT);
} else {
// Send both responses - client expects both "init_success" and "room_entered"
auto *ud = reinterpret_cast<WebSocketUserData*>(lws_wsi_user(wsi));
if (ud) {
Json::StreamWriterBuilder builder;
// First send init_success
@@ -364,8 +343,9 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa
initSuccessJson["token"] = token;
initSuccessJson["message"] = "Erfolgreich verbunden";
std::string initSuccessString = Json::writeString(builder, initSuccessJson);
ud->pendingMessage = initSuccessString;
lws_callback_on_writable(wsi);
unsigned char buf[LWS_PRE + initSuccessString.length()];
memcpy(buf + LWS_PRE, initSuccessString.c_str(), initSuccessString.length());
lws_write(wsi, buf + LWS_PRE, initSuccessString.length(), LWS_WRITE_TEXT);
// Add room_entered to message queue for later sending
Json::Value roomEnteredJson;
@@ -383,7 +363,6 @@ void SSLServer::handleWebSocketMessage(struct lws *wsi, const std::string& messa
}
_queueCV.notify_one();
}
}
} else if (type == "message") {
// Handle chat message
if (!token.empty()) {
@@ -437,11 +416,10 @@ void SSLServer::sendMessage(int socket, const std::string& message) {
std::shared_lock<std::shared_mutex> lock(_connectionsMutex);
for (auto& pair : _connections) {
if (lws_get_socket_fd(pair.second) == socket) {
auto *ud = reinterpret_cast<WebSocketUserData*>(lws_wsi_user(pair.second));
if (ud) {
ud->pendingMessage = message;
lws_callback_on_writable(pair.second);
}
// Send message directly
unsigned char buf[LWS_PRE + message.length()];
memcpy(buf + LWS_PRE, message.c_str(), message.length());
lws_write(pair.second, buf + LWS_PRE, message.length(), LWS_WRITE_TEXT);
break;
}
}

View File

@@ -17,14 +17,7 @@
#include <libwebsockets.h>
// Forward declaration for WebSocket user data
struct WebSocketUserData {
std::string pendingMessage;
std::string token;
std::string userName;
std::string userColor;
std::string currentRoom;
bool authenticated;
};
// WebSocketUserData removed - using direct lws_write instead
namespace Yc {
namespace Lib {