From 800d0cbd9fd4286f0affcb5a28f01f03532655fb Mon Sep 17 00:00:00 2001 From: Hygna Date: Wed, 28 Sep 2022 20:18:32 +0100 Subject: [PATCH] Unify cookies --- README.md | 14 ++-- package.json | 2 - src/assets/javascripts/general.js | 6 +- src/assets/javascripts/services.js | 41 ++++++---- src/assets/javascripts/utils.js | 106 +++++++++++++------------- src/config/config.json | 2 +- src/pages/background/background.js | 2 +- src/pages/options/index.html | 2 +- src/pages/options/init.js | 4 +- src/pages/options/widgets/general.ejs | 2 +- src/pages/popup/popup.html | 2 +- src/pages/popup/popup.js | 10 +-- 12 files changed, 99 insertions(+), 94 deletions(-) diff --git a/README.md b/README.md index 4de39765..2c06b0a2 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Imgur => [Rimgo](https://codeberg.org/video-prize-ranch/rimgo)\ Wikipedia => [Wikiless](https://codeberg.org/orenom/wikiless)\ Medium => [Scribe](https://sr.ht/~edwardloveall/scribe/)\ Quora => [Quetre](https://github.com/zyachel/quetre)\ -IMDb => [Libremdb](https://github.com/zyachel/libremdb)\ +IMDb => [libremdb](https://github.com/zyachel/libremdb)\ PeerTube => [SimpleerTube](https://git.sr.ht/~metalune/simpleweb_peertube)\ LBRY/Odysee => [Librarian](https://codeberg.org/librarian/librarian), [LBRY Desktop](https://lbry.com/get)\ Search => [SearXNG](https://github.com/searxng/searxng), [SearX](https://searx.github.io/searx/), [Whoogle](https://benbusby.com/projects/whoogle-search/), [LibreX](https://github.com/hnhx/librex/)\ @@ -72,21 +72,19 @@ npm update npm install ``` -If you are modifying any files ending with .pug, the pug cli needs to be installed with the following command (with root privileges): +If you are modifying any files ending with .ejs, you need to run the following command to render html: ``` -npm install -g pug-cli +npm run ejs ``` -and then run `npm run pug` to generate pages in the background. - -### Build +### Build the extention zip archive: ``` npm run build ``` -### Test +### Run automated tests ``` npm run test @@ -120,4 +118,4 @@ select `load unpacked extension`\ select `src` folder [Privacy Policy](Privacy-Policy.md)\ -Credits: [Privacy Redirect](https://github.com/SimonBrazell/privacy-redirect) +Forked from [Privacy Redirect](https://github.com/SimonBrazell/privacy-redirect) diff --git a/package.json b/package.json index 76f57474..ec39aee4 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,6 @@ "start": "web-ext run --browser-console --source-dir ./src/", "build": "web-ext build --overwrite-dest --source-dir ./src/", "test": "web-ext lint --source-dir ./src/ || true", - "pug": "pug ./src/pages/options/*.pug ./src/pages/popup/ -P -w", - "prettier": "npx prettier --write .", "instances": "python3 src/instances/get_instances.py; git update-index --assume-unchanged src/instances/blacklist.json src/instances/data.json", "ejs": "npx ejs src/pages/options/index.ejs -f src/config/config.json -o src/pages/options/index.html; npx ejs src/pages/popup/popup.ejs -f src/config/config.json -o src/pages/popup/popup.html" }, diff --git a/src/assets/javascripts/general.js b/src/assets/javascripts/general.js index 3a8987ac..9dcba752 100644 --- a/src/assets/javascripts/general.js +++ b/src/assets/javascripts/general.js @@ -11,8 +11,8 @@ function isException(url) { function init() { return new Promise(resolve => { - browser.storage.local.get("exceptions", r => { - exceptions = r.exceptions + browser.storage.local.get("options", r => { + exceptions = r.options.exceptions resolve() }) }) @@ -30,7 +30,7 @@ async function initDefaults() { url: [], regex: [], }, - theme: "DEFAULT", + theme: "detect", popupServices: ["youtube", "twitter", "instagram", "tiktok", "imgur", "reddit", "quora", "translate", "maps"], autoRedirect: false, firstPartyIsolate: false, diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js index 9fc5a0a3..3db12595 100644 --- a/src/assets/javascripts/services.js +++ b/src/assets/javascripts/services.js @@ -19,25 +19,28 @@ function init() { return new Promise(async resolve => { // await getConfig() browser.storage.local.get(["options", "targets", "redirects", "blacklists"], r => { - blacklists = r.blacklists - redirects = r.redirects - targets = r.targets - options = r.options + if (r.options) { + blacklists = r.blacklists + redirects = r.redirects + targets = r.targets + options = r.options + } resolve() }) }) } -await init() await getConfig() +await init() function fetchFrontendInstanceList(service, frontend) { let tmp = [] - if (!config.services[service].frontends[frontend].singleInstance) { + if (config.services[service].frontends[frontend].instanceList) { for (const network in config.networks) { + if (!redirects[frontend]) console.log(frontend) tmp.push(...redirects[frontend][network], ...options[frontend][network].custom) } - } else if (config.services[service].frontends[frontend].singleInstance != undefined) tmp = config.services[service].frontends[frontend].singleInstance + } else if (config.services[service].frontends[frontend].singleInstance) tmp = config.services[service].frontends[frontend].singleInstance return tmp } @@ -58,8 +61,8 @@ function all(service, frontend) { function regexArray(service, url) { let targets if (config.services[service].targets == "datajson") { - browser.storage.local.get(`${service}Targets`, r => { - targets = r[service + "Targets"] + browser.storage.local.get("targets", r => { + targets = r.targets[service] }) } else { targets = config.services[service].targets @@ -397,8 +400,10 @@ function initDefaults() { let redirects = JSON.parse(data) let options = r.options let targets = {} + // let latency = {} for (const service in config.services) { options[service] = {} + // latency[service] = {} if (config.services[service].targets == "datajson") { targets[service] = redirects[service] //delete dataJson[service] @@ -423,19 +428,25 @@ function initDefaults() { } } } - browser.storage.local.set({ redirects, options, targets }) + browser.storage.local.set({ redirects, options, targets /*, latency*/ }) resolve() }) }) }) } -function computeService(url) { +function computeService(url, returnFrontend) { for (const service in config.services) { if (regexArray(service, url)) { - return service - } else if (all(service).includes(utils.protocolHost(url))) { - return service + if (returnFrontend) return [service, null] + else return service + } else { + for (const frontend in config.services[service].frontends) { + if (all(service, frontend).includes(utils.protocolHost(url))) { + if (returnFrontend) return [service, frontend] + else return service + } + } } } return null @@ -524,7 +535,7 @@ function unifyPreferences(url) { const frontend = config.services[currentService].frontends[currentFrontend] if ("cookies" in frontend.preferences) { - for (const cookie in frontend.preferences.cookies) { + for (const cookie of frontend.preferences.cookies) { await utils.copyCookie(currentFrontend, url, instancesList, cookie) } } diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js index 0e8acb3c..70a93240 100644 --- a/src/assets/javascripts/utils.js +++ b/src/assets/javascripts/utils.js @@ -111,29 +111,27 @@ function protocolHost(url) { return `${url.protocol}//${url.host}` } -async function processDefaultCustomInstances(target, name, protocol, document) { - let latencyKey = `${name}Latency` +async function processDefaultCustomInstances(service, name, network, document) { let instancesLatency - let nameProtocolElement = document.getElementById(name).getElementsByClassName(protocol)[0] + let nameNetworkElement = document.getElementById(name).getElementsByClassName(network)[0] let nameCustomInstances = [] - let nameCheckListElement = nameProtocolElement.getElementsByClassName("checklist")[0] + let nameCheckListElement = nameNetworkElement.getElementsByClassName("checklist")[0] await initBlackList() let nameDefaultRedirects - let redirectsChecks = `${name}${camelCase(protocol)}RedirectsChecks` - let customRedirects = `${name}${camelCase(protocol)}CustomRedirects` - - let redirects + let redirects, options async function getFromStorage() { return new Promise(async resolve => - browser.storage.local.get([redirectsChecks, customRedirects, "redirects", latencyKey], r => { - nameDefaultRedirects = r[redirectsChecks] - nameCustomInstances = r[customRedirects] - instancesLatency = r[latencyKey] ?? [] + browser.storage.local.get(["options", "redirects", "latency"], r => { + nameDefaultRedirects = r.options[name][network].enabled + nameCustomInstances = r.options[name][network].custom + options = r.options + if (r.latency) instancesLatency = r.latency[name] ?? [] + else instancesLatency = [] redirects = r.redirects resolve() }) @@ -141,12 +139,11 @@ async function processDefaultCustomInstances(target, name, protocol, document) { } await getFromStorage() - if (nameCustomInstances === undefined) console.log(customRedirects) function calcNameCheckBoxes() { let isTrue = true - for (const item of redirects[name][protocol]) { - if (nameDefaultRedirects === undefined) console.log(name + protocol + " is undefined") + for (const item of redirects[name][network]) { + if (nameDefaultRedirects === undefined) console.log(name + network + " is undefined") if (!nameDefaultRedirects.includes(item)) { isTrue = false break @@ -156,14 +153,14 @@ async function processDefaultCustomInstances(target, name, protocol, document) { element.checked = nameDefaultRedirects.includes(element.className) } if (nameDefaultRedirects.length == 0) isTrue = false - nameProtocolElement.getElementsByClassName("toggle-all")[0].checked = isTrue + nameNetworkElement.getElementsByClassName("toggle-all")[0].checked = isTrue } nameCheckListElement.innerHTML = [ `
Toggle All
`, - ...redirects[name][protocol].map(x => { + ...redirects[name][network].map(x => { const cloudflare = cloudflareBlackList.includes(x) ? ' cloudflare' : "" const authenticate = authenticateBlackList.includes(x) ? ' authenticate' : "" const offline = offlineBlackList.includes(x) ? ' offline' : "" @@ -188,31 +185,32 @@ async function processDefaultCustomInstances(target, name, protocol, document) { localise.localisePage() calcNameCheckBoxes() - nameProtocolElement.getElementsByClassName("toggle-all")[0].addEventListener("change", async event => { - if (event.target.checked) nameDefaultRedirects = [...redirects[name][protocol]] + nameNetworkElement.getElementsByClassName("toggle-all")[0].addEventListener("change", async event => { + if (event.service.checked) nameDefaultRedirects = [...redirects[name][network]] else nameDefaultRedirects = [] - browser.storage.local.set({ [redirectsChecks]: nameDefaultRedirects }) + options[service][network].enabled = nameDefaultRedirects + browser.storage.local.set({ options }) calcNameCheckBoxes() }) for (let element of nameCheckListElement.getElementsByTagName("input")) { if (element.className != "toggle-all") - nameProtocolElement.getElementsByClassName(element.className)[0].addEventListener("change", async event => { - if (event.target.checked) nameDefaultRedirects.push(element.className) + nameNetworkElement.getElementsByClassName(element.className)[0].addEventListener("change", async event => { + if (event.service.checked) nameDefaultRedirects.push(element.className) else { let index = nameDefaultRedirects.indexOf(element.className) if (index > -1) nameDefaultRedirects.splice(index, 1) } - browser.storage.local.set({ - [redirectsChecks]: nameDefaultRedirects, - }) + + options[service][network].enabled = nameDefaultRedirects + browser.storage.local.set({ options }) calcNameCheckBoxes() }) } function calcNameCustomInstances() { - nameProtocolElement.getElementsByClassName("custom-checklist")[0].innerHTML = nameCustomInstances + nameNetworkElement.getElementsByClassName("custom-checklist")[0].innerHTML = nameCustomInstances .map( x => `
${x} @@ -227,24 +225,26 @@ async function processDefaultCustomInstances(target, name, protocol, document) { .join("\n") for (const item of nameCustomInstances) { - nameProtocolElement.getElementsByClassName(`clear-${item}`)[0].addEventListener("click", async () => { + nameNetworkElement.getElementsByClassName(`clear-${item}`)[0].addEventListener("click", async () => { let index = nameCustomInstances.indexOf(item) if (index > -1) nameCustomInstances.splice(index, 1) - browser.storage.local.set({ [customRedirects]: nameCustomInstances }) + options[service][network].custom = nameCustomInstances + browser.storage.local.set({ options }) calcNameCustomInstances() }) } } calcNameCustomInstances() - nameProtocolElement.getElementsByClassName("custom-instance-form")[0].addEventListener("submit", async event => { + nameNetworkElement.getElementsByClassName("custom-instance-form")[0].addEventListener("submit", async event => { event.preventDefault() - let nameCustomInstanceInput = nameProtocolElement.getElementsByClassName("custom-instance")[0] + let nameCustomInstanceInput = nameNetworkElement.getElementsByClassName("custom-instance")[0] let url = new URL(nameCustomInstanceInput.value) let protocolHostVar = protocolHost(url) - if (nameCustomInstanceInput.validity.valid && !redirects[name][protocol].includes(protocolHostVar)) { + if (nameCustomInstanceInput.validity.valid && !redirects[name][network].includes(protocolHostVar)) { if (!nameCustomInstances.includes(protocolHostVar)) { nameCustomInstances.push(protocolHostVar) - browser.storage.local.set({ [customRedirects]: nameCustomInstances }) + options[service][network].custom = nameCustomInstances + browser.storage.local.set({ options }) nameCustomInstanceInput.value = "" } calcNameCustomInstances() @@ -299,9 +299,9 @@ async function testLatency(element, instances, frontend) { let myList = {} let latencyThreshold let redirectsChecks = [] - browser.storage.local.get(["latencyThreshold", `${frontend}ClearnetRedirectsChecks`], r => { - latencyThreshold = r.latencyThreshold - redirectsChecks = r[`${frontend}ClearnetRedirectsChecks`] + browser.storage.local.get(["options"], r => { + latencyThreshold = r.options.latencyThreshold + redirectsChecks = r.options[frontend].clearnet.enabled }) for (const href of instances) await ping(href).then(time => { @@ -331,9 +331,9 @@ async function testLatency(element, instances, frontend) { function copyCookie(frontend, targetUrl, urls, name) { return new Promise(resolve => { - browser.storage.local.get("firstPartyIsolate", r => { + browser.storage.local.get("options", r => { let query - if (!r.firstPartyIsolate) + if (!r.options.firstPartyIsolate) query = { url: protocolHost(targetUrl), name: name, @@ -348,7 +348,7 @@ function copyCookie(frontend, targetUrl, urls, name) { for (const cookie of cookies) if (cookie.name == name) { for (const url of urls) { - const setQuery = r.firstPartyIsolate + const setQuery = r.options.firstPartyIsolate ? { url: url, name: name, @@ -375,23 +375,21 @@ function copyCookie(frontend, targetUrl, urls, name) { function getPreferencesFromToken(frontend, targetUrl, urls, name, endpoint) { return new Promise(resolve => { - browser.storage.local.get("firstPartyIsolate", r => { + const http = new XMLHttpRequest() + const url = `${targetUrl}${endpoint}` + http.open("GET", url, false) + //http.setRequestHeader("Cookie", `${name}=${cookie.value}`) + http.send(null) + const preferences = JSON.parse(http.responseText) + let formdata = new FormData() + for (var key in preferences) formdata.append(key, preferences[key]) + for (const url of urls) { const http = new XMLHttpRequest() - const url = `${targetUrl}${endpoint}` - http.open("GET", url, false) - http.setRequestHeader("Cookie", `${name}=${cookie.value}`) + http.open("POST", `${url}/settings/stay`, false) http.send(null) - const preferences = JSON.parse(http.responseText) - let formdata = new FormData() - for (var key in preferences) formdata.append(key, preferences[key]) - for (const url of urls) { - const http = new XMLHttpRequest() - http.open("POST", `${url}/settings/stay`, false) - http.send(null) - } - resolve() - return - }) + } + resolve() + return }) } @@ -427,7 +425,7 @@ function copyRaw(test, copyRawElement) { }) } -function unify(test) { +function unify() { return new Promise(resolve => { browser.tabs.query({ active: true, currentWindow: true }, async tabs => { let currTab = tabs[0] diff --git a/src/config/config.json b/src/config/config.json index 09774895..6f926034 100644 --- a/src/config/config.json +++ b/src/config/config.json @@ -184,7 +184,7 @@ "instanceList": true } }, - "targets": ["^https?:\\/{2}(www\\.)?instagram\\.com"], + "targets": ["^https?:\\/{2}(www\\.)?instagram\\.com\\/p\\/"], "name": "Instagram", "options": { "enabled": true }, "imageType": "png", diff --git a/src/pages/background/background.js b/src/pages/background/background.js index 241b51de..e9bf691f 100644 --- a/src/pages/background/background.js +++ b/src/pages/background/background.js @@ -121,7 +121,7 @@ async function redirectOfflineInstance(url, tabId) { let counter = 0 function isAutoRedirect() { - return new Promise(resolve => browser.storage.local.get("autoRedirect", r => resolve(r.autoRedirect == true))) + return new Promise(resolve => browser.storage.local.get("options", r => resolve(r.options.autoRedirect == true))) } browser.webRequest.onResponseStarted.addListener( diff --git a/src/pages/options/index.html b/src/pages/options/index.html index 20592637..6ef33723 100644 --- a/src/pages/options/index.html +++ b/src/pages/options/index.html @@ -99,7 +99,7 @@

Theme

diff --git a/src/pages/options/init.js b/src/pages/options/init.js index 5b679da4..cac23748 100644 --- a/src/pages/options/init.js +++ b/src/pages/options/init.js @@ -4,8 +4,8 @@ import localise from "../../assets/javascripts/localise.js" function changeTheme() { return new Promise(resolve => { - browser.storage.local.get("theme", r => { - switch (r.theme) { + browser.storage.local.get("options", r => { + switch (r.options.theme) { case "dark": document.body.classList.add("dark-theme") document.body.classList.remove("light-theme") diff --git a/src/pages/options/widgets/general.ejs b/src/pages/options/widgets/general.ejs index fa85e8bc..8f7ab029 100644 --- a/src/pages/options/widgets/general.ejs +++ b/src/pages/options/widgets/general.ejs @@ -6,7 +6,7 @@

Theme

diff --git a/src/pages/popup/popup.html b/src/pages/popup/popup.html index e21a63a0..d52a34b6 100644 --- a/src/pages/popup/popup.html +++ b/src/pages/popup/popup.html @@ -241,7 +241,7 @@
-