From e1a6e6fd5eba60be959a60bcdd21bf1e2c31b63f Mon Sep 17 00:00:00 2001 From: Kenneth Hendricks <50819541+kenhendricks00@users.noreply.github.com> Date: Wed, 16 Oct 2024 21:05:49 -0400 Subject: [PATCH] Add files via upload --- firefox_addon_image.png | Bin 0 -> 7408 bytes js/background.js | 123 +++++++++++++++++++++++++++++++ manifest.json | 26 +++++++ pub/index.html | 93 +++++++++++++++++++++++ pub/index.js | 45 +++++++++++ res/ext_icon_144.png | Bin 0 -> 8146 bytes res/icons/potentially_unsafe.png | Bin 0 -> 1026 bytes res/icons/safe.png | Bin 0 -> 1990 bytes res/icons/unsafe.png | Bin 0 -> 1273 bytes 9 files changed, 287 insertions(+) create mode 100644 firefox_addon_image.png create mode 100644 js/background.js create mode 100644 manifest.json create mode 100644 pub/index.html create mode 100644 pub/index.js create mode 100644 res/ext_icon_144.png create mode 100644 res/icons/potentially_unsafe.png create mode 100644 res/icons/safe.png create mode 100644 res/icons/unsafe.png diff --git a/firefox_addon_image.png b/firefox_addon_image.png new file mode 100644 index 0000000000000000000000000000000000000000..2c920b1d080d3379f4eb8431f8e9664d450ca306 GIT binary patch literal 7408 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 i^r~_qjs>uZ>;D76V`+b4qs%t|0000 response.text()) + .then((text) => { + console.log("Filter list fetched successfully!"); + const lines = text.split("\n"); + let isPotentiallyUnsafeSection = false; // Track whether we're in the "potentially unsafe" section + + lines.forEach((line) => { + // Ignore comments and blank lines + if (line.startsWith("#")) { + if (line.includes("not recommended/potentially unsafe")) { + isPotentiallyUnsafeSection = true; + } + } else if (line.trim()) { + const domain = line.trim(); // Trim whitespace + if (isPotentiallyUnsafeSection) { + potentiallyUnsafeSites.push(domain); // Add to potentially unsafe sites + } else { + unsafeSites.push(domain); // Add to unsafe sites + } + } + }); + console.log("Parsed Unsafe Sites:", unsafeSites); // Check if unsafe sites are populated + console.log("Parsed Potentially Unsafe Sites:", potentiallyUnsafeSites); // Check potentially unsafe sites + }) + .catch((error) => console.error("Error fetching filter list:", error)); +} + +// Update the toolbar icon based on the site's status +function updateIcon(status, tabId) { + let iconPath = "res/ext_icon_144.png"; // Default extension icon for unknown sites + + if (status === "safe") { + iconPath = "res/icons/safe.png"; // Icon for safe sites + } else if (status === "unsafe") { + iconPath = "res/icons/unsafe.png"; // Icon for unsafe sites + } else if (status === "potentially_unsafe") { + iconPath = "res/icons/potentially_unsafe.png"; // Icon for potentially unsafe sites + } + + browser.browserAction.setIcon({ + path: iconPath, + tabId: tabId, + }); +} + +// Check the site status for a given tab and URL +function checkSiteAndUpdateIcon(tabId, url) { + if (!url) return; + + const currentUrl = new URL(url).hostname.replace("www.", ""); + console.log("Checking site status for toolbar icon:", currentUrl); + + // Check if the site is unsafe or potentially unsafe + let isUnsafe = unsafeSites.some((site) => currentUrl.includes(site)); + let isPotentiallyUnsafe = potentiallyUnsafeSites.some((site) => + currentUrl.includes(site) + ); + + if (isUnsafe) { + console.log("Updating toolbar icon to unsafe for:", currentUrl); + updateIcon("unsafe", tabId); // Update the toolbar icon to unsafe + } else if (isPotentiallyUnsafe) { + console.log("Updating toolbar icon to potentially unsafe for:", currentUrl); + updateIcon("potentially_unsafe", tabId); // Update the toolbar icon to potentially unsafe + } else { + console.log("No data for this site:", currentUrl); + updateIcon("default", tabId); // Use default extension icon for unknown sites + } +} + +// Listen for messages from the popup +browser.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (message.action === "checkSiteStatus") { + const currentUrl = message.url; + console.log("Checking site status for popup:", currentUrl); + + // Check if the site is unsafe or potentially unsafe + let isUnsafe = unsafeSites.some((site) => currentUrl.includes(site)); + let isPotentiallyUnsafe = potentiallyUnsafeSites.some((site) => + currentUrl.includes(site) + ); + + if (isUnsafe) { + sendResponse({ status: "unsafe", url: currentUrl }); + } else if (isPotentiallyUnsafe) { + sendResponse({ status: "potentially_unsafe", url: currentUrl }); + } else { + console.log("No data for this site:", currentUrl); + sendResponse({ status: "no_data", url: currentUrl }); // Return no data status + } + } + return true; // Indicates we will respond asynchronously +}); + +// Listen for when a tab is updated (e.g., new URL loaded) +browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { + if (changeInfo.status === "complete" && tab.url) { + checkSiteAndUpdateIcon(tabId, tab.url); + } +}); + +// Listen for when a tab is activated (e.g., tab switched) +browser.tabs.onActivated.addListener((activeInfo) => { + browser.tabs.get(activeInfo.tabId, (tab) => { + if (tab.url) { + checkSiteAndUpdateIcon(tab.id, tab.url); + } + }); +}); + +// Fetch the filter list when the extension is loaded +fetchFilterList(); diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..1cf48ac --- /dev/null +++ b/manifest.json @@ -0,0 +1,26 @@ +{ + "manifest_version": 2, + "name": "FMHY SafeGuard", + "version": "1.0.0", + "icons": { + "128": "res/ext_icon_144.png" + }, + "browser_action": { + "default_icon": { + "128": "res/ext_icon_144.png" + }, + "default_popup": "pub/index.html" + }, + "permissions": [ + "activeTab", + "", + "webRequest", + "webRequestBlocking", + "storage", + "notifications" + ], + "background": { + "scripts": ["js/background.js"], + "persistent": true + } +} diff --git a/pub/index.html b/pub/index.html new file mode 100644 index 0000000..4d9bdc9 --- /dev/null +++ b/pub/index.html @@ -0,0 +1,93 @@ + + + + + + FMHY SafeGuard + + + +
+

FMHY SafeGuard

+
+ +
+ + Status Icon + +

Checking site status...

+
+ + +

+ + + + + + diff --git a/pub/index.js b/pub/index.js new file mode 100644 index 0000000..be8879f --- /dev/null +++ b/pub/index.js @@ -0,0 +1,45 @@ +document.addEventListener('DOMContentLoaded', function() { + console.log("Popup loaded, attempting to get site status..."); + + const statusIcon = document.getElementById('status-icon'); + const statusMessage = document.getElementById('status-message'); + const errorMessage = document.getElementById('error-message'); + + // Query the active tab to get its URL + browser.tabs.query({active: true, currentWindow: true}, function(tabs) { + if (tabs.length === 0) { + console.error("No active tab found."); + statusMessage.textContent = "Error: No active tab found."; + return; + } + + const currentUrl = new URL(tabs[0].url).hostname.replace('www.', ''); + console.log("Sending message to background to check site status for:", currentUrl); + + // Send a message to the background script to check the site's status + browser.runtime.sendMessage({action: "checkSiteStatus", url: tabs[0].url}, function(response) { + if (!response) { + console.error("No response from background script."); + statusMessage.textContent = "Error: Could not retrieve site status."; + return; + } + + if (response.status === "unsafe") { + console.log("Popup: Site is unsafe:", currentUrl); + // Update popup for unsafe site + statusIcon.src = '../res/icons/unsafe.png'; // Update icon to unsafe + statusMessage.textContent = `${currentUrl} is unsafe. Be cautious!`; // Update message + } else if (response.status === "potentially_unsafe") { + console.log("Popup: Site is potentially unsafe:", currentUrl); + // Update popup for potentially unsafe site + statusIcon.src = '../res/icons/potentially_unsafe.png'; // Update icon to potentially unsafe + statusMessage.textContent = `${currentUrl} is potentially unsafe. Be cautious!`; // Update message + } else if (response.status === "no_data") { + console.log("Popup: No data for this site:", currentUrl); + // Update popup for no data + statusIcon.src = '../res/ext_icon_144.png'; // Default extension icon + statusMessage.textContent = "There is no data for this site yet."; // Update message for no data + } + }); + }); +}); diff --git a/res/ext_icon_144.png b/res/ext_icon_144.png new file mode 100644 index 0000000000000000000000000000000000000000..f0d4f7462305bea9a6a45a536a436b5eecf2722a GIT binary patch literal 8146 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 literal 0 HcmV?d00001 diff --git a/res/icons/potentially_unsafe.png b/res/icons/potentially_unsafe.png new file mode 100644 index 0000000000000000000000000000000000000000..8caa947a38853daa9396659891d40c3f78fe61c3 GIT binary patch literal 1026 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9F3${@^GvDChdfq{98 zr;B4q#hkadHu_5?${hPRzhHv3VcdsFlN1US8XH}%8BM!-H8ea-{6G7D_UmPDUv*8s zcyh`?$4Pu{y|ZF;d%yVEY-qMz8v226)$!AxYs{4QRDS&a^j@{Mok{NVe;2B z^F6XQT79w#3^Ze?|M9phvu(!F(wWgwoPY1^$UB+yE%QaOxAr8xt8RQoTwZJwOt>4{ z?th+hAbXkE>V3uVMzxbYuL|S3(gPCt*-ko0mKAzpq ze3_)t?6quGtF6~A+fk-m;xRWYcwPTC<~@^6E(iey(#xQ?NAK@7`%{12u={o6`B(Fv zvsC4rFFs;-hpY69i|@+n2EWysYagFK|L?%uFyjv&{vN;G9^JTKmdEPPeD~X4yzwp@ z8C+aqc7MG7p=zFR){lMjo}c)7aoe3aZ+iBs*Z(MgdwJvas{B)TS-Na^&)c8gz0USi z)Z5Lw?%bVos-~`ViGJ&@b-HUG>wED54XSR~E^?X2&}eGFefBNqUw!($XWgCD{qrY< zH*CM~StfJ-)uUUb7e%KU+SSy2?7C2zTllukBAh)rwo;9CJ%jTR6Xz}a&i}f5TRzzE zOWhtOo{OL7to(1!^wf^^!vCX#E73yoP(8yI!}kq;OcGB3Gc|*!tDnm{r-UW|@5-N# literal 0 HcmV?d00001 diff --git a/res/icons/safe.png b/res/icons/safe.png new file mode 100644 index 0000000000000000000000000000000000000000..9c51a933ffe05916d6f9c995297d4576bcca2a74 GIT binary patch literal 1990 zcmb`I={MV37sr1IA*d-0swi3|W};?liXlX5idDUav^AHs<{?U?hElgHhEhaL2_9Uf zhE|QCDDFecEgnM+MYPn|78mvW`r`fv_r*SY?X}lF>zuvM=X=r|@Yeji=Xn7D;K$lv zoIp?cWpFNV?Y(+)7<4@MY}~>CK<&~mgG4h;A_0Iq8jCS=iKc%oGQK}psk`(wE%z1<8=E{pTlgG&_CnAGuChsh7U-72#dJ}2hL<$OCYEVB# zO}3Y%+L<|x2|$DUA~0Vb?JgRR20FECNPi@6vfW~KXR;Gm@L|DWHK5V`I>5RK;Y@`I zNs5}@`*#D9N*fR&%e-8*uC&`~M5-WNEFSiX@ff~SISt2BVE3 zGRh$K?@JVKFvx0Ner-BIlPM8Fi{CcFh5Ou1+f8ml~6+wf6J zIDg5ii&5;h|I(410aHy3%rn5kbr8qmqTKT~&J>E^Z4gtJ?kZNBpw7$=Z;c zsi7;}hCn z!`u&fWtf+9Hgn9MYZb~@yGE?OH);&%2`XTF{8p0m#7RN)>HZ@s*7E|>#NCnI=?sC^~2-77=Fg=L$%tn zTZk#1f^v*KvADmOt>-(AshOijt*U<0f0RN89HCvWxO`A8hk3HPLP*iHBjaLsxlY_$ z9-)-+ic>;Ak3Iw(rdk_3jY=W9$*q6cA?BRsZ-EDZ%>KFW{8Hq7H>!pW?{@W} z(pZGm`);$(lm|VUwYdq3r>{56aq08>nNMEK&&_J4(=$W1D#_Q~+!AL(G!M`ZOOwK7 z6agU4;E=Q2U#7W$w?n77fLh`IPB)z4>a5ZO_lBK|6YoA6D6AS*U^4IK#>DttIF5hu zGCtYN6#(v;w5^33z9JuOV)mJ?&Zt=>qF)&IPyw`SE4z52NOTMe^bQsW$iW>ZkU?TC zqg!IZ=(KjAdz;xRC00;ona)#pQQ0SC|A)s$&?eEx2UbL~ez+HJh1U%^QfkDUtje>`bS?LVP6K zWo+Hz;>%PHF~elGzWTk`$nCGgQ_pbya9?+1lFPj-0c;>B8VBwt}h6X$&k z>qS=x$#06I6n_f_hhw4-cP<;u2{_gKCqFf1CF4xFKXE(aU?vCK4wUN!bAt!yJL>w# zVah074)IUt^07}md1)W%?TCUv!LsuSIwKrb5gtVbL>KVxN`>_|M6odxPRgZ+Va>?X|SF48Jor{U*fRb!e&o3x6n^D|1G? z$)6g$SWs39k`UJ}sWJQF!t6De=z?KJdVN%adg$*$Hm0yFW$MzK$Y3M#j!Nj!)xpx7 zNrbl$I|9X-u0%9_TId;3e}%6H&N{_7r!}b*4Vk-$63vgF3D$^s@-3rV z&)I4js&peUX}f+>zK{7tiM*(Yy&fW@LI#VK`$z1aQc;)gtE$II97TXst^Bb&JI=zH zBOz6_a`L+3R|*hTAl}-64SBLbRg*iCXzLG|)evfaD+R=fyuW|Tn4i&35Rh7Vgmwt` zkh#>opJj2*l7m}N@K%1Jb66n5c}P)JLO~Xklm1ms-Yh+P^j#B0$2~;8eKzj9pimm5 z%=fECIv1#ajR7OtVb(Do==_YZ*vc_I>&lZh&pL5paXVw@y)TK?J7J&5QNbo{Tx&r*TLfUKWitg#sYgvAny z^(_8Pey2nk8?xnfF6}Har^HUd&)Yve#a&)Zkxd(q92pP@n#BJ(886~}n}RwpK5Z}R zoVD(n9gUh^tfVPqV)!&3%c*YAVOevgzVY<{wHFE(;FHl)p)CB1!6`)BW=1WvWONVw Om;tOM9#dydr2Ze?LUFGE literal 0 HcmV?d00001 diff --git a/res/icons/unsafe.png b/res/icons/unsafe.png new file mode 100644 index 0000000000000000000000000000000000000000..dacf00392cd78df56d53b6183fb6a82dc7ade49c GIT binary patch literal 1273 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9F3${@^GvDChdfq`YU zr;B4q#hkZy_vZ_j%N+ZtZYx!lw`TGyGqq6Ozzt1ZEiFk(Vi9vD_9Q-PX9;Ez4t6_p zsNoO0L0UpfBjZHIO({-HEKWRpnK6l`OG@V+>zbOaGxyTLt|<&Vi?i+w-gp1S z@4!EO?{nO}?$7S*%;i{{e@M>Z&{BpInhZr;4Re?jmQ#~iuJMNPj!KawPwf78yPj{K zZO%L^O@IB(H${@#N0SUs_qu|Cq^>*T-vQ9d*IpX@WlQN>yNxx@p@OR9=nNWx{|De^&Yv74Hms_H+;vGVFBrtZ`ix% z&91yOBZHuo4a+h;pA;GRTrNF->`#ruT9KYKmMzAm|UXwiP2)Kl+@BmujO8!nR!5uxif|@P3`fn z^v{Re9nxO5onU8R=q-OAbDj6{k$!P~HY4w>qD!TBH|DOfuah~Ub6237;o5xL&v!mw zZsp!*&#m&g@=w9PJ+J5eIz4^gxeK`)ITErnIlo?CANyTmS?8HEJ^98GD@EGY#eBT8 zecy%$w|VM1Tp1VwX3ze7C%Ly*(bo3u>7O%aN}kWIUmVhP_Vj+)jhqR|b@x7}2{82e z_?DV7DNl8J_ANIeIeA|7|Ee!5vY)f5nlUoG{ol~< zZ~tG01fTvMkwbEeV$T*y9($m$?|ho=_d0WvmMc$Ge(7-kpLY7jwzu2Pdp`T@5x=)< zzJC0%?YT8~-rO*&(-(QLX6@Emw~#M;XU@36SKZNU5Tq%iFJ`;``25Y+{SGi1YWbtcVsd+yk6fbmVbxiZS(Z2?fii|i`A!W z-mSTfkzs9m)6wkf0lANDoANTRWku|(7O%gzU;f6-x~`|T2d>MUOZ#|wZS=ms-sQ)) z1=fCAk}mf{)>imH-{G4&Z2GZTwN5u$XS?hUI(X~z^B>P&23siJFaELcInxc@iKi7U z?f8mQSe|W6&fU8wdy3bF)2Sxm;nm+9@2_3Xe8b;p{{7FTpC7yD=<2qb`0n6qwRMnq q^kdrE_@uvD4punx1JQ-RcX@{i9Pd*b3;lp)8H1;*pUXO@geCw|z%rl! literal 0 HcmV?d00001