diff --git a/package-lock.json b/package-lock.json index 55e473b8..fc881028 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@popperjs/core": "^2.11.8", "@tensorflow/tfjs": "^3.20.0", "@tensorflow/tfjs-node": "^4.2.0", + "@types/psl": "^1.1.3", "ansi-html": "^0.0.9", "ansi-regex": "^6.0.1", "async": "^3.2.4", @@ -29,6 +30,7 @@ "markdown-it": "^13.0.1", "marked": "^4.0.18", "node-forge": "^1.3.1", + "psl": "^1.9.0", "queue": "^6.0.2", "react": "^17.0.1", "react-dom": "^17.0.1", @@ -3847,6 +3849,11 @@ "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", "dev": true }, + "node_modules/@types/psl": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/psl/-/psl-1.1.3.tgz", + "integrity": "sha512-Iu174JHfLd7i/XkXY6VDrqSlPvTDQOtQI7wNAXKKOAADJ9TduRLkNdMgjGiMxSttUIZnomv81JAbAbC0DhggxA==" + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -12208,6 +12215,11 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -18572,6 +18584,11 @@ "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", "dev": true }, + "@types/psl": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/psl/-/psl-1.1.3.tgz", + "integrity": "sha512-Iu174JHfLd7i/XkXY6VDrqSlPvTDQOtQI7wNAXKKOAADJ9TduRLkNdMgjGiMxSttUIZnomv81JAbAbC0DhggxA==" + }, "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -24924,6 +24941,11 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", diff --git a/package.json b/package.json index eaf7664d..c22860e8 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "@popperjs/core": "^2.11.8", "@tensorflow/tfjs": "^3.20.0", "@tensorflow/tfjs-node": "^4.2.0", + "@types/psl": "^1.1.3", "ansi-html": "^0.0.9", "ansi-regex": "^6.0.1", "async": "^3.2.4", @@ -46,6 +47,7 @@ "markdown-it": "^13.0.1", "marked": "^4.0.18", "node-forge": "^1.3.1", + "psl": "^1.9.0", "queue": "^6.0.2", "react": "^17.0.1", "react-dom": "^17.0.1", diff --git a/src/background/analysis/utility/util.js b/src/background/analysis/utility/util.js index f36a40e4..9e8ff719 100644 --- a/src/background/analysis/utility/util.js +++ b/src/background/analysis/utility/util.js @@ -4,6 +4,7 @@ privacy-tech-lab, https://privacytechlab.org/ */ import { Evidence } from "../classModels.js"; +import psl from "psl"; /** * Utility function to create hash for watchlist key based on keyword and type @@ -58,22 +59,7 @@ export function extractHostname(url) { */ export function getHostname(url) { if (typeof url == "undefined") return ""; - var domain = extractHostname(url), - splitArr = domain.split("."), - arrLen = splitArr.length; - - //extracting the root domain here - //if there is a subdomain - if (arrLen > 2) { - // domain = second to last and last domain. could be (xyz.me.uk) or (xyz.uk) - domain = splitArr[arrLen - 2] + "." + splitArr[arrLen - 1]; - //check to see if it's using a Country Code Top Level Domain (ccTLD) (i.e. ".me.uk") - if (splitArr[arrLen - 2].length == 2 && splitArr[arrLen - 1].length == 2) { - //this is using a ccTLD. set domain to include the actual host name - domain = splitArr[arrLen - 3] + "." + domain; - } - } - return domain; + return psl.parse(extractHostname(url)).domain ?? ""; } /** diff --git a/src/popup/views/website-view/index.js b/src/popup/views/website-view/index.js index 39083413..78ae2985 100644 --- a/src/popup/views/website-view/index.js +++ b/src/popup/views/website-view/index.js @@ -52,6 +52,7 @@ const WebsiteView = () => { const [empty, setEmpty] = useState(true); const [isOurHomePage, setIsOurHomePage] = useState(false); const [extensionEnabled, setExtensionEnabled] = useState(false); + const [invalidSite, setInvalidSite] = useState(false); /** * Navigate to route in options page based on urlHash @@ -110,7 +111,8 @@ const WebsiteView = () => { const host = getHostname(request.data); //@ts-ignore - setIsOurHomePage(browser.runtime.getURL("").includes(host)); + setIsOurHomePage(request.data.includes(browser.runtime.getURL(""))); + setInvalidSite(host == ""); getWebsiteLastVisitedEvidence(host).then((result) => { setLabels(result); @@ -220,7 +222,7 @@ const WebsiteView = () => { {extensionEnabled && ( - {isOurHomePage ? ( + {(isOurHomePage || invalidSite) ? ( ) : ( { /> )} {isOurHomePage ? "Privacy Pioneer" : website} - {!isOurHomePage && getCount()} + {!(isOurHomePage || invalidSite) && getCount()} )} {empty ? ( @@ -239,7 +241,7 @@ const WebsiteView = () => { {extensionEnabled ? isOurHomePage ? "This is our homepage! You won't find anything here. Keep browsing and check back later." - : "Nothing yet...Keep browsing and check back later!" + : invalidSite ? "Privacy Pioneer is unable to analyze this page." : "Nothing yet...Keep browsing and check back later!" : "The extension is currently disabled! Press the power button to re-enable analysis!"}