From a32708dcd1eea9fc1a90aeaf31b759b720d71d7b Mon Sep 17 00:00:00 2001 From: Kevin R Date: Sat, 26 Nov 2022 00:21:23 +0100 Subject: [PATCH] Fixed ETag filtering Fixed https://github.com/ClearURLs/Addon/issues/276 --- core_js/eTagFilter.js | 25 ++++++++++++++++++++++--- core_js/tools.js | 9 +++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/core_js/eTagFilter.js b/core_js/eTagFilter.js index 8642e5b..01cf766 100644 --- a/core_js/eTagFilter.js +++ b/core_js/eTagFilter.js @@ -31,8 +31,16 @@ function eTagFilter(requestDetails) { continue; } + const etag = header.value.toLowerCase(); + const w = etag.startsWith('w'); + const quotes = etag.endsWith('"'); + + let len = etag.length; + if (w) len -= 2; + if (quotes) len -= 2; + // insert dummy etag - requestDetails.responseHeaders[i].value = generateDummyEtag(); + requestDetails.responseHeaders[i].value = generateDummyEtag(len, quotes, w); pushToLog(requestDetails.url, requestDetails.url, translate("eTag_filtering_log")); @@ -42,8 +50,19 @@ function eTagFilter(requestDetails) { return {responseHeaders: requestDetails.responseHeaders}; } -function generateDummyEtag() { - return Math.random().toString(); +/** + * Generates a random ETag. + * + * Must be ASCII characters placed between double quotes. + * See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag + */ +function generateDummyEtag(len, quotes = true, w = false) { + let rtn = randomASCII(len); + + if (quotes) rtn = '"' + rtn + '"'; + if (w) rtn = 'W/' + rtn; + + return rtn; } browser.webRequest.onHeadersReceived.addListener( diff --git a/core_js/tools.js b/core_js/tools.js index 3989982..f435abb 100644 --- a/core_js/tools.js +++ b/core_js/tools.js @@ -328,3 +328,12 @@ async function sha256(message) { return hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); } + +/** + * Generates a non-secure random ASCII string of length {@code len}. + * + * @returns non-secure random ASCII + */ +function randomASCII(len) { + return [...Array(len)].map(() => (~~(Math.random() * 36)).toString(36)).join(''); +}