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(); 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.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 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()); } } }