diff options
-rw-r--r-- | bg/ExternalLicenses.js | 45 | ||||
-rw-r--r-- | content/externalLicenseChecker.js | 2 | ||||
-rw-r--r-- | main_background.js | 5 |
3 files changed, 37 insertions, 15 deletions
diff --git a/bg/ExternalLicenses.js b/bg/ExternalLicenses.js index 27d9223..33bcbf6 100644 --- a/bg/ExternalLicenses.js +++ b/bg/ExternalLicenses.js @@ -26,10 +26,28 @@ "use strict"; let licensesByLabel = new Map(); +let licensesByUrl = new Map(); { let {licenses} = require("../license_definitions"); - for (let l of Object.values(licenses).filter(l => l.identifier)) { - licensesByLabel.set(l.identifier, l); + let mapByLabel = (label, license) => licensesByLabel.set(label.toUpperCase(), license); + for (let [id, l] of Object.entries(licenses)) { + let {identifier, canonicalUrl, licenseName} = l; + if (identifier) { + mapByLabel(identifier, l); + } else { + l.identifier = id; + } + if (id !== identifier) { + mapByLabel(id, l); + } + if (licenseName) { + mapByLabel(licenseName, l); + } + if (Array.isArray(canonicalUrl)) { + for (let url of canonicalUrl) { + licensesByUrl.set(url, l); + } + } } } @@ -55,23 +73,26 @@ var ExternalLicenses = { return null; } scriptInfo.licenses = new Set(); - scriptInfo.allFree = true; scriptInfo.toString = function() { let licenseIds = [...this.licenses].map(l => l.identifier).sort().join(", "); return licenseIds - ? (this.allFree ? `Free license${this.licenses.length > 1 ? "s" : ""} (${licenseIds})` - : `Mixed free (${licenseIds}) and unknown licenses`) + ? `Free license${this.licenses.size > 1 ? "s" : ""} (${licenseIds})` : "Unknown license(s)"; } - - for (let {label} of scriptInfo.licenseLinks) { - if (licensesByLabel.has(label)) { - scriptInfo.licenses.add(licensesByLabel.get(label)); - } else { - scriptInfo.allFree = false; - break; + let match = (map, key) => { + if (map.has(key)) { + scriptInfo.licenses.add(map.get(key)); + return true; } + return false; + }; + + for (let {label, url} of scriptInfo.licenseLinks) { + match(licensesByLabel, label = label.trim().toUpperCase()) || + match(licensesByUrl, url) || + match(licensesByLabel, label.replace(/^GNU-|-(?:OR-LATER|ONLY)$/, '')); } + scriptInfo.free = scriptInfo.licenses.size > 0; return scriptInfo; }, diff --git a/content/externalLicenseChecker.js b/content/externalLicenseChecker.js index 181e3f9..516057e 100644 --- a/content/externalLicenseChecker.js +++ b/content/externalLicenseChecker.js @@ -79,7 +79,7 @@ async checkLicensedScript(m) { let {url, cache} = m; if (!licensedScripts) licensedScripts = await fetchLicenseInfo(cache); - return licensedScripts.get(url); + return licensedScripts.get(url) || licensedScripts.get(url.replace(/\?.*/, '')); } } diff --git a/main_background.js b/main_background.js index 4cfca7a..cdc987e 100644 --- a/main_background.js +++ b/main_background.js @@ -859,6 +859,7 @@ var ResponseHandler = { let {request} = response; let {url, type, tabId, frameId, documentUrl} = request; + let fullUrl = url; url = ListStore.urlItem(url); let site = ListStore.siteItem(url); @@ -888,11 +889,11 @@ var ResponseHandler = { "whitelisted": [url, whitelistedSite ? `User whitelisted ${site}` : "Whitelisted by user"]}); return ResponseProcessor.ACCEPT; } else { - let scriptInfo = await ExternalLicenses.check({url, tabId, frameId, documentUrl}); + let scriptInfo = await ExternalLicenses.check({url: fullUrl, tabId, frameId, documentUrl}); if (scriptInfo) { let verdict, ret; let msg = scriptInfo.toString(); - if (scriptInfo.allFree) { + if (scriptInfo.free) { verdict = "accepted"; ret = ResponseProcessor.ACCEPT; } else { |