Skip to content

Commit 88a2f08

Browse files
authored
browse_rsc() hashing (#2373)
1 parent 802e202 commit 88a2f08

File tree

5 files changed

+26
-10
lines changed

5 files changed

+26
-10
lines changed

OpenDreamClient/OpenDreamClient.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<ProjectReference Include="..\RobustToolbox\Robust.Shared.Maths\Robust.Shared.Maths.csproj" />
1818
<ProjectReference Include="..\RobustToolbox\Robust.Shared\Robust.Shared.csproj" />
1919
<ProjectReference Include="..\RobustToolbox\Robust.Client\Robust.Client.csproj" />
20+
<PackageReference Include="SpaceWizards.Sodium" />
2021
</ItemGroup>
2122
<Import Project="..\RobustToolbox\MSBuild\Robust.Properties.targets" />
2223
<Import Project="..\RobustToolbox\MSBuild\XamlIL.targets" />

OpenDreamClient/Resources/DreamResourceManager.cs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
using Robust.Shared.ContentPack;
66
using Robust.Shared.Network;
77
using Robust.Shared.Utility;
8+
using System.Linq;
9+
using SpaceWizards.Sodium;
810

911
namespace OpenDreamClient.Resources;
1012

@@ -69,21 +71,32 @@ private void EnsureCacheDirectory() {
6971
}
7072

7173
private void RxBrowseResource(MsgBrowseResource message) {
72-
_sawmill.Debug($"Received cache check for {message.Filename}");
74+
_sawmill.Debug($"Received cache check for {message.Filename} hash: {BitConverter.ToString(message.DataHash)}");
7375
EnsureCacheDirectory();
74-
if(_resourceManager.UserData.Exists(GetCacheFilePath(message.Filename))){ //TODO CHECK HASH
76+
if(_resourceManager.UserData.Exists(GetCacheFilePath(message.Filename)) && GetFileHash(GetCacheFilePath(message.Filename)).SequenceEqual(message.DataHash)){
7577
_sawmill.Debug($"Cache hit for {message.Filename}");
7678
} else {
7779
if(_activeBrowseRscRequests.Contains(message.Filename)) //we've already requested it, don't need to do it again
7880
return;
79-
_sawmill.Debug($"Cache miss for {message.Filename}, requesting from server.");
81+
if (_resourceManager.UserData.Exists(GetCacheFilePath(message.Filename))) {
82+
_sawmill.Debug($"Cache hit for {message.Filename} but hashes did not match (hash: {BitConverter.ToString(GetFileHash(GetCacheFilePath(message.Filename)))}). Re-requesting!");
83+
_resourceManager.UserData.Delete(GetCacheFilePath(message.Filename));
84+
} else
85+
_sawmill.Debug($"Cache miss for {message.Filename}, requesting from server.");
8086
_activeBrowseRscRequests.Add(message.Filename);
8187
_netManager.ServerChannel?.SendMessage(new MsgBrowseResourceRequest(){ Filename = message.Filename});
8288
}
8389
}
8490

91+
private byte[] GetFileHash(ResPath path) {
92+
var stream = _resourceManager.UserData.OpenRead(path);
93+
Span<byte> filebytes = new(new byte[stream.Length]);
94+
stream.ReadToEnd(filebytes);
95+
return CryptoGenericHashBlake2B.Hash(32, filebytes, ReadOnlySpan<byte>.Empty);
96+
}
97+
8598
private void RxBrowseResourceResponse(MsgBrowseResourceResponse message) {
86-
if(_activeBrowseRscRequests.Contains(message.Filename)) {
99+
if (_activeBrowseRscRequests.Contains(message.Filename)) {
87100
_activeBrowseRscRequests.Remove(message.Filename);
88101
EnsureCacheDirectory();
89102
CreateCacheFile(message.Filename, message.Data);
@@ -227,7 +240,7 @@ public bool EnsureCacheFile(string filename, int timeoutSeconds = 5) {
227240

228241
return _resourceManager.UserData.Exists(actualPath);
229242
} else {
230-
_sawmill.Error("Cache was ensured for a file that does not exist in cache and is not requested. Probably somebody called browse() without browse_rsc() first.");
243+
_sawmill.Error($"Cache was ensured for a file ({filename}) that does not exist in cache and is not requested. Probably somebody called browse() without browse_rsc() first.");
231244
return false;
232245
}
233246
}

OpenDreamRuntime/DreamConnection.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using OpenDreamShared.Network.Messages;
1010
using Robust.Shared.Enums;
1111
using Robust.Shared.Player;
12+
using SpaceWizards.Sodium;
1213

1314
namespace OpenDreamRuntime;
1415

@@ -373,7 +374,7 @@ public void BrowseResource(DreamResource resource, string filename) {
373374

374375
var msg = new MsgBrowseResource() {
375376
Filename = filename,
376-
DataHash = resource.ResourceData.Length //TODO: make a quick hash that can work clientside too
377+
DataHash = CryptoGenericHashBlake2B.Hash(32, resource.ResourceData!, ReadOnlySpan<byte>.Empty)
377378
};
378379
_permittedBrowseRscFiles[filename] = resource;
379380

@@ -384,7 +385,7 @@ public void HandleBrowseResourceRequest(string filename) {
384385
if(_permittedBrowseRscFiles.TryGetValue(filename, out var dreamResource)) {
385386
var msg = new MsgBrowseResourceResponse() {
386387
Filename = filename,
387-
Data = dreamResource.ResourceData! //honestly if this is null, something mega fucked up has happened and we should error hard
388+
Data = dreamResource.ResourceData!, //honestly if this is null, something mega fucked up has happened and we should error hard
388389
};
389390
_permittedBrowseRscFiles.Remove(filename);
390391
Session?.Channel.SendMessage(msg);

OpenDreamRuntime/OpenDreamRuntime.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<PackageReference Include="Byond.TopicSender" />
1717
<PackageReference Include="Tracy-CSharp" />
1818
<PackageReference Include="OpenDreamByondApi" />
19+
<PackageReference Include="SpaceWizards.Sodium" />
1920
</ItemGroup>
2021

2122
<Import Project="..\RobustToolbox\MSBuild\Robust.Properties.targets" />

OpenDreamShared/Network/Messages/MsgBrowseResource.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ public sealed class MsgBrowseResource : NetMessage {
88
public override MsgGroups MsgGroup => MsgGroups.EntityEvent;
99

1010
public string Filename = string.Empty;
11-
public int DataHash;
11+
public byte[] DataHash = [];
1212

1313
public override void ReadFromBuffer(NetIncomingMessage buffer, IRobustSerializer serializer) {
1414
Filename = buffer.ReadString();
15-
DataHash = buffer.ReadVariableInt32();
15+
DataHash = buffer.ReadBytes(32);
1616
}
1717

1818
public override void WriteToBuffer(NetOutgoingMessage buffer, IRobustSerializer serializer) {
1919
buffer.Write(Filename);
20-
buffer.WriteVariableInt32(DataHash);
20+
buffer.Write(DataHash);
2121
}
2222
}

0 commit comments

Comments
 (0)