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