Make machine linking check access reader permissions (#7658)

This commit is contained in:
Leon Friedrich
2022-04-22 15:04:54 +12:00
committed by GitHub
parent 61d98a66c7
commit 2bb8a776a7
4 changed files with 49 additions and 38 deletions

View File

@@ -1,21 +0,0 @@
using Content.Server.MachineLinking.Components;
using Robust.Shared.GameObjects;
namespace Content.Server.MachineLinking.Events
{
public sealed class LinkAttemptEvent : CancellableEntityEventArgs
{
public readonly SignalTransmitterComponent TransmitterComponent;
public readonly string TransmitterPort;
public readonly SignalReceiverComponent ReceiverComponent;
public readonly string ReceiverPort;
public LinkAttemptEvent(SignalTransmitterComponent transmitterComponent, string transmitterPort, SignalReceiverComponent receiverComponent, string receiverPort)
{
TransmitterComponent = transmitterComponent;
this.TransmitterPort = transmitterPort;
ReceiverComponent = receiverComponent;
this.ReceiverPort = receiverPort;
}
}
}

View File

@@ -10,6 +10,7 @@ using Robust.Server.GameObjects;
using Robust.Shared.Utility; using Robust.Shared.Utility;
using Robust.Shared.Player; using Robust.Shared.Player;
using Content.Shared.Verbs; using Content.Shared.Verbs;
using Content.Shared.MachineLinking.Events;
namespace Content.Server.MachineLinking.System namespace Content.Server.MachineLinking.System
{ {
@@ -73,7 +74,7 @@ namespace Content.Server.MachineLinking.System
{ {
verb.Act = () => verb.Act = () =>
{ {
var msg = TryLinkDefaults(uid, linker.SavedTransmitter.Value, component) var msg = TryLinkDefaults(uid, linker.SavedTransmitter.Value, args.User, component)
? Loc.GetString("signal-linking-verb-success", ("machine", linker.SavedTransmitter.Value)) ? Loc.GetString("signal-linking-verb-success", ("machine", linker.SavedTransmitter.Value))
: Loc.GetString("signal-linking-verb-fail", ("machine", linker.SavedTransmitter.Value)); : Loc.GetString("signal-linking-verb-fail", ("machine", linker.SavedTransmitter.Value));
_popupSystem.PopupEntity(msg, uid, Filter.Entities(args.User)); _popupSystem.PopupEntity(msg, uid, Filter.Entities(args.User));
@@ -104,7 +105,7 @@ namespace Content.Server.MachineLinking.System
{ {
verb.Act = () => verb.Act = () =>
{ {
var msg = TryLinkDefaults(linker.SavedReceiver.Value, uid, null, component) var msg = TryLinkDefaults(linker.SavedReceiver.Value, uid, args.User, null, component)
? Loc.GetString("signal-linking-verb-success", ("machine", linker.SavedReceiver.Value)) ? Loc.GetString("signal-linking-verb-success", ("machine", linker.SavedReceiver.Value))
: Loc.GetString("signal-linking-verb-fail", ("machine", linker.SavedReceiver.Value)); : Loc.GetString("signal-linking-verb-fail", ("machine", linker.SavedReceiver.Value));
_popupSystem.PopupEntity(msg, uid, Filter.Entities(args.User)); _popupSystem.PopupEntity(msg, uid, Filter.Entities(args.User));
@@ -261,7 +262,7 @@ namespace Content.Server.MachineLinking.System
} }
private bool TryLink(SignalTransmitterComponent transmitter, SignalReceiverComponent receiver, SignalPortSelected args, EntityUid? popupUid = null, bool checkRange = true) private bool TryLink(SignalTransmitterComponent transmitter, SignalReceiverComponent receiver, SignalPortSelected args, EntityUid user, bool quiet = false, bool checkRange = true)
{ {
if (!transmitter.Outputs.TryGetValue(args.TransmitterPort, out var receivers) || if (!transmitter.Outputs.TryGetValue(args.TransmitterPort, out var receivers) ||
!receiver.Inputs.TryGetValue(args.ReceiverPort, out var transmitters)) !receiver.Inputs.TryGetValue(args.ReceiverPort, out var transmitters))
@@ -269,38 +270,38 @@ namespace Content.Server.MachineLinking.System
if (checkRange && !IsInRange(transmitter, receiver)) if (checkRange && !IsInRange(transmitter, receiver))
{ {
if (popupUid.HasValue) if (!quiet)
_popupSystem.PopupCursor(Loc.GetString("signal-linker-component-out-of-range"), _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-out-of-range"),
Filter.Entities(popupUid.Value)); Filter.Entities(user));
return false; return false;
} }
// allow other systems to refuse the connection // allow other systems to refuse the connection
var linkAttempt = new LinkAttemptEvent(transmitter, args.TransmitterPort, receiver, args.ReceiverPort); var linkAttempt = new LinkAttemptEvent(user, transmitter.Owner, args.TransmitterPort, receiver.Owner, args.ReceiverPort);
RaiseLocalEvent(transmitter.Owner, linkAttempt); RaiseLocalEvent(transmitter.Owner, linkAttempt);
if (linkAttempt.Cancelled) if (linkAttempt.Cancelled)
{ {
if (popupUid.HasValue) if (!quiet)
_popupSystem.PopupCursor(Loc.GetString("signal-linker-component-connection-refused", ("machine", transmitter.Owner)), _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-connection-refused", ("machine", transmitter.Owner)),
Filter.Entities(popupUid.Value)); Filter.Entities(user));
return false; return false;
} }
RaiseLocalEvent(receiver.Owner, linkAttempt); RaiseLocalEvent(receiver.Owner, linkAttempt);
if (linkAttempt.Cancelled) if (linkAttempt.Cancelled)
{ {
if (popupUid.HasValue) if (!quiet)
_popupSystem.PopupCursor(Loc.GetString("signal-linker-component-connection-refused", ("machine", receiver.Owner)), _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-connection-refused", ("machine", receiver.Owner)),
Filter.Entities(popupUid.Value)); Filter.Entities(user));
return false; return false;
} }
receivers.Add(new(receiver.Owner, args.ReceiverPort)); receivers.Add(new(receiver.Owner, args.ReceiverPort));
transmitters.Add(new(transmitter.Owner, args.TransmitterPort)); transmitters.Add(new(transmitter.Owner, args.TransmitterPort));
if (popupUid.HasValue) if (!quiet)
_popupSystem.PopupCursor(Loc.GetString("signal-linker-component-linked-port", _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-linked-port",
("machine1", transmitter.Owner), ("port1", args.TransmitterPort), ("machine1", transmitter.Owner), ("port1", args.TransmitterPort),
("machine2", receiver.Owner), ("port2", args.ReceiverPort)), ("machine2", receiver.Owner), ("port2", args.ReceiverPort)),
Filter.Entities(popupUid.Value)); Filter.Entities(user));
return true; return true;
} }
@@ -313,8 +314,7 @@ namespace Content.Server.MachineLinking.System
!receiver.Inputs.TryGetValue(args.ReceiverPort, out var transmitters)) !receiver.Inputs.TryGetValue(args.ReceiverPort, out var transmitters))
return; return;
if (args.Session.AttachedEntity is not EntityUid attached || attached == default || if (args.Session.AttachedEntity is not EntityUid { Valid: true} attached)
!TryComp(attached, out ActorComponent? actor))
return; return;
if (receivers.Contains(new(receiver.Owner, args.ReceiverPort)) || if (receivers.Contains(new(receiver.Owner, args.ReceiverPort)) ||
@@ -366,7 +366,10 @@ namespace Content.Server.MachineLinking.System
!TryComp(linker.SavedReceiver, out SignalReceiverComponent? receiver)) !TryComp(linker.SavedReceiver, out SignalReceiverComponent? receiver))
return; return;
TryLinkDefaults(linker.SavedReceiver!.Value, linker.SavedTransmitter!.Value, receiver, transmitter); if (args.Session.AttachedEntity is not EntityUid { Valid: true } user)
return;
TryLinkDefaults(linker.SavedReceiver!.Value, linker.SavedTransmitter!.Value, user, receiver, transmitter);
TryUpdateUI(linker, transmitter, receiver); TryUpdateUI(linker, transmitter, receiver);
} }
@@ -374,7 +377,8 @@ namespace Content.Server.MachineLinking.System
/// Attempt to link all default ports connections. Returns true if all links succeeded. Otherwise returns /// Attempt to link all default ports connections. Returns true if all links succeeded. Otherwise returns
/// false. /// false.
/// </summary> /// </summary>
public bool TryLinkDefaults(EntityUid receiverUid, EntityUid transmitterUid, SignalReceiverComponent? receiver = null, SignalTransmitterComponent? transmitter = null) public bool TryLinkDefaults(EntityUid receiverUid, EntityUid transmitterUid, EntityUid user,
SignalReceiverComponent? receiver = null, SignalTransmitterComponent? transmitter = null)
{ {
if (!Resolve(receiverUid, ref receiver, false) || !Resolve(transmitterUid, ref transmitter, false)) if (!Resolve(receiverUid, ref receiver, false) || !Resolve(transmitterUid, ref transmitter, false))
return false; return false;
@@ -396,7 +400,7 @@ namespace Content.Server.MachineLinking.System
RaiseLocalEvent(receiver.Owner, new PortDisconnectedEvent(port)); RaiseLocalEvent(receiver.Owner, new PortDisconnectedEvent(port));
foreach (var (t, r) in mapping) foreach (var (t, r) in mapping)
allLinksSucceeded &= TryLink(transmitter, receiver, new(t, r), checkRange: false); allLinksSucceeded &= !TryLink(transmitter, receiver, new(t, r), user, quiet: true, checkRange: false);
} }
return allLinksSucceeded; return allLinksSucceeded;

