From 356fd321d9a035c9c4d0f5b6bb8313cf1d4ca64d Mon Sep 17 00:00:00 2001 From: ManeraKai Date: Wed, 8 Feb 2023 15:51:07 +0300 Subject: [PATCH] Added option to use github, codeberg, disable for fetching instances https://github.com/libredirect/libredirect/issues/626 --- src/assets/javascripts/services.js | 40 ++-------------------- src/assets/javascripts/utils.js | 46 +++++++++++++++++++++++--- src/config.json | 22 ++++++------ src/pages/background/background.js | 6 ++-- src/pages/options/index.js | 23 ++++++++++--- src/pages/options/widgets/general.js | 5 +++ src/pages/options/widgets/general.pug | 7 ++++ src/pages/options/widgets/services.pug | 8 ++--- 8 files changed, 94 insertions(+), 63 deletions(-) diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js index 2b630d6d..3e05f047 100644 --- a/src/assets/javascripts/services.js +++ b/src/assets/javascripts/services.js @@ -618,6 +618,7 @@ function initDefaults() { } options['theme'] = "detect" options['popupServices'] = ["youtube", "twitter", "tiktok", "imgur", "reddit", "quora", "translate", "maps"] + options['fetchInstances'] = 'github' options = { ...options, ...defaultInstances } @@ -631,45 +632,10 @@ function initDefaults() { function upgradeOptions() { return new Promise(async resolve => { const oldOptions = await utils.getOptions() - const config = await utils.getConfig() let options = {} - - options.exceptions = oldOptions.exceptions - options.theme = oldOptions.theme - options.popupServices = oldOptions.popupServices - - for (const service in config.services) { - if (service in oldOptions) { - options[service] = oldOptions[service] - delete options[service].embedFrontend - } - else { - options[service] = {} - for (const defaultOption in config.services[service].options) { - options[service][defaultOption] = config.services[service].options[defaultOption] - } - for (const frontend in config.services[service].frontends) { - if (config.services[service].frontends[frontend].instanceList) { - options[frontend] = [] - } - } - } - - for (const frontend in config.services[service].frontends) { - if (config.services[service].frontends[frontend].instanceList) { - if (frontend in oldOptions) { - options[frontend] = [ - ...oldOptions[frontend].clearnet.enabled, - ...oldOptions[frontend].clearnet.custom - ] - } - else { - options[frontend] = defaultInstances[frontend] - } - } - } - } + options = [...oldOptions] + options.fetchInstances = 'github' browser.storage.local.clear(() => { browser.storage.local.set({ options }, () => { diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js index 2b9a9193..6644f8ed 100644 --- a/src/assets/javascripts/utils.js +++ b/src/assets/javascripts/utils.js @@ -32,30 +32,68 @@ function getOptions() { ) } -function getBlacklist() { +function getBlacklist(options) { return new Promise(resolve => { + let url + if (options.fetchInstances == 'github') { + url = 'https://raw.githubusercontent.com/libredirect/instances/main/blacklist.json' + } + else if (options.fetchInstances == 'codeberg') { + url = 'https://codeberg.org/LibRedirect/instances/raw/branch/main/blacklist.json' + } + else { + resolve('disabled') + return + } const http = new XMLHttpRequest() - http.open("GET", "https://raw.githubusercontent.com/libredirect/instances/main/blacklist.json", true) + http.open("GET", url, true) http.onreadystatechange = () => { if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) { resolve(JSON.parse(http.responseText)) return } } + http.onerror = () => { + resolve() + return + } + http.ontimeout = () => { + resolve() + return + } http.send(null) }) } -function getList() { +function getList(options) { return new Promise(resolve => { + let url + if (options.fetchInstances == 'github') { + url = 'https://raw.githubusercontent.com/libredirect/instances/main/data.json' + } + else if (options.fetchInstances == 'codeberg') { + url = 'https://codeberg.org/LibRedirect/instances/raw/branch/main/data.json' + } + else { + resolve('disabled') + return + } const http = new XMLHttpRequest() - http.open("GET", "https://raw.githubusercontent.com/libredirect/instances/main/data.json", true) + http.open("GET", url, true) http.onreadystatechange = () => { if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) { resolve(JSON.parse(http.responseText)) return } } + http.onerror = () => { + resolve() + return + } + http.ontimeout = () => { + resolve() + return + } http.send(null) }) } diff --git a/src/config.json b/src/config.json index 3a3ed06b..41a87f79 100644 --- a/src/config.json +++ b/src/config.json @@ -46,6 +46,16 @@ "instanceList": true, "url": "https://github.com/mmjee/Piped-Material" }, + "poketube": { + "excludeTargets": [ + 2, + 3 + ], + "name": "PokeTube", + "embeddable": true, + "instanceList": true, + "url": "https://codeberg.org/Ashley/poketube" + }, "cloudtube": { "name": "CloudTube", "embeddable": false, @@ -71,16 +81,6 @@ "embeddable": false, "instanceList": false, "url": "https://github.com/yattee/yattee" - }, - "poketube": { - "excludeTargets": [ - 2, - 3 - ], - "name": "PokeTube", - "embeddable": true, - "instanceList": true, - "url": "https://codeberg.org/Ashley/poketube/" } }, "targets": [ @@ -611,4 +611,4 @@ "url": "https://www.snopes.com" } } -} +} \ No newline at end of file diff --git a/src/pages/background/background.js b/src/pages/background/background.js index 1a62f4e2..faeaf002 100644 --- a/src/pages/background/background.js +++ b/src/pages/background/background.js @@ -16,7 +16,7 @@ browser.runtime.onInstalled.addListener(async details => { browser.runtime.openOptionsPage() } else if (details.reason == "update") { - if (details.previousVersion == '2.3.4') { + if (details.previousVersion == '2.5.2') { await servicesHelper.upgradeOptions() } else { await servicesHelper.processUpdate() @@ -115,7 +115,7 @@ browser.contextMenus.create({ }) browser.contextMenus.create({ - id: "reverse", + id: "reverseTab", title: 'Reverse redirect', contexts: ["browser_action"], }) @@ -157,7 +157,7 @@ browser.contextMenus.onClicked.addListener(async (info, tab) => { servicesHelper.copyRaw(url) return } - case 'reverse': { + case 'reverseTab': { const url = new URL(info.pageUrl) const newUrl = await servicesHelper.reverse(url) if (newUrl) { diff --git a/src/pages/options/index.js b/src/pages/options/index.js index 18fb120f..f122f3fc 100644 --- a/src/pages/options/index.js +++ b/src/pages/options/index.js @@ -99,11 +99,25 @@ async function loadPage(path) { } !async function () { - const blacklist = await utils.getBlacklist() - const redirects = await utils.getList() + const blacklist = await utils.getBlacklist(options) + const redirects = await utils.getList(options) + for (const frontend in config.services[service].frontends) { if (config.services[service].frontends[frontend].instanceList) { - createList(frontend, config.networks, document, redirects, blacklist) + if (redirects == 'disabled' || blacklist == 'disabled') { + document.getElementById(frontend).getElementsByClassName('clearnet')[0].style.display = 'none' + document.getElementById(frontend).getElementsByClassName('ping')[0].style.display = 'none' + } + else if (!redirects || !blacklist) { + document.getElementById(frontend) + .getElementsByClassName('clearnet')[0] + .getElementsByClassName("checklist")[0] + .getElementsByClassName('loading')[0] + .innerHTML = 'Could not fetch instances.' + } + else { + createList(frontend, config.networks, document, redirects, blacklist) + } } } }() @@ -240,8 +254,9 @@ async function ping(frontend) { .getElementsByClassName('clearnet')[0] .getElementsByTagName('x') for (const element of instanceElements) { - let span = element.getElementsByTagName('span')[0] + let span = element.getElementsByClassName('ping')[0] if (!span) span = document.createElement('span') + span.classList = ['ping'] span.innerHTML = 'pinging...' element.appendChild(span) diff --git a/src/pages/options/widgets/general.js b/src/pages/options/widgets/general.js index 09c222a2..b676046b 100644 --- a/src/pages/options/widgets/general.js +++ b/src/pages/options/widgets/general.js @@ -71,6 +71,11 @@ resetSettings.addEventListener("click", async () => { location.reload() }) +document.getElementById('fetch-instances').addEventListener('change', event => { + setOption('fetchInstances', 'select', event) + location.reload() +}) + let themeElement = document.getElementById("theme") themeElement.addEventListener("change", event => { setOption("theme", "select", event) diff --git a/src/pages/options/widgets/general.pug b/src/pages/options/widgets/general.pug index dc3c3d93..52ea21c2 100644 --- a/src/pages/options/widgets/general.pug +++ b/src/pages/options/widgets/general.pug @@ -10,6 +10,13 @@ section(class="option-block" id="general_page") option(value="light" data-localise="__MSG_light__") Light option(value="dark" data-localise="__MSG_dark__") Dark + div(class="some-block option-block") + h4 Fetch public instances + select(id="fetch-instances") + option(value="github") GitHub + option(value="codeberg") Codeberg + option(value="disable") Disable + div(class="some-block option-block") h4(data-localise="__MSG_excludeFromRedirecting__") Excluded from redirecting diff --git a/src/pages/options/widgets/services.pug b/src/pages/options/widgets/services.pug index 345e16af..1ebd626b 100644 --- a/src/pages/options/widgets/services.pug +++ b/src/pages/options/widgets/services.pug @@ -44,22 +44,22 @@ each val, service in services form(class="custom-instance-form") div(class="some-block option-block") - input(class="custom-instance" type="url" ) + input(class="custom-instance" type="url" placeholder="https://instance.com") button(class="add add-instance" type="submit") svg(xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor") path(d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z") div(class="checklist custom-checklist") - div(class="some-block") + div(class="ping some-block") a(class="button button-inline" id=`ping-${frontend}`) svg(xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor") path(d="M10.45 15.5q.6.6 1.55.587.95-.012 1.4-.687L19 7l-8.4 5.6q-.675.45-.712 1.375-.038.925.562 1.525ZM12 4q1.475 0 2.838.412Q16.2 4.825 17.4 5.65l-1.9 1.2q-.825-.425-1.712-.637Q12.9 6 12 6 8.675 6 6.338 8.337 4 10.675 4 14q0 1.05.287 2.075Q4.575 17.1 5.1 18h13.8q.575-.95.838-1.975Q20 15 20 13.9q0-.9-.212-1.75-.213-.85-.638-1.65l1.2-1.9q.75 1.175 1.188 2.5.437 1.325.462 2.75.025 1.425-.325 2.725-.35 1.3-1.025 2.475-.275.45-.75.7-.475.25-1 .25H5.1q-.525 0-1-.25t-.75-.7q-.65-1.125-1-2.387Q2 15.4 2 14q0-2.075.788-3.888.787-1.812 2.15-3.175Q6.3 5.575 8.125 4.787 9.95 4 12 4Zm.175 7.825Z") |  x() Ping instances - + each val, network in networks div(class=network) div(class="checklist") if (network == 'clearnet') - div(class="some-block option-block") Loading... \ No newline at end of file + div(class="some-block option-block loading") Loading... \ No newline at end of file