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