[object Object]

← back to Rentv

crm: harden green-highlight to admin credential only — require genuine admin basic/session/service (honor admin basic-auth even under OPEN=1 dev bypass); unauth + non-admin get zero LinkedIn relationship data

530cac5276e1f2c7a38cadeb3b21a4210ae4ad2d · 2026-08-12 18:39:21 -0700 · Steve Abrams

Files touched

Diff

commit 530cac5276e1f2c7a38cadeb3b21a4210ae4ad2d
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Aug 12 18:39:21 2026 -0700

    crm: harden green-highlight to admin credential only — require genuine admin basic/session/service (honor admin basic-auth even under OPEN=1 dev bypass); unauth + non-admin get zero LinkedIn relationship data
---
 server.js | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/server.js b/server.js
index 4087f7ec..d2d3075a 100644
--- a/server.js
+++ b/server.js
@@ -2440,9 +2440,17 @@ app.get('/api/crm', adminOnly, async (req, res) => {
     const owners = crmNormalizeOwners(readJSON('la-commercial.json', { marquee: [] }));
     const commercial = crmNormalizeCommercial(commercialRows);
     const directory = crmLoadImported();      // manually-imported contacts (scanned lists, business cards, etc.)
-    const liGraph = loadLinkedInGraph();
+    // LinkedIn green-highlight is ADMIN-ONLY (it reveals Steve's personal network). Require a
+    // GENUINE admin credential — a real basic/session/service admin, OR (under the OPEN=1 dev
+    // bypass, which clobbers authVia to 'open') a request that still carries admin basic-auth.
+    // A plain unauthenticated hit (even when OPEN=1 makes it role=admin) gets NO relationship data.
+    const isAdmin = req.role === 'admin' && (
+      req.authVia === 'basic' || req.authVia === 'session' || req.authVia === 'service' ||
+      (() => { const az = req.headers.authorization || ''; if (az.startsWith('Basic ')) { try { return Buffer.from(az.slice(6), 'base64').toString().split(':')[0] === 'admin'; } catch { return false; } } return false; })()
+    );
+    const liGraph = isAdmin ? loadLinkedInGraph() : null;
     const all = [...ownedContacts, ...commercial, ...owners, ...directory].map((c) => {
-      const lr = c.name || c.firm ? liGraph.rel(c.name, c.firm) : { any: false, label: null };
+      const lr = (isAdmin && (c.name || c.firm)) ? liGraph.rel(c.name, c.firm) : { any: false, label: null };
       return {
       ...c,
       // LinkedIn relationship (strongest signal drives the green highlight + badge)

← d1e51c25 auto-data-snapshot: 2026-08-12T18:36:17 (8 data files) — dat  ·  back to Rentv  ·  5x sweep 1: cap CRM render at 400 rows (was rendering all 5, 34e4fb84 →