mirror of
https://github.com/QuiteAFancyEmerald/Holy-Unblocker.git
synced 2025-05-12 11:30:01 -04:00
Ghetto domain blacklist since workerware is being difficult; other JS revisions.
This commit is contained in:
parent
636e1fc45f
commit
be733b69a7
5 changed files with 236 additions and 5 deletions
|
@ -76,7 +76,7 @@ const testServerResponse = async () => {
|
||||||
console.error(
|
console.error(
|
||||||
"One or more endpoints failed to respond with status code 200. Test failed."
|
"One or more endpoints failed to respond with status code 200. Test failed."
|
||||||
);
|
);
|
||||||
process.exit(1);
|
process.exitCode = 1;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -303,14 +303,14 @@ xx xx
|
||||||
|
|
||||||
if (rammerheadPassed && ultravioletPassed) {
|
if (rammerheadPassed && ultravioletPassed) {
|
||||||
console.log("Both tests passed.");
|
console.log("Both tests passed.");
|
||||||
process.exit(0);
|
process.exitCode = 0;
|
||||||
} else {
|
} else {
|
||||||
console.error("Tests failed.");
|
console.error("Tests failed.");
|
||||||
process.exit(1);
|
process.exitCode = 1;
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error in testCommonJSOnPage:", error.message);
|
console.error("Error in testCommonJSOnPage:", error.message);
|
||||||
process.exit(1);
|
process.exitCode = 1;
|
||||||
} finally {
|
} finally {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
}
|
}
|
||||||
|
|
1
views/assets/json/blacklist.json
Normal file
1
views/assets/json/blacklist.json
Normal file
|
@ -0,0 +1 @@
|
||||||
|
["*.google.com"]
|
12
views/uv/WWError.js
Normal file
12
views/uv/WWError.js
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
/* -----------------------------------------------
|
||||||
|
/* Authors: wearrrrr
|
||||||
|
/* GNU General Public License v3.0: https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||||
|
/* Workerware Error Script
|
||||||
|
/* ----------------------------------------------- */
|
||||||
|
|
||||||
|
class WWError extends Error {
|
||||||
|
constructor(message) {
|
||||||
|
super(message);
|
||||||
|
this.name = "[WorkerWare Exception]";
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,15 +2,59 @@ importScripts("uv.bundle.js");
|
||||||
importScripts("uv.config.js");
|
importScripts("uv.config.js");
|
||||||
importScripts(__uv$config.sw || "uv.sw.js");
|
importScripts(__uv$config.sw || "uv.sw.js");
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Workerware does not work yet due to one of the following possibilities:
|
||||||
|
|
||||||
|
1. UV or the bare client is not updated to support workerware yet.
|
||||||
|
2. Workerware is unfinished.
|
||||||
|
3. We are doofuses and do not know how to use workerware properly.
|
||||||
|
|
||||||
|
Going to implement a ghetto domain blacklist for now.
|
||||||
|
|
||||||
|
importScripts("./workerware.js");
|
||||||
|
|
||||||
|
const ww = new WorkerWare({
|
||||||
|
debug: true,
|
||||||
|
randomNames: true,
|
||||||
|
timing: true
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
ww.use({
|
||||||
|
function: event => console.log(event),
|
||||||
|
events: ["fetch", "message"]
|
||||||
|
});
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
const uv = new UVServiceWorker();
|
const uv = new UVServiceWorker();
|
||||||
|
|
||||||
|
// Get list of blacklisted domains.
|
||||||
|
let blacklist;
|
||||||
|
fetch("/assets/json/blacklist.json").then(request => {
|
||||||
|
request.json().then(jsonData => {
|
||||||
|
blacklist = jsonData.map(
|
||||||
|
domain => new RegExp(domain.replaceAll(".", "\\.").replaceAll("*", "."))
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
self.addEventListener("fetch", (event) => {
|
self.addEventListener("fetch", (event) => {
|
||||||
event.respondWith(
|
event.respondWith(
|
||||||
(async () => {
|
(async () => {
|
||||||
|
// The one and only ghetto domain blacklist.
|
||||||
|
if (!new URL(event.request.url).pathname.indexOf("/uv/service/")) {
|
||||||
|
const url = new URL(uv.config.decodeUrl(new URL(event.request.url).pathname.replace(/^\/uv\/service\//, "")));
|
||||||
|
if (blacklist.some(domain => domain.test(url.hostname)))
|
||||||
|
return new Response(new Blob(), {status: 406});
|
||||||
|
}
|
||||||
|
|
||||||
if (uv.route(event)) {
|
if (uv.route(event)) {
|
||||||
return await uv.fetch(event);
|
return await uv.fetch(event);
|
||||||
}
|
}
|
||||||
return await fetch(event.request);
|
return await fetch(event.request);
|
||||||
})()
|
})()
|
||||||
);
|
);
|
||||||
});
|
});
|
174
views/uv/workerware.js
Normal file
174
views/uv/workerware.js
Normal file
|
@ -0,0 +1,174 @@
|
||||||
|
/* -----------------------------------------------
|
||||||
|
/* Authors: wearrrrr
|
||||||
|
/* GNU General Public License v3.0: https://www.gnu.org/licenses/gpl-3.0.en.html
|
||||||
|
/* Service Worker Middleware Script
|
||||||
|
/* ----------------------------------------------- */
|
||||||
|
|
||||||
|
importScripts("./WWError.js");
|
||||||
|
const dbg = console.log.bind(console, "[WorkerWare]");
|
||||||
|
const time = console.time.bind(console, "[WorkerWare]");
|
||||||
|
const timeEnd = console.timeEnd.bind(console, "[WorkerWare]");
|
||||||
|
|
||||||
|
/*
|
||||||
|
OPTS:
|
||||||
|
debug - Enables debug logging.
|
||||||
|
randomNames - Generate random names for middlewares.
|
||||||
|
timing - Logs timing for each middleware.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const defaultOpt = {
|
||||||
|
debug: false,
|
||||||
|
randomNames: false,
|
||||||
|
timing: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
const validEvents = [
|
||||||
|
"abortpayment",
|
||||||
|
"activate",
|
||||||
|
"backgroundfetchabort",
|
||||||
|
"backgroundfetchclick",
|
||||||
|
"backgroundfetchfail",
|
||||||
|
"backgroundfetchsuccess",
|
||||||
|
"canmakepayment",
|
||||||
|
"contentdelete",
|
||||||
|
"cookiechange",
|
||||||
|
"fetch",
|
||||||
|
"install",
|
||||||
|
"message",
|
||||||
|
"messageerror",
|
||||||
|
"notificationclick",
|
||||||
|
"notificationclose",
|
||||||
|
"paymentrequest",
|
||||||
|
"periodicsync",
|
||||||
|
"push",
|
||||||
|
"pushsubscriptionchange",
|
||||||
|
"sync",
|
||||||
|
];
|
||||||
|
|
||||||
|
class WorkerWare {
|
||||||
|
constructor(opt) {
|
||||||
|
this._opt = Object.assign({}, defaultOpt, opt);
|
||||||
|
this._middlewares = [];
|
||||||
|
}
|
||||||
|
info() {
|
||||||
|
return {
|
||||||
|
version: "0.1.0",
|
||||||
|
middlewares: this._middlewares,
|
||||||
|
options: this._opt,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
use(middleware) {
|
||||||
|
let validateMW = this.validateMiddleware(middleware);
|
||||||
|
if (validateMW.error) throw new WWError(validateMW.error);
|
||||||
|
// This means the middleware is an anonymous function, or the user is silly and named their function "function"
|
||||||
|
if (middleware.function.name == "function") middleware.name = crypto.randomUUID();
|
||||||
|
if (!middleware.name) middleware.name = middleware.function.name;
|
||||||
|
if (this._opt.randomNames) middleware.name = crypto.randomUUID();
|
||||||
|
if (this._opt.debug) dbg("Adding middleware:", middleware.name);
|
||||||
|
this._middlewares.push(middleware);
|
||||||
|
}
|
||||||
|
// Run all middlewares for the event type passed in.
|
||||||
|
run(event) {
|
||||||
|
const middlewares = this._middlewares;
|
||||||
|
const returnList = [];
|
||||||
|
let fn = async () => {
|
||||||
|
for (let i = 0; i < middlewares.length; i++) {
|
||||||
|
if (middlewares[i].events.includes(event.type)) {
|
||||||
|
if (this._opt.timing) console.time(middlewares[i].name);
|
||||||
|
// Add the configuration to the event object.
|
||||||
|
event.workerware = {
|
||||||
|
config: middlewares[i].configuration || {},
|
||||||
|
};
|
||||||
|
if (!middlewares[i].explicitCall) {
|
||||||
|
let res = await middlewares[i].function(event);
|
||||||
|
if (this._opt.timing) console.timeEnd(middlewares[i].name);
|
||||||
|
returnList.push(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return returnList;
|
||||||
|
};
|
||||||
|
return fn;
|
||||||
|
}
|
||||||
|
deleteByName(middlewareID) {
|
||||||
|
if (this._opt.debug) dbg("Deleting middleware:", middlewareID);
|
||||||
|
this._middlewares = this._middlewares.filter((mw) => mw.name !== middlewareID);
|
||||||
|
}
|
||||||
|
deleteByEvent(middlewareEvent) {
|
||||||
|
if (this._opt.debug) dbg("Deleting middleware by event:", middlewareEvent);
|
||||||
|
this._middlewares = this._middlewares.filter((mw) => !mw.events.includes(middlewareEvent));
|
||||||
|
}
|
||||||
|
get() {
|
||||||
|
return this._middlewares;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Run a single middleware by ID.
|
||||||
|
This assumes that the user knows what they're doing, and is running the middleware on an event that it's supposed to run on.
|
||||||
|
*/
|
||||||
|
runMW(name, event) {
|
||||||
|
const middlewares = this._middlewares;
|
||||||
|
if (this._opt.debug) dbg("Running middleware:", name);
|
||||||
|
// if (middlewares.includes(name)) {
|
||||||
|
// return middlewares[name](event);
|
||||||
|
// } else {
|
||||||
|
// throw new WWError("Middleware not found!");
|
||||||
|
// }
|
||||||
|
let didCall = false;
|
||||||
|
for (let i = 0; i < middlewares.length; i++) {
|
||||||
|
if (middlewares[i].name == name) {
|
||||||
|
didCall = true;
|
||||||
|
event.workerware = {
|
||||||
|
config: middlewares[i].configuration || {},
|
||||||
|
}
|
||||||
|
if (this._opt.timing) console.time(middlewares[i].name);
|
||||||
|
let call = middlewares[i].function(event);
|
||||||
|
if (this._opt.timing) console.timeEnd(middlewares[i].name);
|
||||||
|
return call;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!didCall) {
|
||||||
|
throw new WWError("Middleware not found!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// type middlewareManifest = {
|
||||||
|
// function: Function,
|
||||||
|
// name?: string,
|
||||||
|
// events: string[], // Should be a union of validEvents.
|
||||||
|
// configuration?: Object // Optional configuration for the middleware.
|
||||||
|
// }
|
||||||
|
validateMiddleware(middleware) {
|
||||||
|
if (!middleware.function)
|
||||||
|
return {
|
||||||
|
error: "middleware.function is required",
|
||||||
|
};
|
||||||
|
if (typeof middleware.function !== "function")
|
||||||
|
return {
|
||||||
|
error: "middleware.function must be typeof function",
|
||||||
|
};
|
||||||
|
if (typeof middleware.configuration !== "object" && middleware.configuration !== undefined) {
|
||||||
|
return {
|
||||||
|
error: "middleware.configuration must be typeof object",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (!middleware.events)
|
||||||
|
return {
|
||||||
|
error: "middleware.events is required",
|
||||||
|
};
|
||||||
|
if (!Array.isArray(middleware.events))
|
||||||
|
return {
|
||||||
|
error: "middleware.events must be an array",
|
||||||
|
};
|
||||||
|
if (middleware.events.some((ev) => !validEvents.includes(ev)))
|
||||||
|
return {
|
||||||
|
error: "Invalid event type! Must be one of the following: " + validEvents.join(", "),
|
||||||
|
};
|
||||||
|
if (middleware.explicitCall && typeof middleware.explicitCall !== "boolean") {
|
||||||
|
return {
|
||||||
|
error: "middleware.explicitCall must be typeof boolean",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
error: undefined,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue