From bae02a44ed6f387df1c60f9ed4bfc064401ccd62 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Sat, 15 Feb 2025 12:56:43 +0200 Subject: [PATCH 1/2] Add cache buster middleware to clear browser cache on server restart --- server.js | 3 ++- src/middleware/cacheBuster.js | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/middleware/cacheBuster.js diff --git a/server.js b/server.js index 6f5634f41..18f5cba1a 100644 --- a/server.js +++ b/server.js @@ -60,6 +60,7 @@ import basicAuthMiddleware from './src/middleware/basicAuth.js'; import whitelistMiddleware from './src/middleware/whitelist.js'; import multerMonkeyPatch from './src/middleware/multerMonkeyPatch.js'; import initRequestProxy from './src/request-proxy.js'; +import getCacheBusterMiddleware from './src/middleware/cacheBuster.js'; import { getVersion, getConfigValue, @@ -515,7 +516,7 @@ if (!disableCsrf) { // Static files // Host index page -app.get('/', (request, response) => { +app.get('/', getCacheBusterMiddleware(), (request, response) => { if (shouldRedirectToLogin(request)) { const query = request.url.split('?')[1]; const redirectUrl = query ? `/login?${query}` : '/login'; diff --git a/src/middleware/cacheBuster.js b/src/middleware/cacheBuster.js new file mode 100644 index 000000000..c197edc6a --- /dev/null +++ b/src/middleware/cacheBuster.js @@ -0,0 +1,22 @@ +/** + * Middleware to bust the browser cache for the current user. + * @returns {import('express').RequestHandler} + */ +export default function getCacheBusterMiddleware() { + /** + * @type {Set} Handles that have already been busted. + */ + const handles = new Set(); + + return (request, response, next) => { + const handle = request.user?.profile?.handle; + + if (!handle || handles.has(handle)) { + return next(); + } + + handles.add(handle); + response.setHeader('Clear-Site-Data', '"cache"'); + next(); + }; +} From fd38ca503a277eb753475b1827ada6264dcb0a6d Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Sat, 15 Feb 2025 23:05:08 +0200 Subject: [PATCH 2/2] Evict cache per user agent --- src/middleware/cacheBuster.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/middleware/cacheBuster.js b/src/middleware/cacheBuster.js index c197edc6a..5c38d2da1 100644 --- a/src/middleware/cacheBuster.js +++ b/src/middleware/cacheBuster.js @@ -1,21 +1,27 @@ +import crypto from 'node:crypto'; +import { DEFAULT_USER } from '../constants.js'; + /** * Middleware to bust the browser cache for the current user. * @returns {import('express').RequestHandler} */ export default function getCacheBusterMiddleware() { /** - * @type {Set} Handles that have already been busted. + * @type {Set} Handles/User-Agents that have already been busted. */ - const handles = new Set(); + const keys = new Set(); return (request, response, next) => { - const handle = request.user?.profile?.handle; + const handle = request.user?.profile?.handle || DEFAULT_USER.handle; + const userAgent = request.headers['user-agent'] || ''; + const hash = crypto.createHash('sha256').update(userAgent).digest('hex'); + const key = `${handle}-${hash}`; - if (!handle || handles.has(handle)) { + if (keys.has(key)) { return next(); } - handles.add(handle); + keys.add(key); response.setHeader('Clear-Site-Data', '"cache"'); next(); };