This commit is contained in:
Entrpix 2024-07-06 19:20:46 -04:00
parent d2d8853fb0
commit 3c7652b41d
10 changed files with 1731 additions and 54 deletions

View file

@ -15,13 +15,16 @@
"author": "Titanium Network", "author": "Titanium Network",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@titaniumnetwork-dev/ultraviolet": "^1.0.4", "@mercuryworkshop/bare-mux": "^1.1.4",
"@tomphttp/bare-server-node": "^1.2.2", "@mercuryworkshop/epoxy-transport": "^2.0.6",
"@titaniumnetwork-dev/ultraviolet": "^3.1.5",
"@tomphttp/bare-server-node": "^2.0.3",
"babel": "^6.23.0", "babel": "^6.23.0",
"corrosion": "^1.0.0", "corrosion": "^1.0.0",
"express": "^4.17.1", "express": "^4.19.2",
"mime-types": "^2.1.27", "mime-types": "^2.1.35",
"node-fetch": "^3.2.0", "node-fetch": "^3.3.2",
"ws": "^7.5.3" "wisp-server-node": "^1.1.0",
"ws": "^8.18.0"
} }
} }

1590
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,7 @@
import { uvPath } from '@titaniumnetwork-dev/ultraviolet'; import wisp from "wisp-server-node";
import createBareServer from '@tomphttp/bare-server-node'; import { uvPath } from "@titaniumnetwork-dev/ultraviolet";
import { epoxyPath } from "@mercuryworkshop/epoxy-transport";
import { baremuxPath } from "@mercuryworkshop/bare-mux/node";
import http from 'http'; import http from 'http';
import path from 'path'; import path from 'path';
import express from 'express'; import express from 'express';
@ -7,9 +9,8 @@ import { readFile } from 'fs/promises';
import pkg from './routes.mjs'; import pkg from './routes.mjs';
import { paintSource, tryReadFile } from './randomization.mjs'; import { paintSource, tryReadFile } from './randomization.mjs';
const bare = createBareServer('/bare/');
const config = JSON.parse(await readFile(new URL('./config.json', const config = JSON.parse(await readFile(new URL('./config.json', import.meta.url)));
import.meta.url)));
const { pages, text404 } = pkg; const { pages, text404 } = pkg;
const __dirname = path.resolve(); const __dirname = path.resolve();
const port = process.env.PORT || config.port; const port = process.env.PORT || config.port;
@ -17,30 +18,30 @@ const app = express();
const router = express.Router(); const router = express.Router();
const server = http.createServer(); const server = http.createServer();
server.on('request', (req, res) => {
if (bare.shouldRoute(req)) {
bare.routeRequest(req, res);
} else {
app(req, res);
}
});
server.on('upgrade', (req, socket, head) => { router.get('/', async (req, res) => res.send(paintSource(tryReadFile(path.join(__dirname, 'views', ['/', '/?'].includes(req.url) ? pages.index : pages[Object.keys(req.query)[0]])))));
if (bare.shouldRoute(req)) {
bare.routeUpgrade(req, socket, head);
} else {
app(req, res);
}
});
router.get('/', async(req, res) => res.send(paintSource(tryReadFile(path.join(__dirname, 'views', ['/', '/?'].includes(req.url) ? pages.index : pages[Object.keys(req.query)[0]])))));
app.use(router); app.use(router);
app.use(express.static(path.join(__dirname, 'views'))); app.use(express.static(path.join(__dirname, 'views')));
app.use("/uv/", express.static(uvPath)); app.use("/uv/", express.static(uvPath));
app.use("/epoxy/", express.static(epoxyPath));
app.use("/baremux/", express.static(baremuxPath));
app.disable('x-powered-by'); app.disable('x-powered-by');
app.use((req, res) => { app.use((req, res) => {
res.status(404).send(paintSource(text404)); res.status(404).send(paintSource(text404));
}); });
server.on("request", (req, res) => {
res.setHeader("Cross-Origin-Opener-Policy", "same-origin");
res.setHeader("Cross-Origin-Embedder-Policy", "require-corp");
app(req, res);
});
server.on("upgrade", (req, socket, head) => {
if (req.url.endsWith("/wisp/"))
wisp.routeRequest(req, socket, head);
else
socket.end();
});
server.listen(port); server.listen(port);
console.log('Holy Unblocker is listening on port ' + port + '.'); console.log('Holy Unblocker is listening on port ' + port + '.');