View File

@@ -6,6 +6,7 @@ using Content.Shared.PDA;
using Content.Shared.Access.Components; using Content.Shared.Access.Components;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Content.Shared.Hands.EntitySystems; using Content.Shared.Hands.EntitySystems;
using Content.Shared.MachineLinking.Events;
namespace Content.Shared.Access.Systems namespace Content.Shared.Access.Systems
{ {
@@ -20,6 +21,13 @@ namespace Content.Shared.Access.Systems
base.Initialize(); base.Initialize();
SubscribeLocalEvent<AccessReaderComponent, ComponentInit>(OnInit); SubscribeLocalEvent<AccessReaderComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<AccessReaderComponent, GotEmaggedEvent>(OnEmagged); SubscribeLocalEvent<AccessReaderComponent, GotEmaggedEvent>(OnEmagged);
SubscribeLocalEvent<AccessReaderComponent, LinkAttemptEvent>(OnLinkAttempt);
}
private void OnLinkAttempt(EntityUid uid, AccessReaderComponent component, LinkAttemptEvent args)
{
if (component.Enabled && !IsAllowed(component, args.User))
args.Cancel();
} }
private void OnInit(EntityUid uid, AccessReaderComponent reader, ComponentInit args) private void OnInit(EntityUid uid, AccessReaderComponent reader, ComponentInit args)

View File

@@ -0,0 +1,20 @@
namespace Content.Shared.MachineLinking.Events
{
public sealed class LinkAttemptEvent : CancellableEntityEventArgs
{
public readonly EntityUid Transmitter;
public readonly EntityUid Receiver;
public readonly EntityUid User;
public readonly string TransmitterPort;
public readonly string ReceiverPort;
public LinkAttemptEvent(EntityUid user, EntityUid transmitter, string transmitterPort, EntityUid receiver, string receiverPort)
{
User = user;
Transmitter = transmitter;
TransmitterPort = transmitterPort;
Receiver = receiver;
ReceiverPort = receiverPort;
}
}
}