From 35e9f7e812188fecb22659f321718d57669ef85f Mon Sep 17 00:00:00 2001 From: Michael Freno Date: Sun, 10 May 2026 11:53:25 -0400 Subject: [PATCH] Fix 4 P1 and 2 P2 code review findings for FRE-4576 P1 fixes: - Fix import paths in background/index.ts (./ -> ../lib/) - Fix Promise-in-string bug in api-client.ts authenticate() - Add missing background/service_worker key to manifest - Copy HTML to public/ so Vite places them in dist P2 fixes: - Add notifications permission to manifest - Make showWarningNotification async with proper await Co-Authored-By: Paperclip --- packages/extension/public/manifest.json | 6 +- packages/extension/public/options.html | 189 ++++++++++++++ packages/extension/public/popup.html | 271 +++++++++++++++++++++ packages/extension/src/background/index.ts | 30 ++- packages/extension/src/lib/api-client.ts | 3 +- 5 files changed, 481 insertions(+), 18 deletions(-) create mode 100644 packages/extension/public/options.html create mode 100644 packages/extension/public/popup.html diff --git a/packages/extension/public/manifest.json b/packages/extension/public/manifest.json index 9bf9d6a..679f598 100644 --- a/packages/extension/public/manifest.json +++ b/packages/extension/public/manifest.json @@ -3,12 +3,16 @@ "name": "ShieldAI - Phishing & Spam Protection", "version": "0.1.0", "description": "Real-time phishing detection and spam protection powered by ShieldAI", + "background": { + "service_worker": "background.js" + }, "permissions": [ "activeTab", "storage", "tabs", "scripting", - "declarativeNetRequest" + "declarativeNetRequest", + "notifications" ], "host_permissions": [ "https://*/*", diff --git a/packages/extension/public/options.html b/packages/extension/public/options.html new file mode 100644 index 0000000..fbac82f --- /dev/null +++ b/packages/extension/public/options.html @@ -0,0 +1,189 @@ + + + + + + ShieldAI Options + + + +

🛡️ ShieldAI Options

+

Configure your phishing & spam protection

+ +
+
Connection
+
+ + +
+
+ + +
+
+ +
+
Protection Settings
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
Blocked Domains
+
    +
    + + +
    +
    + +
    +
    Allowed Domains (Whitelist)
    +
      +
      + + +
      +
      + +
      + + +
      + +
      Settings saved!
      + + + + diff --git a/packages/extension/public/popup.html b/packages/extension/public/popup.html new file mode 100644 index 0000000..29afc1e --- /dev/null +++ b/packages/extension/public/popup.html @@ -0,0 +1,271 @@ + + + + + + ShieldAI Protection + + + + + + + + + + diff --git a/packages/extension/src/background/index.ts b/packages/extension/src/background/index.ts index 1abe98d..b6eda8a 100644 --- a/packages/extension/src/background/index.ts +++ b/packages/extension/src/background/index.ts @@ -1,8 +1,8 @@ -import { UrlCheckResult, UrlVerdict, ThreatInfo, BackgroundMessage, MessageType, SubscriptionTier, PhishingReport } from '../types'; -import { urlCache, CACHE_TTL } from './cache'; -import { phishingDetector } from './phishing-detector'; -import { settingsManager } from './settings'; -import { shieldApiClient } from './api-client'; +import { UrlCheckResult, UrlVerdict, ThreatInfo, BackgroundMessage, MessageType, SubscriptionTier, PhishingReport, ExtensionSettings } from '../types'; +import { urlCache, CACHE_TTL } from '../lib/cache'; +import { phishingDetector } from '../lib/phishing-detector'; +import { settingsManager } from '../lib/settings'; +import { shieldApiClient } from '../lib/api-client'; let threatsBlockedToday = 0; let urlsCheckedToday = 0; @@ -140,17 +140,15 @@ async function showBlockedPage(tabId: number, url: string): Promise { await chrome.tabs.update(tabId, { url: blockedUrl }); } -function showWarningNotification(result: UrlCheckResult): void { - const showNotif = settingsManager.get().then(s => s.showNotifications); - Promise.resolve(showNotif).then((enabled) => { - if (!enabled) return; - chrome.notifications.create({ - type: 'basic', - iconUrl: 'icons/icon48.png', - title: 'ShieldAI Warning', - message: `${result.verdict.toUpperCase()}: ${result.domain}`, - priority: result.verdict === UrlVerdict.PHISHING ? 2 : 0, - }); +async function showWarningNotification(result: UrlCheckResult): Promise { + const settings = await settingsManager.get(); + if (!settings.showNotifications) return; + await chrome.notifications.create({ + type: 'basic', + iconUrl: 'icons/icon48.png', + title: 'ShieldAI Warning', + message: `${result.verdict.toUpperCase()}: ${result.domain}`, + priority: result.verdict === UrlVerdict.PHISHING ? 2 : 0, }); } diff --git a/packages/extension/src/lib/api-client.ts b/packages/extension/src/lib/api-client.ts index b694eca..c368bfc 100644 --- a/packages/extension/src/lib/api-client.ts +++ b/packages/extension/src/lib/api-client.ts @@ -88,7 +88,8 @@ export class ShieldApiClient { async authenticate(apiKey: string): Promise<{ userId: string; tier: SubscriptionTier } | null> { try { - const response = await fetch(`${settingsManager.get().then(s => s.apiBaseUrl)}/extension/auth`, { + const settings = await settingsManager.get(); + const response = await fetch(`${settings.apiBaseUrl}/extension/auth`, { method: 'POST', headers: { 'Content-Type': 'application/json',