View file

@ -958,4 +958,15 @@ strong) {
.gfooter-only { .gfooter-only {
margin: 40px 0px 32px 0px; margin: 40px 0px 32px 0px;
} }
#hu-frame {
border: none;
position: absolute;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: #111;
}

View file

@ -5,7 +5,7 @@
const stockSW = "/uv/sw.js"; const stockSW = "/uv/sw.js";
/** /**
* List of hostnames that are allowed to run serviceworkers on http: * List of hostnames that are allowed to run serviceworkers on http://
*/ */
const swAllowedHostnames = ["localhost", "127.0.0.1"]; const swAllowedHostnames = ["localhost", "127.0.0.1"];
@ -14,17 +14,19 @@ const swAllowedHostnames = ["localhost", "127.0.0.1"];
* Used in 404.html and index.html * Used in 404.html and index.html
*/ */
async function registerSW() { async function registerSW() {
if ( if (!navigator.serviceWorker) {
location.protocol !== "https:" && if (
!swAllowedHostnames.includes(location.hostname) location.protocol !== "https:" &&
) !swAllowedHostnames.includes(location.hostname)
throw new Error("Service workers cannot be registered without https."); )
throw new Error("Service workers cannot be registered without https.");
if (!navigator.serviceWorker)
throw new Error("Your browser doesn't support service workers."); throw new Error("Your browser doesn't support service workers.");
}
// Ultraviolet has a stock `sw.js` script. await navigator.serviceWorker.register(stockSW);
await navigator.serviceWorker.register(stockSW, {
scope: __uv$config.prefix, // Register the EpoxyClient transport to be used for network requests
}); let wispUrl = (location.protocol === "https:" ? "wss" : "ws") + "://" + location.host + "/wisp/";
} await BareMux.SetTransport("EpxMod.EpoxyClient", { wisp: wispUrl });
}

32
views/assets/js/search.js Normal file
View file

@ -0,0 +1,32 @@
"use strict";
/**
*
* @param {string} input
* @param {string} template Template for a search query.
* @returns {string} Fully qualified URL
*/
function search(input, template) {
try {
// input is a valid URL:
// eg: https://example.com, https://example.com/test?q=param
return new URL(input).toString();
} catch (err) {
// input was not a valid URL
}
try {
// input is a valid URL when http:// is added to the start:
// eg: example.com, https://example.com/test?q=param
const url = new URL(`http://${input}`);
// only if the hostname has a TLD/subdomain
if (url.hostname.includes(".")) return url.toString();
} catch (err) {
// input was not valid URL
}
// input may have been a valid URL, however the hostname was invalid
// Attempts to convert the input to a fully qualified URL have failed
// Treat the input as a search query
return template.replace("%s", encodeURIComponent(input));
}

View file

@ -0,0 +1,22 @@
const form = document.getElementById("pr-form");
const address = document.getElementById("pr-url");
const searchEngine = "https://google.com/search?q=%s";
form.addEventListener("submit", async (event) => {
event.preventDefault();
try {
await registerSW();
} catch (err) {
alert(err);
throw err;
}
const url = search(address.value, searchEngine);
let frame = document.getElementById("hu-frame");
frame.style.display = "block";
frame.src = __uv$config.prefix + __uv$config.encodeUrl(url);
});

View file

