[object Object]

← back to Lifestyle Asset Intel

gitignore snapshot files + 404-guard .bak/.pre-/.orig paths under static

f4021885fab60a1c931de9be9a629eaffa9d7a4a · 2026-05-19 21:09:40 -0700 · Steve Abrams

Broadens .gitignore to exclude editor/snapshot backups (*.bak, *.bak.*,
*.pre-*, *.orig, *.rej, *.swp, *~) and adds an Express middleware that
404s any request matching those patterns BEFORE express.static can serve
them, so a stray backup landing in public/ can never leak.

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

Files touched

Diff

commit f4021885fab60a1c931de9be9a629eaffa9d7a4a
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue May 19 21:09:40 2026 -0700

    gitignore snapshot files + 404-guard .bak/.pre-/.orig paths under static
    
    Broadens .gitignore to exclude editor/snapshot backups (*.bak, *.bak.*,
    *.pre-*, *.orig, *.rej, *.swp, *~) and adds an Express middleware that
    404s any request matching those patterns BEFORE express.static can serve
    them, so a stray backup landing in public/ can never leak.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---
 .gitignore |  9 +++++++++
 server.js  | 11 +++++++++++
 2 files changed, 20 insertions(+)

diff --git a/.gitignore b/.gitignore
index 111b69d..62fae7c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,15 @@ tmp/
 uploads/
 coverage/
 
+# snapshot / editor backup files — never commit
+*.bak
+*.bak.*
+*.pre-*
+*.orig
+*.rej
+*.swp
+*~
+
 # yolo loop runtime artifacts — keep the scripts + prompt, ignore logs/locks
 .yolo/yolo-loop.log
 .yolo/launchd-out.log
diff --git a/server.js b/server.js
index 194dfd0..ef20a56 100644
--- a/server.js
+++ b/server.js
@@ -51,6 +51,17 @@ app.use(morgan(morganFormat));
 
 app.use(express.json({ limit: '512kb' }));
 app.use(express.urlencoded({ extended: true, limit: '512kb' }));
+
+// Hard 404 guard for editor/snapshot backups so that even if a stray
+// `.bak`, `.bak.*`, `.pre-*`, `.orig`, `.rej`, `.swp`, or `*~` file
+// lands under public/ it can never be served. Runs BEFORE express.static.
+app.use((req, res, next) => {
+  if (/\.(bak|orig|rej|swp)(\.|$)|\.pre-|~$/i.test(req.path)) {
+    return res.status(404).json({ error: 'not_found' });
+  }
+  next();
+});
+
 app.use(express.static(path.join(__dirname, 'public'), { maxAge: '1h' }));
 
 app.use((req, res, next) => {

← 3c385b4 snapshot — gitify backup 2026-05-19  ·  back to Lifestyle Asset Intel  ·  add noreferrer to topnav external-target links bf3e286 →