mirror of
https://codeberg.org/spire/webrcon.git
synced 2026-06-03 17:24:07 +02:00
initial plugin
This commit is contained in:
commit
4e4fce92e5
2 changed files with 120 additions and 0 deletions
BIN
plugin/webrcon.smx
Normal file
BIN
plugin/webrcon.smx
Normal file
Binary file not shown.
120
plugin/webrcon.sp
Normal file
120
plugin/webrcon.sp
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
#pragma semicolon 1
|
||||
#include <sourcemod>
|
||||
#include <websocket>
|
||||
|
||||
#define PLUGIN_VERSION "1.0"
|
||||
|
||||
// The handle to the master socket
|
||||
new WebsocketHandle:g_hListenSocket = INVALID_WEBSOCKET_HANDLE;
|
||||
|
||||
// An adt_array of all child socket handles
|
||||
new Handle:g_hChilds;
|
||||
new Handle:g_hChildsAuth;
|
||||
|
||||
new Handle:g_hCvarRconPassword = INVALID_HANDLE;
|
||||
new Handle:g_hCvarSharedKey = INVALID_HANDLE;
|
||||
|
||||
public Plugin:myinfo =
|
||||
{
|
||||
name = "Websocket rcon server",
|
||||
author = "icewind",
|
||||
description = "Create rcon connections using websockets",
|
||||
version = PLUGIN_VERSION,
|
||||
url = "http://spire.tf/"
|
||||
}
|
||||
|
||||
public OnPluginStart()
|
||||
{
|
||||
// Create the array
|
||||
g_hChilds = CreateArray();
|
||||
g_hChildsAuth = CreateArray();
|
||||
g_hCvarSharedKey = CreateConVar("sm_webrcon_key", "", "Key for webrcon connections", FCVAR_PROTECTED);
|
||||
g_hCvarRconPassword = FindConVar("rcon_password");
|
||||
}
|
||||
|
||||
public OnAllPluginsLoaded()
|
||||
{
|
||||
decl String:sServerIP[40];
|
||||
new longip = GetConVarInt(FindConVar("hostip"));
|
||||
FormatEx(sServerIP, sizeof(sServerIP), "%d.%d.%d.%d", (longip >> 24) & 0x000000FF, (longip >> 16) & 0x000000FF, (longip >> 8) & 0x000000FF, longip & 0x000000FF);
|
||||
|
||||
// Open a new child socket
|
||||
if(g_hListenSocket == INVALID_WEBSOCKET_HANDLE)
|
||||
g_hListenSocket = Websocket_Open(sServerIP, 27021, OnWebsocketIncoming, OnWebsocketMasterError, OnWebsocketMasterClose);
|
||||
}
|
||||
|
||||
public OnPluginEnd()
|
||||
{
|
||||
if(g_hListenSocket != INVALID_WEBSOCKET_HANDLE)
|
||||
Websocket_Close(g_hListenSocket);
|
||||
}
|
||||
|
||||
public Action:OnWebsocketIncoming(WebsocketHandle:websocket, WebsocketHandle:newWebsocket, const String:remoteIP[], remotePort, String:protocols[256])
|
||||
{
|
||||
Format(protocols, sizeof(protocols), "");
|
||||
Websocket_HookChild(newWebsocket, OnWebsocketReceive, OnWebsocketDisconnect, OnChildWebsocketError);
|
||||
PushArrayCell(g_hChilds, newWebsocket);
|
||||
PushArrayCell(g_hChildsAuth, false);
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
public OnWebsocketMasterError(WebsocketHandle:websocket, const errorType, const errorNum)
|
||||
{
|
||||
LogError("MASTER SOCKET ERROR: handle: %d type: %d, errno: %d", _:websocket, errorType, errorNum);
|
||||
g_hListenSocket = INVALID_WEBSOCKET_HANDLE;
|
||||
}
|
||||
|
||||
public OnWebsocketMasterClose(WebsocketHandle:websocket)
|
||||
{
|
||||
g_hListenSocket = INVALID_WEBSOCKET_HANDLE;
|
||||
}
|
||||
|
||||
public OnChildWebsocketError(WebsocketHandle:websocket, const errorType, const errorNum)
|
||||
{
|
||||
LogError("CHILD SOCKET ERROR: handle: %d, type: %d, errno: %d", _:websocket, errorType, errorNum);
|
||||
new i = FindValueInArray(g_hChilds, websocket);
|
||||
RemoveFromArray(g_hChilds, i);
|
||||
RemoveFromArray(g_hChildsAuth, i);
|
||||
}
|
||||
|
||||
public OnWebsocketReceive(WebsocketHandle:websocket, WebsocketSendType:iType, const String:receiveData[], const dataSize)
|
||||
{
|
||||
if(iType == SendType_Text)
|
||||
{
|
||||
new i = FindValueInArray(g_hChilds, websocket);
|
||||
|
||||
if(GetArrayCell(g_hChildsAuth, i) != false) {
|
||||
decl String:output[8192];
|
||||
ServerCommandEx(output, sizeof(output), receiveData);
|
||||
|
||||
if (strncmp(receiveData, "quit", 4) == 0) {
|
||||
CloseHandle(websocket);
|
||||
}
|
||||
|
||||
Websocket_Send(websocket, SendType_Text, output);
|
||||
} else {
|
||||
decl String:password[128];
|
||||
GetConVarString(g_hCvarRconPassword, password, sizeof(password));
|
||||
if (strncmp(receiveData, password, strlen(password)) == 0) {
|
||||
SetArrayCell(g_hChildsAuth, i, true);
|
||||
Websocket_Send(websocket, SendType_Text, "authenticated");
|
||||
} else {
|
||||
// try the webrcon key
|
||||
GetConVarString(g_hCvarSharedKey, password, sizeof(password));
|
||||
if (strncmp(receiveData, password, strlen(password)) == 0 && strlen(password) > 0) {
|
||||
SetArrayCell(g_hChildsAuth, i, true);
|
||||
Websocket_Send(websocket, SendType_Text, "authenticated");
|
||||
} else {
|
||||
Websocket_Send(websocket, SendType_Text, "error: not authenticated");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public OnWebsocketDisconnect(WebsocketHandle:websocket)
|
||||
{
|
||||
new i = FindValueInArray(g_hChilds, websocket);
|
||||
RemoveFromArray(g_hChilds, i);
|
||||
RemoveFromArray(g_hChildsAuth, i);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue