From 62108ecd636219b0e203965d4430895b8892e43c Mon Sep 17 00:00:00 2001 From: Zack Date: Sat, 23 Aug 2014 16:08:18 -0400 Subject: [PATCH] Allow rest request handlers access to the request object itself, to allow the plugin more information on who is making the request. Refactored the args for Rest commands to just one delegate, that takes a RestRequestArgs which has verbs, params, request, and tokenData. --- TShockAPI/Rest/Rest.cs | 38 +++++-- TShockAPI/Rest/RestCommand.cs | 16 +-- TShockAPI/Rest/RestManager.cs | 202 +++++++++++++++++----------------- TShockAPI/Rest/SecureRest.cs | 24 ++-- 4 files changed, 147 insertions(+), 133 deletions(-) diff --git a/TShockAPI/Rest/Rest.cs b/TShockAPI/Rest/Rest.cs index 87357186..740f9bde 100644 --- a/TShockAPI/Rest/Rest.cs +++ b/TShockAPI/Rest/Rest.cs @@ -37,17 +37,31 @@ namespace Rests /// Parameters in the url /// {x} in urltemplate /// Response object or null to not handle request - public delegate object RestCommandD(RestVerbs verbs, IParameterCollection parameters); + public delegate object RestCommandD(RestRequestArgs args); - /// - /// Secure Rest command delegate including token data. - /// - /// Parameters in the url - /// {x} in urltemplate - /// The data of stored for the provided token. - /// Response object or null to not handle request - public delegate object SecureRestCommandD(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData); + public class RestRequestArgs + { + public RestVerbs Verbs { get; private set; } + public IParameterCollection Parameters { get; private set; } + public IRequest Request { get; private set; } + public SecureRest.TokenData TokenData { get; private set; } + public RestRequestArgs(RestVerbs verbs, IParameterCollection param, IRequest request) + { + Verbs = verbs; + Parameters = param; + Request = request; + TokenData = SecureRest.TokenData.None; + } + + public RestRequestArgs(RestVerbs verbs, IParameterCollection param, IRequest request, SecureRest.TokenData tokenData) + { + Verbs = verbs; + Parameters = param; + Request = request; + TokenData = tokenData; + } + } public class Rest : IDisposable { private readonly List commands = new List(); @@ -173,7 +187,7 @@ namespace Rests continue; } - var obj = ExecuteCommand(com, verbs, e.Request.Parameters); + var obj = ExecuteCommand(com, verbs, e.Request.Parameters, e.Request); if (obj != null) return obj; } @@ -193,9 +207,9 @@ namespace Rests }; } - protected virtual object ExecuteCommand(RestCommand cmd, RestVerbs verbs, IParameterCollection parms) + protected virtual object ExecuteCommand(RestCommand cmd, RestVerbs verbs, IParameterCollection parms, IRequest request) { - object result = cmd.Execute(verbs, parms); + object result = cmd.Execute(verbs, parms, request); if (cmd.DoLog && TShock.Config.LogRest) { Log.ConsoleInfo("Anonymous requested REST endpoint: " + BuildRequestUri(cmd, verbs, parms, false)); diff --git a/TShockAPI/Rest/RestCommand.cs b/TShockAPI/Rest/RestCommand.cs index 5fa4a429..d08616cb 100644 --- a/TShockAPI/Rest/RestCommand.cs +++ b/TShockAPI/Rest/RestCommand.cs @@ -65,9 +65,9 @@ namespace Rests get { return UriVerbs.Length > 0; } } - public virtual object Execute(RestVerbs verbs, IParameterCollection parameters) + public virtual object Execute(RestVerbs verbs, IParameterCollection parameters, IRequest request) { - return callback(verbs, parameters); + return callback(new RestRequestArgs(verbs, parameters, request)); } } @@ -76,31 +76,31 @@ namespace Rests public override bool RequiresToken { get { return true; } } public string[] Permissions { get; set; } - private SecureRestCommandD callback; + private RestCommandD callback; - public SecureRestCommand(string name, string uritemplate, SecureRestCommandD callback, params string[] permissions) + public SecureRestCommand(string name, string uritemplate, RestCommandD callback, params string[] permissions) : base(name, uritemplate, null) { this.callback = callback; Permissions = permissions; } - public SecureRestCommand(string uritemplate, SecureRestCommandD callback, params string[] permissions) + public SecureRestCommand(string uritemplate, RestCommandD callback, params string[] permissions) : this(string.Empty, uritemplate, callback, permissions) { } - public override object Execute(RestVerbs verbs, IParameterCollection parameters) + public override object Execute(RestVerbs verbs, IParameterCollection parameters, IRequest request) { return new RestObject("401") { Error = "Not authorized. The specified API endpoint requires a token." }; } - public object Execute(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + public object Execute(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData, IRequest request) { if (tokenData.Equals(SecureRest.TokenData.None)) return new RestObject("401") { Error = "Not authorized. The specified API endpoint requires a token." }; - return callback(verbs, parameters, tokenData); + return callback(new RestRequestArgs(verbs, parameters, request, tokenData)); } } } \ No newline at end of file diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index 2956d576..2bcdcbc5 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -49,10 +49,10 @@ namespace TShockAPI } else { - Rest.Register(new RestCommand("/v2/server/status", (a, b) => this.ServerStatusV2(a, b, SecureRest.TokenData.None))); - Rest.Register(new RestCommand("/status", (a, b) => this.ServerStatus(a, b, SecureRest.TokenData.None))); - Rest.Register(new RestCommand("/v3/server/motd", (a, b) => this.ServerMotd(a, b, SecureRest.TokenData.None))); - Rest.Register(new RestCommand("/v3/server/rules", (a, b) => this.ServerRules(a, b, SecureRest.TokenData.None))); + Rest.Register(new RestCommand("/v2/server/status", (a) => this.ServerStatusV2(new RestRequestArgs(a.Verbs, a.Parameters, a.Request, SecureRest.TokenData.None)))); + Rest.Register(new RestCommand("/status", (a) => this.ServerStatus(new RestRequestArgs(a.Verbs, a.Parameters, a.Request, SecureRest.TokenData.None)))); + Rest.Register(new RestCommand("/v3/server/motd", (a) => this.ServerMotd(new RestRequestArgs(a.Verbs, a.Parameters, a.Request, SecureRest.TokenData.None)))); + Rest.Register(new RestCommand("/v3/server/rules", (a) => this.ServerRules(new RestRequestArgs(a.Verbs, a.Parameters, a.Request, SecureRest.TokenData.None)))); } Rest.Register(new SecureRestCommand("/v2/server/broadcast", ServerBroadcast)); @@ -105,84 +105,84 @@ namespace TShockAPI #region RestServerMethods - private object ServerCommand(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object ServerCommand(RestRequestArgs args) { - if (string.IsNullOrWhiteSpace(parameters["cmd"])) + if (string.IsNullOrWhiteSpace(args.Parameters["cmd"])) return RestMissingParam("cmd"); Group restPlayerGroup; // TODO: Get rid of this when the old REST permission model is removed. if (TShock.Config.RestUseNewPermissionModel) - restPlayerGroup = TShock.Groups.GetGroupByName(tokenData.UserGroupName); + restPlayerGroup = TShock.Groups.GetGroupByName(args.TokenData.UserGroupName); else restPlayerGroup = new SuperAdminGroup(); - TSRestPlayer tr = new TSRestPlayer(tokenData.Username, restPlayerGroup); - Commands.HandleCommand(tr, parameters["cmd"]); + TSRestPlayer tr = new TSRestPlayer(args.TokenData.Username, restPlayerGroup); + Commands.HandleCommand(tr, args.Parameters["cmd"]); return RestResponse(string.Join("\n", tr.GetCommandOutput())); } - private object ServerCommandV3(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object ServerCommandV3(RestRequestArgs args) { - if (string.IsNullOrWhiteSpace(parameters["cmd"])) + if (string.IsNullOrWhiteSpace(args.Parameters["cmd"])) return RestMissingParam("cmd"); Group restPlayerGroup; // TODO: Get rid of this when the old REST permission model is removed. if (TShock.Config.RestUseNewPermissionModel) - restPlayerGroup = TShock.Groups.GetGroupByName(tokenData.UserGroupName); + restPlayerGroup = TShock.Groups.GetGroupByName(args.TokenData.UserGroupName); else restPlayerGroup = new SuperAdminGroup(); - TSRestPlayer tr = new TSRestPlayer(tokenData.Username, restPlayerGroup); - Commands.HandleCommand(tr, parameters["cmd"]); + TSRestPlayer tr = new TSRestPlayer(args.TokenData.Username, restPlayerGroup); + Commands.HandleCommand(tr, args.Parameters["cmd"]); return new RestObject() { {"response", tr.GetCommandOutput()} }; } - private object ServerOff(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object ServerOff(RestRequestArgs args) { - if (!GetBool(parameters["confirm"], false)) + if (!GetBool(args.Parameters["confirm"], false)) return RestInvalidParam("confirm"); // Inform players the server is shutting down - var reason = string.IsNullOrWhiteSpace(parameters["message"]) ? "Server is shutting down" : parameters["message"]; - TShock.Utils.StopServer(!GetBool(parameters["nosave"], false), reason); + var reason = string.IsNullOrWhiteSpace(args.Parameters["message"]) ? "Server is shutting down" : args.Parameters["message"]; + TShock.Utils.StopServer(!GetBool(args.Parameters["nosave"], false), reason); return RestResponse("The server is shutting down"); } - private object ServerRestart(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object ServerRestart(RestRequestArgs args) { - if (!GetBool(parameters["confirm"], false)) + if (!GetBool(args.Parameters["confirm"], false)) return RestInvalidParam("confirm"); // Inform players the server is shutting down - var reason = string.IsNullOrWhiteSpace(parameters["message"]) ? "Server is restarting" : parameters["message"]; - TShock.Utils.RestartServer(!GetBool(parameters["nosave"], false), reason); + var reason = string.IsNullOrWhiteSpace(args.Parameters["message"]) ? "Server is restarting" : args.Parameters["message"]; + TShock.Utils.RestartServer(!GetBool(args.Parameters["nosave"], false), reason); return RestResponse("The server is shutting down and will attempt to restart"); } - private object ServerReload(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object ServerReload(RestRequestArgs args) { - TShock.Utils.Reload(new TSRestPlayer(tokenData.Username, TShock.Groups.GetGroupByName(tokenData.UserGroupName))); + TShock.Utils.Reload(new TSRestPlayer(args.TokenData.Username, TShock.Groups.GetGroupByName(args.TokenData.UserGroupName))); return RestResponse("Configuration, permissions, and regions reload complete. Some changes may require a server restart."); } - private object ServerBroadcast(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object ServerBroadcast(RestRequestArgs args) { - var msg = parameters["msg"]; + var msg = args.Parameters["msg"]; if (string.IsNullOrWhiteSpace(msg)) return RestMissingParam("msg"); TShock.Utils.Broadcast(msg); return RestResponse("The message was broadcasted successfully"); } - private object ServerMotd(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object ServerMotd(RestRequestArgs args) { string motdFilePath = Path.Combine(TShock.SavePath, "motd.txt"); if (!File.Exists(motdFilePath)) @@ -194,7 +194,7 @@ namespace TShockAPI }; } - private object ServerRules(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object ServerRules(RestRequestArgs args) { string rulesFilePath = Path.Combine(TShock.SavePath, "rules.txt"); if (!File.Exists(rulesFilePath)) @@ -206,7 +206,7 @@ namespace TShockAPI }; } - private object ServerStatus(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object ServerStatus(RestRequestArgs args) { var activeplayers = Main.player.Where(p => null != p && p.active).ToList(); return new RestObject() @@ -218,7 +218,7 @@ namespace TShockAPI }; } - private object ServerStatusV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object ServerStatusV2(RestRequestArgs args) { var ret = new RestObject() { @@ -233,19 +233,19 @@ namespace TShockAPI {"serverpassword", !string.IsNullOrEmpty(TShock.Config.ServerPassword)} }; - if (GetBool(parameters["players"], false)) + if (GetBool(args.Parameters["players"], false)) { var players = new ArrayList(); foreach (TSPlayer tsPlayer in TShock.Players.Where(p => null != p)) { - var p = PlayerFilter(tsPlayer, parameters, ((tokenData.UserGroupName) != "" && TShock.Utils.GetGroup(tokenData.UserGroupName).HasPermission(RestPermissions.viewips))); + var p = PlayerFilter(tsPlayer, args.Parameters, ((args.TokenData.UserGroupName) != "" && TShock.Utils.GetGroup(args.TokenData.UserGroupName).HasPermission(RestPermissions.viewips))); if (null != p) players.Add(p); } ret.Add("players", players); } - if (GetBool(parameters["rules"], false)) + if (GetBool(args.Parameters["rules"], false)) { var rules = new Dictionary(); rules.Add("AutoSave", TShock.Config.AutoSave); @@ -267,12 +267,12 @@ namespace TShockAPI return ret; } - private object ServerTokenTest(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object ServerTokenTest(RestRequestArgs args) { return new RestObject() { {"response", "Token is valid and was passed through correctly."}, - {"associateduser", tokenData.Username} + {"associateduser", args.TokenData.Username} }; } @@ -280,12 +280,12 @@ namespace TShockAPI #region RestUserMethods - private object UserActiveListV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object UserActiveListV2(RestRequestArgs args) { return new RestObject() { { "activeusers", string.Join("\t", TShock.Players.Where(p => null != p && null != p.UserAccountName && p.Active).Select(p => p.UserAccountName)) } }; } - private object UserListV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object UserListV2(RestRequestArgs args) { return new RestObject() { { "users", TShock.Users.GetUsers().Select(p => new Dictionary(){ {"name", p.Name}, @@ -294,17 +294,17 @@ namespace TShockAPI }) } }; } - private object UserCreateV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object UserCreateV2(RestRequestArgs args) { - var username = parameters["user"]; + var username = args.Parameters["user"]; if (string.IsNullOrWhiteSpace(username)) return RestMissingParam("user"); - var group = parameters["group"]; + var group = args.Parameters["group"]; if (string.IsNullOrWhiteSpace(group)) group = TShock.Config.DefaultRegistrationGroupName; - var password = parameters["password"]; + var password = args.Parameters["password"]; if (string.IsNullOrWhiteSpace(password)) return RestMissingParam("password"); @@ -322,14 +322,14 @@ namespace TShockAPI return RestResponse("User was successfully created"); } - private object UserUpdateV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object UserUpdateV2(RestRequestArgs args) { - var ret = UserFind(parameters); + var ret = UserFind(args.Parameters); if (ret is RestObject) return ret; - var password = parameters["password"]; - var group = parameters["group"]; + var password = args.Parameters["password"]; + var group = args.Parameters["group"]; if (string.IsNullOrWhiteSpace(group) && string.IsNullOrWhiteSpace(password)) return RestMissingParam("group", "password"); @@ -364,9 +364,9 @@ namespace TShockAPI return response; } - private object UserDestroyV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object UserDestroyV2(RestRequestArgs args) { - var ret = UserFind(parameters); + var ret = UserFind(args.Parameters); if (ret is RestObject) return ret; @@ -382,9 +382,9 @@ namespace TShockAPI return RestResponse("User deleted successfully"); } - private object UserInfoV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object UserInfoV2(RestRequestArgs args) { - var ret = UserFind(parameters); + var ret = UserFind(args.Parameters); if (ret is RestObject) return ret; @@ -396,17 +396,17 @@ namespace TShockAPI #region RestBanMethods - private object BanCreate(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object BanCreate(RestRequestArgs args) { - var ip = parameters["ip"]; - var name = parameters["name"]; + var ip = args.Parameters["ip"]; + var name = args.Parameters["name"]; if (string.IsNullOrWhiteSpace(ip) && string.IsNullOrWhiteSpace(name)) return RestMissingParam("ip", "name"); try { - TShock.Bans.AddBan(ip, name, "", parameters["reason"], true, tokenData.Username); + TShock.Bans.AddBan(ip, name, "", args.Parameters["reason"], true, args.TokenData.Username); } catch (Exception e) { @@ -415,27 +415,27 @@ namespace TShockAPI return RestResponse("Ban created successfully"); } - private object BanDestroyV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object BanDestroyV2(RestRequestArgs args) { - var ret = BanFind(parameters); + var ret = BanFind(args.Parameters); if (ret is RestObject) return ret; try { Ban ban = (Ban)ret; - switch (parameters["type"]) + switch (args.Parameters["type"]) { case "ip": if (!TShock.Bans.RemoveBan(ban.IP, false, false, true)) return RestResponse("Failed to delete ban (already deleted?)"); break; case "name": - if (!TShock.Bans.RemoveBan(ban.Name, true, GetBool(parameters["caseinsensitive"], true))) + if (!TShock.Bans.RemoveBan(ban.Name, true, GetBool(args.Parameters["caseinsensitive"], true))) return RestResponse("Failed to delete ban (already deleted?)"); break; default: - return RestError("Invalid Type: '" + parameters["type"] + "'"); + return RestError("Invalid Type: '" + args.Parameters["type"] + "'"); } } @@ -447,9 +447,9 @@ namespace TShockAPI return RestResponse("Ban deleted successfully"); } - private object BanInfoV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object BanInfoV2(RestRequestArgs args) { - var ret = BanFind(parameters); + var ret = BanFind(args.Parameters); if (ret is RestObject) return ret; @@ -461,7 +461,7 @@ namespace TShockAPI }; } - private object BanListV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object BanListV2(RestRequestArgs args) { var banList = new ArrayList(); foreach (var ban in TShock.Bans.GetBans()) @@ -483,27 +483,27 @@ namespace TShockAPI #region RestWorldMethods - private object WorldChangeSaveSettings(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object WorldChangeSaveSettings(RestRequestArgs args) { bool autoSave; - if (!bool.TryParse(verbs["bool"], out autoSave)) + if (!bool.TryParse(args.Verbs["bool"], out autoSave)) return RestInvalidParam("state"); TShock.Config.AutoSave = autoSave; return RestResponse("AutoSave has been set to " + autoSave); } - private object WorldSave(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object WorldSave(RestRequestArgs args) { SaveManager.Instance.SaveWorld(); return RestResponse("World saved"); } - private object WorldButcher(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object WorldButcher(RestRequestArgs args) { bool killFriendly; - if (!bool.TryParse(parameters["killfriendly"], out killFriendly)) + if (!bool.TryParse(args.Parameters["killfriendly"], out killFriendly)) return RestInvalidParam("killfriendly"); int killcount = 0; @@ -519,7 +519,7 @@ namespace TShockAPI return RestResponse(killcount + " NPCs have been killed"); } - private object WorldRead(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object WorldRead(RestRequestArgs args) { return new RestObject() { @@ -532,7 +532,7 @@ namespace TShockAPI }; } - private object WorldMeteor(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object WorldMeteor(RestRequestArgs args) { if (null == WorldGen.genRand) WorldGen.genRand = new Random(); @@ -540,10 +540,10 @@ namespace TShockAPI return RestResponse("Meteor has been spawned"); } - private object WorldBloodmoon(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object WorldBloodmoon(RestRequestArgs args) { bool bloodmoon; - if (!bool.TryParse(verbs["bool"], out bloodmoon)) + if (!bool.TryParse(args.Verbs["bool"], out bloodmoon)) return RestInvalidParam("bloodmoon"); Main.bloodMoon = bloodmoon; @@ -554,37 +554,37 @@ namespace TShockAPI #region RestPlayerMethods - private object PlayerUnMute(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object PlayerUnMute(RestRequestArgs args) { - return PlayerSetMute(parameters, false); + return PlayerSetMute(args.Parameters, false); } - private object PlayerMute(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object PlayerMute(RestRequestArgs args) { - return PlayerSetMute(parameters, true); + return PlayerSetMute(args.Parameters, true); } - private object PlayerList(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object PlayerList(RestRequestArgs args) { var activeplayers = Main.player.Where(p => null != p && p.active).ToList(); return new RestObject() { { "players", string.Join(", ", activeplayers.Select(p => p.name)) } }; } - private object PlayerListV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object PlayerListV2(RestRequestArgs args) { var playerList = new ArrayList(); foreach (TSPlayer tsPlayer in TShock.Players.Where(p => null != p)) { - var p = PlayerFilter(tsPlayer, parameters); + var p = PlayerFilter(tsPlayer, args.Parameters); if (null != p) playerList.Add(p); } return new RestObject() { { "players", playerList } }; } - private object PlayerReadV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object PlayerReadV2(RestRequestArgs args) { - var ret = PlayerFind(parameters); + var ret = PlayerFind(args.Parameters); if (ret is RestObject) return ret; @@ -602,39 +602,39 @@ namespace TShockAPI }; } - private object PlayerKickV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object PlayerKickV2(RestRequestArgs args) { - var ret = PlayerFind(parameters); + var ret = PlayerFind(args.Parameters); if (ret is RestObject) return ret; TSPlayer player = (TSPlayer)ret; - TShock.Utils.ForceKick(player, null == parameters["reason"] ? "Kicked via web" : parameters["reason"], false, true); + TShock.Utils.ForceKick(player, null == args.Parameters["reason"] ? "Kicked via web" : args.Parameters["reason"], false, true); return RestResponse("Player " + player.Name + " was kicked"); } - private object PlayerBanV2(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object PlayerBanV2(RestRequestArgs args) { - var ret = PlayerFind(parameters); + var ret = PlayerFind(args.Parameters); if (ret is RestObject) return ret; TSPlayer player = (TSPlayer)ret; - var reason = null == parameters["reason"] ? "Banned via web" : parameters["reason"]; + var reason = null == args.Parameters["reason"] ? "Banned via web" : args.Parameters["reason"]; TShock.Bans.AddBan(player.IP, player.Name, "", reason); TShock.Utils.ForceKick(player, reason, false, true); return RestResponse("Player " + player.Name + " was banned"); } - private object PlayerKill(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object PlayerKill(RestRequestArgs args) { - var ret = PlayerFind(parameters); + var ret = PlayerFind(args.Parameters); if (ret is RestObject) return ret; TSPlayer player = (TSPlayer)ret; player.DamagePlayer(999999); - var from = string.IsNullOrWhiteSpace(parameters["from"]) ? "Server Admin" : parameters["from"]; + var from = string.IsNullOrWhiteSpace(args.Parameters["from"]) ? "Server Admin" : args.Parameters["from"]; player.SendMessage(string.Format("{0} just killed you!", from)); return RestResponse("Player " + player.Name + " was killed"); } @@ -643,7 +643,7 @@ namespace TShockAPI #region RestGroupMethods - private object GroupList(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object GroupList(RestRequestArgs args) { var groups = new ArrayList(); foreach (Group group in TShock.Groups) @@ -653,9 +653,9 @@ namespace TShockAPI return new RestObject() { { "groups", groups } }; } - private object GroupInfo(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object GroupInfo(RestRequestArgs args) { - var ret = GroupFind(parameters); + var ret = GroupFind(args.Parameters); if (ret is RestObject) return ret; @@ -670,9 +670,9 @@ namespace TShockAPI }; } - private object GroupDestroy(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object GroupDestroy(RestRequestArgs args) { - var ret = GroupFind(parameters); + var ret = GroupFind(args.Parameters); if (ret is RestObject) return ret; @@ -689,14 +689,14 @@ namespace TShockAPI return RestResponse("Group '" + group.Name + "' deleted successfully"); } - private object GroupCreate(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object GroupCreate(RestRequestArgs args) { - var name = parameters["group"]; + var name = args.Parameters["group"]; if (string.IsNullOrWhiteSpace(name)) return RestMissingParam("group"); try { - TShock.Groups.AddGroup(name, parameters["parent"], parameters["permissions"], parameters["chatcolor"], true); + TShock.Groups.AddGroup(name, args.Parameters["parent"], args.Parameters["permissions"], args.Parameters["chatcolor"], true); } catch (Exception e) { @@ -706,16 +706,16 @@ namespace TShockAPI return RestResponse("Group '" + name + "' created successfully"); } - private object GroupUpdate(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object GroupUpdate(RestRequestArgs args) { - var ret = GroupFind(parameters); + var ret = GroupFind(args.Parameters); if (ret is RestObject) return ret; Group group = (Group)ret; - var parent = (null == parameters["parent"]) ? group.ParentName : parameters["parent"]; - var chatcolor = (null == parameters["chatcolor"]) ? string.Format("{0}.{1}.{2}", group.R, group.G, group.B) : parameters["chatcolor"]; - var permissions = (null == parameters["permissions"]) ? group.Permissions : parameters["permissions"]; + var parent = (null == args.Parameters["parent"]) ? group.ParentName : args.Parameters["parent"]; + var chatcolor = (null == args.Parameters["chatcolor"]) ? string.Format("{0}.{1}.{2}", group.R, group.G, group.B) : args.Parameters["chatcolor"]; + var permissions = (null == args.Parameters["permissions"]) ? group.Permissions : args.Parameters["permissions"]; try { TShock.Groups.UpdateGroup(group.Name, parent, permissions, chatcolor, group.Suffix, group.Prefix); diff --git a/TShockAPI/Rest/SecureRest.cs b/TShockAPI/Rest/SecureRest.cs index 4771f28a..9845bc08 100644 --- a/TShockAPI/Rest/SecureRest.cs +++ b/TShockAPI/Rest/SecureRest.cs @@ -84,9 +84,9 @@ namespace Rests } } - private object DestroyToken(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object DestroyToken(RestRequestArgs args) { - var token = verbs["token"]; + var token = args.Verbs["token"]; try { Tokens.Remove(token); @@ -100,7 +100,7 @@ namespace Rests { Response = "Requested token was successfully destroyed." }; } - private object DestroyAllTokens(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + private object DestroyAllTokens(RestRequestArgs args) { Tokens.Clear(); @@ -108,18 +108,18 @@ namespace Rests { Response = "All tokens were successfully destroyed." }; } - private object NewTokenV2(RestVerbs verbs, IParameterCollection parameters) + private object NewTokenV2(RestRequestArgs args) { - var user = parameters["username"]; - var pass = verbs["password"]; + var user = args.Parameters["username"]; + var pass = args.Verbs["password"]; return this.NewTokenInternal(user, pass); } - private object NewToken(RestVerbs verbs, IParameterCollection parameters) + private object NewToken(RestRequestArgs args) { - var user = verbs["username"]; - var pass = verbs["password"]; + var user = args.Verbs["username"]; + var pass = args.Verbs["password"]; RestObject response = this.NewTokenInternal(user, pass); response["deprecated"] = "This endpoint is depracted and will be removed in the future."; @@ -157,10 +157,10 @@ namespace Rests return response; } - protected override object ExecuteCommand(RestCommand cmd, RestVerbs verbs, IParameterCollection parms) + protected override object ExecuteCommand(RestCommand cmd, RestVerbs verbs, IParameterCollection parms, IRequest request) { if (!cmd.RequiresToken) - return base.ExecuteCommand(cmd, verbs, parms); + return base.ExecuteCommand(cmd, verbs, parms, request); var token = parms["token"]; if (token == null) @@ -191,7 +191,7 @@ namespace Rests } } - object result = secureCmd.Execute(verbs, parms, tokenData); + object result = secureCmd.Execute(verbs, parms, tokenData, request); if (cmd.DoLog && TShock.Config.LogRest) TShock.Utils.SendLogs(string.Format( "\"{0}\" requested REST endpoint: {1}", tokenData.Username, this.BuildRequestUri(cmd, verbs, parms, false)),