1
0
KF2-Dev-Scripts/WebAdmin/Classes/BanImporter.uc
2020-12-13 18:01:13 +03:00

182 lines
4.1 KiB
Ucode

/**
* This class will do the actual importing of bans from an URL (json data)
*
* Copyright 2014 Tripwire Interactive LLC
*
* @author Michiel 'elmuerte' Hendriks
*/
class BanImporter extends Object;
enum ImportStatus
{
IS_DOWNLOADING,
IS_PARSING,
IS_DONE,
IS_ERROR
};
var ImportStatus status;
var string importFromUrl;
var string errorMessage;
var localized string msgIOError, msgInvalidResponse, msgInvalidJson, msgJsonNoBans,
msgStatusDownloading, msgStatusParsing, msgStatusDone, msgStatusError, msgBadUrl;
var JsonObject jsonBans;
function bool isFinished()
{
return status == IS_DONE || status == IS_ERROR;
}
function string getStatusStr()
{
switch (status)
{
case IS_DOWNLOADING:
return msgStatusDownloading;
case IS_PARSING:
return msgStatusParsing;
case IS_DONE:
return msgStatusDone;
case IS_ERROR:
return msgStatusError;
}
}
function importFrom(string url)
{
local bool result;
jsonBans = none;
errorMessage = "";
status = IS_DOWNLOADING;
importFromUrl = url;
if (url == "")
{
status = IS_ERROR;
errorMessage = msgBadUrl;
return;
}
`log("Importing bans from: "$url,,'WebAdmin');
result = class'HttpFactory'.static.CreateRequest()
.SetURL(importFromUrl)
.SetVerb("GET")
.SetProcessRequestCompleteDelegate(downloadFinished)
.SetHeader("X-WebAdmin", "KF2 WebAdmin; BanImporter")
// This header prevents caching in the client which could prevent a download.
.SetHeader("If-Modified-Since", "Thu, 1 Jan 1970 00:00:00 GMT")
.ProcessRequest();
if (!result)
{
`log("Failed to initiate HTTP request.",,'WebAdmin');
status = IS_ERROR;
errorMessage = msgIOError;
}
}
function downloadFinished(HttpRequestInterface request, HttpResponseInterface response, bool bDidSucceed)
{
`log("Webserver responded with code: "$response.GetResponseCode(),, 'WebAdmin');
if (!bDidSucceed)
{
`log("Ban import failed. IO Error?",,'WebAdmin');
status = IS_ERROR;
errorMessage = msgIOError;
return;
}
if (response.GetResponseCode() == 200)
{
if (parseBans(response.GetContentAsString()))
{
status = IS_DONE;
return;
}
status = IS_ERROR;
errorMessage = Repl(errorMessage, "%content-type%", response.GetContentType());
errorMessage = Repl(errorMessage, "%content-length%", response.GetContentLength());
return;
}
status = IS_ERROR;
errorMessage = msgInvalidResponse;
errorMessage = Repl(errorMessage, "%content-type%", response.GetContentType());
errorMessage = Repl(errorMessage, "%content-length%", response.GetContentLength());
errorMessage = Repl(errorMessage, "%response-code%", response.GetResponseCode());
return;
}
function bool parseBans(string data)
{
local JsonObject json;
json = class'JsonObject'.static.DecodeJson(data);
if (json == none)
{
errorMessage = msgInvalidJson;
return false;
}
jsonBans = json.GetObject("bans");
if (jsonBans == none)
{
errorMessage = msgJsonNoBans;
return false;
}
foreach jsonBans.ObjectArray(json)
{
if (json.HasKey("uniqueNetId") || json.HasKey("steamId64") )
{
return true;
}
}
errorMessage = msgJsonNoBans;
return false;
}
function int applyBansTo(AccessControl accessControl, OnlineSubsystem steamWorks)
{
local JsonObject json;
local string tmp;
local UniqueNetId netid;
local int cnt, idx;
foreach jsonBans.ObjectArray(json)
{
tmp = json.GetStringValue("uniqueNetId");
tmp -= " ";
if (tmp != "") {
class'OnlineSubsystem'.static.StringToUniqueNetId(tmp, netid);
}
else if (steamWorks != none) {
tmp = json.GetStringValue("steamId64");
tmp -= " ";
steamWorks.Int64ToUniqueNetId(tmp, netid);
}
if (class'WebAdminUtils'.static.UniqueNetIdToString(netid) == "")
{
// invalid id
continue;
}
for (idx = 0; idx < accessControl.BannedIDs.length; ++idx)
{
if (accessControl.BannedIDs[idx] == netid)
{
break;
}
}
if (idx == accessControl.BannedIDs.length)
{
// does not exist yet
accessControl.BannedIDs.addItem(netid);
++cnt;
}
}
return cnt;
}