From b8a02bf81a946ea478ae8df917a65158e9b7a76e Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 28 Aug 2018 11:27:43 -0400 Subject: [PATCH 1/3] Implement a proper fucking GetId for Instances already --- .../InstanceManagerClient.cs | 3 ++- .../Controllers/InstanceController.cs | 24 ++++++++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/Tgstation.Server.Client/InstanceManagerClient.cs b/src/Tgstation.Server.Client/InstanceManagerClient.cs index 974017ffdb..63b78d47af 100644 --- a/src/Tgstation.Server.Client/InstanceManagerClient.cs +++ b/src/Tgstation.Server.Client/InstanceManagerClient.cs @@ -43,7 +43,8 @@ namespace Tgstation.Server.Client /// public Task Update(Instance instance, CancellationToken cancellationToken) => apiClient.Update(Routes.InstanceManager, instance, cancellationToken); - public Task GetId(Instance instance, CancellationToken cancellationToken) => apiClient.Read(Routes.InstanceManager, instance.Id, cancellationToken); + /// + public Task GetId(Instance instance, CancellationToken cancellationToken) => apiClient.Read(Routes.SetID(Routes.InstanceManager, instance.Id), cancellationToken); /// public IInstanceClient CreateClient(Instance instance) diff --git a/src/Tgstation.Server.Host/Controllers/InstanceController.cs b/src/Tgstation.Server.Host/Controllers/InstanceController.cs index fb07995f22..30f111dede 100644 --- a/src/Tgstation.Server.Host/Controllers/InstanceController.cs +++ b/src/Tgstation.Server.Host/Controllers/InstanceController.cs @@ -348,7 +348,7 @@ namespace Tgstation.Server.Host.Controllers } /// - [TgsAuthorize] + [TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)] public override async Task List(CancellationToken cancellationToken) { IQueryable query = DatabaseContext.Instances; @@ -359,12 +359,24 @@ namespace Tgstation.Server.Host.Controllers } /// - [TgsAuthorize] - public override Task Read(CancellationToken cancellationToken) + [TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)] + public override async Task GetId(long id, CancellationToken cancellationToken) { - if (Instance == null) - return Task.FromResult(BadRequest(new ErrorMessage { Message = "No instance specified" })); - return Task.FromResult(Json(Instance.ToApi())); + var query = DatabaseContext.Instances.Where(x => x.Id == id); + var cantList = !AuthenticationContext.User.InstanceManagerRights.Value.HasFlag(InstanceManagerRights.List); + + if (cantList) + query = query.Include(x => x.InstanceUsers); + + var instance = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false); + + if (instance == null) + return StatusCode((int)HttpStatusCode.Gone); + + if (cantList && !instance.InstanceUsers.Any(x => x.UserId == AuthenticationContext.User.Id && x.AnyRights)) + return Forbid(); + + return Json(instance.ToApi()); } } } From 5c3dcb9f6cd11b05e6f73125940d7232782ce93b Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 28 Aug 2018 11:35:23 -0400 Subject: [PATCH 2/3] Fixes issues with lack of error messages in responses --- src/Tgstation.Server.Client/ApiClient.cs | 28 +++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Tgstation.Server.Client/ApiClient.cs b/src/Tgstation.Server.Client/ApiClient.cs index 176253e06d..032d6b9b52 100644 --- a/src/Tgstation.Server.Client/ApiClient.cs +++ b/src/Tgstation.Server.Client/ApiClient.cs @@ -106,10 +106,16 @@ namespace Tgstation.Server.Client } catch (JsonException) { } + const string BadSpecExtension = " This is not part of TGS4 communication specification and should be reported if it was returned from a TGS4 server!"; + switch (response.StatusCode) { case HttpStatusCode.UpgradeRequired: - throw new ApiMismatchException(errorMessage); + throw new ApiMismatchException(errorMessage ?? new ErrorMessage + { + Message = "API Mismatch but no current API version provided!" + BadSpecExtension, + SeverApiVersion = null + }); case HttpStatusCode.Unauthorized: throw new UnauthorizedException(); case HttpStatusCode.RequestTimeout: @@ -119,9 +125,25 @@ namespace Tgstation.Server.Client case HttpStatusCode.ServiceUnavailable: throw new ServiceUnavailableException(); case HttpStatusCode.Gone: - case HttpStatusCode.NotFound: + errorMessage = errorMessage ?? new ErrorMessage + { + Message = "The requested resource could not be found!", + SeverApiVersion = null + }; + goto case HttpStatusCode.Conflict; + case HttpStatusCode.NotFound: //our fault somehow + errorMessage = errorMessage ?? new ErrorMessage + { + Message = "This is not a valid route!" + BadSpecExtension, + SeverApiVersion = null + }; + goto case HttpStatusCode.Conflict; case HttpStatusCode.Conflict: - throw new ConflictException(errorMessage, response.StatusCode); + throw new ConflictException(errorMessage ?? new ErrorMessage + { + Message = "An undescribed conflict occurred!" + BadSpecExtension, + SeverApiVersion = null + }, response.StatusCode); case HttpStatusCode.NotImplemented: case (HttpStatusCode)422: //unprocessable entity throw new MethodNotSupportedException(); From 7fdfbe4219edfb401b4b8e50a0056d9b06709a74 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 28 Aug 2018 11:35:45 -0400 Subject: [PATCH 3/3] Bump client preview version --- src/Tgstation.Server.Client/Tgstation.Server.Client.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj b/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj index 546c1d416b..40ffb4c446 100644 --- a/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj +++ b/src/Tgstation.Server.Client/Tgstation.Server.Client.csproj @@ -3,7 +3,7 @@ netstandard2.0 Full - 4.0.0.0-preview7 + 4.0.0.0-preview8 true Cyberboss /tg/station 13