From a2e00299c3b307b11a88dfd18319fb35c85841dd Mon Sep 17 00:00:00 2001 From: Robert Wiggins Date: Sat, 2 Aug 2025 08:16:26 +0100 Subject: [PATCH 1/2] Update extension to Manifest V3 for Chrome Web Store compliance - Update manifest_version from 2 to 3 - Replace browser_action with action - Convert background script to service worker - Update chrome.browserAction API calls to chrome.action - Move broad permissions to host_permissions for better security - Add all required icon sizes (16, 32, 48, 96, 128) - Add activeTab permission for enhanced security These changes ensure the extension meets current Chrome Web Store requirements and will pass the review process for new submissions. --- background-script.js | 4 ++-- manifest.json | 25 +++++++++++++++++++------ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/background-script.js b/background-script.js index 2fb6884..bdc8c82 100644 --- a/background-script.js +++ b/background-script.js @@ -26,7 +26,7 @@ function get_ios_id(uri) { } function update_color() { - chrome.browserAction.setIcon({ path: "res/images/FF_ext_icon_" + color + ".svg" }); + chrome.action.setIcon({ path: "res/images/FF_ext_icon_" + color + ".svg" }); } function getTab() { @@ -87,7 +87,7 @@ function get_domain_info(urlStr) { color = "orange" } - chrome.browserAction.setIcon({ path: "res/images/FF_ext_icon_" + color + ".svg" }); + chrome.action.setIcon({ path: "res/images/FF_ext_icon_" + color + ".svg" }); return { programs: programs, security_txt: security_txt, color: color, last_programs_update: CACHE.last_programs_update, lax: lax } } diff --git a/manifest.json b/manifest.json index ea1a526..5261132 100644 --- a/manifest.json +++ b/manifest.json @@ -1,30 +1,43 @@ { - "manifest_version": 2, + "manifest_version": 3, "name": "YesWeHack VDP Finder", "version": "1.1.2", "description": "This extension tells if visited sites have vulnerability disclosure programs", "homepage_url": "https://github.com/yeswehack/yeswehack_vdp_finder", "icons": { + "16": "res/images/icon-48.png", + "32": "res/images/icon-48.png", "48": "res/images/FF_ext_icon_red-48.png", - "96": "res/images/FF_ext_icon_red-96.png" + "96": "res/images/FF_ext_icon_red-96.png", + "128": "res/images/FF_ext_icon_red-128.png" }, - "browser_action": { + "action": { "default_title": "YesWeHack VDP Finder", "default_popup": "popup.html", "default_icon": { + "16": "res/images/icon-48.png", + "32": "res/images/icon-48.png", "48": "res/images/FF_ext_icon_gray-48.png", - "96": "res/images/FF_ext_icon_gray-96.png" + "96": "res/images/FF_ext_icon_gray-96.png", + "128": "res/images/FF_ext_icon_red-128.png" } }, "background": { - "scripts": ["background-script.js"] + "service_worker": "background-script.js" }, "permissions": [ "tabs", - "" + "activeTab" + ], + + "host_permissions": [ + "https://firebounty.com/*", + "https://publicsuffix.org/*", + "https://*/*", + "http://*/*" ] } From 95fb28e70d8ed96967e7110bfc93d4294b109e00 Mon Sep 17 00:00:00 2001 From: Robert Wiggins Date: Wed, 10 Dec 2025 00:15:30 +0000 Subject: [PATCH 2/2] Fix icon errors and improve security.txt detection for sites with SSL issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace SVG icons with PNG to fix Chrome Web Store decode errors - Add content script to fetch security.txt in page context, bypassing service worker SSL restrictions - Improve error handling with detailed logging for SSL/certificate and network errors - Fix TypeError when tab or tab.url is undefined on special pages - Generate missing PNG icon files for green, orange, and yellow status indicators This allows the extension to properly detect security.txt files on sites with certificate warnings that users have accepted, such as IP-based HTTPS connections. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- background-script.js | 95 +++++++++++++++++++++----- content-script.js | 69 +++++++++++++++++++ manifest.json | 8 ++- popup.js | 9 ++- res/images/FF_ext_icon_green-128.png | Bin 0 -> 4127 bytes res/images/FF_ext_icon_green-48.png | Bin 0 -> 1311 bytes res/images/FF_ext_icon_green-96.png | Bin 0 -> 2832 bytes res/images/FF_ext_icon_orange-128.png | Bin 0 -> 5104 bytes res/images/FF_ext_icon_orange-48.png | Bin 0 -> 1739 bytes res/images/FF_ext_icon_orange-96.png | Bin 0 -> 3610 bytes res/images/FF_ext_icon_yellow-128.png | Bin 0 -> 4547 bytes res/images/FF_ext_icon_yellow-48.png | Bin 0 -> 1486 bytes res/images/FF_ext_icon_yellow-96.png | Bin 0 -> 3211 bytes 13 files changed, 162 insertions(+), 19 deletions(-) create mode 100644 content-script.js create mode 100644 res/images/FF_ext_icon_green-128.png create mode 100644 res/images/FF_ext_icon_green-48.png create mode 100644 res/images/FF_ext_icon_green-96.png create mode 100644 res/images/FF_ext_icon_orange-128.png create mode 100644 res/images/FF_ext_icon_orange-48.png create mode 100644 res/images/FF_ext_icon_orange-96.png create mode 100644 res/images/FF_ext_icon_yellow-128.png create mode 100644 res/images/FF_ext_icon_yellow-48.png create mode 100644 res/images/FF_ext_icon_yellow-96.png diff --git a/background-script.js b/background-script.js index bdc8c82..717d6fd 100644 --- a/background-script.js +++ b/background-script.js @@ -26,7 +26,13 @@ function get_ios_id(uri) { } function update_color() { - chrome.action.setIcon({ path: "res/images/FF_ext_icon_" + color + ".svg" }); + chrome.action.setIcon({ + path: { + "48": "res/images/FF_ext_icon_" + color + "-48.png", + "96": "res/images/FF_ext_icon_" + color + "-96.png", + "128": "res/images/FF_ext_icon_" + color + "-128.png" + } + }); } function getTab() { @@ -87,7 +93,13 @@ function get_domain_info(urlStr) { color = "orange" } - chrome.action.setIcon({ path: "res/images/FF_ext_icon_" + color + ".svg" }); + chrome.action.setIcon({ + path: { + "48": "res/images/FF_ext_icon_" + color + "-48.png", + "96": "res/images/FF_ext_icon_" + color + "-96.png", + "128": "res/images/FF_ext_icon_" + color + "-128.png" + } + }); return { programs: programs, security_txt: security_txt, color: color, last_programs_update: CACHE.last_programs_update, lax: lax } } @@ -218,15 +230,35 @@ async function check_security_txt(urlStr, force_update) { for (let i = 0; i < SECURITY_TXT_PATHS.length; ++i) { const path = SECURITY_TXT_PATHS[i] const security_txt_url = `${protocol}//${hostname}${path}` - const content = await fetch(security_txt_url, { cache: 'no-cache', redirect: 'manual' }) - .then(r => r.status == 200 && r.text()) - .then(txt => txt && !txt.startsWith("<") && txt) - if (content) { - /* update and stop if found */ - CACHE.security_txt[hostname].content = content - CACHE.security_txt[hostname].url = security_txt_url - CACHE.security_txt[hostname].found = true - return + + try { + const response = await fetch(security_txt_url, { cache: 'no-cache', redirect: 'follow' }) + + if (response.ok) { + const content = await response.text() + + // Check if content looks like security.txt (not HTML) + if (content && content.trim().length > 0 && !content.trim().startsWith(" { getTab().then(tab => { - check_security_txt(tab.url, false).then(_ => { - get_domain_info(tab.url) - }) + if (tab && tab.url) { + check_security_txt(tab.url, false).then(_ => { + get_domain_info(tab.url) + }) + } }) }); chrome.tabs.onActivated.addListener(_ => { getTab().then(tab => { - check_security_txt(tab.url, false).then(_ => { - get_domain_info(tab.url) - }) + if (tab && tab.url) { + check_security_txt(tab.url, false).then(_ => { + get_domain_info(tab.url) + }) + } }) }); @@ -269,6 +305,31 @@ chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { case "GET_DOMAIN_INFO": sendResponse(get_domain_info(request.data)) break; + case "SECURITY_TXT_RESULT": + // Handle security.txt result from content script + if (request.data && request.data.hostname) { + CACHE.security_txt[request.data.hostname] = { + last_update: new Date(), + content: request.data.content || "", + url: request.data.url || "", + found: request.data.found || false + }; + console.log(`[VDP Finder] Security.txt cache updated for ${request.data.hostname}: ${request.data.found ? 'found' : 'not found'}`); + + // Update icon if this is the active tab + if (sender.tab) { + chrome.tabs.query({ active: true, currentWindow: true }, tabs => { + if (tabs[0] && tabs[0].id === sender.tab.id) { + get_domain_info(sender.tab.url); + } + }); + } + } + break; + case "CHECK_SECURITY_TXT": + // Request from content script (handled by content script itself) + sendResponse({ received: true }); + break; default: console.error(`Unhandled message "${request.msg}"`) break; diff --git a/content-script.js b/content-script.js new file mode 100644 index 0000000..02baf43 --- /dev/null +++ b/content-script.js @@ -0,0 +1,69 @@ +// Content script runs in page context and can bypass SSL warnings user has accepted + +const SECURITY_TXT_PATHS = ['/.well-known/security.txt', '/security.txt']; + +async function fetchSecurityTxt() { + const protocol = window.location.protocol; + const hostname = window.location.hostname; + + // Only check HTTP/HTTPS pages + if (!["http:", "https:"].includes(protocol)) { + return null; + } + + for (const path of SECURITY_TXT_PATHS) { + const security_txt_url = `${protocol}//${hostname}${path}`; + + try { + const response = await fetch(security_txt_url, { + cache: 'no-cache', + redirect: 'follow', + credentials: 'omit' // Don't send cookies for security.txt + }); + + if (response.ok) { + const content = await response.text(); + + // Check if content looks like security.txt (not HTML) + if (content && + content.trim().length > 0 && + !content.trim().startsWith(" { + if (request.msg === "CHECK_SECURITY_TXT") { + fetchSecurityTxt().then(sendResponse); + return true; // Will respond asynchronously + } +}); + +// Also check on page load and notify background +fetchSecurityTxt().then(result => { + if (result) { + chrome.runtime.sendMessage({ + msg: "SECURITY_TXT_RESULT", + data: result + }); + } +}); diff --git a/manifest.json b/manifest.json index 5261132..97fcc19 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "YesWeHack VDP Finder", - "version": "1.1.2", + "version": "1.1.6", "description": "This extension tells if visited sites have vulnerability disclosure programs", "homepage_url": "https://github.com/yeswehack/yeswehack_vdp_finder", @@ -29,6 +29,12 @@ "service_worker": "background-script.js" }, + "content_scripts": [{ + "matches": ["http://*/*", "https://*/*"], + "js": ["content-script.js"], + "run_at": "document_idle" + }], + "permissions": [ "tabs", "activeTab" diff --git a/popup.js b/popup.js index 978fb06..c7f21b4 100644 --- a/popup.js +++ b/popup.js @@ -63,6 +63,11 @@ function update_content(domain_info) { document.addEventListener("DOMContentLoaded", _ => { getTab().then(tab => { + if (!tab || !tab.url) { + $("#domain-host").innerText = "N/A"; + return; + } + const url = new URL(tab.url) $("#domain-host").innerText = url.hostname; @@ -88,5 +93,7 @@ function getTab() { /* on open */ getTab().then(tab => { - chrome.runtime.sendMessage({ msg: "GET_DOMAIN_INFO", data: tab.url }, update_content); + if (tab && tab.url) { + chrome.runtime.sendMessage({ msg: "GET_DOMAIN_INFO", data: tab.url }, update_content); + } }) diff --git a/res/images/FF_ext_icon_green-128.png b/res/images/FF_ext_icon_green-128.png new file mode 100644 index 0000000000000000000000000000000000000000..a15edba64a27600454a16eb858da0493ba76aece GIT binary patch literal 4127 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 literal 0 HcmV?d00001 diff --git a/res/images/FF_ext_icon_green-48.png b/res/images/FF_ext_icon_green-48.png new file mode 100644 index 0000000000000000000000000000000000000000..39735a87e6e66f77a2e8144e922a1077c05e56d7 GIT binary patch literal 1311 zcmV+)1>pLLP)qDSlK*Tb6K-X3T6nVCKQ z7sH-Cd#!K%*V^BFx0wOW;#kbVd>n^K+4Vp1BR1ko>}qPlfj-B#umm?_Hjc+Mj4$ZF z7dx>7+wlzE!GS(`RK^sn##Zb>)I9cNGFE3Y4?704$-XX4@>*d|slH#~@obL6g3F}c z+FzPHVY2X*u((wJ{n&!VO%iWmC59>y?>?3b|CC-tWOF^H|9jMtcpdv{lP4?@Lf9po zQhMB8tj##oCjTx*`XW!bBwIiTuU8s7l5wcKhylFX2zkQoT?+`|^va8PLsI3^SgBvN z=|0wtTEMc(GWJUML@6wiyk;}x7YGMNE#S>svW6r}*b{@2sceS)MB$53OO7kA?U1~4 ze{-xFO}?cm-9JhAxq$qBVNoNSwACoHdb$3h%5+Q+J}V#}!d=3kaHVjcaCYsvb{l1p zUTkFd*YqI2Ot?b$LD(#u*7tlbbT8o3zR92KPaoP6`wPzZQX_(W(`It~k z#F@AbGZZI;JEY*GjbCcbl!rl_*TT%&B9>;K6MOWT>)>E`M%Ve7wP$YQ_?A=(sfSB3 zU8i`GhXpxf+9*=H@|apF#y$uwoFZiobMaS?e%-hYCuQeX>pO*Ssas?^LMLOrUrIU3 zU=m)&(Rg2lC_fiFTlk^Y(0`-|on*sKkV3&SIA3y|D{wt-t;K+3B3!6y7;$Cx`Qj*> zzpaNe%WG?ddxT+OUS&V92NzJ)kzJ*em@lkAwx}(XsukOXN!1-$`>!Y;N_;9so5u(P z!ux$L;3+A=3E{~~3)n=*Mr<#oakC};osLH`F?V3N)aYWFZ8LH!W|bbfoz4QDEk)z3 zuJff*a`!DBEIsL=*n!it^KrPT)Tljpy8A-8gyyy!71$`8?9kFl*><0l=(Jn8eEI)` zru`2bz=vb5``?^v^YICukW%g{cna4z*x8jUvVS1wnZgufCG{8e*vXHDk1Fi^knmm3 z^|!{{{cXC!pYFB)j<=<JdM{cq`P)NR3d7ZHya7>r%Wx3dHvb&kM5($v5_puN#XcGnTJX6Q!#2I^pje(nC^#>t0Fy zidAL{7B)$|8{?%AZd(C?&M{LsRX9VKGDhEyhh3qBoo@oiYUWjg-Ii~_(lqe*X!eDk4A42DaAWY=XIO*uI`dZZ<1cO`J<@`{{te( VO~8zy&V2v?002ovPDHLkV1fe(kg@;( literal 0 HcmV?d00001 diff --git a/res/images/FF_ext_icon_green-96.png b/res/images/FF_ext_icon_green-96.png new file mode 100644 index 0000000000000000000000000000000000000000..40e83bf2a79d7c1262966bb7db5cc531570bc349 GIT binary patch literal 2832 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 literal 0 HcmV?d00001 diff --git a/res/images/FF_ext_icon_orange-96.png b/res/images/FF_ext_icon_orange-96.png new file mode 100644 index 0000000000000000000000000000000000000000..2b6701ed1c98dbb74bf3953688e3def3fe373519 GIT binary patch literal 3610 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 literal 0 HcmV?d00001 diff --git a/res/images/FF_ext_icon_yellow-128.png b/res/images/FF_ext_icon_yellow-128.png new file mode 100644 index 0000000000000000000000000000000000000000..9dcfd46d2443ce2380a71f31639883ec5dfb6b70 GIT binary patch literal 4547 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 literal 0 HcmV?d00001 diff --git a/res/images/FF_ext_icon_yellow-48.png b/res/images/FF_ext_icon_yellow-48.png new file mode 100644 index 0000000000000000000000000000000000000000..8c76f950822d7fa04426479b0e56ffc2a011bb5c GIT binary patch literal 1486 zcmV;<1u^=GP)f4fn$YSfK>1NVU;Ky1oTWQ@a+F+Vzd5oLc`CAo1U zvT&iLwvT`xB04?_zCdSd#433}a&wVKkC5tWOYKL1dqB0D#JxZ>(3c7EL}_Y5-oLkO zghX^5#Q8hQMBoDO&MtXCYHAP>WMBX(F1Fk+1hhps*e3rw5OzWykkzZz01@QEg^c=! zBOEd|!UO!`26;fXZHpTqf|QhGY{W%$DO*M}4wp@$baae0ps_LIF+%7&VF^{J*K~z^ zMFlcCI@W;pc3Wfhp*vwp_|UD=74kVb$is(Y$%`OeUAD)(hq;#r)JbKu&!>_TCz8pF zAZ=~7#|)#(+Yq^^H*|%3eZ4Vx5oG&zM`H&t2|EtEMSj&PbzDZ|gF*Gq4s{$FPu`15 zYrm)ndGW%S{KyDWRprVg-Dljk`X$byN&#f@WTd;>eCh1if%tq#Z7tH!fGk~VTi090 z?MP?bnEjR(bMlRi$lA5Yvu8+853*o^V|}L+4Y=!+{PN|=`+Zc-pVt{59Yy;4k^FpD zmeHLk`CQ;{y8~rsYrKE*q%rwW2-&Oy0uS-kqYK~!s7cGU@!kRTuPyl|vd7Fxg_m9IP+SZikIwSopn1DQ)YU;zkzTJ~4?c$}yce5ArU?_2JiwkkaPgwGettikI|oyy zKxZc$v>fFdq90%vHg|&F-uUiv{W=l|m^-rZ(%!EA;MFT+>sH%4(KldY8?CL?-!o^% zk_rUOotcrev>>~7A;ZH+Sy{&9hkzB3p(9(jE}ocIR$3=(CY6<1t$6$x@%!yLGRPp5 zxO-Ql&8brnj|b`ObY?(nt0p)i$noPD84wF4z+x~rZ(dySv19sd{(NL;$i4wruf{XC za2T08*RlbpAs$ozgu3RGSh6I3U0)B)&G6(2?Aw>Fr#XT_C@InFtSs2F#ZtE+;6&mB zO9@R~UGfZebs=-+B$rOCN<)JtI?;QJ`Eo3wiT(#hf$Qna{_r9BS$R3!z70o@LO5(` z_F`ylg$*0VIyf^CoiRhV_~6>qDMCHI80WaX^#$Soo9Z z=>GwJMawFN=HYl;r!!;KRp3w4iD@*#7ApTKaP8i$%g=;(IHIG{P2!2jM(gtd69O@rIa4Fm#fy==JWKIS0QepY z`@9>NhC4?M-bThagw5)R8;3orfUkjK^n^-2=Entw(L}r#_zMk*FXP~_hpR6Mn&K@W oe%vNHs{<(MJLqwnf8A2}Kf6JZC||P~`~Uy|07*qoM6N<$g2-diw*UYD literal 0 HcmV?d00001 diff --git a/res/images/FF_ext_icon_yellow-96.png b/res/images/FF_ext_icon_yellow-96.png new file mode 100644 index 0000000000000000000000000000000000000000..e16bc484d390aeadf9e23c268ceef202d8d3d90c GIT binary patch literal 3211 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