Ignore:
Timestamp:
Apr 24, 2023, 2:40:34 PM (19 months ago)
Author:
alloc
Message:

*Updated web permissions system
*Fixed webpermissions command
*Moved API "webmods" to "mods", also lists non-webmod mods

Location:
binary-improvements2/WebServer/src/WebAPI
Files:
8 edited
1 moved

Legend:

Unmodified
Added
Removed
  • binary-improvements2/WebServer/src/WebAPI/APIs/Command.cs

    r408 r426  
    33using JetBrains.Annotations;
    44using Utf8Json;
     5using Webserver.Permissions;
    56
    67namespace Webserver.WebAPI.APIs {
     
    130131                }
    131132
    132                 public override int DefaultPermissionLevel () => 2000;
     133                public override int DefaultPermissionLevel () => AdminWebModules.PermissionLevelGuest;
    133134        }
    134135}
  • binary-improvements2/WebServer/src/WebAPI/APIs/Mods.cs

    r425 r426  
    11using JetBrains.Annotations;
    22using Utf8Json;
     3using Webserver.Permissions;
    34
    45namespace Webserver.WebAPI.APIs {
    56        [UsedImplicitly]
    6         public class WebMods : AbsRestApi {
     7        public class Mods : AbsRestApi {
    78                private readonly byte[] loadedWebMods;
    89
    9                 public WebMods (Web _parent) {
     10                public Mods (Web _parent) {
    1011                        JsonWriter writer = new JsonWriter ();
    1112                        writer.WriteBeginArray ();
     
    1314                        for (int i = 0; i < _parent.webMods.Count; i++) {
    1415                                WebMod webMod = _parent.webMods [i];
    15                                
     16
    1617                                if (i > 0) {
    1718                                        writer.WriteValueSeparator ();
    1819                                }
    19 
     20                               
    2021                                writer.WriteBeginObject ();
    2122
    22                                 writer.WriteString ("name");
    23                                 writer.WriteNameSeparator ();
    24                                 writer.WriteString (webMod.ParentMod.Name);
     23                                writeModJson (ref writer, webMod);
    2524
    26                                 string webModReactBundle = webMod.ReactBundle;
    27                                 if (webModReactBundle != null) {
     25                                if (webMod.ReactBundle != null || webMod.CssPath != null) {
    2826                                        writer.WriteValueSeparator ();
    29                                         writer.WriteString ("bundle");
    30                                         writer.WriteNameSeparator ();
    31                                         writer.WriteString (webModReactBundle);
    32                                 }
    3327
    34                                 string webModCssFile = webMod.CssPath;
    35                                 if (webModCssFile != null) {
    36                                         writer.WriteValueSeparator ();
    37                                         writer.WriteString ("css");
    38                                         writer.WriteNameSeparator ();
    39                                         writer.WriteString (webModCssFile);
     28                                        writer.WritePropertyName ("web");
     29                                        writer.WriteBeginObject ();
     30                                       
     31                                        string webModReactBundle = webMod.ReactBundle;
     32                                        if (webModReactBundle != null) {
     33                                                writer.WritePropertyName ("bundle");
     34                                                writer.WriteString (webModReactBundle);
     35                                        }
     36
     37                                        string webModCssFile = webMod.CssPath;
     38                                        if (webModCssFile != null) {
     39                                                if (webModReactBundle != null) {
     40                                                        writer.WriteValueSeparator ();
     41                                                }
     42
     43                                                writer.WritePropertyName ("css");
     44                                                writer.WriteString (webModCssFile);
     45                                        }
     46                                       
     47                                        writer.WriteEndObject ();
    4048                                }
    4149
     
    5462                }
    5563
    56                 public override int DefaultPermissionLevel () => 2000;
     64                public override int DefaultPermissionLevel () => AdminWebModules.PermissionLevelGuest;
     65
     66                private void writeModJson (ref JsonWriter _writer, WebMod _webMod) {
     67                        _writer.WritePropertyName ("name");
     68                        _writer.WriteString (_webMod.ParentMod.Name);
     69                       
     70                        _writer.WriteValueSeparator ();
     71                        _writer.WritePropertyName ("displayName");
     72                        JsonCommons.WriteStringOrNull (ref _writer, _webMod.ParentMod.DisplayName);
     73
     74                        _writer.WriteValueSeparator ();
     75                        _writer.WritePropertyName ("description");
     76                        JsonCommons.WriteStringOrNull (ref _writer, _webMod.ParentMod.Description);
     77
     78                        _writer.WriteValueSeparator ();
     79                        _writer.WritePropertyName ("author");
     80                        JsonCommons.WriteStringOrNull (ref _writer, _webMod.ParentMod.Author);
     81
     82                        _writer.WriteValueSeparator ();
     83                        _writer.WritePropertyName ("version");
     84                        JsonCommons.WriteStringOrNull (ref _writer, _webMod.ParentMod.VersionString);
     85
     86                        _writer.WriteValueSeparator ();
     87                        _writer.WritePropertyName ("website");
     88                        JsonCommons.WriteStringOrNull (ref _writer, _webMod.ParentMod.Website);
     89                }
    5790        }
    5891}
  • binary-improvements2/WebServer/src/WebAPI/APIs/Player.cs

    r425 r426  
    256256                }
    257257
    258                 public override int DefaultPermissionLevel () => 2000;
     258                public override int DefaultPermissionLevel () => AdminWebModules.PermissionLevelGuest;
    259259        }
    260260}
  • binary-improvements2/WebServer/src/WebAPI/APIs/RegisterUser.cs

    r416 r426  
    8080                        }
    8181                       
    82                         // TODO: Check if username is already used!
     82                        // TODO: Check if username is already used by someone else!
     83                        // TODO: Remove existing username if player already had one!
    8384
    8485                        AdminWebUsers.Instance.AddUser (username, password, regData.PlatformUserId, regData.CrossPlatformUserId);
     
    9596                }
    9697
    97                 public override int DefaultPermissionLevel () => 2000;
     98                public override int DefaultPermissionLevel () => AdminWebModules.PermissionLevelGuest;
    9899        }
    99100}
  • binary-improvements2/WebServer/src/WebAPI/APIs/ServerStats.cs

    r408 r426  
    22using Utf8Json;
    33using Webserver.LiveData;
     4using Webserver.Permissions;
    45
    56namespace Webserver.WebAPI.APIs {
     
    4748                }
    4849
    49                 public override int DefaultPermissionLevel () => 2000;
     50                public override int DefaultPermissionLevel () => AdminWebModules.PermissionLevelGuest;
    5051        }
    5152}
  • binary-improvements2/WebServer/src/WebAPI/APIs/WebUiUpdates.cs

    r408 r426  
    22using Utf8Json;
    33using Webserver.LiveData;
     4using Webserver.Permissions;
    45
    56namespace Webserver.WebAPI.APIs {
     
    5758                }
    5859
    59                 public override int DefaultPermissionLevel () => 2000;
     60                public override int DefaultPermissionLevel () => AdminWebModules.PermissionLevelGuest;
    6061        }
    6162}
  • binary-improvements2/WebServer/src/WebAPI/AbsRestApi.cs

    r418 r426  
    1010                private static readonly UnityEngine.Profiling.CustomSampler jsonDeserializeSampler = UnityEngine.Profiling.CustomSampler.Create ("JSON_Deserialize");
    1111
    12                 protected readonly string[] CachedPerMethodModuleNames = new string[(int)ERequestMethod.Count];
    13 
    1412                protected AbsRestApi (string _name = null) : this(null, _name) {
    1513                }
     
    1917
    2018                protected override void RegisterPermissions () {
    21                         base.RegisterPermissions ();
    22                        
    23                         for (int i = 0; i < (int)ERequestMethod.Count; i++) {
    24                                 ERequestMethod method = (ERequestMethod)i;
    25 
    26                                 if (method is not (ERequestMethod.GET or ERequestMethod.PUT or ERequestMethod.POST or ERequestMethod.DELETE)) {
    27                                         continue;
    28                                 }
    29 
    30                                 CachedPerMethodModuleNames [i] = $"webapi.{Name}:{method.ToStringCached ()}";
    31                                 AdminWebModules.Instance.AddKnownModule (CachedPerMethodModuleNames [i], DefaultMethodPermissionLevel (method));
    32                         }
     19                        AdminWebModules.Instance.AddKnownModule (new AdminWebModules.WebModule (CachedApiModuleName, DefaultPermissionLevel (),
     20                                DefaultMethodPermissionLevels (), true));
    3321                }
    3422
     
    136124
    137125                public override bool Authorized (RequestContext _context) {
    138                         return ActiveMethodPermissionLevel (_context.Method) >= _context.PermissionLevel;
     126                        AdminWebModules.WebModule module = AdminWebModules.Instance.GetModule (CachedApiModuleName);
     127
     128                        if (module.LevelPerMethod != null) {
     129                                int perMethodLevel = module.LevelPerMethod [(int)_context.Method];
     130                                if (perMethodLevel == AdminWebModules.MethodLevelNotSupported) {
     131                                        return false;
     132                                }
     133
     134                                if (perMethodLevel != AdminWebModules.MethodLevelInheritGlobal) {
     135                                        return perMethodLevel >= _context.PermissionLevel;
     136                                }
     137                        }
     138
     139                        return module.LevelGlobal >= _context.PermissionLevel;
    139140                }
    140141
    141142                /// <summary>
    142                 /// Define default permission levels per HTTP method
     143                /// Define default permission levels per HTTP method as an array of levels. See <see cref="ERequestMethod"/> for the order of entries.
    143144                /// </summary>
    144                 /// <param name="_method">HTTP method to return the default value for</param>
    145                 /// <returns>Default permission level for the given HTTP method. A value of int.MinValue means no per-method default, use per-API default</returns>
    146                 public virtual int DefaultMethodPermissionLevel (ERequestMethod _method) => int.MinValue;
    147 
    148                 public virtual int ActiveMethodPermissionLevel (ERequestMethod _method) {
    149                         string methodApiModuleName = CachedPerMethodModuleNames [(int)_method];
    150 
    151                         if (methodApiModuleName == null) {
    152                                 return 0;
    153                         }
    154 
    155                         AdminWebModules.WebModule? overrideModule = AdminWebModules.Instance.GetModule (methodApiModuleName, false);
    156                         if (overrideModule.HasValue) {
    157                                 return overrideModule.Value.PermissionLevel;
    158                         }
    159 
    160                         overrideModule = AdminWebModules.Instance.GetModule (CachedApiModuleName, false);
    161                         if (overrideModule.HasValue) {
    162                                 return overrideModule.Value.PermissionLevel;
    163                         }
    164 
    165                         int defaultMethodPermissionLevel = DefaultMethodPermissionLevel (_method);
    166                         // ReSharper disable once ConvertIfStatementToReturnStatement
    167                         if (defaultMethodPermissionLevel != int.MinValue) {
    168                                 return defaultMethodPermissionLevel;
    169                         }
    170 
    171                         return DefaultPermissionLevel ();
    172                 }
     145                /// <returns>Default permission levels for supported methods. See <see cref="AdminWebModules.MethodLevelNotSupported"/> and <see cref="AdminWebModules.MethodLevelInheritGlobal"/>.</returns>
     146                public virtual int[] DefaultMethodPermissionLevels () => new[] {
     147                        AdminWebModules.MethodLevelNotSupported,
     148                        AdminWebModules.MethodLevelInheritGlobal,
     149                        AdminWebModules.MethodLevelInheritGlobal,
     150                        AdminWebModules.MethodLevelInheritGlobal,
     151                        AdminWebModules.MethodLevelInheritGlobal
     152                };
    173153
    174154#region Helpers
  • binary-improvements2/WebServer/src/WebAPI/AbsWebAPI.cs

    r418 r426  
    1919
    2020                protected virtual void RegisterPermissions () {
    21                         AdminWebModules.Instance.AddKnownModule ($"webapi.{Name}", DefaultPermissionLevel ());
     21                        AdminWebModules.Instance.AddKnownModule (new AdminWebModules.WebModule(CachedApiModuleName, DefaultPermissionLevel (), true));
    2222                }
    2323
     
    2525
    2626                public virtual bool Authorized (RequestContext _context) {
    27                         return AdminWebModules.Instance.ModuleAllowedWithLevel (CachedApiModuleName, _context.PermissionLevel);
     27                        return AdminWebModules.Instance.GetModule (CachedApiModuleName).LevelGlobal >= _context.PermissionLevel;
    2828                }
    2929
  • binary-improvements2/WebServer/src/WebAPI/JsonCommons.cs

    r425 r426  
    6060                        _writer.WriteString (_dateTime.ToString ("o"));
    6161                }
     62
     63                public static void WriteStringOrNull (ref JsonWriter _writer, string _string) {
     64                        if (_string == null) {
     65                                _writer.WriteNull ();
     66                        } else {
     67                                _writer.WriteString (_string);
     68                        }
     69                }
    6270        }
    6371}
Note: See TracChangeset for help on using the changeset viewer.