source: binary-improvements2/WebServer/src/WebAPI/APIs/Permissions/Blacklist.cs@ 434

Last change on this file since 434 was 434, checked in by alloc, 18 months ago

Added permission management APIs

File size: 4.2 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Net;
4using JetBrains.Annotations;
5using Utf8Json;
6using Webserver.Permissions;
7
8namespace Webserver.WebAPI.APIs.Permissions {
9 [UsedImplicitly]
10 public class Blacklist : AbsRestApi {
11 private const string propertyName = "name";
12 private const string propertyUserId = "userId";
13 private const string propertyBannedUntil = "bannedUntil";
14 private const string propertyBanReason = "banReason";
15
16 private static readonly byte[] jsonKeyName = JsonWriter.GetEncodedPropertyNameWithBeginObject (propertyName);
17 private static readonly byte[] jsonKeyUserId = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator (propertyUserId);
18 private static readonly byte[] jsonKeyBannedUntil = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator (propertyBannedUntil);
19 private static readonly byte[] jsonKeyBanReason = JsonWriter.GetEncodedPropertyNameWithPrefixValueSeparator (propertyBanReason);
20
21 private static AdminBlacklist BlacklistInstance => GameManager.Instance.adminTools.Blacklist;
22
23 protected override void HandleRestGet (RequestContext _context) {
24 string id = _context.RequestPath;
25
26 PrepareEnvelopedResult (out JsonWriter writer);
27
28 if (string.IsNullOrEmpty (id)) {
29 writer.WriteBeginArray ();
30
31 bool first = true;
32 foreach (AdminBlacklist.BannedUser ban in BlacklistInstance.GetBanned ()) {
33 if (!first) {
34 writer.WriteValueSeparator ();
35 }
36
37 first = false;
38
39 writeBan (ref writer, ban);
40 }
41
42 writer.WriteEndArray ();
43
44 SendEnvelopedResult (_context, ref writer);
45 return;
46 }
47
48 writer.WriteRaw (WebUtils.JsonEmptyData);
49 SendEnvelopedResult (_context, ref writer, HttpStatusCode.BadRequest);
50 }
51
52 private void writeBan (ref JsonWriter _writer, AdminBlacklist.BannedUser _ban) {
53 _writer.WriteRaw (jsonKeyName);
54 _writer.WriteString (_ban.Name ?? "");
55 _writer.WriteRaw (jsonKeyUserId);
56 JsonCommons.WritePlatformUserIdentifier (ref _writer, _ban.UserIdentifier);
57 _writer.WriteRaw (jsonKeyBannedUntil);
58 JsonCommons.WriteDateTime (ref _writer, _ban.BannedUntil);
59 _writer.WriteRaw (jsonKeyBanReason);
60 _writer.WriteString (_ban.BanReason);
61 _writer.WriteEndObject ();
62 }
63
64 protected override void HandleRestPost (RequestContext _context, IDictionary<string, object> _jsonInput, byte[] _jsonInputData) {
65 if (!TryParseId (_context, _jsonInputData, out PlatformUserIdentifierAbs userId)) {
66 return;
67 }
68
69 if (!JsonCommons.TryReadDateTime (_jsonInput, propertyBannedUntil, out DateTime bannedUntil)) {
70 SendEmptyResponse (_context, HttpStatusCode.BadRequest, _jsonInputData, "NO_OR_INVALID_BANNED_UNTIL");
71 return;
72 }
73
74 JsonCommons.TryGetJsonField (_jsonInput, propertyBanReason, out string banReason);
75
76 JsonCommons.TryGetJsonField (_jsonInput, propertyName, out string name);
77
78 BlacklistInstance.AddBan (name, userId, bannedUntil, banReason);
79
80 SendEmptyResponse (_context, HttpStatusCode.Created);
81 }
82
83 protected override void HandleRestDelete (RequestContext _context) {
84 if (!TryParseId (_context, null, out PlatformUserIdentifierAbs userId)) {
85 return;
86 }
87
88 bool removed = BlacklistInstance.RemoveBan (userId);
89
90 SendEmptyResponse (_context, removed ? HttpStatusCode.NoContent : HttpStatusCode.NotFound);
91 }
92
93 private bool TryParseId (RequestContext _context, byte[] _jsonInputData, out PlatformUserIdentifierAbs _userId) {
94 string id = _context.RequestPath;
95 _userId = default;
96
97 if (string.IsNullOrEmpty (id)) {
98 SendEmptyResponse (_context, HttpStatusCode.BadRequest, _jsonInputData, "NO_USER");
99 return false;
100 }
101
102 bool validId = PlatformUserIdentifierAbs.TryFromCombinedString (id, out _userId);
103 if (!validId) {
104 SendEmptyResponse (_context, HttpStatusCode.BadRequest, _jsonInputData, "INVALID_USER");
105 }
106
107 return validId;
108 }
109
110 protected override bool AllowPostWithId => true;
111
112 public override int[] DefaultMethodPermissionLevels () => new[] {
113 AdminWebModules.MethodLevelNotSupported,
114 AdminWebModules.MethodLevelInheritGlobal,
115 AdminWebModules.MethodLevelInheritGlobal,
116 AdminWebModules.MethodLevelNotSupported,
117 AdminWebModules.MethodLevelInheritGlobal
118 };
119 }
120}
Note: See TracBrowser for help on using the repository browser.