From 22db65d1091de78962593e5a8ba8162ce3fdc183 Mon Sep 17 00:00:00 2001 From: robin Date: Thu, 18 Dec 2025 16:29:16 +0100 Subject: [PATCH] chore: security hardening, mobile PWA fix & analysis expansion - Applied strict RLS and auth validation to tracking/credit services - Set Service Worker to Network First to fix mobile session/loading issues - Expanded Gemini analysis summary to show distilled/bottled/batch info - Updated SQL schema document with hardening policies --- public/sw.js | 11 ++++++++--- src/middleware.ts | 10 +++++++++- src/services/credit-service.ts | 35 ++++++++++++++++++++++++++++++++- src/services/track-api-usage.ts | 7 +++++++ supa_schema.sql | 18 +++++++++++++---- 5 files changed, 72 insertions(+), 9 deletions(-) diff --git a/public/sw.js b/public/sw.js index d864183..71feb1e 100644 --- a/public/sw.js +++ b/public/sw.js @@ -30,9 +30,14 @@ self.addEventListener('activate', (event) => { }); self.addEventListener('fetch', (event) => { + // Network first, fallback to cache event.respondWith( - caches.match(event.request).then((response) => { - return response || fetch(event.request); - }) + fetch(event.request) + .then((response) => { + return response; + }) + .catch(() => { + return caches.match(event.request); + }) ); }); diff --git a/src/middleware.ts b/src/middleware.ts index fc95433..d2d84c5 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -4,12 +4,20 @@ import type { NextRequest } from 'next/server'; export async function middleware(req: NextRequest) { const res = NextResponse.next(); + const url = new URL(req.url); + + // Skip logs for static assets + const isStatic = url.pathname.startsWith('/_next') || url.pathname.includes('/icon-') || url.pathname === '/favicon.ico'; // Only attempt session refresh if variables are present if (process.env.NEXT_PUBLIC_SUPABASE_URL && process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY) { try { const supabase = createMiddlewareClient({ req, res }); - await supabase.auth.getSession(); + const { data: { session } } = await supabase.auth.getSession(); + + if (!isStatic) { + console.log(`[Middleware] Path: ${url.pathname}, Session: ${session ? 'Active' : 'Missing'}, User: ${session?.user?.id || 'N/A'}`); + } } catch (e) { console.error('Middleware session refresh failed:', e); } diff --git a/src/services/credit-service.ts b/src/services/credit-service.ts index a29d6f5..0cfd7c2 100644 --- a/src/services/credit-service.ts +++ b/src/services/credit-service.ts @@ -3,6 +3,8 @@ import { createServerComponentClient } from '@supabase/auth-helpers-nextjs'; import { cookies } from 'next/headers'; +import { checkIsAdmin } from './track-api-usage'; + interface UserCredits { user_id: string; balance: number; @@ -34,6 +36,17 @@ export async function getUserCredits(userId: string): Promise