AccessReader IsAllowed use resolve (#8527)

This commit is contained in:
keronshb
2022-06-01 11:26:50 -04:00
committed by GitHub
parent 7f984792a1
commit d5620aa833
11 changed files with 43 additions and 39 deletions

View File

@@ -21,53 +21,53 @@ namespace Content.IntegrationTests.Tests.Access
// test empty
var reader = new AccessReaderComponent();
Assert.That(system.IsAllowed(reader, new[] { "Foo" }), Is.True);
Assert.That(system.IsAllowed(reader, new[] { "Bar" }), Is.True);
Assert.That(system.IsAllowed(reader, new string[] { }), Is.True);
Assert.That(system.IsAllowed(new[] { "Foo" }, reader), Is.True);
Assert.That(system.IsAllowed(new[] { "Bar" }, reader), Is.True);
Assert.That(system.IsAllowed(new string[] { }, reader), Is.True);
// test deny
reader = new AccessReaderComponent();
reader.DenyTags.Add("A");
Assert.That(system.IsAllowed(reader, new[] { "Foo" }), Is.True);
Assert.That(system.IsAllowed(reader, new[] { "A" }), Is.False);
Assert.That(system.IsAllowed(reader, new[] { "A", "Foo" }), Is.False);
Assert.That(system.IsAllowed(reader, new string[] { }), Is.True);
Assert.That(system.IsAllowed(new[] { "Foo" }, reader), Is.True);
Assert.That(system.IsAllowed(new[] { "A" }, reader), Is.False);
Assert.That(system.IsAllowed(new[] { "A", "Foo" }, reader), Is.False);
Assert.That(system.IsAllowed(new string[] { }, reader), Is.True);
// test one list
reader = new AccessReaderComponent();
reader.AccessLists.Add(new HashSet<string> { "A" });
Assert.That(system.IsAllowed(reader, new[] { "A" }), Is.True);
Assert.That(system.IsAllowed(reader, new[] { "B" }), Is.False);
Assert.That(system.IsAllowed(reader, new[] { "A", "B" }), Is.True);
Assert.That(system.IsAllowed(reader, new string[] { }), Is.False);
Assert.That(system.IsAllowed(new[] { "A" }, reader), Is.True);
Assert.That(system.IsAllowed(new[] { "B" }, reader), Is.False);
Assert.That(system.IsAllowed(new[] { "A", "B" }, reader), Is.True);
Assert.That(system.IsAllowed(new string[] { }, reader), Is.False);
// test one list - two items
reader = new AccessReaderComponent();
reader.AccessLists.Add(new HashSet<string> { "A", "B" });
Assert.That(system.IsAllowed(reader, new[] { "A" }), Is.False);
Assert.That(system.IsAllowed(reader, new[] { "B" }), Is.False);
Assert.That(system.IsAllowed(reader, new[] { "A", "B" }), Is.True);
Assert.That(system.IsAllowed(reader, new string[] { }), Is.False);
Assert.That(system.IsAllowed(new[] { "A" }, reader), Is.False);
Assert.That(system.IsAllowed(new[] { "B" }, reader), Is.False);
Assert.That(system.IsAllowed(new[] { "A", "B" }, reader), Is.True);
Assert.That(system.IsAllowed(new string[] { }, reader), Is.False);
// test two list
reader = new AccessReaderComponent();
reader.AccessLists.Add(new HashSet<string> { "A" });
reader.AccessLists.Add(new HashSet<string> { "B", "C" });
Assert.That(system.IsAllowed(reader, new[] { "A" }), Is.True);
Assert.That(system.IsAllowed(reader, new[] { "B" }), Is.False);
Assert.That(system.IsAllowed(reader, new[] { "A", "B" }), Is.True);
Assert.That(system.IsAllowed(reader, new[] { "C", "B" }), Is.True);
Assert.That(system.IsAllowed(reader, new[] { "C", "B", "A" }), Is.True);
Assert.That(system.IsAllowed(reader, new string[] { }), Is.False);
Assert.That(system.IsAllowed(new[] { "A" }, reader), Is.True);
Assert.That(system.IsAllowed(new[] { "B" }, reader), Is.False);
Assert.That(system.IsAllowed(new[] { "A", "B" }, reader), Is.True);
Assert.That(system.IsAllowed(new[] { "C", "B" }, reader), Is.True);
Assert.That(system.IsAllowed(new[] { "C", "B", "A" }, reader), Is.True);
Assert.That(system.IsAllowed(new string[] { }, reader), Is.False);
// test deny list
reader = new AccessReaderComponent();
reader.AccessLists.Add(new HashSet<string> { "A" });
reader.DenyTags.Add("B");
Assert.That(system.IsAllowed(reader, new[] { "A" }), Is.True);
Assert.That(system.IsAllowed(reader, new[] { "B" }), Is.False);
Assert.That(system.IsAllowed(reader, new[] { "A", "B" }), Is.False);
Assert.That(system.IsAllowed(reader, new string[] { }), Is.False);
Assert.That(system.IsAllowed(new[] { "A" }, reader), Is.True);
Assert.That(system.IsAllowed(new[] { "B" }, reader), Is.False);
Assert.That(system.IsAllowed(new[] { "A", "B" }, reader), Is.False);
Assert.That(system.IsAllowed(new string[] { }, reader), Is.False);
});
}

