[Tweak] Panda web server POST upgrade (#628)
* [Feat] Panda web server POST upgrade * Move token in comms
This commit is contained in:
@@ -125,7 +125,7 @@ public sealed class BanCommand : LocalizedCommands
|
||||
Rid = EntitySystem.Get<GameTicker>().RoundId,
|
||||
BanId = banId
|
||||
};
|
||||
_pandaWeb.SendBotMessage(utkaBanned);
|
||||
_pandaWeb.SendBotPostMessage(utkaBanned);
|
||||
_entMan.EventBus.RaiseEvent(EventSource.Local, utkaBanned);
|
||||
//WD end
|
||||
}
|
||||
|
||||
@@ -529,7 +529,7 @@ public sealed class BanManager : IBanManager, IPostInjectInit
|
||||
BanId = banId
|
||||
};
|
||||
|
||||
_pandaWeb.SendBotMessage(utkaBanned);
|
||||
_pandaWeb.SendBotPostMessage(utkaBanned);
|
||||
_entMan.EventBus.RaiseEvent(EventSource.Local, utkaBanned);
|
||||
}
|
||||
|
||||
|
||||
@@ -658,7 +658,7 @@ namespace Content.Server.Administration.Systems
|
||||
Entity = entity
|
||||
};
|
||||
|
||||
_pandaWeb.SendBotMessage(utkaAhelpEvent);
|
||||
_pandaWeb.SendBotPostMessage(utkaAhelpEvent);
|
||||
}
|
||||
//WD-EDIT
|
||||
}
|
||||
|
||||
@@ -331,14 +331,14 @@ namespace Content.Server.Chat.Managers
|
||||
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"OOC from {player:Player}: {message}");
|
||||
|
||||
//WD-EDIT
|
||||
var toUtkaMessage = new UtkaChatEventMessage()
|
||||
var toUtkaMessage = new UtkaChatMessageEvent()
|
||||
{
|
||||
Command = "ooc",
|
||||
Ckey = player.Name,
|
||||
Message = message,
|
||||
};
|
||||
|
||||
_pandaWeb.SendBotMessage(toUtkaMessage);
|
||||
_pandaWeb.SendBotPostMessage(toUtkaMessage);
|
||||
//WD-EDIT
|
||||
}
|
||||
|
||||
@@ -374,14 +374,14 @@ namespace Content.Server.Chat.Managers
|
||||
_adminLogger.Add(LogType.Chat, $"Admin chat from {player:Player}: {message}");
|
||||
|
||||
//WD-EDIT
|
||||
var asayEventMessage = new UtkaChatEventMessage()
|
||||
var asayEventMessage = new UtkaChatMessageEvent()
|
||||
{
|
||||
Command = "asay",
|
||||
Ckey = player.Name,
|
||||
Message = message
|
||||
};
|
||||
|
||||
_pandaWeb.SendBotMessage(asayEventMessage);
|
||||
_pandaWeb.SendBotPostMessage(asayEventMessage);
|
||||
//WD-EDIT
|
||||
}
|
||||
|
||||
|
||||
@@ -648,7 +648,7 @@ public sealed partial class ChatSystem : SharedChatSystem
|
||||
CharacterName = MetaData(source).EntityName
|
||||
};
|
||||
|
||||
_pandaWeb.SendBotMessage(utkaEmoteEvent);
|
||||
_pandaWeb.SendBotPostMessage(utkaEmoteEvent);
|
||||
|
||||
//WD-EDIT
|
||||
}
|
||||
|
||||
@@ -567,7 +567,7 @@ namespace Content.Server.GameTicking
|
||||
Message = status
|
||||
};
|
||||
|
||||
_pandaWeb.SendBotMessage(utkaRoundStatusEvent);
|
||||
_pandaWeb.SendBotPostMessage(utkaRoundStatusEvent);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -307,7 +307,7 @@ namespace Content.Server.RoundEnd
|
||||
Message = status
|
||||
};
|
||||
|
||||
_pandaWeb.SendBotMessage(utkaRoundStatusEvent);
|
||||
_pandaWeb.SendBotPostMessage(utkaRoundStatusEvent);
|
||||
}
|
||||
//WD-EDIT
|
||||
|
||||
|
||||
@@ -584,6 +584,6 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem
|
||||
Message = status
|
||||
};
|
||||
|
||||
_pandaWeb.SendBotMessage(utkaRoundStatusEvent);
|
||||
_pandaWeb.SendBotPostMessage(utkaRoundStatusEvent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ public sealed class PandaBanCommand : IPandaCommand
|
||||
BanId = banId
|
||||
};
|
||||
|
||||
_pandaWeb.SendBotMessage(utkaBanned);
|
||||
_pandaWeb.SendBotPostMessage(utkaBanned);
|
||||
_entMan.EventBus.RaiseEvent(EventSource.Local, utkaBanned);
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ public interface IPandaStatusHandlerContext
|
||||
Stream RequestBody { get; }
|
||||
Uri Url { get; }
|
||||
bool IsGetLike { get; }
|
||||
bool IsPostLike { get; }
|
||||
IReadOnlyDictionary<string, StringValues> RequestHeaders { get; }
|
||||
|
||||
IDictionary<string, string> ResponseHeaders { get; }
|
||||
|
||||
@@ -8,7 +8,13 @@ public class PandaBaseMessage
|
||||
public virtual string? Command { get; set; }
|
||||
}
|
||||
|
||||
public class UtkaOOCRequest : PandaBaseMessage
|
||||
public class PandaBaseRequestEventMessage : PandaBaseMessage
|
||||
{
|
||||
[JsonPropertyName("token")]
|
||||
public string? Token { get; set; }
|
||||
}
|
||||
|
||||
public class UtkaOOCRequest : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "ooc";
|
||||
@@ -20,7 +26,7 @@ public class UtkaOOCRequest : PandaBaseMessage
|
||||
public string? Message { get; set; }
|
||||
}
|
||||
|
||||
public class UtkaAsayRequest : PandaBaseMessage
|
||||
public class UtkaAsayRequest : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "asay";
|
||||
@@ -32,7 +38,7 @@ public class UtkaAsayRequest : PandaBaseMessage
|
||||
public string? Message { get; set; }
|
||||
}
|
||||
|
||||
public class UtkaPmRequest : PandaBaseMessage
|
||||
public class UtkaPmRequest : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "discordpm";
|
||||
@@ -56,7 +62,7 @@ public class UtkaPmResponse : PandaBaseMessage
|
||||
public bool? Message { get; set; }
|
||||
}
|
||||
|
||||
public class UtkaWhoRequest : PandaBaseMessage
|
||||
public class UtkaWhoRequest : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "who";
|
||||
@@ -71,7 +77,7 @@ public class UtkaWhoResponse : PandaBaseMessage
|
||||
public List<string>? Players { get; set; }
|
||||
}
|
||||
|
||||
public class UtkaAdminWhoRequest : PandaBaseMessage
|
||||
public class UtkaAdminWhoRequest : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "adminwho";
|
||||
@@ -86,7 +92,7 @@ public class UtkaAdminWhoResponse : PandaBaseMessage
|
||||
public List<string>? Admins { get; set; }
|
||||
}
|
||||
|
||||
public class UtkaStatusRequest : PandaBaseMessage
|
||||
public class UtkaStatusRequest : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "status";
|
||||
@@ -116,7 +122,7 @@ public class UtkaStatusResponse : PandaBaseMessage
|
||||
public string? StationCode { get; set; }
|
||||
}
|
||||
|
||||
public sealed class UtkaBanRequest : PandaBaseMessage
|
||||
public sealed class UtkaBanRequest : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "ban";
|
||||
@@ -146,7 +152,7 @@ public sealed class UtkaBanResponse : PandaBaseMessage
|
||||
public bool? Banned { get; set; }
|
||||
}
|
||||
|
||||
public sealed class UtkaJobBanRequest : PandaBaseMessage
|
||||
public sealed class UtkaJobBanRequest : PandaBaseRequestEventMessage
|
||||
{
|
||||
public override string? Command => "jobban";
|
||||
|
||||
@@ -178,7 +184,7 @@ public sealed class UtkaJobBanResponse : PandaBaseMessage
|
||||
public bool? Banned { get; set; }
|
||||
}
|
||||
|
||||
public sealed class UtkaRestartRoundRequest : PandaBaseMessage
|
||||
public sealed class UtkaRestartRoundRequest : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "restartround";
|
||||
@@ -193,7 +199,7 @@ public sealed class UtkaRestartRoundResponse : PandaBaseMessage
|
||||
public bool? Restarted { get; set; }
|
||||
}
|
||||
|
||||
public sealed class UtkaUnbanRequest : PandaBaseMessage
|
||||
public sealed class UtkaUnbanRequest : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "unban";
|
||||
@@ -214,7 +220,7 @@ public sealed class UtkaUnbanResponse : PandaBaseMessage
|
||||
public bool? Unbanned { get; set; }
|
||||
}
|
||||
|
||||
public sealed class UtkaUnJobBanRequest : PandaBaseMessage
|
||||
public sealed class UtkaUnJobBanRequest : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "unjobban";
|
||||
@@ -235,7 +241,7 @@ public sealed class UtkaUnJobBanResponse : PandaBaseMessage
|
||||
public bool? Unbanned { get; set; }
|
||||
}
|
||||
|
||||
public sealed class UtkaBannedEvent : PandaBaseMessage
|
||||
public sealed class UtkaBannedEvent : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "banned";
|
||||
@@ -265,7 +271,7 @@ public sealed class UtkaBannedEvent : PandaBaseMessage
|
||||
public int? BanId { get; set; }
|
||||
}
|
||||
|
||||
public sealed class UtkaChatEventMessage : PandaBaseMessage
|
||||
public sealed class UtkaChatMessageEvent : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("ckey")]
|
||||
public string? Ckey { get; set; }
|
||||
@@ -274,7 +280,7 @@ public sealed class UtkaChatEventMessage : PandaBaseMessage
|
||||
public string? Message { get; set; }
|
||||
}
|
||||
|
||||
public sealed class UtkaRoundStatusEvent : PandaBaseMessage
|
||||
public sealed class UtkaRoundStatusEvent : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "roundstatus";
|
||||
@@ -283,7 +289,7 @@ public sealed class UtkaRoundStatusEvent : PandaBaseMessage
|
||||
public string? Message { get; set; }
|
||||
}
|
||||
|
||||
public sealed class UtkaChatMeEvent : PandaBaseMessage
|
||||
public sealed class UtkaChatMeEvent : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "me";
|
||||
@@ -298,7 +304,7 @@ public sealed class UtkaChatMeEvent : PandaBaseMessage
|
||||
public string? CharacterName { get; set; }
|
||||
}
|
||||
|
||||
public sealed class UtkaAhelpPmEvent : PandaBaseMessage
|
||||
public sealed class UtkaAhelpPmEvent : PandaBaseRequestEventMessage
|
||||
{
|
||||
[JsonPropertyName("command")]
|
||||
public override string? Command => "pm";
|
||||
|
||||
@@ -44,12 +44,12 @@ public sealed partial class PandaStatusHost
|
||||
|
||||
private async Task<bool> HandleRequest(IPandaStatusHandlerContext context)
|
||||
{
|
||||
if (!context.IsGetLike || context.Url!.AbsolutePath != "/request")
|
||||
if (!context.IsPostLike || context.Url!.AbsolutePath != "/request")
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ValidateMessage(context.Url.Query, out var message) || message == null)
|
||||
if (!ValidatePostMessage(context.RequestBody, out var message) || message == null)
|
||||
return false;
|
||||
|
||||
ExecuteCommand(context, message);
|
||||
|
||||
@@ -162,9 +162,51 @@ public sealed partial class PandaStatusHost : IDisposable
|
||||
return false;
|
||||
|
||||
var collection = HttpUtility.ParseQueryString(message);
|
||||
#pragma warning disable CS8714
|
||||
var json = JsonSerializer.Serialize(collection.AllKeys.ToDictionary(y => y!, y => collection[y]));
|
||||
#pragma warning restore CS8714
|
||||
var jsonDocument = JsonDocument.Parse(json);
|
||||
var root = jsonDocument.RootElement;
|
||||
|
||||
if (!root.TryGetProperty("token", out var token))
|
||||
return false;
|
||||
|
||||
if (token.GetString() != _token)
|
||||
return false;
|
||||
|
||||
if (!root.TryGetProperty("command", out var commandNameElement))
|
||||
return false;
|
||||
|
||||
var commandName = commandNameElement.GetString();
|
||||
if (commandName == null)
|
||||
return false;
|
||||
|
||||
var pandaCommand = Commands.Values.FirstOrDefault(x => x.Name == commandName);
|
||||
if (pandaCommand == null)
|
||||
return false;
|
||||
|
||||
var messageType = pandaCommand.RequestMessageType;
|
||||
|
||||
try
|
||||
{
|
||||
baseMessage = JsonConvert.DeserializeObject(json, messageType) as PandaBaseMessage;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool ValidatePostMessage(Stream message, out PandaBaseMessage? baseMessage)
|
||||
{
|
||||
baseMessage = null;
|
||||
|
||||
var reader = new StreamReader(message, Encoding.UTF8);
|
||||
|
||||
var task = Task.Run(async () => await reader.ReadToEndAsync());
|
||||
_taskManager.BlockWaitOnTask(task);
|
||||
var json = task.GetAwaiter().GetResult();
|
||||
|
||||
var jsonDocument = JsonDocument.Parse(json);
|
||||
var root = jsonDocument.RootElement;
|
||||
|
||||
@@ -219,6 +261,7 @@ public sealed partial class PandaStatusHost : IDisposable
|
||||
public Stream RequestBody => _context.Request.InputStream;
|
||||
public Uri Url => _context.Request.Url!;
|
||||
public bool IsGetLike => RequestMethod == HttpMethod.Head || RequestMethod == HttpMethod.Get;
|
||||
public bool IsPostLike => RequestMethod == HttpMethod.Post;
|
||||
public IReadOnlyDictionary<string, StringValues> RequestHeaders { get; }
|
||||
|
||||
public bool KeepAlive
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
using Content.Shared.White;
|
||||
using Newtonsoft.Json;
|
||||
@@ -28,7 +29,7 @@ public sealed class PandaWebManager
|
||||
_cfg.OnValueChanged(WhiteCVars.UtkaClientBind, uri => _utkaUri = uri, true);
|
||||
}
|
||||
|
||||
public async void SendBotMessage(PandaBaseMessage message)
|
||||
public async void SendBotGetMessage(PandaBaseMessage message)
|
||||
{
|
||||
if (_utkaUri is null || _token is null)
|
||||
return;
|
||||
@@ -50,4 +51,26 @@ public sealed class PandaWebManager
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public async void SendBotPostMessage(PandaBaseRequestEventMessage message)
|
||||
{
|
||||
if (_utkaUri is null || _token is null)
|
||||
return;
|
||||
|
||||
message.Token = _token;
|
||||
|
||||
var request = $"http://{_utkaUri}";
|
||||
var json = JsonSerializer.Serialize(message, message.GetType());
|
||||
|
||||
HttpContent content = new StringContent(json, Encoding.UTF8, "application/json");
|
||||
|
||||
try
|
||||
{
|
||||
await _httpClient.PostAsync(request, content);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user