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