Finished options upgrading

This commit is contained in:
Hygna 2022-10-03 06:44:49 +01:00
parent 6c8c304a0d
commit c1af086c27
No known key found for this signature in database
10 changed files with 184 additions and 169 deletions

View File

@ -1,12 +1,4 @@
import requests
import json
from urllib.parse import urlparse
from bs4 import BeautifulSoup
import re
from colorama import Fore, Back, Style
from urllib.parse import urlparse
import socket
import subprocess
ar_json = {}

View File

Before

Width:  |  Height:  |  Size: 316 B

After

Width:  |  Height:  |  Size: 316 B

View File

@ -406,123 +406,115 @@ function computeService(url, returnFrontend) {
}
}
}
// if (returnFrontend) return [null, null]
// else return null
resolve()
})
})
})
}
async function switchInstance(url) {
fetch("/config/config.json")
.then(response => response.text())
.then(configData => {
const config = JSON.parse(configData)
browser.storage.local.get(["redirects", "options"], r => {
const redirects = r.redirects
const options = r.options
const protocolHost = utils.protocolHost(url)
for (const service in config.services) {
if (!options[service].enabled) continue
if (!all(service, null, options, config, redirects).includes(protocolHost)) continue
function switchInstance(url) {
return new Promise(async resolve => {
await init()
const protocolHost = utils.protocolHost(url)
for (const service in config.services) {
if (!all(service, null, options, config, redirects).includes(protocolHost)) continue
let instancesList = [...options[options[service].frontend][options.network].enabled, ...options[options[service].frontend][options.network].custom]
if (instancesList.length === 0 && options.networkFallback) instancesList = [...options[options[service].frontend].clearnet.enabled, ...options[options[service].frontend].clearnet.custom]
let instancesList = [...options[options[service].frontend][options.network].enabled, ...options[options[service].frontend][options.network].custom]
if (instancesList.length === 0 && options.networkFallback) instancesList = [...options[options[service].frontend].clearnet.enabled, ...options[options[service].frontend].clearnet.custom]
let oldInstance
const i = instancesList.indexOf(protocolHost)
if (i > -1) {
oldInstance = instancesList[i]
instancesList.splice(i, 1)
}
if (instancesList.length === 0) return
const randomInstance = utils.getRandomInstance(instancesList)
const oldUrl = `${oldInstance}${url.pathname}${url.search}`
// This is to make instance switching work when the instance depends on the pathname, eg https://darmarit.org/searx
// Doesn't work because of .includes array method, not a top priotiry atm
return oldUrl.replace(oldInstance, randomInstance)
}
})
})
let oldInstance
const i = instancesList.indexOf(protocolHost)
if (i > -1) {
oldInstance = instancesList[i]
instancesList.splice(i, 1)
}
if (instancesList.length === 0) {
resolve()
return
}
const randomInstance = utils.getRandomInstance(instancesList)
const oldUrl = `${oldInstance}${url.pathname}${url.search}`
// This is to make instance switching work when the instance depends on the pathname, eg https://darmarit.org/searx
// Doesn't work because of .includes array method, not a top priotiry atm
resolve(oldUrl.replace(oldInstance, randomInstance))
return
}
resolve()
})
}
async function reverse(url) {
fetch("/config/config.json")
.then(response => response.text())
.then(configData => {
const config = JSON.parse(configData)
browser.storage.local.get(["redirects", "options"], r => {
const redirects = r.redirects
const options = r.options
let protocolHost = utils.protocolHost(url)
for (const service in config.services) {
if (!all(service, null, options, config, redirects).includes(protocolHost)) continue
function reverse(url) {
return new Promise(async resolve => {
await init()
let protocolHost = utils.protocolHost(url)
for (const service in config.services) {
if (!all(service, null, options, config, redirects).includes(protocolHost)) continue
switch (service) {
case "instagram":
if (url.pathname.startsWith("/p")) return `https://instagram.com${url.pathname.replace("/p", "")}${url.search}`
if (url.pathname.startsWith("/u")) return `https://instagram.com${url.pathname.replace("/u", "")}${url.search}`
return config.services[service].url + url.pathname + url.search
case "youtube":
case "imdb":
case "imgur":
case "tiktok":
case "twitter":
case "reddit":
return config.services[service].url + url.pathname + url.search
default:
return
}
}
})
})
switch (service) {
case "instagram":
if (url.pathname.startsWith("/p")) resolve(`https://instagram.com${url.pathname.replace("/p", "")}${url.search}`)
if (url.pathname.startsWith("/u")) resolve(`https://instagram.com${url.pathname.replace("/u", "")}${url.search}`)
resolve(config.services[service].url + url.pathname + url.search)
return
case "youtube":
case "imdb":
case "imgur":
case "tiktok":
case "twitter":
case "reddit":
resolve(config.services[service].url + url.pathname + url.search)
return
default:
resolve()
return
}
}
resolve()
})
}
async function unifyPreferences(url, tabId) {
fetch("/config/config.json")
.then(response => response.text())
.then(configData => {
const config = JSON.parse(configData)
browser.storage.local.get(["options", "reidrects"], r => {
const redirects = r.redirects
const options = r.options
const protocolHost = utils.protocolHost(url)
for (const service in config.services) {
for (const frontend in config.services[service].frontends) {
if (all(service, frontend, options, config, redirects).includes(protocolHost)) {
let instancesList = [...options[frontend][options.network].enabled, ...options[frontend][options.network].custom]
if (options.networkFallback && options.network != "clearnet") instancesList.push(...options[frontend].clearnet.enabled, ...options[frontend].clearnet.custom)
function unifyPreferences(url, tabId) {
return new Promise(async resolve => {
await init()
const protocolHost = utils.protocolHost(url)
for (const service in config.services) {
for (const frontend in config.services[service].frontends) {
if (all(service, frontend, options, config, redirects).includes(protocolHost)) {
let instancesList = [...options[frontend][options.network].enabled, ...options[frontend][options.network].custom]
if (options.networkFallback && options.network != "clearnet") instancesList.push(...options[frontend].clearnet.enabled, ...options[frontend].clearnet.custom)
const frontend = config.services[service].frontends[frontend]
if ("cookies" in frontend.preferences) {
for (const cookie of frontend.preferences.cookies) {
utils.copyCookie(frontend, url, instancesList, cookie)
}
}
if ("localstorage" in frontend.preferences) {
browser.storage.local.set({ tmp: [frontend, frontend.preferences.localstorage] })
browser.tabs.executeScript(tabId, {
file: "/assets/javascripts/get-localstorage.js",
runAt: "document_start",
})
for (const instance of instancesList)
browser.tabs.create({ url: instance }, tab =>
browser.tabs.executeScript(tab.id, {
file: "/assets/javascripts/set-localstorage.js",
runAt: "document_start",
})
)
}
if ("indexeddb" in frontend.preferences) {
}
if ("token" in frontend.preferences) {
}
return true
const frontendObject = config.services[service].frontends[frontend]
if ("cookies" in frontendObject.preferences) {
for (const cookie of frontendObject.preferences.cookies) {
utils.copyCookie(frontendObject, url, instancesList, cookie)
}
}
if ("localstorage" in frontendObject.preferences) {
browser.storage.local.set({ tmp: [frontend, frontendObject.preferences.localstorage] })
browser.tabs.executeScript(tabId, {
file: "/assets/javascripts/get-localstorage.js",
runAt: "document_start",
})
for (const instance of instancesList)
browser.tabs.create({ url: instance }, tab =>
browser.tabs.executeScript(tab.id, {
file: "/assets/javascripts/set-localstorage.js",
runAt: "document_start",
})
)
}
/*
if ("indexeddb" in frontendObject.preferences) {
}
if ("token" in frontendObject.preferences) {
}
*/
resolve(true)
return
}
})
})
}
}
})
}
async function setRedirects(redirects) {
@ -612,46 +604,67 @@ function upgradeOptions() {
fetch("/config/config.json")
.then(response => response.text())
.then(configData => {
browser.storage.local.get(["options", "exceptions", "theme", "popupFrontends", "autoRedirect", "firstPartyIsolate"], r => {
browser.storage.local.get(null, r => {
let options = r.options
let latency = {}
const config = JSON.parse(configData)
options.exceptions = r.exceptions
if (r.theme != "DEFAULT") options.theme = r.theme
options.popupServices = r.popupFrontends
let tmp = options.popupServices.indexOf("tikTok")
if (tmp > -1) {
options.popupServices.splice(tmp, 1)
options.popupServices.push("tiktok")
}
tmp = options.popupServices.indexOf("sendTarget")
if (tmp > -1) {
options.popupServices.splice(tmp, 1)
options.popupServices.push("sendFiles")
}
options.firstPartyIsolate = r.firstPartyIsolate
options.autoRedirect = r.autoRedirect
switch (r.onlyEmbeddedVideo) {
case "onlyNotEmbedded":
options.youtube.redirectType = "main_frame"
case "onlyEmbedded":
options.youtube.redirectType = "sub_frame"
case "both":
options.youtube.redirectType = "both"
}
for (const service in config.services) {
browser.storage.local.get([`disable${utils.camelCase(service)}`, `${service}RedirectType`, `${service}Frontend`, `${service}Latency`, `${service}EmbedFrontend`], r => {
if (r) {
options[service].enabled = !r["disable" + utils.camelCase(service)]
if (r[service + "Frontend"]) {
if (r[service + "Frontend"] == "yatte") options[service].frontend = "yattee"
else options[service].frontend = r[service + "Frontend"]
}
if (r[service + "RedirectType"]) options[service].redirectType = r[service + "RedirectType"]
if (r[service + "EmbedFrontend"] && (service != "youtube" || r[service + "EmbedFrontend"] == "invidious" || "piped")) options[service].embedFrontend = r[service + "EmbedFrontend"]
for (const frontend in config.services[service].frontends) {
browser.local.storage.get(`${frontend}Latency`, r => {
if (r) latency[frontend] = r[frontend + "Latency"]
for (const network in config.networks) {
let protocol
if (network == "clearnet") protocol = "normal"
else protocol = network
browser.storage.local.get([`${frontend}${utils.camelCase(protocol)}RedirectsChecks`, `${frontend}${utils.camelCase(protocol)}CustomRedirects`], r => {
if (r) {
options[frontend][network].checks = r[frontend + utils.camelCase(protocol) + "RedirectsChecks"]
options[frontend][network].custom = r[frontend + utils.camelCase(protocol) + "CustomRedirects"]
}
})
}
})
let oldService
switch (service) {
case "tiktok":
oldService = "tikTok"
break
case "sendFiles":
oldService = "sendTarget"
break
default:
oldService = service
}
options[service].enabled = !r["disable" + utils.camelCase(oldService)]
if (r[oldService + "Frontend"]) {
if (r[oldService + "Frontend"] == "yatte") options[service].frontend = "yattee"
else options[service].frontend = r[oldService + "Frontend"]
}
if (r[oldService + "RedirectType"]) options[service].redirectType = r[oldService + "RedirectType"]
if (r[oldService + "EmbedFrontend"] && (service != "youtube" || r[oldService + "EmbedFrontend"] == "invidious" || r[oldService + "EmbedFrontend"] == "piped"))
options[service].embedFrontend = r[oldService + "EmbedFrontend"]
for (const frontend in config.services[service].frontends) {
if (r[frontend + "Latency"]) latency[frontend] = r[frontend + "Latency"]
for (const network in config.networks) {
let protocol
if (network == "clearnet") protocol = "normal"
else protocol = network
if (r[frontend + utils.camelCase(protocol) + "RedirectsChecks"]) {
options[frontend][network].enabled = r[frontend + utils.camelCase(protocol) + "RedirectsChecks"]
options[frontend][network].custom = r[frontend + utils.camelCase(protocol) + "CustomRedirects"]
}
}
})
}
}
browser.storage.local.set({ options, latency })
resolve()
browser.storage.local.set({ options, latency }, () => resolve())
})
})
})

View File

@ -342,7 +342,7 @@ function getPreferencesFromToken(frontend, targetUrl, urls, name, endpoint) {
})
}
function copyRaw(test, copyRawElement, config) {
function copyRaw(test, copyRawElement) {
return new Promise(resolve => {
browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
let currTab = tabs[0]
@ -355,7 +355,7 @@ function copyRaw(test, copyRawElement, config) {
return
}
let newUrl = servicesHelper.reverse(url, config)
const newUrl = await servicesHelper.reverse(url)
if (newUrl) {
resolve(newUrl)
@ -387,9 +387,7 @@ function unify() {
return
}
const result = await servicesHelper.unifyPreferences(url, currTab.id)
resolve(result)
resolve(await servicesHelper.unifyPreferences(url, currTab.id))
}
})
})

View File

@ -22,7 +22,8 @@
"frontends": {
"invidious": {
"preferences": {
"cookies": ["PREFS"]
"cookies": ["PREFS"],
"localstorage": ["dark_mode"]
},
"name": "Invidious",
"embeddable": true,
@ -529,7 +530,7 @@
"embeddable": false,
"url": "https://maps.libredirect.invalid"
},
"uploadFiles": {
"sendFiles": {
"frontends": {
"send": {
"name": "Send",

View File

@ -431,6 +431,7 @@ def peertube():
def isValid(url): # This code is contributed by avanitrachhadiya2155
try:
url.encode('ascii')
result = urlparse(url)
return all([result.scheme, result.netloc])
except Exception:

View File

@ -84,7 +84,7 @@
<path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
</svg>
<a href="#uploadFiles" data-localise="__MSG_uploadFiles__">Send Files</a></div>
<a href="#sendFiles" data-localise="__MSG_sendFiles__">Send Files</a></div>
<div class="title"><svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" fill="currentColor">
<path d="M11 17h2v-6h-2Zm1-8q.425 0 .713-.288Q13 8.425 13 8t-.287-.713Q12.425 7 12 7t-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9Zm0 13q-2.075 0-3.9-.788-1.825-.787-3.175-2.137-1.35-1.35-2.137-3.175Q2 14.075 2 12t.788-3.9q.787-1.825 2.137-3.175 1.35-1.35 3.175-2.138Q9.925 2 12 2t3.9.787q1.825.788 3.175 2.138 1.35 1.35 2.137 3.175Q22 9.925 22 12t-.788 3.9q-.787 1.825-2.137 3.175-1.35 1.35-3.175 2.137Q14.075 22 12 22Zm0-2q3.35 0 5.675-2.325Q20 15.35 20 12q0-3.35-2.325-5.675Q15.35 4 12 4 8.65 4 6.325 6.325 4 8.65 4 12q0 3a.35 2.325 5.675Q8.65 20 12 20Zm0-8Z"></path>
</svg>
@ -150,11 +150,6 @@
</button>
</div>
</form>
<div class="buttons buttons-inline"><a class="button button-inline" id="test">
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
<path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"></path>
</svg>
Test Test Yes Yes</a>&nbsp; &nbsp;</div>
<div class="checklist" id="exceptions-custom-checklist"></div>
<div class="buttons buttons-inline"><a class="button button-inline" id="update-instances">
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
@ -323,9 +318,9 @@
<path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
</svg>
<x data-localise="__MSG_uploadFiles__">Send Files</x>
<x data-localise="__MSG_sendFiles__">Send Files</x>
</div>
<input id="uploadFiles" type="checkbox">
<input id="sendFiles" type="checkbox">
</div>
</div>
@ -3139,14 +3134,14 @@
</div>
</section>
<section class="option-block" id="uploadFiles_page">
<section class="option-block" id="sendFiles_page">
<div class="some-block option-block">
<h1 data-localise="__MSG_uploadFiles__">Send Files</h1>
<h1 data-localise="__MSG_sendFiles__">Send Files</h1>
</div>
<hr>
<div class="some-block option-block">
<h4 data-localise="__MSG_enable__">Enable</h4>
<input id="uploadFiles-enabled" type="checkbox">
<input id="sendFiles-enabled" type="checkbox">
</div>
<hr>
<div id="send">

View File

@ -49,16 +49,16 @@ function setOption(option, multiChoice, event) {
let exportSettingsElement = document.getElementById("export-settings")
function exportSettings() {
browser.storage.local.get(null, result => {
let resultString = JSON.stringify(result, null, " ")
exportSettingsElement.href = "data:application/json;base64," + btoa(encodeURI(resultString))
browser.storage.local.get("options", result => {
result.options.version = browser.runtime.getManifest().version
let resultString = JSON.stringify(result.options, null, " ")
exportSettingsElement.href = "data:application/json;base64," + btoa(resultString)
exportSettingsElement.download = "libredirect-settings.json"
})
}
exportSettings()
document.getElementById("general_page").addEventListener("click", exportSettings)
document.getElementById("test").addEventListener("click", servicesHelper.upgradeOptions)
let importSettingsElement = document.getElementById("import-settings")
let importSettingsElementText = document.getElementById("import_settings_text")
@ -70,7 +70,22 @@ importSettingsElement.addEventListener("change", () => {
reader.onload = async () => {
const data = JSON.parse(reader.result)
if ("theme" in data && "disableImgur" in data && "imgurRedirects" in data) {
browser.storage.local.clear(() => browser.storage.local.set({ ...data }, () => location.reload()))
browser.storage.local.clear(() =>
browser.storage.local.set({ ...data }, () => {
fetch("/instances/blacklist.json")
.then(response => response.text())
.then(async data => {
browser.storage.local.set({ blacklists: JSON.parse(data) }, async () => {
await generalHelper.initDefaults()
await servicesHelper.initDefaults()
await servicesHelper.upgradeOptions()
location.reload()
})
})
})
)
} else if ("version" in data) {
browser.storage.local.clear(() => browser.storage.local.set({ options: data }, () => location.reload()))
} else {
console.log("incompatible settings")
importError()

View File

@ -107,13 +107,13 @@
<h4 data-localise="__MSG_maps__">Maps</h4></a>
<input class="maps-enabled" type="checkbox"/>
</div>
<div class="uploadFiles some-block"><a class="title" href="https://send.libredirect.invalid">
<div class="sendFiles some-block"><a class="title" href="https://send.libredirect.invalid">
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
<path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
</svg>
<h4 data-localise="__MSG_uploadFiles__">Send Files</h4></a>
<input class="uploadFiles-enabled" type="checkbox"/>
<h4 data-localise="__MSG_sendFiles__">Send Files</h4></a>
<input class="sendFiles-enabled" type="checkbox"/>
</div>
<div id="current_site_divider">
@ -220,13 +220,13 @@
<h4 data-localise="__MSG_maps__">Maps</h4></a>
<input class="maps-enabled" type="checkbox"/>
</div>
<div class="uploadFiles some-block"><a class="title" href="https://send.libredirect.invalid">
<div class="sendFiles some-block"><a class="title" href="https://send.libredirect.invalid">
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
<path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
</svg>
<h4 data-localise="__MSG_uploadFiles__">Send Files</h4></a>
<input class="uploadFiles-enabled" type="checkbox"/>
<h4 data-localise="__MSG_sendFiles__">Send Files</h4></a>
<input class="sendFiles-enabled" type="checkbox"/>
</div>
</div>

View File

@ -26,7 +26,7 @@ utils.switchInstance(true).then(r => {
else document.getElementById("change_instance").addEventListener("click", () => utils.switchInstance(false))
})
utils.copyRaw(true, null, config).then(r => {
utils.copyRaw(true).then(r => {
if (!r) document.getElementById("copy_raw_div").style.display = "none"
else {
const copy_raw = document.getElementById("copy_raw")
@ -81,13 +81,13 @@ browser.storage.local.get("options", r => {
let service = await serviceHelper.computeService(url, true)
let frontend
if (service) {
if (service[1]) {
if (service[0]) {
frontend = service[1]
service = service[0]
}
divs[service].current.classList.remove("hide")
divs[service].all.classList.add("hide")
if (config.services[service].frontends[frontend].preferences && !config.services[service].frontends[frontend].preferences.token) {
if (frontend && config.services[service].frontends[frontend].preferences && !config.services[service].frontends[frontend].preferences.token) {
const unify = document.getElementById("unify")
const textElement = document.getElementById("unify").getElementsByTagName("h4")[0]
unify.addEventListener("click", () => {