huge commit
This commit is contained in:
129
2026/cscg/misc/CS_Sript_Time/cs-script-time/Program.cs
Executable file
129
2026/cscg/misc/CS_Sript_Time/cs-script-time/Program.cs
Executable file
@@ -0,0 +1,129 @@
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using CSScriptLib;
|
||||
|
||||
namespace Challenge
|
||||
{
|
||||
internal class Program
|
||||
{
|
||||
private const String HEADER = @"
|
||||
public object Do()
|
||||
{
|
||||
var result = new System.Collections.ArrayList();";
|
||||
|
||||
private const String FOOTER = @"
|
||||
if (result.Count == 0) return null;
|
||||
return result;
|
||||
}
|
||||
";
|
||||
private const string NAMESPACES = "using System.Collections;\n" +
|
||||
"using System.Collections.Generic;\n" +
|
||||
"using Math = System.Math;\n" +
|
||||
"using ArrayList = System.Collections.ArrayList;\n" +
|
||||
"using TimeSpan = System.TimeSpan;\n" +
|
||||
"using DateTime = System.DateTime;\n" +
|
||||
"using Random = System.Random;\n" +
|
||||
"using DayOfWeek = System.DayOfWeek;\n";
|
||||
|
||||
private const string SCRIPTBASE = "public class Script\n{\n";
|
||||
private const string SCRIPTBASE_END = " }";
|
||||
|
||||
static async Task Main(string[] args)
|
||||
{
|
||||
await StartTcpListenerAsync();
|
||||
}
|
||||
|
||||
private static async Task StartTcpListenerAsync()
|
||||
{
|
||||
TcpListener listener = new TcpListener(IPAddress.Any, 1337);
|
||||
listener.Start();
|
||||
Console.WriteLine("TCP Listener started on port 1337.");
|
||||
|
||||
while (true)
|
||||
{
|
||||
TcpClient client = await listener.AcceptTcpClientAsync();
|
||||
Console.WriteLine("Client connected.");
|
||||
_ = HandleClientAsync(client);
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task HandleClientAsync(TcpClient client)
|
||||
{
|
||||
using (NetworkStream stream = client.GetStream())
|
||||
{
|
||||
var welcomeMessage = $"Welcome to the script evaluator. Write your script and finish it with $EOF\n";
|
||||
|
||||
byte[] welcomeMessageBytes = Encoding.UTF8.GetBytes(welcomeMessage);
|
||||
await stream.WriteAsync(welcomeMessageBytes, 0, welcomeMessageBytes.Length);
|
||||
|
||||
byte[] buffer = new byte[1024*128];
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
do {
|
||||
int offset = 0;
|
||||
int bytesRead = await stream.ReadAsync(buffer, offset, buffer.Length - offset);
|
||||
|
||||
sb.Append(Encoding.UTF8.GetString(buffer, offset, bytesRead));
|
||||
offset += bytesRead;
|
||||
}
|
||||
while (!sb.ToString().Contains("$EOF"));
|
||||
var request = sb.ToString();
|
||||
request = request.Replace("$EOF", "");
|
||||
|
||||
Console.WriteLine($"Received: {request}");
|
||||
|
||||
// Check for restricted keywords using regex
|
||||
string pattern = @"\b(new|using|System|Microsoft|invoke)\b";
|
||||
if (Regex.IsMatch(request, pattern, RegexOptions.IgnoreCase))
|
||||
{
|
||||
string errorResponse = "Script execution denied due to restricted keywords.\n";
|
||||
byte[] errorResponseBytes = Encoding.UTF8.GetBytes(errorResponse);
|
||||
await stream.WriteAsync(errorResponseBytes, 0, errorResponseBytes.Length);
|
||||
Console.WriteLine("Error response sent due to restricted keywords.");
|
||||
client.Close();
|
||||
return;
|
||||
}
|
||||
|
||||
string script = $"{NAMESPACES}\n{SCRIPTBASE}\n{HEADER}\n{request}\n{FOOTER}\n{SCRIPTBASE_END}\n\n";
|
||||
|
||||
var fullScriptResponse = $"\n========== \nFull Script: \n{script}";
|
||||
byte[] fullScriptResponseBytes = Encoding.UTF8.GetBytes(fullScriptResponse);
|
||||
await stream.WriteAsync(fullScriptResponseBytes, 0, fullScriptResponseBytes.Length);
|
||||
try
|
||||
{
|
||||
dynamic scriptObj = CSScript.Evaluator
|
||||
.LoadCode(script);
|
||||
|
||||
dynamic scriptResult = scriptObj.Do();
|
||||
|
||||
string response;
|
||||
if (scriptResult != null)
|
||||
{
|
||||
response = $"Script executed successfully. Result: {scriptResult}";
|
||||
}
|
||||
else
|
||||
{
|
||||
response = "Script executed successfully but returned null.";
|
||||
}
|
||||
|
||||
byte[] responseBytes = Encoding.UTF8.GetBytes(response);
|
||||
await stream.WriteAsync(responseBytes, 0, responseBytes.Length);
|
||||
Console.WriteLine("Response sent.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
string errorResponse = $"Error executing script: {ex.Message}";
|
||||
byte[] errorResponseBytes = Encoding.UTF8.GetBytes(errorResponse);
|
||||
await stream.WriteAsync(errorResponseBytes, 0, errorResponseBytes.Length);
|
||||
Console.WriteLine("Error response sent.");
|
||||
}
|
||||
}
|
||||
|
||||
client.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user