@ -12,6 +12,13 @@
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="dns-prefetch" href="https://fonts.googleapis.com"> <link rel="dns-prefetch" href="https://fonts.googleapis.com">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
<script src="/baremux/bare.cjs" defer></script>
<script src="/epoxy/index.js" defer></script>
<script src="/uv/uv.bundle.js" defer></script>
<script src="/uv/uv.config.js" defer></script>
<script src="/assets/js/register-sw.js" defer></script>
<script src="/assets/js/search.js" defer></script>
<script src="/assets/js/uvhuwork.js" defer></script>
<script defer="defer" src="https://cdn.jsdelivr.net/npm/tsparticles@1.39.2/tsparticles.min.js" integrity="sha256-FCz5ToEA27payrGYaVGRidiIA+68Z31TBXFzcIT1/gU=" crossorigin="anonymous"></script> <script defer="defer" src="https://cdn.jsdelivr.net/npm/tsparticles@1.39.2/tsparticles.min.js" integrity="sha256-FCz5ToEA27payrGYaVGRidiIA+68Z31TBXFzcIT1/gU=" crossorigin="anonymous"></script>
</head> </head>
@ -28,11 +35,11 @@
<img id="cor-logo" class="pr-logo" src="/assets/img/uv2.png" alt="Ultraviolet TN Logo"> <img id="cor-logo" class="pr-logo" src="/assets/img/uv2.png" alt="Ultraviolet TN Logo">
<p>T&#173;he hi&#173;ghly inno&#173;vati&#173;ve pr&#173;ox&#173;y of Tit&#173;aniu&#173;m Netw&#173;ork usi&#173;ng tec&#173;hnologi&#173;es such as servi&#173;ce wor&#173;kers and soph&#173;isticated rewr&#173;iting techniq&#173;ues wit&#173;h <p>T&#173;he hi&#173;ghly inno&#173;vati&#173;ve pr&#173;ox&#173;y of Tit&#173;aniu&#173;m Netw&#173;ork usi&#173;ng tec&#173;hnologi&#173;es such as servi&#173;ce wor&#173;kers and soph&#173;isticated rewr&#173;iting techniq&#173;ues wit&#173;h
CAPT&#173;CHA suppor&#173;t.</p> CAPT&#173;CHA suppor&#173;t.</p>
<div id="pr-form"> <form id="pr-form">
<input type="text" id="pr-url" spellcheck="false" autocomplete="off" placeholder="Search or enter in a target site!"> <input type="text" id="pr-url" spellcheck="false" autocomplete="off" placeholder="Search or enter in a target site!">
<a href="#" id="pr-go1" class="pr-button glowbutton">Cl&#173;assic</a> <a href="#" id="pr-go1" class="pr-button glowbutton">Cl&#173;assic</a>
<a href="#" id="pr-go2" class="pr-button glowbutton">Stea&#173;lth</a> <a href="#" id="pr-go2" class="pr-button glowbutton">Stea&#173;lth</a>
</div> </form>
<h3>More Information:</h3> <h3>More Information:</h3>
<div class="font3"> <div class="font3">
<p class="accented"> <p class="accented">
@ -53,20 +60,11 @@
</div> </div>
</div> </div>
<div id="footer" class="fullwidth"></div> <div id="footer" class="fullwidth"></div>
<iframe style="display: none;" id="hu-frame"></iframe>
<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE --> <!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->
<script src="assets/js/common.js"></script> <script src="assets/js/common.js"></script>
<script src="assets/js/links.js"></script> <script src="assets/js/links.js"></script>
<script src="assets/js/prset.js"></script> <script src="assets/js/prset.js"></script>
<script>
prSet("ultraviolet");
</script>
<script src="uv/uv.bundle.js"></script>
<script src="uv/uv.config.js"></script>
<script src="assets/js/register-sw.js"></script>
<script>
registerSW();
</script>
</script>
<script src="assets/js/header.js"></script> <script src="assets/js/header.js"></script>
<script src="assets/js/csel.js"></script> <script src="assets/js/csel.js"></script>
<script src="assets/js/footer.js"></script> <script src="assets/js/footer.js"></script>

18
views/uv/sw.js Normal file
View file

@ -0,0 +1,18 @@
importScripts('/epoxy/index.js');
importScripts('/uv/uv.bundle.js');
importScripts('/uv/uv.config.js');
importScripts(__uv$config.sw || '/uv/uv.sw.js');
const uv = new UVServiceWorker();
self.addEventListener('fetch', event => {
event.respondWith(
(async ()=>{
if(uv.route(event)) {
return await uv.fetch(event);
}
return await fetch(event.request);
})()
);
});

View file

@ -2,11 +2,11 @@
self.__uv$config = { self.__uv$config = {
prefix: "/uv/service/", prefix: "/uv/service/",
bare: "/bare/",
encodeUrl: Ultraviolet.codec.xor.encode, encodeUrl: Ultraviolet.codec.xor.encode,
decodeUrl: Ultraviolet.codec.xor.decode, decodeUrl: Ultraviolet.codec.xor.decode,
handler: "/uv/uv.handler.js", handler: "/uv/uv.handler.js",
client: "/uv/uv.client.js",
bundle: "/uv/uv.bundle.js", bundle: "/uv/uv.bundle.js",
config: "/uv/uv.config.js", config: "/uv/uv.config.js",
sw: "/uv/uv.sw.js", sw: "/uv/uv.sw.js",
}; };