This commit is contained in:
ManeraKai 2024-08-29 15:29:51 +03:00
parent 1f426d9134
commit 1492345b0d
No known key found for this signature in database
GPG Key ID: 5ABC31FFD562E337
3 changed files with 97 additions and 12 deletions

View File

@ -667,6 +667,15 @@ function computeService(url) {
resolve() resolve()
}) })
} }
export function computeFrontend(url) {
for (const service in config.services) {
for (const frontend in config.services[service].frontends) {
if (all(service, frontend, options, config).includes(utils.protocolHost(url))) {
return {service, frontend}
}
}
}
}
/** /**
* @param {URL} url * @param {URL} url
@ -975,4 +984,5 @@ export default {
copyRaw, copyRaw,
switchInstance, switchInstance,
isException, isException,
computeFrontend,
} }

View File

@ -58,7 +58,7 @@ browser.webRequest.onBeforeRequest.addListener(
return null return null
} }
const newUrl = servicesHelper.redirect( let newUrl = servicesHelper.redirect(
url, url,
details.type, details.type,
originUrl, originUrl,
@ -72,20 +72,16 @@ browser.webRequest.onBeforeRequest.addListener(
const frontend = url.searchParams.get("frontend") const frontend = url.searchParams.get("frontend")
const oldUrl = new URL(url.searchParams.get("url")) const oldUrl = new URL(url.searchParams.get("url"))
browser.tabs.update({ newUrl = browser.runtime.getURL(
url: browser.runtime.getURL(
`/pages/messages/index.html?message=no_instance&url=${encodeURIComponent(oldUrl)}&frontend=${encodeURIComponent(frontend)}` `/pages/messages/index.html?message=no_instance&url=${encodeURIComponent(oldUrl)}&frontend=${encodeURIComponent(frontend)}`
), )
})
} }
if (!newUrl) { if (!newUrl) {
if (url.href.match(/^https?:\/{2}(.*\.)?libredirect\.invalid.*/)) { if (url.href.match(/^https?:\/{2}(.*\.)?libredirect\.invalid.*/)) {
browser.tabs.update({ newUrl = browser.runtime.getURL(
url: browser.runtime.getURL(
`/pages/messages/index.html?message=disabled&url=${encodeURIComponent(url.href)}` `/pages/messages/index.html?message=disabled&url=${encodeURIComponent(url.href)}`
), )
})
} }
} }
@ -108,6 +104,22 @@ browser.webRequest.onBeforeRequest.addListener(
["blocking"] ["blocking"]
) )
browser.webRequest.onHeadersReceived.addListener(
details => {
if (details.statusCode >= 501 || details.statusCode == 429 || details.statusCode == 403) {
const url = new URL(details.url)
const { service, frontend } = servicesHelper.computeFrontend(url)
if (!service) return
browser.tabs.update({
url: browser.runtime.getURL(
`/pages/messages/index.html?message=server_error&code=${details.statusCode}=&url=${encodeURIComponent(url.href)}&frontend=${encodeURIComponent(frontend)}&service=${encodeURIComponent(service)}`
),
})
}
},
{ urls: ["<all_urls>"] }
)
browser.tabs.onRemoved.addListener(tabId => { browser.tabs.onRemoved.addListener(tabId => {
if (tabIdRedirects[tabId] != undefined) { if (tabIdRedirects[tabId] != undefined) {
delete tabIdRedirects[tabId] delete tabIdRedirects[tabId]

View File

@ -9,6 +9,7 @@
import { options, config, page } from "./stores" import { options, config, page } from "./stores"
import Button from "../components/Button.svelte" import Button from "../components/Button.svelte"
import AutoPickIcon from "../icons/AutoPickIcon.svelte" import AutoPickIcon from "../icons/AutoPickIcon.svelte"
import SwitchInstanceIcon from "../icons/SwitchInstanceIcon.svelte"
let _options let _options
const unsubscribeOptions = options.subscribe(val => { const unsubscribeOptions = options.subscribe(val => {
@ -49,7 +50,7 @@
const params = new URLSearchParams(window.location.search) const params = new URLSearchParams(window.location.search)
const oldUrl = new URL(params.get("url")) const oldUrl = new URL(params.get("url"))
async function autoPickInstance() { async function autoPick() {
const frontend = params.get("frontend") const frontend = params.get("frontend")
autoPicking = true autoPicking = true
const instances = utils.randomInstances(redirects[frontend]["clearnet"], 5) const instances = utils.randomInstances(redirects[frontend]["clearnet"], 5)
@ -59,6 +60,10 @@
_options[frontend].push(pings[0][0]) _options[frontend].push(pings[0][0])
options.set(_options) options.set(_options)
autoPicking = false autoPicking = false
}
async function autoPickInstance() {
await autoPick()
await redirectUrl() await redirectUrl()
} }
@ -73,6 +78,36 @@
const newUrl = await servicesHelper.redirectAsync(oldUrl, "main_frame", null, null, false, true) const newUrl = await servicesHelper.redirectAsync(oldUrl, "main_frame", null, null, false, true)
browser.tabs.update({ url: newUrl }) browser.tabs.update({ url: newUrl })
} }
async function switchInstance() {
const newUrl = await servicesHelper.switchInstance(oldUrl)
browser.tabs.update({ url: newUrl })
}
async function removeInstance() {
const frontend = params.get("frontend")
const i = _options[frontend].indexOf(utils.protocolHost(oldUrl))
_options[frontend].splice(i, 1)
options.set(_options)
const newUrl = await servicesHelper.switchInstance(oldUrl, service)
browser.tabs.update({ url: newUrl })
}
async function removeAndAutoPickInstance() {
const frontend = params.get("frontend")
const i = _options[frontend].indexOf(utils.protocolHost(oldUrl))
_options[frontend].splice(i, 1)
options.set(_options)
await autoPick()
const newUrl = await servicesHelper.switchInstance(oldUrl, service)
browser.tabs.update({ url: newUrl })
}
async function addAutoPickInstance() {
await autoPick()
const newUrl = await servicesHelper.switchInstance(oldUrl)
browser.tabs.update({ url: newUrl })
}
</script> </script>
{#if _options && _config} {#if _options && _config}
@ -84,6 +119,34 @@
{browser.i18n.getMessage("enable") || "Enable"} {browser.i18n.getMessage("enable") || "Enable"}
</Button> </Button>
</div> </div>
{:else if window.location.search.includes("message=server_error")}
<!-- https://httpstat.us/403 for testing -->
<div>
<h1>Your selected instance gave out an error</h1>
{#if _options[params.get("frontend")].length > 1}
<Button on:click={switchInstance}>
<SwitchInstanceIcon class="margin margin_{document.body.dir}" />
{browser.i18n.getMessage("switchInstance") || "Switch Instance"}
</Button>
<Button on:click={removeInstance}>
<SwitchInstanceIcon class="margin margin_{document.body.dir}" />
{browser.i18n.getMessage("removeInstance") || "Remove Instance"}
+
{browser.i18n.getMessage("switchInstance") || "Switch Instance"}
</Button>
{:else}
<Button on:click={addAutoPickInstance} disabled={autoPicking}>
<AutoPickIcon class="margin margin_{document.body.dir}" />
{browser.i18n.getMessage("autoPickInstance") || "Auto Pick Instance"}
</Button>
<Button on:click={removeAndAutoPickInstance} disabled={autoPicking}>
<AutoPickIcon class="margin margin_{document.body.dir}" />
{browser.i18n.getMessage("removeInstance") || "Remove Instance"}
+
{browser.i18n.getMessage("autoPickInstance") || "Auto Pick Instance"}
</Button>
{/if}
</div>
{:else if window.location.search.includes("message=no_instance")} {:else if window.location.search.includes("message=no_instance")}
<div> <div>
<h1>You have no instance selected for this frontend</h1> <h1>You have no instance selected for this frontend</h1>