[object Object]

← back to Butlr

gitignore + serve-time 404-guard for .bak/.pre- snapshot files

a5dc24d9f922183cc8051956056c0fb646bcbcab · 2026-05-19 17:24:13 -0700 · SteveStudio2

- broaden .gitignore to cover *.bak, *.bak.*, *.pre-*, .pre-*
- add Express middleware that 404s any .bak/.pre- path before
  express.static so a stray snapshot dropped in public/ can never
  leak. Pre-existing target=_blank links already carry rel=noopener.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit a5dc24d9f922183cc8051956056c0fb646bcbcab
Author: SteveStudio2 <steve@designerwallcoverings.com>
Date:   Tue May 19 17:24:13 2026 -0700

    gitignore + serve-time 404-guard for .bak/.pre- snapshot files
    
    - broaden .gitignore to cover *.bak, *.bak.*, *.pre-*, .pre-*
    - add Express middleware that 404s any .bak/.pre- path before
      express.static so a stray snapshot dropped in public/ can never
      leak. Pre-existing target=_blank links already carry rel=noopener.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---
 .gitignore | 5 +++++
 server.js  | 9 +++++++++
 2 files changed, 14 insertions(+)

diff --git a/.gitignore b/.gitignore
index d18e73b..a3b42bb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,8 @@ data/password-resets.json.*
 data/uploads/
 data/uploads-meta.json
 
+# Snapshot / backup files — never commit or serve
+*.bak
+*.bak.*
+*.pre-*
+.pre-*
diff --git a/server.js b/server.js
index 5e4530d..7cccc01 100644
--- a/server.js
+++ b/server.js
@@ -106,6 +106,15 @@ app.use(morgan(IS_PROD ? 'combined' : 'dev'));
 app.use(express.json({ limit: '64kb' }));
 app.use(express.urlencoded({ extended: true, limit: '64kb' }));
 
+// Never serve snapshot/backup files even if they land in /public by accident.
+// Matches *.bak, *.bak.*, and any path segment beginning with .pre- or *.pre-*.
+app.use((req, res, next) => {
+  if (/(?:^|\/)(?:\.pre-|[^/]+\.(?:bak|pre-))/i.test(req.path)) {
+    return res.status(404).render('public/404', { title: 'Not found — Butlr' });
+  }
+  next();
+});
+
 app.use(express.static(path.join(__dirname, 'public'), {
   maxAge: '1h',
   setHeaders(res, p) {

← b52ca5e Fix µ-law decoder bias (33 → 0x84) — root cause of distorted  ·  back to Butlr  ·  amd: silent hangup on machine answer (no voicemail messages) f4b29f0 →