Skip to content

Commit 5196fb0

Browse files
authored
Merge pull request #5 from VerityIncorporated/main
Replaced GetClients with safer GetClientIdByIndex
2 parents d02b86e + 5f4846b commit 5196fb0

5 files changed

Lines changed: 62 additions & 41 deletions

File tree

scripting/include/websocket/ws.inc

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -310,13 +310,14 @@ methodmap WebSocketServer < Handle
310310
public native bool DisconnectClient(const char[] clientId);
311311

312312
/**
313-
* Get handles for all connected clients
313+
* Gets a client ID by index
314314
*
315-
* @param buffer Array to store client handles
316-
* @param maxSize Maximum size of the array
317-
* @return Number of handles stored
315+
* @param index Index of the client ID to retrieve
316+
* @param buffer String buffer to store the ID
317+
* @param maxlength Maximum length of the buffer
318+
* @return true on success, false if index is invalid
318319
*/
319-
public native int GetClients(WebSocket[] buffer, int maxSize);
320+
public native bool GetClientIdByIndex(int index, char[] buffer, int maxlength);
320321

321322
/**
322323
* Start the WebSocket server
@@ -340,6 +341,13 @@ methodmap WebSocketServer < Handle
340341
*/
341342
public native void IsDeflateEnabled();
342343

344+
/**
345+
* Maximum length of client IDs (including null terminator)
346+
*/
347+
property int MaxClientIdLength {
348+
public native get();
349+
}
350+
343351
/**
344352
* Retrieves connected clients
345353
*/

src/smsdk_config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#define SMEXT_CONF_NAME "SourceMod WebSocket Extension"
55
#define SMEXT_CONF_DESCRIPTION "Provide JSON and WebSocket Native"
6-
#define SMEXT_CONF_VERSION "1.0.4"
6+
#define SMEXT_CONF_VERSION "1.0.5"
77
#define SMEXT_CONF_AUTHOR "ProjectSky"
88
#define SMEXT_CONF_URL "https://github.com/ProjectSky/sm-ext-websocket"
99
#define SMEXT_CONF_LOGTAG "websocket"

src/ws_natives_server.cpp

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -263,46 +263,45 @@ static cell_t ws_IsDeflateEnabled(IPluginContext *pContext, const cell_t *params
263263
return pWebsocketServer->m_webSocketServer.isPerMessageDeflateEnabled();
264264
}
265265

266-
static cell_t ws_GetClients(IPluginContext *pContext, const cell_t *params)
266+
static cell_t ws_GetClientIdByIndex(IPluginContext *pContext, const cell_t *params)
267267
{
268-
WebSocketServer *pWebsocketServer = GetWsServerPointer(pContext, params[1]);
269-
270-
if (!pWebsocketServer)
271-
{
272-
return 0;
273-
}
268+
WebSocketServer *pWebsocketServer = GetWsServerPointer(pContext, params[1]);
269+
if (!pWebsocketServer)
270+
{
271+
return 0;
272+
}
274273

275-
cell_t *outputArray;
276-
pContext->LocalToPhysAddr(params[2], &outputArray);
277-
cell_t maxSize = params[3];
274+
cell_t index = params[2];
275+
const auto& ids = pWebsocketServer->getClientIds();
278276

279-
auto clients = pWebsocketServer->m_webSocketServer.getClients();
280-
size_t count = 0;
277+
if (index < 0 || static_cast<size_t>(index) >= ids.size())
278+
{
279+
return 0;
280+
}
281281

282-
HandleSecurity sec(nullptr, myself->GetIdentity());
282+
pContext->StringToLocal(params[3], params[4], ids[index].c_str());
283283

284-
for (const auto &client : clients)
285-
{
286-
if (count >= maxSize)
287-
break;
288-
289-
WebSocketClient *pClient = new WebSocketClient(client.first.get());
290-
HandleError err;
291-
Handle_t handle = handlesys->CreateHandleEx(g_htWsClient, pClient, &sec, nullptr, &err);
292-
293-
if (handle != BAD_HANDLE)
294-
{
295-
pClient->m_websocket_handle = handle;
296-
pClient->m_keepConnecting = true;
297-
outputArray[count++] = handle;
298-
}
299-
else
300-
{
301-
delete pClient;
302-
}
303-
}
284+
return 1;
285+
}
304286

305-
return count;
287+
static cell_t ws_GetMaxClientIdLength(IPluginContext *pContext, const cell_t *params)
288+
{
289+
WebSocketServer *pWebsocketServer = GetWsServerPointer(pContext, params[1]);
290+
if (!pWebsocketServer)
291+
{
292+
return 0;
293+
}
294+
295+
const auto& ids = pWebsocketServer->getClientIds();
296+
size_t maxLen = 0;
297+
298+
for (const auto& id : ids)
299+
{
300+
if (id.length() > maxLen)
301+
maxLen = id.length();
302+
}
303+
304+
return static_cast<cell_t>(maxLen + 1);
306305
}
307306

308307
const sp_nativeinfo_t ws_natives_server[] =
@@ -320,7 +319,8 @@ const sp_nativeinfo_t ws_natives_server[] =
320319
{"WebSocketServer.ClientsCount.get", ws_GetClientsCount},
321320
{"WebSocketServer.EnablePong.get", ws_SetOrGetPongEnable},
322321
{"WebSocketServer.EnablePong.set", ws_SetOrGetPongEnable},
323-
{"WebSocketServer.GetClients", ws_GetClients},
322+
{"WebSocketServer.GetClientIdByIndex", ws_GetClientIdByIndex},
323+
{"WebSocketServer.MaxClientIdLength.get", ws_GetMaxClientIdLength},
324324
{"WebSocketServer.DisableDeflate", ws_DisableDeflate},
325325
{"WebSocketServer.IsDeflateEnabled", ws_IsDeflateEnabled},
326326
{nullptr, nullptr}

src/ws_server.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,16 @@ bool WebSocketServer::disconnectClient(const std::string& clientId) {
159159
}
160160
}
161161
return false;
162+
}
163+
164+
std::vector<std::string> WebSocketServer::getClientIds() {
165+
std::vector<std::string> clientIds;
166+
167+
auto clients = m_webSocketServer.getClients();
168+
169+
for (const auto& client : clients) {
170+
clientIds.push_back(client.second);
171+
}
172+
173+
return clientIds;
162174
}

src/ws_server.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class WebSocketServer
1515
void broadcastMessage(const std::string& message);
1616
bool sendToClient(const std::string& clientId, const std::string& message);
1717
bool disconnectClient(const std::string& clientId);
18+
std::vector<std::string> getClientIds();
1819

1920
ix::WebSocketServer m_webSocketServer;
2021
Handle_t m_webSocketServer_handle = BAD_HANDLE;

0 commit comments

Comments
 (0)