From 9355938f6a7af3f8562050bdc557f45eb26bd232 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Fri, 26 Jul 2019 23:36:24 +0200 Subject: [PATCH] Don't try to send unserializable value types over the wire with VV. --- Robust.Client/ViewVariables/ViewVariablesManager.cs | 2 +- Robust.Server/ViewVariables/ViewVariablesHost.cs | 6 +++++- Robust.Server/ViewVariables/ViewVariablesSession.cs | 5 ++++- Robust.Server/ViewVariables/ViewVariablesTrait.cs | 4 ++-- .../Interfaces/Serialization/IRobustSerializer.cs | 2 ++ Robust.Shared/Serialization/RobustSerializer.cs | 9 +++++++-- 6 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Robust.Client/ViewVariables/ViewVariablesManager.cs b/Robust.Client/ViewVariables/ViewVariablesManager.cs index eb63b3ddd..8dfb611a1 100644 --- a/Robust.Client/ViewVariables/ViewVariablesManager.cs +++ b/Robust.Client/ViewVariables/ViewVariablesManager.cs @@ -168,7 +168,7 @@ namespace Robust.Client.ViewVariables return new ViewVariablesPropertyEditorColor(); } - if (!type.IsValueType) + if (type != typeof(ViewVariablesBlobMembers.ServerValueTypeToken) && !type.IsValueType) { return new ViewVariablesPropertyEditorReference(); } diff --git a/Robust.Server/ViewVariables/ViewVariablesHost.cs b/Robust.Server/ViewVariables/ViewVariablesHost.cs index a49d982e4..2bffaa215 100644 --- a/Robust.Server/ViewVariables/ViewVariablesHost.cs +++ b/Robust.Server/ViewVariables/ViewVariablesHost.cs @@ -6,6 +6,7 @@ using Robust.Shared.Enums; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Network; using Robust.Shared.Interfaces.Reflection; +using Robust.Shared.Interfaces.Serialization; using Robust.Shared.IoC; using Robust.Shared.Log; using Robust.Shared.Network.Messages; @@ -22,6 +23,7 @@ namespace Robust.Server.ViewVariables [Dependency] private readonly IPlayerManager _playerManager; [Dependency] private readonly IComponentManager _componentManager; [Dependency] private readonly IConGroupController _groupController; + [Dependency] private readonly IRobustSerializer _robustSerializer; #pragma warning restore 649 private readonly Dictionary @@ -179,6 +181,7 @@ namespace Robust.Server.ViewVariables Deny(DenyReason.InvalidRequest); return; } + theObject = IoCManager.ResolveType(type); break; @@ -188,7 +191,8 @@ namespace Robust.Server.ViewVariables } var sessionId = _nextSessionId++; - var session = new ViewVariablesSession(message.MsgChannel.SessionId, theObject, sessionId, this); + var session = new ViewVariablesSession(message.MsgChannel.SessionId, theObject, sessionId, this, + _robustSerializer); _sessions.Add(sessionId, session); diff --git a/Robust.Server/ViewVariables/ViewVariablesSession.cs b/Robust.Server/ViewVariables/ViewVariablesSession.cs index a390b6264..f27943b6c 100644 --- a/Robust.Server/ViewVariables/ViewVariablesSession.cs +++ b/Robust.Server/ViewVariables/ViewVariablesSession.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using Robust.Server.ViewVariables.Traits; +using Robust.Shared.Interfaces.Serialization; using Robust.Shared.Network; using Robust.Shared.ViewVariables; @@ -10,6 +11,7 @@ namespace Robust.Server.ViewVariables { private readonly List _traits = new List(); public IViewVariablesHost Host { get; } + public IRobustSerializer RobustSerializer { get; } public NetSessionId PlayerSession { get; } public object Object { get; } public uint SessionId { get; } @@ -21,13 +23,14 @@ namespace Robust.Server.ViewVariables /// The session ID for this session. This is what the server and client use to talk about this session. /// /// The view variables host owning this session. - public ViewVariablesSession(NetSessionId playerSession, object o, uint sessionId, IViewVariablesHost host) + public ViewVariablesSession(NetSessionId playerSession, object o, uint sessionId, IViewVariablesHost host, IRobustSerializer robustSerializer) { PlayerSession = playerSession; Object = o; SessionId = sessionId; ObjectType = o.GetType(); Host = host; + RobustSerializer = robustSerializer; var traitIds = Host.TraitIdsFor(ObjectType); if (traitIds.Contains(ViewVariablesTraits.Members)) diff --git a/Robust.Server/ViewVariables/ViewVariablesTrait.cs b/Robust.Server/ViewVariables/ViewVariablesTrait.cs index 492f3aea5..8f5ae6801 100644 --- a/Robust.Server/ViewVariables/ViewVariablesTrait.cs +++ b/Robust.Server/ViewVariables/ViewVariablesTrait.cs @@ -81,7 +81,7 @@ namespace Robust.Server.ViewVariables /// /// Swaps values like references over to reference tokens to prevent issues. /// - protected static object MakeValueNetSafe(object value) + protected object MakeValueNetSafe(object value) { if (value == null) { @@ -100,7 +100,7 @@ namespace Robust.Server.ViewVariables }; } } - else if (valType.IsServerSide()) + else if (!Session.RobustSerializer.CanSerialize(valType)) { // Can't send this value type over the wire. return new ViewVariablesBlobMembers.ServerValueTypeToken diff --git a/Robust.Shared/Interfaces/Serialization/IRobustSerializer.cs b/Robust.Shared/Interfaces/Serialization/IRobustSerializer.cs index 031423289..85ec6905d 100644 --- a/Robust.Shared/Interfaces/Serialization/IRobustSerializer.cs +++ b/Robust.Shared/Interfaces/Serialization/IRobustSerializer.cs @@ -1,3 +1,4 @@ +using System; using System.IO; namespace Robust.Shared.Interfaces.Serialization @@ -8,5 +9,6 @@ namespace Robust.Shared.Interfaces.Serialization void Serialize(Stream stream, object toSerialize); T Deserialize(Stream stream); object Deserialize(Stream stream); + bool CanSerialize(Type type); } } diff --git a/Robust.Shared/Serialization/RobustSerializer.cs b/Robust.Shared/Serialization/RobustSerializer.cs index 6fee1dc85..643871204 100644 --- a/Robust.Shared/Serialization/RobustSerializer.cs +++ b/Robust.Shared/Serialization/RobustSerializer.cs @@ -6,8 +6,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Reflection; -using Robust.Shared.Maths; namespace Robust.Shared.Serialization { @@ -18,6 +16,7 @@ namespace Robust.Shared.Serialization private readonly IReflectionManager reflectionManager; #pragma warning restore 649 private Serializer Serializer; + private HashSet SerializableTypes; public void Initialize() { @@ -34,6 +33,7 @@ namespace Robust.Shared.Serialization var settings = new Settings(); Serializer = new Serializer(types, settings); + SerializableTypes = new HashSet(Serializer.GetTypeMap().Keys); } public void Serialize(Stream stream, object toSerialize) @@ -50,5 +50,10 @@ namespace Robust.Shared.Serialization { return Serializer.Deserialize(stream); } + + public bool CanSerialize(Type type) + { + return SerializableTypes.Contains(type); + } } }