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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user