Ignore:
Timestamp:
May 17, 2023, 11:05:59 PM (18 months ago)
Author:
alloc
Message:

Added permission management APIs

File:
1 edited

Legend:

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

    r426 r434  
    4444                                        jsonDeserializeSampler.End ();
    4545
    46                                         SendErrorResult (_context, HttpStatusCode.BadRequest, null, "INVALID_BODY", e);
     46                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, null, "INVALID_BODY", e);
    4747                                        return;
    4848                                }
     
    5353                                        case ERequestMethod.GET:
    5454                                                if (inputJson != null) {
    55                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, jsonInputData, "GET_WITH_BODY");
     55                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, jsonInputData, "GET_WITH_BODY");
    5656                                                        return;
    5757                                                }
     
    6060                                                return;
    6161                                        case ERequestMethod.POST:
    62                                                 if (!string.IsNullOrEmpty (_context.RequestPath)) {
    63                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, jsonInputData, "POST_WITH_ID");
     62                                                if (!AllowPostWithId && !string.IsNullOrEmpty (_context.RequestPath)) {
     63                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, jsonInputData, "POST_WITH_ID");
    6464                                                        return;
    6565                                                }
    6666
    6767                                                if (inputJson == null) {
    68                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, null, "POST_WITHOUT_BODY");
     68                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, null, "POST_WITHOUT_BODY");
    6969                                                        return;
    7070                                                }
     
    7474                                        case ERequestMethod.PUT:
    7575                                                if (string.IsNullOrEmpty (_context.RequestPath)) {
    76                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, jsonInputData, "PUT_WITHOUT_ID");
     76                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, jsonInputData, "PUT_WITHOUT_ID");
    7777                                                        return;
    7878                                                }
    7979
    8080                                                if (inputJson == null) {
    81                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, null, "PUT_WITHOUT_BODY");
     81                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, null, "PUT_WITHOUT_BODY");
    8282                                                        return;
    8383                                                }
     
    8787                                        case ERequestMethod.DELETE:
    8888                                                if (string.IsNullOrEmpty (_context.RequestPath)) {
    89                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, jsonInputData, "DELETE_WITHOUT_ID");
     89                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, jsonInputData, "DELETE_WITHOUT_ID");
    9090                                                        return;
    9191                                                }
    9292
    9393                                                if (inputJson != null) {
    94                                                         SendErrorResult (_context, HttpStatusCode.BadRequest, null, "DELETE_WITH_BODY");
     94                                                        SendEmptyResponse (_context, HttpStatusCode.BadRequest, null, "DELETE_WITH_BODY");
    9595                                                        return;
    9696                                                }
     
    9999                                                return;
    100100                                        default:
    101                                                 SendErrorResult (_context, HttpStatusCode.BadRequest, null, "INVALID_METHOD");
     101                                                SendEmptyResponse (_context, HttpStatusCode.BadRequest, null, "INVALID_METHOD");
    102102                                                return;
    103103                                }
    104104                        } catch (Exception e) {
    105                                 SendErrorResult (_context, HttpStatusCode.InternalServerError, jsonInputData, "ERROR_PROCESSING", e);
     105                                SendEmptyResponse (_context, HttpStatusCode.InternalServerError, jsonInputData, "ERROR_PROCESSING", e);
    106106                        }
    107107                }
    108108
    109109                protected virtual void HandleRestGet (RequestContext _context) {
    110                         SendErrorResult (_context, HttpStatusCode.MethodNotAllowed, null, "Unsupported");
     110                        SendEmptyResponse (_context, HttpStatusCode.MethodNotAllowed, null, "Unsupported");
    111111                }
    112112
    113113                protected virtual void HandleRestPost (RequestContext _context, IDictionary<string, object> _jsonInput, byte[] _jsonInputData) {
    114                         SendErrorResult (_context, HttpStatusCode.MethodNotAllowed, _jsonInputData, "Unsupported");
     114                        SendEmptyResponse (_context, HttpStatusCode.MethodNotAllowed, _jsonInputData, "Unsupported");
    115115                }
    116116
    117117                protected virtual void HandleRestPut (RequestContext _context, IDictionary<string, object> _jsonInput, byte[] _jsonInputData) {
    118                         SendErrorResult (_context, HttpStatusCode.MethodNotAllowed, _jsonInputData, "Unsupported");
     118                        SendEmptyResponse (_context, HttpStatusCode.MethodNotAllowed, _jsonInputData, "Unsupported");
    119119                }
    120120
    121121                protected virtual void HandleRestDelete (RequestContext _context) {
    122                         SendErrorResult (_context, HttpStatusCode.MethodNotAllowed, null, "Unsupported");
     122                        SendEmptyResponse (_context, HttpStatusCode.MethodNotAllowed, null, "Unsupported");
    123123                }
    124124
     
    126126                        AdminWebModules.WebModule module = AdminWebModules.Instance.GetModule (CachedApiModuleName);
    127127
    128                         if (module.LevelPerMethod != null) {
    129                                 int perMethodLevel = module.LevelPerMethod [(int)_context.Method];
    130                                 if (perMethodLevel == AdminWebModules.MethodLevelNotSupported) {
    131                                         return false;
    132                                 }
     128                        if (module.LevelPerMethod == null) {
     129                                return module.LevelGlobal >= _context.PermissionLevel;
     130                        }
    133131
    134                                 if (perMethodLevel != AdminWebModules.MethodLevelInheritGlobal) {
    135                                         return perMethodLevel >= _context.PermissionLevel;
    136                                 }
     132                        int perMethodLevel = module.LevelPerMethod [(int)_context.Method];
     133                        if (perMethodLevel == AdminWebModules.MethodLevelNotSupported) {
     134                                return false;
     135                        }
     136
     137                        if (perMethodLevel != AdminWebModules.MethodLevelInheritGlobal) {
     138                                return perMethodLevel >= _context.PermissionLevel;
    137139                        }
    138140
    139141                        return module.LevelGlobal >= _context.PermissionLevel;
    140142                }
     143
     144                protected virtual bool AllowPostWithId => false;
    141145
    142146                /// <summary>
     
    154158#region Helpers
    155159
    156                 protected static readonly byte[] JsonEmptyData;
    157                
    158                 static AbsRestApi () {
    159                         JsonWriter writer = new JsonWriter ();
    160                         writer.WriteBeginArray ();
    161                         writer.WriteEndArray ();
    162                         JsonEmptyData = writer.ToUtf8ByteArray ();
    163                 }
    164 
    165160                protected static void PrepareEnvelopedResult (out JsonWriter _writer) {
    166161                        WebUtils.PrepareEnvelopedResult (out _writer);
     
    173168                }
    174169
    175                 protected static void SendErrorResult (RequestContext _context, HttpStatusCode _statusCode, byte[] _jsonInputData = null, string _errorCode = null, Exception _exception = null) {
     170                protected static void SendEmptyResponse (RequestContext _context, HttpStatusCode _statusCode = HttpStatusCode.OK, byte[] _jsonInputData = null, string _errorCode = null, Exception _exception = null) {
    176171                        PrepareEnvelopedResult (out JsonWriter writer);
    177                         writer.WriteRaw (JsonEmptyData);
     172                        writer.WriteRaw (WebUtils.JsonEmptyData);
    178173                        SendEnvelopedResult (_context, ref writer, _statusCode, _jsonInputData, _errorCode, _exception);
    179174                }
    180 
    181                 protected static bool TryGetJsonField (IDictionary<string, object> _jsonObject, string _fieldName, out int _value) {
    182                         _value = default;
    183                        
    184                         if (!_jsonObject.TryGetValue (_fieldName, out object fieldNode)) {
    185                                 return false;
    186                         }
    187 
    188                         if (fieldNode is not double value) {
    189                                 return false;
    190                         }
    191 
    192                         try {
    193                                 _value = (int)value;
    194                                 return true;
    195                         } catch (Exception) {
    196                                 return false;
    197                         }
    198                 }
    199 
    200                 protected static bool TryGetJsonField (IDictionary<string, object> _jsonObject, string _fieldName, out double _value) {
    201                         _value = default;
    202                        
    203                         if (!_jsonObject.TryGetValue (_fieldName, out object fieldNode)) {
    204                                 return false;
    205                         }
    206 
    207                         if (fieldNode is not double value) {
    208                                 return false;
    209                         }
    210 
    211                         try {
    212                                 _value = value;
    213                                 return true;
    214                         } catch (Exception) {
    215                                 return false;
    216                         }
    217                 }
    218 
    219                 protected static bool TryGetJsonField (IDictionary<string, object> _jsonObject, string _fieldName, out string _value) {
    220                         _value = default;
    221                        
    222                         if (!_jsonObject.TryGetValue (_fieldName, out object fieldNode)) {
    223                                 return false;
    224                         }
    225 
    226                         if (fieldNode is not string value) {
    227                                 return false;
    228                         }
    229 
    230                         try {
    231                                 _value = value;
    232                                 return true;
    233                         } catch (Exception) {
    234                                 return false;
    235                         }
    236                 }
    237                
    238175
    239176#endregion
Note: See TracChangeset for help on using the changeset viewer.