View File

@@ -116,7 +116,7 @@ namespace Content.Server.AI.Pathfinding
var accessSystem = EntitySystem.Get<AccessReaderSystem>();
foreach (var reader in node.AccessReaders)
{
if (!accessSystem.IsAllowed(reader, access))
if (!accessSystem.IsAllowed(access, reader))
{
return false;
}

View File

@@ -232,7 +232,7 @@ public sealed partial class PathfindingSystem
var access = _accessReader.FindAccessTags(entity);
foreach (var reader in node.AccessReaders)
{
if (!_accessReader.IsAllowed(reader, access))
if (!_accessReader.IsAllowed(access, reader))
{
return false;
}

View File

@@ -56,7 +56,7 @@ namespace Content.Server.Access.Components
var privilegedIdEntity = PrivilegedIdSlot.Item;
var accessSystem = EntitySystem.Get<AccessReaderSystem>();
return privilegedIdEntity != null && accessSystem.IsAllowed(reader, privilegedIdEntity.Value);
return privilegedIdEntity != null && accessSystem.IsAllowed(privilegedIdEntity.Value, reader);
}
/// <summary>

View File

@@ -258,7 +258,7 @@ namespace Content.Server.Atmos.Monitor.Systems
if (!EntityManager.TryGetComponent(uid, out AccessReaderComponent reader) || user == null)
return false;
if (!_accessSystem.IsAllowed(reader, user.Value))
if (!_accessSystem.IsAllowed(user.Value, reader))
{
_popup.PopupEntity(Loc.GetString("air-alarm-ui-access-denied"), user.Value, Filter.Entities(user.Value));
return false;

View File

@@ -190,7 +190,7 @@ namespace Content.Server.Cargo
public bool ApproveOrder(EntityUid uid, EntityUid approver, int id, int orderNumber, AccessReaderComponent? reader = null)
{
// does the approver have permission to approve orders?
if (Resolve(uid, ref reader) && !_accessReaderSystem.IsAllowed(reader, approver))
if (Resolve(uid, ref reader) && !_accessReaderSystem.IsAllowed(approver, reader))
return false;
// get the approver's name

View File

@@ -217,9 +217,9 @@ public sealed class DoorSystem : SharedDoorSystem
return AccessType switch
{
// Some game modes modify access rules.
AccessTypes.AllowAllIdExternal => !isExternal || _accessReaderSystem.IsAllowed(access, user.Value),
AccessTypes.AllowAllIdExternal => !isExternal || _accessReaderSystem.IsAllowed(user.Value, access),
AccessTypes.AllowAllNoExternal => !isExternal,
_ => _accessReaderSystem.IsAllowed(access, user.Value)
_ => _accessReaderSystem.IsAllowed(user.Value, access)
};
}

View File

@@ -156,7 +156,7 @@ namespace Content.Server.Lock
if (!Resolve(uid, ref reader))
return true;
if (!_accessReader.IsAllowed(reader, user))
if (!_accessReader.IsAllowed(user, reader))
{
if (!quiet)
reader.Owner.PopupMessage(user, Loc.GetString("lock-comp-has-user-access-fail"));

View File

@@ -48,7 +48,7 @@ namespace Content.Server.Power.EntitySystems
if (args.Session.AttachedEntity == null)
return;
if (access == null || _accessReader.IsAllowed(access, args.Session.AttachedEntity.Value))
if (access == null || _accessReader.IsAllowed(args.Session.AttachedEntity.Value, access))
{
ApcToggleBreaker(uid, component);
}

View File

@@ -175,7 +175,7 @@ namespace Content.Server.VendingMachines
if (TryComp<AccessReaderComponent?>(vendComponent.Owner, out var accessReader))
{
if (!_accessReader.IsAllowed(accessReader, sender.Value) && !vendComponent.Emagged)
if (!_accessReader.IsAllowed(sender.Value, accessReader) && !vendComponent.Emagged)
{
_popupSystem.PopupEntity(Loc.GetString("vending-machine-component-try-eject-access-denied"), uid, Filter.Pvs(uid));
Deny(uid, vendComponent);

View File

@@ -26,7 +26,7 @@ namespace Content.Shared.Access.Systems
private void OnLinkAttempt(EntityUid uid, AccessReaderComponent component, LinkAttemptEvent args)
{
if (component.Enabled && !IsAllowed(component, args.User))
if (component.Enabled && !IsAllowed(args.User, component))
args.Cancel();
}
@@ -59,13 +59,17 @@ namespace Content.Shared.Access.Systems
/// If no access is found, an empty set is used instead.
/// </remarks>
/// <param name="entity">The entity to bor access.</param>
public bool IsAllowed(AccessReaderComponent reader, EntityUid entity)
/// <param name="reader"></param>
public bool IsAllowed(EntityUid entity, AccessReaderComponent? reader = null)
{
if (!Resolve(entity, ref reader, false))
return true;
var tags = FindAccessTags(entity);
return IsAllowed(reader, tags);
return IsAllowed(tags, reader);
}
public bool IsAllowed(AccessReaderComponent reader, ICollection<string> accessTags)
public bool IsAllowed(ICollection<string> accessTags, AccessReaderComponent reader)
{
if (!reader.Enabled)
{