From 1b00fa74bcbabdf4e854a660fd92788496b08143 Mon Sep 17 00:00:00 2001 From: David Montesinos Date: Mon, 21 Apr 2025 11:14:24 +0200 Subject: [PATCH] Compute file server etag with MD5 and always include ModifiedOn --- Oqtane.Server/Pages/Files.cshtml.cs | 10 +++++----- Oqtane.Shared/Shared/Utilities.cs | 8 ++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Oqtane.Server/Pages/Files.cshtml.cs b/Oqtane.Server/Pages/Files.cshtml.cs index 97fc2c57..7be27e89 100644 --- a/Oqtane.Server/Pages/Files.cshtml.cs +++ b/Oqtane.Server/Pages/Files.cshtml.cs @@ -137,15 +137,15 @@ namespace Oqtane.Pages string downloadName = file.Name; string filepath = _files.GetFilePath(file); + var etagInput = $"{file.ModifiedOn.Ticks}:{file.Size}"; + if (Request.QueryString.HasValue) { - etag = Utilities.GenerateSimpleHash(Request.QueryString.Value); - } - else - { - etag = Convert.ToString(file.ModifiedOn.Ticks ^ file.Size, 16); + etagInput += $":{Request.QueryString.Value}"; } + etag = Utilities.GenerateHashMD5(etagInput); + var header = ""; if (HttpContext.Request.Headers.TryGetValue(HeaderNames.IfNoneMatch, out var ifNoneMatch)) { diff --git a/Oqtane.Shared/Shared/Utilities.cs b/Oqtane.Shared/Shared/Utilities.cs index 826fac70..d38fe490 100644 --- a/Oqtane.Shared/Shared/Utilities.cs +++ b/Oqtane.Shared/Shared/Utilities.cs @@ -5,6 +5,7 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; +using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using File = Oqtane.Models.File; @@ -619,6 +620,13 @@ namespace Oqtane.Shared } } + public static string GenerateHashMD5(string input) + { + var bytes = Encoding.UTF8.GetBytes(input); + var hashBytes = MD5.HashData(bytes); + return Convert.ToHexString(hashBytes); + } + [Obsolete("ContentUrl(Alias alias, int fileId) is deprecated. Use FileUrl(Alias alias, int fileId) instead.", false)] public static string ContentUrl(Alias alias, int fileId) {