[391] | 1 | using System.Collections.Generic;
|
---|
| 2 | using JetBrains.Annotations;
|
---|
[404] | 3 | using Webserver.Permissions;
|
---|
[391] | 4 |
|
---|
| 5 | namespace Webserver.Commands {
|
---|
| 6 | [UsedImplicitly]
|
---|
| 7 | public class WebPermissionsCmd : ConsoleCmdAbstract {
|
---|
[405] | 8 | protected override string[] getCommands () {
|
---|
[391] | 9 | return new[] {"webpermission"};
|
---|
| 10 | }
|
---|
| 11 |
|
---|
[405] | 12 | protected override string getDescription () {
|
---|
[391] | 13 | return "Manage web permission levels";
|
---|
| 14 | }
|
---|
| 15 |
|
---|
[405] | 16 | protected override string getHelp () {
|
---|
[426] | 17 | return @"
|
---|
| 18 | |Set/get permission levels required to access a given web functionality. Default
|
---|
| 19 | |level required for functions that are not explicitly specified is 0.
|
---|
| 20 | |Usage:
|
---|
| 21 | | 1. webpermission add <webfunction> <method> <level>
|
---|
| 22 | | 2. webpermission remove <webfunction>
|
---|
| 23 | | 3. webpermission list [includedefaults]
|
---|
| 24 | |1. Add a new override (or replace the existing one) for the given function. Method must be a HTTP method (like 'GET', 'POST')
|
---|
| 25 | supported by the function or the keyword 'global' for a per-API permission level. Use the permission level keyword
|
---|
| 26 | 'inherit' to use the per-API permission level for the specified method instead of a custom one for just the single method.
|
---|
| 27 | |2. Removes any custom overrides for the specified function.
|
---|
| 28 | |3. List all permissions. Pass in 'true' for the includedefaults argument to also show functions that do not have a custom override defined.
|
---|
| 29 | ".Unindent ();
|
---|
[391] | 30 | }
|
---|
| 31 |
|
---|
| 32 | public override void Execute (List<string> _params, CommandSenderInfo _senderInfo) {
|
---|
| 33 | if (_params.Count >= 1) {
|
---|
| 34 | if (_params [0].EqualsCaseInsensitive ("add")) {
|
---|
| 35 | ExecuteAdd (_params);
|
---|
| 36 | } else if (_params [0].EqualsCaseInsensitive ("remove")) {
|
---|
| 37 | ExecuteRemove (_params);
|
---|
| 38 | } else if (_params [0].EqualsCaseInsensitive ("list")) {
|
---|
[419] | 39 | ExecuteList (_params);
|
---|
[391] | 40 | } else {
|
---|
| 41 | SdtdConsole.Instance.Output ($"Invalid sub command \"{_params [0]}\".");
|
---|
| 42 | }
|
---|
| 43 | } else {
|
---|
| 44 | SdtdConsole.Instance.Output ("No sub command given.");
|
---|
| 45 | }
|
---|
| 46 | }
|
---|
| 47 |
|
---|
| 48 | private void ExecuteAdd (List<string> _params) {
|
---|
[426] | 49 | if (_params.Count != 4) {
|
---|
| 50 | SdtdConsole.Instance.Output ($"Wrong number of arguments, expected 4, found {_params.Count}.");
|
---|
[391] | 51 | return;
|
---|
| 52 | }
|
---|
| 53 |
|
---|
[426] | 54 | string moduleString = _params [1];
|
---|
| 55 | string methodString = _params [2];
|
---|
| 56 | string permissionLevelString = _params [3];
|
---|
| 57 |
|
---|
| 58 | ERequestMethod method = ERequestMethod.Count;
|
---|
| 59 | bool isGlobal = false;
|
---|
| 60 | bool isInherit = false;
|
---|
| 61 | int level;
|
---|
| 62 |
|
---|
| 63 | if (!AdminWebModules.Instance.IsKnownModule (moduleString)) {
|
---|
| 64 | SdtdConsole.Instance.Output ($"\"{moduleString}\" is not a valid web function.");
|
---|
[391] | 65 | return;
|
---|
| 66 | }
|
---|
| 67 |
|
---|
[426] | 68 | AdminWebModules.WebModule module = AdminWebModules.Instance.GetModule (moduleString);
|
---|
| 69 |
|
---|
| 70 | if (methodString.EqualsCaseInsensitive ("global")) {
|
---|
| 71 | isGlobal = true;
|
---|
| 72 | } else {
|
---|
| 73 | if (!EnumUtils.TryParse (methodString, out method, true)) {
|
---|
| 74 | SdtdConsole.Instance.Output ($"\"{methodString}\" is neither a valid HTTP method nor the 'global' keyword.");
|
---|
| 75 | return;
|
---|
| 76 | }
|
---|
| 77 |
|
---|
| 78 | if (module.LevelPerMethod == null || module.LevelPerMethod [(int)method] == AdminWebModules.MethodLevelNotSupported) {
|
---|
| 79 | SdtdConsole.Instance.Output ($"\"{methodString}\" is not a method supported by the \"{moduleString}\" function.");
|
---|
| 80 | return;
|
---|
| 81 | }
|
---|
[391] | 82 | }
|
---|
| 83 |
|
---|
[435] | 84 | if (permissionLevelString.EqualsCaseInsensitive (AdminWebModules.MethodLevelInheritKeyword)) {
|
---|
[426] | 85 | if (isGlobal) {
|
---|
| 86 | SdtdConsole.Instance.Output ($"Permission level can not use the 'inherit' keyword with the 'global' method keyword.");
|
---|
| 87 | return;
|
---|
| 88 | }
|
---|
| 89 |
|
---|
| 90 | isInherit = true;
|
---|
| 91 | level = AdminWebModules.MethodLevelInheritGlobal;
|
---|
| 92 | } else {
|
---|
| 93 | if (!int.TryParse (permissionLevelString, out level)) {
|
---|
| 94 | SdtdConsole.Instance.Output ($"\"{permissionLevelString}\" is neither a valid integer nor the 'inherit' keyword.");
|
---|
| 95 | return;
|
---|
| 96 | }
|
---|
| 97 | }
|
---|
| 98 |
|
---|
| 99 | module.IsDefault = false;
|
---|
| 100 | if (isGlobal) {
|
---|
| 101 | module.LevelGlobal = level;
|
---|
| 102 | } else {
|
---|
| 103 | module.LevelPerMethod [(int)method] = level;
|
---|
| 104 | }
|
---|
| 105 |
|
---|
| 106 | AdminWebModules.Instance.AddModule (module);
|
---|
| 107 |
|
---|
| 108 | SdtdConsole.Instance.Output (
|
---|
| 109 | $"{moduleString}, method {methodString} added {(isInherit ? ", inheriting the APIs global permission level" : "with permission level " + level)}.");
|
---|
[391] | 110 | }
|
---|
| 111 |
|
---|
| 112 | private void ExecuteRemove (List<string> _params) {
|
---|
| 113 | if (_params.Count != 2) {
|
---|
| 114 | SdtdConsole.Instance.Output ($"Wrong number of arguments, expected 2, found {_params.Count}.");
|
---|
| 115 | return;
|
---|
| 116 | }
|
---|
| 117 |
|
---|
[404] | 118 | if (!AdminWebModules.Instance.IsKnownModule (_params [1])) {
|
---|
[391] | 119 | SdtdConsole.Instance.Output ($"\"{_params [1]}\" is not a valid web function.");
|
---|
| 120 | return;
|
---|
| 121 | }
|
---|
| 122 |
|
---|
[404] | 123 | AdminWebModules.Instance.RemoveModule (_params [1]);
|
---|
[391] | 124 | SdtdConsole.Instance.Output ($"{_params [1]} removed from permissions list.");
|
---|
| 125 | }
|
---|
| 126 |
|
---|
[419] | 127 | private void ExecuteList (List<string> _params) {
|
---|
| 128 | bool includeDefaults = _params.Count > 1 && ConsoleHelper.ParseParamBool (_params [1], true);
|
---|
| 129 |
|
---|
[391] | 130 | SdtdConsole.Instance.Output ("Defined web function permissions:");
|
---|
[404] | 131 |
|
---|
| 132 | List<AdminWebModules.WebModule> wmps = AdminWebModules.Instance.GetModules ();
|
---|
[426] | 133 | for (int iModule = 0; iModule < wmps.Count; iModule++) {
|
---|
| 134 | AdminWebModules.WebModule wmp = wmps [iModule];
|
---|
[419] | 135 |
|
---|
| 136 | if (!includeDefaults && wmp.IsDefault) {
|
---|
| 137 | continue;
|
---|
| 138 | }
|
---|
| 139 |
|
---|
[426] | 140 | SdtdConsole.Instance.Output ($" {wmp.Name,-25}: {wmp.LevelGlobal,4}{(wmp.IsDefault ? " (default permissions)" : "")}");
|
---|
[434] | 141 | if (wmp.LevelPerMethod == null) {
|
---|
| 142 | continue;
|
---|
| 143 | }
|
---|
| 144 |
|
---|
| 145 | for (int iMethod = 0; iMethod < wmp.LevelPerMethod.Length; iMethod++) {
|
---|
| 146 | int methodLevel = wmp.LevelPerMethod [iMethod];
|
---|
| 147 | ERequestMethod method = (ERequestMethod)iMethod;
|
---|
[426] | 148 |
|
---|
[434] | 149 | if (methodLevel == AdminWebModules.MethodLevelNotSupported) {
|
---|
| 150 | continue;
|
---|
| 151 | }
|
---|
[426] | 152 |
|
---|
[434] | 153 | if (methodLevel == AdminWebModules.MethodLevelInheritGlobal) {
|
---|
| 154 | SdtdConsole.Instance.Output ($" {method.ToStringCached (),25}: {wmp.LevelGlobal,4} (Using API level)");
|
---|
| 155 | } else {
|
---|
| 156 | SdtdConsole.Instance.Output ($" {method.ToStringCached (),25}: {methodLevel,4}");
|
---|
[419] | 157 | }
|
---|
| 158 | }
|
---|
[391] | 159 | }
|
---|
| 160 | }
|
---|
| 161 | }
|
---|
| 162 | }
|
---|