diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 776b12d6..bdb68c7b 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -245,7 +245,8 @@ namespace TShockAPI add(Permissions.savessi, OverrideSSI, "overridessi", "ossi"); add(Permissions.xmas, ForceXmas, "forcexmas"); add(Permissions.settempgroup, TempGroup, "tempgroup"); - add(null, Aliases, "aliases"); + add(null, Aliases, "aliases"); + add(Rests.RestPermissions.restmanage, ManageRest, "rest"); //add(null, TestCallbackCommand, "test"); TShockCommands = new ReadOnlyCollection(tshockCommands); @@ -1343,7 +1344,58 @@ namespace TShockAPI args.Player.SendInfoMessage("Starting plugin update process:"); args.Player.SendInfoMessage("This may take a while, do not turn off the server!"); new PluginUpdaterThread(args.Player); - } + } + + private static void ManageRest(CommandArgs args) + { + string subCommand = "help"; + if (args.Parameters.Count > 0) + subCommand = args.Parameters[0]; + + switch(subCommand.ToLower()) + { + case "listusers": + { + int pageNumber; + if (!PaginationTools.TryParsePageNumber(args.Parameters, 1, args.Player, out pageNumber)) + return; + + Dictionary restUsersTokens = new Dictionary(); + foreach (Rests.SecureRest.TokenData tokenData in TShock.RestApi.Tokens.Values) + { + if (restUsersTokens.ContainsKey(tokenData.Username)) + restUsersTokens[tokenData.Username]++; + else + restUsersTokens.Add(tokenData.Username, 1); + } + + List restUsers = new List( + restUsersTokens.Select(ut => string.Format("{0} ({1} tokens)", ut.Key, ut.Value))); + + PaginationTools.SendPage( + args.Player, pageNumber, PaginationTools.BuildLinesFromTerms(restUsers), new PaginationTools.Settings { + NothingToDisplayString = "There are currently no active REST users.", + HeaderFormat = "Active REST Users ({0}/{1}):", + FooterFormat = "Type /rest listusers {0} for more." + } + ); + + break; + } + case "destroytokens": + { + TShock.RestApi.Tokens.Clear(); + args.Player.SendSuccessMessage("All REST tokens have been destroyed."); + break; + } + default: + { + args.Player.SendInfoMessage("Available REST Sub-Commands:"); + args.Player.SendMessage("destroytokens - Destroys all current REST tokens.", Color.White); + break; + } + } + } #endregion Server Maintenence Commands diff --git a/TShockAPI/Rest/RestPermissions.cs b/TShockAPI/Rest/RestPermissions.cs index e1c446cf..4662276d 100644 --- a/TShockAPI/Rest/RestPermissions.cs +++ b/TShockAPI/Rest/RestPermissions.cs @@ -26,6 +26,9 @@ namespace Rests [Description("User can create REST tokens.")] public static readonly string restapi; + [Description("User or REST user can destroy all REST tokens.")] + public static readonly string restmanage; + [Description("REST user can turn off / restart the server.")] public static readonly string restmaintenance; diff --git a/TShockAPI/Rest/SecureRest.cs b/TShockAPI/Rest/SecureRest.cs index 6d6b300c..5c5f8ea7 100644 --- a/TShockAPI/Rest/SecureRest.cs +++ b/TShockAPI/Rest/SecureRest.cs @@ -46,6 +46,7 @@ namespace Rests Register(new RestCommand("/token/create/{username}/{password}", NewToken) { DoLog = false }); Register(new RestCommand("/v2/token/create/{password}", NewTokenV2) { DoLog = false }); Register(new SecureRestCommand("/token/destroy/{token}", DestroyToken)); + Register(new SecureRestCommand("/v2/token/destroy/all", DestroyAllTokens, RestPermissions.restmanage)); foreach (KeyValuePair t in TShockAPI.TShock.RESTStartupTokens) { @@ -67,6 +68,14 @@ namespace Rests } return new Dictionary {{"status", "200"}, {"response", "Requested token was successfully destroyed."}}; + } + + private object DestroyAllTokens(RestVerbs verbs, IParameterCollection parameters, SecureRest.TokenData tokenData) + { + Tokens.Clear(); + + return new Dictionary + {{"status", "200"}, {"response", "All tokens were successfully destroyed."}}; } private object NewTokenV2(RestVerbs verbs, IParameterCollection parameters)