//============================================================================== // WebAdmin handler for modifying default game settings // // Written by Michael Comeau // Revised by Ron Prestenback // © 2003,2004 Epic Games, Inc. All Rights Reserved //============================================================================== class xWebQueryDefaults extends xWebQueryHandler config; var config string DefaultsIndexPage; // Defaults Menu Page var config string DefaultsMapsPage; var config string DefaultsRulesPage; var config string DefaultsIPPolicyPage; // Special Case of Multi-part list page var config string DefaultsRestartPage; var config string DefaultsVotingGameConfigPage; // Custom Skin Support var config string DefaultsRowPage; var localized string DefaultsMapsLink; var localized string DefaultsIPPolicyLink; var localized string DefaultsRestartLink; var localized string IDBan; var localized string DefaultsVotingGameConfigLink; // Error messages var localized string ActiveMapNotFound; var localized string InactiveMapNotFound; var localized string CannotModify; var localized string NoteMapsPage; var localized string NoteRulesPage; var localized string NotePolicyPage; var localized string NoteVotingGameConfigPage; // ifdef _KF_ var localized string NoteSandboxPage; var localized string NoteGamePage; // endif _KF_ function bool Init() { local int i; if (GamePI == None) SetGamePI(""); for (i = 0; i < GamePI.Settings.Length; i++) if (GamePI.Settings[i].ExtraPriv != "" && InStr(NeededPrivs, GamePI.Settings[i].ExtraPriv) == -1) NeededPrivs = NeededPrivs $ "|" $ GamePI.Settings[i].ExtraPriv; return true; } function bool Query(WebRequest Request, WebResponse Response) { if (!CanPerform(NeededPrivs)) return false; MapTitle(Response); switch (Mid(Request.URI, 1)) { case DefaultPage: QueryDefaults(Request, Response); return true; // Done : General case DefaultsIndexPage: QueryDefaultsMenu(Request, Response); return true;// Done : General case DefaultsMapsPage: if (!MapIsChanging()) QueryDefaultsMaps(Request, Response); return true; case DefaultsRulesPage: if (!MapIsChanging()) QueryDefaultsRules(Request, Response); return true; case DefaultsIPPolicyPage: if (!MapIsChanging()) QueryDefaultsIPPolicy(Request, Response); return true; case DefaultsRestartPage: if (!MapIsChanging()) QueryRestartPage(Request, Response); return true; case DefaultsVotingGameConfigPage: if (!MapIsChanging()) QueryVotingGameConfig(Request, Response); return true; } return false; } //***************************************************************************** function QueryDefaults(WebRequest Request, WebResponse Response) { local String GameType, PageStr, Filter; // if no gametype specified use the first one in the list GameType = Request.GetVariable("GameType", String(Level.Game.Class)); // if no page specified, use the first one PageStr = Request.GetVariable("Page", DefaultsMapsPage); Filter = Eval(Request.GetVariable("Filter") != "", "&Filter="$ Request.GetVariable("Filter"), ""); Response.Subst("IndexURI", DefaultsIndexPage $ "?GameType=" $ GameType $ "&Page=" $ PageStr $ Filter); Response.Subst("MainURI", PageStr $ "?GameType=" $GameType $ Filter); ShowFrame(Response, DefaultPage); } function QueryDefaultsMenu(WebRequest Request, WebResponse Response) { local string GameType, Page, TempStr, Content; local int i; GameType = SetGamePI(Request.GetVariable("GameType", string(Level.Game.Class))); Page = Request.GetVariable("Page"); // set currently active page if (CanPerform("Mt")) { if (Request.GetVariable("GameTypeSet", "") != "") { TempStr = Request.GetVariable("GameTypeSelect", GameType); if (!(TempStr ~= GameType)) GameType = TempStr; } Response.Subst("GameTypeButton", SubmitButton("GameTypeSet", Update)); Response.Subst("GameTypeSelect", Select("GameType", GenerateGameTypeOptions(GameType))); } else Response.Subst("GameTypeSelect", Level.Game.Default.GameName); // set background colors Response.Subst("DefaultBG", DefaultBG); // for unused tabs // Set URIs Content = MakeMenuRow(Response, GameType $ "&Page=" $ DefaultsMapsPage, DefaultsMapsLink); for (i = 0; i" $ MakeMenuRow(Response, GameType $ "&Page=" $ DefaultsRestartPage, DefaultsRestartLink); Response.Subst("Content", Content); Response.Subst("Filter", Request.GetVariable("Filter", "")); Response.Subst("Page", Page); Response.Subst("PostAction", DefaultPage); ShowPage(Response, DefaultsIndexPage); } // TODO: add highlight code function string MakeMenuRow(WebResponse Response, string URI, string Title) { Response.Subst("URI", DefaultPage $ "?GameType=" $ URI); Response.Subst("URIText", Title); return WebInclude("defaults_menu_row"); } function QueryDefaultsMaps(WebRequest Request, WebResponse Response) { local String GameType, ListName, Tmp, MapName, MapURL; // Strings containing generated html (possibly move to .inc?) local string CustomMapSelect; local StringArray ExcludeMaps, IncludeMaps, MovedMaps; local int i, Count, MoveCount, id, CurrentList, Index; local array Arr; local bool bForceSave; //Don't always force the Map List to Save bForceSave = false; if (CanPerform("Ml")) { Request.Dump(); GameType = Request.GetVariable("GameType"); // provided by index page Index = Level.Game.MaplistHandler.GetGameIndex(GameType); // Get index of maplist from select Tmp = Request.GetVariable("MapListNum"); // Maybe viewing a non-active list if (Tmp != "") CurrentList = int(Tmp); else CurrentList = Level.Game.MaplistHandler.GetActiveList(Index); ListName = Level.Game.MaplistHandler.GetMapListTitle(Index, CurrentList); // Available maplists ExcludeMaps = ReloadExcludeMaps(GameType); IncludeMaps = ReloadIncludeMaps(ExcludeMaps, Index, CurrentList); MovedMaps = New(None) class'SortedStringArray'; Tmp = Request.GetVariable("MoveMap",""); // If name in textbox isn't the same as the name of the active list, // and we're moving maps, should track of name until we either save or cancel if (Tmp != "") { ListName = Request.GetVariable("ListName", ListName); switch (Tmp) { case " > ": case ">": Count = Request.GetVariableCount("ExcludeMapsSelect"); for (i = Count - 1; i >= 0; i--) { if (ExcludeMaps.Count() > 0) { MapURL = Request.GetVariableNumber("ExcludeMapsSelect", i); MapName = class'MaplistRecord'.static.GetBaseMapName(MapURL); id = IncludeMaps.MoveFrom(ExcludeMaps, MapName); if (id >= 0) { MovedMaps.CopyFromId(IncludeMaps, id); Level.Game.MaplistHandler.AddMap(Index, CurrentList, MapName $ MapURL); } else Log(InactiveMapNotFound$Request.GetVariableNumber("ExcludeMapsSelect", i),'WebAdmin'); } } break; case " < ": case "<": if (Request.GetVariableCount("IncludeMapsSelect") > 0) { Count = Request.GetVariableCount("IncludeMapsSelect"); for (i = Count-1; i >= 0; i--) { MapURL = Request.GetVariableNumber("IncludeMapsSelect", i); MapName = class'MaplistRecord'.static.GetBaseMapName(MapURL); if (IncludeMaps.Count() > 0) { id = ExcludeMaps.MoveFrom(IncludeMaps, MapName); if (id >= 0) { MovedMaps.CopyFromId(ExcludeMaps, id); Level.Game.MaplistHandler.RemoveMap(Index, CurrentList, MapName $ MapURL); } else Log(ActiveMapNotFound $ Request.GetVariableNumber("IncludeMapsSelect", i),'WebAdmin'); } } } break; case ">>": while (ExcludeMaps.Count() > 0) { id = IncludeMaps.MoveFromId(ExcludeMaps, ExcludeMaps.Count()-1); if (id >= 0) { MovedMaps.CopyFromId(IncludeMaps, id); Level.Game.MaplistHandler.AddMap(Index, CurrentList, IncludeMaps.GetItem(id)); } } break; case "<<": while (IncludeMaps.Count() > 0) { id = ExcludeMaps.MoveFromId(IncludeMaps, IncludeMaps.Count()-1); if (id >= 0) { MovedMaps.CopyFromId(ExcludeMaps, id); Level.Game.MaplistHandler.ClearList(Index, CurrentList); } } break; case "Up": MoveCount = int(Abs(float(Request.GetVariable("MoveMapCount")))); Count = Request.GetVariableCount("IncludeMapsSelect"); for (i = 0; i= 0) { Level.Game.MaplistHandler.ShiftMap(Index, CurrentList, IncludeMaps.GetItem(i), MoveCount); IncludeMaps.ShiftStrict(i, MoveCount); } } break; case "Down": MoveCount = int(Abs(float(Request.GetVariable("MoveMapCount")))); Count = Request.GetVariableCount("IncludeMapsSelect"); for (i = 0; i= 0; i--) { if (MovedMaps.FindTagId(IncludeMaps.GetTag(i)) >= 0) { Level.Game.MaplistHandler.ShiftMap(Index, CurrentList, IncludeMaps.GetItem(i), MoveCount); IncludeMaps.ShiftStrict(i, MoveCount); } } break; } } if (Request.GetVariable("Save") != "" || bForceSave) { ListName = Request.GetVariable("ListName", ListName); UpdateCustomMapList(Index, CurrentList, ListName); } else if (Request.GetVariable("New") != "") { Arr.Length = 0; for (i = 0; i < IncludeMaps.Count(); i++) Arr[Arr.Length] = IncludeMaps.GetTag(i); Level.Game.MaplistHandler.ResetList(Index, CurrentList); CurrentList = Level.Game.MaplistHandler.AddList(GameType, Request.GetVariable("ListName", ListName), Arr); ExcludeMaps = ReloadExcludeMaps(GameType); IncludeMaps = ReloadIncludeMaps(ExcludeMaps, Index, CurrentList); } else if (Request.GetVariable("Use") != "") { ListName = Request.GetVariable("ListName", ListName); UpdateCustomMaplist(Index, CurrentList, ListName); Level.Game.MaplistHandler.ApplyMapList(Index, CurrentList); } else if (Request.GetVariable("Delete") != "") { CurrentList = Level.Game.MaplistHandler.RemoveList(Index, CurrentList); ListName = Level.Game.MaplistHandler.GetMapListTitle(Index, CurrentList); ExcludeMaps = ReloadExcludeMaps(GameType); IncludeMaps = ReloadIncludeMaps(ExcludeMaps, Index, CurrentList); } CustomMapSelect = GenerateMapListOptions(GameType, CurrentList); // Fill response values Response.Subst("GameType", GameType); Response.Subst("Session", "Session"); Response.Subst("MapListName", ListName); Response.Subst("MapListOptions", CustomMapSelect); Response.Subst("ExcludeMapsOptions", GenerateMapListSelect(ExcludeMaps, MovedMaps)); Response.Subst("IncludeMapsOptions", GenerateMapListSelect(IncludeMaps, MovedMaps)); Response.Subst("Section", DefaultsMapsLink); Response.Subst("PostAction", DefaultsMapsPage); Response.Subst("PageHelp", NoteMapsPage); Response.Dump(); ShowPage(Response, DefaultsMapsPage); } else AccessDenied(Response); } function QueryDefaultsRules(WebRequest Request, WebResponse Response) { local int i, j; local bool bMarked, bSave; local String GameType, Content, Data, Op, Mark, Filter, SecLevel, TempStr; local array Options; if (!CanPerform("Ms")) { AccessDenied(Response); return; } GameType = SetGamePI(Request.GetVariable("GameType")); Filter = Request.GetVariable("Filter"); bSave = Request.GetVariable("Save", "") != ""; Content = ""; Mark = WebInclude("defaults_mark"); Response.Subst("Section", Filter); Response.Subst("Filter", Filter); for (i = 0; i 1) Op = " ("$Options[0]$" - "$Options[1]$")"; Response.Subst("Content", Textbox(GamePI.Settings[i].SettingName, j, int(Data), HtmlEncode(GamePI.Settings[i].Value)) $ Op); Response.Subst("FormObject", WebInclude(NowrapLeft)); break; case PIT_Check: if (bSave && GamePI.Settings[i].Value == "") GamePI.StoreSetting(i, false); Response.Subst("Content", Checkbox(GamePI.Settings[i].SettingName, GamePI.Settings[i].Value ~= string(true), GamePI.Settings[i].Data != "")); Response.Subst("FormObject", WebInclude(NowrapLeft)); break; case PIT_Select: Data = ""; // Build a set of options from PID.Data GamePI.SplitStringToArray(Options, GamePI.Settings[i].Data, ";"); for (j = 0; (j+1)"$HtmlEncode(Options[j+1])$""); } Response.Subst("Content", Select(GamePI.Settings[i].SettingName, Data)); Response.Subst("FormObject", WebInclude(NowrapLeft)); break; } Content $= WebInclude(DefaultsRowPage); } } GamePI.SaveSettings(); if (Content == "") Content = CannotModify; Response.Subst("TableContent", Content); Response.Subst("PostAction", DefaultsRulesPage); Response.Subst("GameType", GameType); Response.Subst("SubmitValue", Accept); // ifdef _KF_ if ( Filter == "Sandbox" ) { Response.Subst("PageHelp", NoteSandboxPage); } else if ( Filter == "Game" ) { Response.Subst("PageHelp", NoteGamePage); } else { // endif _KF_ Response.Subst("PageHelp", NoteRulesPage); } ShowPage(Response, DefaultsRulesPage); } function QueryDefaultsIPPolicy(WebRequest Request, WebResponse Response) { local int i, j; local bool bIpBan; local string policies, tmpN, tmpV; local string PolicyType; if (CanPerform("Xi")) { Response.Subst("Section", DefaultsIPPolicyLink); if (Request.GetVariable("Update") != "") { i = int(Request.GetVariable("IpNo", "-1")); //if _RO_ tmpN = Request.GetVariable("IPMask"); if (ValidMask(tmpN)) { if(i > -1) { //else //if(i > -1 && ValidMask(Request.GetVariable("IPMask"))) //{ //end _RO_ if (i >= Level.Game.AccessControl.IPPolicies.Length) { i = Level.Game.AccessControl.IPPolicies.Length; Level.Game.AccessControl.IPPolicies.Length = i+1; } Level.Game.AccessControl.IPPolicies[i] = Request.GetVariable("AcceptDeny")$";"$Request.GetVariable("IPMask"); Level.Game.AccessControl.SaveConfig(); } } //if _RO_ else if (Level.Game.AccessControl.CheckID(tmpN) == 0) { i = Level.Game.AccessControl.BannedIDs.Length; Level.Game.AccessControl.BannedIDs.Length = i+1; Level.Game.AccessControl.BannedIDs[i] = tmpN @ "WebAdminBan"; Level.Game.AccessControl.SaveConfig(); } //end _RO_ } if(Request.GetVariable("Delete") != "") { i = int(Request.GetVariable("IdNo", "-1")); if (i == -1) { bIpBan = True; i = int(Request.GetVariable("IpNo", "-1")); } if (i > -1) { if ( bIpBan && i < Level.Game.AccessControl.IPPolicies.Length ) { Level.Game.AccessControl.IPPolicies.Remove(i,1); Level.Game.AccessControl.SaveConfig(); } if ( !bIpBan && i < Level.Game.AccessControl.BannedIDs.Length ) { Level.Game.AccessControl.BannedIDs.Remove(i,1); Level.Game.AccessControl.SaveConfig(); } } } Policies = ""; if (Level.Game.AccessControl.bBanById) { for (i = 0; i < Level.Game.AccessControl.BannedIds.Length; i++) { j = InStr(Level.Game.AccessControl.BannedIDs[i], " "); tmpN = Mid(Level.Game.AccessControl.BannedIDs[i], j + 1); tmpV = Left(Level.Game.AccessControl.BannedIDs[i], j); Response.Subst("PolicyType", IDBan); Response.Subst("PolicyCell", tmpN $ ":" @ tmpV $ "  "); Response.Subst("PostAction", DefaultsIPPolicyPage $ "?IDNo="$string(i)); Response.Subst("UpdateButton", ""); Policies = Policies $ WebInclude(DefaultsIPPolicyPage $ "_row"); } } for(i=0; i"; PolicyType = PolicyType $ RadioButton("AcceptDeny", "DENY", tmpN ~= "DENY") @ Deny; Response.Subst("PolicyType", PolicyType); Response.Subst("PolicyCell", Textbox("IPMask", 15, 25, tmpV) $ "  "); Response.Subst("PostAction", DefaultsIPPolicyPage $ "?IpNo="$string(i)); Response.Subst("UpdateButton", SubmitButton("Update", Update)); Policies = Policies $ WebInclude(DefaultsIPPolicyPage $ "_row"); } Response.Subst("Policies", policies); Response.Subst("PostAction", DefaultsIPPolicyPage$"?IpNo="$string(i)); Response.Subst("PageHelp", NotePolicyPage); ShowPage(Response, DefaultsIPPolicyPage); } else AccessDenied(Response); } function QueryVotingGameConfig(WebRequest Request, WebResponse Response) { local int i, j, k, x, columns, count, GameConfigIndex; local string PageText, GameConfigData, ColumnTitle, Value; local array Parts; local array MutatorList; if (CanPerform("Ms")) { Response.Subst("Section", DefaultsVotingGameConfigLink); PageText = ""; // make headers i=0; while( Level.Game.VotingHandler.GetConfigArrayColumnTitle("GameConfig",i) != "" ) { PageText = PageText $ "" $ Level.Game.VotingHandler.GetConfigArrayColumnTitle("GameConfig",i) $ ""; i++; } columns = i; Response.Subst("ColumnTitles", PageText); GameConfigIndex = int(Request.GetVariable("GameConfigIndex", "-1")); if (Request.GetVariable("Update") != "") { if( GameConfigIndex > -1 ) { for( j=0; j < columns; j++ ) { ColumnTitle = Level.Game.VotingHandler.GetConfigArrayColumnTitle("GameConfig",j); Value = ""; if ( j == 4 ) // Mutators - retrieve all selected mutators { count = Request.GetVariableCount(ColumnTitle); for ( k = 0; k < count; k++ ) { if( Request.GetVariableNumber(ColumnTitle, k) ~= "NONE" ) { Value = "NONE"; // dont allow any other mutators if none break; } if ( Value != "" ) Value $= ","; Value $= Request.GetVariableNumber(ColumnTitle, k); } } else Value = Request.GetVariable(ColumnTitle); Level.Game.VotingHandler.UpdateConfigArrayItem("GameConfig", GameConfigIndex, j, Value); } Level.Game.VotingHandler.SaveConfig(); GameConfigIndex = -1; } } if(Request.GetVariable("Delete") != "") { if (GameConfigIndex > -1) { Level.Game.VotingHandler.DeleteConfigArrayItem("GameConfig", GameConfigIndex); Level.Game.VotingHandler.SaveConfig(); GameConfigIndex = -1; } } if(Request.GetVariable("New") != "") { Level.Game.VotingHandler.AddConfigArrayItem("GameConfig"); Level.Game.VotingHandler.SaveConfig(); } PageText = ""; for( i=0; i"; for( j=0; j < columns; j++) { PageText $= ""; GameConfigData = Level.Game.VotingHandler.GetConfigArrayData("GameConfig", i, j); Split(GameConfigData, ";", Parts); // split "type;maxlength;value" // 0 1 2 if( i == GameConfigIndex ) { switch( Caps(Parts[0]) ) // type { case "TEXT": //TextBox(string TextName, coerce string Size, coerce string MaxLength, optional string DefaultValue) PageText $= Textbox(Level.Game.VotingHandler.GetConfigArrayColumnTitle("GameConfig",j), 15, int(Parts[1]), Parts[2]); break; case "GAMETYPE": PageText $= Select(Level.Game.VotingHandler.GetConfigArrayColumnTitle("GameConfig",j), GenerateGameTypeOptions(Parts[2])); break; case "MUTATORS": PageText $= ""; break; } } else { switch( Caps(Parts[0]) ) // type { case "TEXT": PageText $= Parts[2]; break; case "GAMETYPE": // translate game class name to friendly name for(k=0; k < AllGames.Length; k++) { if( Parts[2] ~= AllGames[k].ClassName ) { PageText $= AllGames[k].GameName; break; } } break; case "MUTATORS": // translate mutator class names to friendly names for display Split( Parts[2], ",", MutatorList); for(x=0; x < MutatorList.Length; x++) { for(k=0; k < AllMutators.Length; k++) { if( MutatorList[x] ~= AllMutators[k].ClassName ) { PageText $= AllMutators[k].FriendlyName; if( x < MutatorList.Length - 1 ) PageText $= ","; break; } } } break; } } PageText $= ""; } PageText $= ""; if( i == GameConfigIndex ) { PageText $= SubmitButton("Update", Update); PageText $= SubmitButton("Delete", DeleteText); } else PageText $= SubmitButton("Edit",Edit); PageText $= ""; } PageText $= "
"; PageText $= SubmitButton("New", NewText); PageText $= "
"; Response.Subst("GameConfigs", PageText); Response.Subst("PageHelp", NoteVotingGameConfigPage); ShowPage(Response, DefaultsVotingGameConfigPage); } else AccessDenied(Response); } // evo --- function bool ValidMask(string mask) { local int i; local string Octets[4]; local string tmp; // First check each octet to make sure it's a byte while (mask != "") { if (Left(mask,1) == ".") { if (!ValidOctet(tmp)) return false; Octets[i++] = tmp; Mask = Mid(Mask,1); tmp = ""; } EatStr(tmp, Mask, 1); } if (!ValidOctet(tmp)) return false; Octets[i++] = tmp; // Check to make sure we only have 4 valid bytes if (i > 4) return false; return true; } function bool ValidOctet(string tmp) { local int i; if (tmp == "") return false; if (ValidMaskOctet(tmp)) return true; i = int(tmp); if (i == 0 && tmp != "0") return false; if (i < 0 || i > 255) return false; return true; } function bool ValidMaskOctet(string tmp) { local string s; if (tmp == "" || len(tmp) > 3 || right(tmp,1) != "*") return false; while (tmp != "") { s = left(tmp,1); if (s == "*") break; if (s < "0" || s > "9") return false; tmp = mid(tmp,1); } return true; } // --- evo defaultproperties { NeededPrivs="G|M|X|Gt|Ml|Ms|Xi|Xb" DefaultsIndexPage="defaults_menu" DefaultsMapsPage="defaults_maps" DefaultsRulesPage="defaults_rules" DefaultsIPPolicyPage="defaults_ippolicy" DefaultsRestartPage="defaults_restart" DefaultsRowPage="defaults_row" DefaultsVotingGameConfigPage="defaults_votinggameconfig" ActiveMapNotFound="Active map not found: " InactiveMapNotFound="Inactive map not found: " CannotModify="** You cannot modify any settings in this section **" IDBan="(Global Ban)" DefaultsMapsLink="Maps" DefaultsRestartLink="Restart Level" DefaultsIPPolicyLink="Access Policies" DefaultsVotingGameConfigLink="Voting GameConfig" NoteMapsPage="To save any changes to a custom maplist, click the Save button. To apply the selected maplist to the server's map rotation, click the 'Use' button." NoteRulesPage="Configurable game parameters can be changed from this page. Some parameters may affect more than one gametype." NotePolicyPage="Any banned players will automatically be added to this listing. You will only be able to add manual bans for IP addresses." NoteVotingGameConfigPage="The game configurations for map voting can be modified from this page." DefaultPage="defaultsframe" Title="Defaults" // ifdef _KF_ NoteSandboxPage="Settings on this page are only applied when GameLength is set to Custom. Setting GameLength to Custom, however, will turn off Perk progression." NoteGamePage="WARNING: Setting GameLength to Custom will turn off Perk progression. In order to use Sandbox settings, however, GameLength must be Custom." // endif _KF_ }