diff --git a/app.json b/app.json index 73742cff..975f3a5e 100644 --- a/app.json +++ b/app.json @@ -1,7 +1,17 @@ { - "name": "Holy Unblocker v5.5", - "description": "Holy Unblocker is a secure web proxy service supporting numerous sites while concentrating on detail with design, mechanics, and features. Bypass web filters regardless of whether it is an extension or network-based.", - "repository": "https://github.com/titaniumnetwork-dev/Holy-Unblocker", - "logo": "https://raw.githubusercontent.com/titaniumnetwork-dev/Holy-Unblocker/master/views/assets/img/icon.png", - "keywords": ["holyunblocker", "womginx", "corrosion", "titaniumnetwork", "node", "proxy", "unblocker", "webproxy", "games"] -} \ No newline at end of file + "name": "Holy Unblocker v5.5", + "description": "Holy Unblocker is a secure web proxy service supporting numerous sites while concentrating on detail with design, mechanics, and features. Bypass web filters regardless of whether it is an extension or network-based.", + "repository": "https://github.com/titaniumnetwork-dev/Holy-Unblocker", + "logo": "https://raw.githubusercontent.com/titaniumnetwork-dev/Holy-Unblocker/master/views/assets/img/icon.png", + "keywords": [ + "holyunblocker", + "womginx", + "corrosion", + "titaniumnetwork", + "node", + "proxy", + "unblocker", + "webproxy", + "games" + ] +} diff --git a/backend.js b/backend.js index 4d152f81..0062b594 100644 --- a/backend.js +++ b/backend.js @@ -1,4 +1,3 @@ -(async() => { - await - import ('./src/server.mjs'); -})(); \ No newline at end of file +(async () => { + await import("./src/server.mjs"); +})(); diff --git a/ecosystem.config.js b/ecosystem.config.js index 6dcb8491..a80de18f 100644 --- a/ecosystem.config.js +++ b/ecosystem.config.js @@ -1,22 +1,24 @@ module.exports = { - apps: [{ - name: 'HolyUB', - script: './backend.js', - env: { - PORT: 8078, - NODE_ENV: "development", - }, - env_production: { - PORT: 8078, - NODE_ENV: "production", - }, - instances: "1", - exec_interpreter: "babel-node", - exec_mode: "fork", - autorestart: true, - exp_backoff_restart_delay: 100, - cron_restart: "*/10 * * * *", - kill_timeout: 3000, - watch: false - }] -}; \ No newline at end of file + apps: [ + { + name: "HolyUB", + script: "./backend.js", + env: { + PORT: 8078, + NODE_ENV: "development", + }, + env_production: { + PORT: 8078, + NODE_ENV: "production", + }, + instances: "1", + exec_interpreter: "babel-node", + exec_mode: "fork", + autorestart: true, + exp_backoff_restart_delay: 100, + cron_restart: "*/10 * * * *", + kill_timeout: 3000, + watch: false, + }, + ], +}; diff --git a/src/config.json b/src/config.json index 361d99d9..5993febd 100644 --- a/src/config.json +++ b/src/config.json @@ -1,12 +1,9 @@ { - "title": "HU LTS", - "port": "8080", - "ssl": false, - "ws": true, - "prefix": "/service/", - "codec": "xor", - "blacklist": [ - "accounts.google.com", - "dcounter.space" - ] + "title": "HU LTS", + "port": "8080", + "ssl": false, + "ws": true, + "prefix": "/service/", + "codec": "xor", + "blacklist": ["accounts.google.com", "dcounter.space"] } diff --git a/src/data.json b/src/data.json index 0ad228e1..0a5c6499 100644 --- a/src/data.json +++ b/src/data.json @@ -1,15 +1,21 @@ { - "chars": [ - "­", "​", "­" - ], - "keywords": [ - "Example1", "Example2", "Example3", "Example4", "Example5", "Example6", "Example7", "Example8", "Example9" - ], - "content": [ - "Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1", - "Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2" - ], - "splash": [ - "This version is the public LTS build of the web proxy service project and may be hosted unofficially. Check your domain or jo‌­in t‌he T⁡­N Di‌s­co⁡­rd for official pr­iva️te sit‌e lin­ks for your safety." - ] -} \ No newline at end of file + "chars": ["­", "​", "­"], + "keywords": [ + "Example1", + "Example2", + "Example3", + "Example4", + "Example5", + "Example6", + "Example7", + "Example8", + "Example9" + ], + "content": [ + "Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1Example1", + "Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2Example2" + ], + "splash": [ + "This version is the public LTS build of the web proxy service project and may be hosted unofficially. Check your domain or jo‌­in t‌he T⁡­N Di‌s­co⁡­rd for official pr­iva️te sit‌e lin­ks for your safety." + ] +} diff --git a/src/randomization.mjs b/src/randomization.mjs index 94e55c57..f26f485f 100644 --- a/src/randomization.mjs +++ b/src/randomization.mjs @@ -1,6 +1,13 @@ -import pkg from './routes.mjs'; -import { existsSync, readFileSync } from 'fs'; -const { cookingInserts, vegetables, charRandom, splashRandom, cacheBustList, text404 } = pkg; +import pkg from "./routes.mjs"; +import { existsSync, readFileSync } from "fs"; +const { + cookingInserts, + vegetables, + charRandom, + splashRandom, + cacheBustList, + text404, +} = pkg; export { insertText, paintSource, tryReadFile }; /* @@ -11,62 +18,51 @@ export { insertText, paintSource, tryReadFile }; // stringOrFunctionToGenerateNewText); */ const insertText = (lis, str, newText) => { - let position; + let position; -// The lis argument should be a list of strings containing placeholders. -// Ensure lis is formatted as a list, and loop through each of the -// placeholder strings. - for (let placeholder of [].concat(lis)) { -// Find all matches of a placeholder string and insert new text there. - while ((position = str.indexOf(placeholder)) >= 0) - str = str.slice(0, position) - + (typeof newText == 'function' ? newText() : newText) - + str.slice(position + placeholder.length); - } - return str; + // The lis argument should be a list of strings containing placeholders. + // Ensure lis is formatted as a list, and loop through each of the + // placeholder strings. + for (let placeholder of [].concat(lis)) { + // Find all matches of a placeholder string and insert new text there. + while ((position = str.indexOf(placeholder)) >= 0) + str = + str.slice(0, position) + + (typeof newText == "function" ? newText() : newText) + + str.slice(position + placeholder.length); + } + return str; }; - - // Below are lots of function definitions used to obfuscate the website. // This makes the website harder to properly categorize, as its source code // changes with each time it is loaded. -const randomListItem = lis => () => lis[Math.random() * lis.length | 0], - -charset = ['­', '​', '­', ''], -getRandomChar = randomListItem(charRandom), -insertCharset = str => insertText( - charset, - str, - getRandomChar -), - -getRandomSplash = randomListItem(splashRandom), -hutaoInsert = str => insertText( - '', - str, - getRandomSplash -), - -getCookingText = () => `${randomListItem(cookingInserts)()}`, -insertCooking = str => insertText( - '', - str, - getCookingText -), - -// This one isn't for obfuscation; it's just for dealing with cache issues. -cacheBusting = str => { +const randomListItem = (lis) => () => lis[(Math.random() * lis.length) | 0], + charset = ["­", "​", "­", ""], + getRandomChar = randomListItem(charRandom), + insertCharset = (str) => insertText(charset, str, getRandomChar), + getRandomSplash = randomListItem(splashRandom), + hutaoInsert = (str) => insertText("", str, getRandomSplash), + getCookingText = () => + `${randomListItem(cookingInserts)()}`, + insertCooking = (str) => + insertText( + "", + str, + getCookingText + ), + // This one isn't for obfuscation; it's just for dealing with cache issues. + cacheBusting = (str) => { for (let item of Object.entries(cacheBustList)) - str = insertText(item[0], str, item[1]); + str = insertText(item[0], str, item[1]); return str; -}, - -// Applies the final obfuscation changes to an entire file. -paintSource = str => insertCharset(hutaoInsert(insertCooking(cacheBusting(str)))), - -// Grabs the text content of a file. -tryReadFile = file => existsSync(file) ? readFileSync(file, 'utf8') : text404; + }, + // Applies the final obfuscation changes to an entire file. + paintSource = (str) => + insertCharset(hutaoInsert(insertCooking(cacheBusting(str)))), + // Grabs the text content of a file. + tryReadFile = (file) => + existsSync(file) ? readFileSync(file, "utf8") : text404; /* // All of this is now old code. @@ -105,4 +101,4 @@ export function tryReadFile(file) { return existsSync(file) ? readFileSync(file, 'utf8') : text404; } -*/ \ No newline at end of file +*/ diff --git a/src/routes.mjs b/src/routes.mjs index 6213f61b..4f28d296 100644 --- a/src/routes.mjs +++ b/src/routes.mjs @@ -1,40 +1,43 @@ -import { readFileSync } from 'fs'; -import path from 'path'; -import { readFile } from 'fs/promises'; +import { readFileSync } from "fs"; +import path from "path"; +import { readFile } from "fs/promises"; - -const insert = JSON.parse(await readFile(new URL('./data.json', - import.meta.url))); +const insert = JSON.parse( + await readFile(new URL("./data.json", import.meta.url)) +); const __dirname = path.resolve(); -const text404 = readFileSync(path.normalize(__dirname + '/views/error.html'), 'utf8'); +const text404 = readFileSync( + path.normalize(__dirname + "/views/error.html"), + "utf8" +); const pages = { - 'index': 'index.html', - /* Main */ - 'documentation': 'docs.html', - 'faq': 'faq.html', - 's': 'pages/frame.html', - 'browse': 'pages/surf.html', - 'credits': 'pages/nav/credits.html', - 'x': 'pages/nav/bookmarklets.html', - 'terms': 'pages/nav/terms.html', - /* Games */ - 'g': 'pages/nav/gtools.html', - 'h': 'pages/nav/games5.html', - 'el': 'pages/nav/emulators.html', - 'f': 'pages/nav/flash.html', - 'm': 'pages/nav/emulibrary.html', - /* Proxies */ - 'q': 'pages/proxnav/ultraviolet.html', - 'rh': 'pages/proxnav/rammerhead.html', - /* Proxy Presets */ - 'y': 'pages/proxnav/preset/youtube.html', - 'apps': 'pages/proxnav/preset/applications.html', - /* Misc */ - 'fg': 'archive/gfiles/flash/index.html', - 'eg': 'archive/gfiles/rarch/index.html', - 'vos': 'archive/vibeOS/index.html' + index: "index.html", + /* Main */ + documentation: "docs.html", + faq: "faq.html", + s: "pages/frame.html", + browse: "pages/surf.html", + credits: "pages/nav/credits.html", + x: "pages/nav/bookmarklets.html", + terms: "pages/nav/terms.html", + /* Games */ + g: "pages/nav/gtools.html", + h: "pages/nav/games5.html", + el: "pages/nav/emulators.html", + f: "pages/nav/flash.html", + m: "pages/nav/emulibrary.html", + /* Proxies */ + q: "pages/proxnav/ultraviolet.html", + rh: "pages/proxnav/rammerhead.html", + /* Proxy Presets */ + y: "pages/proxnav/preset/youtube.html", + apps: "pages/proxnav/preset/applications.html", + /* Misc */ + fg: "archive/gfiles/flash/index.html", + eg: "archive/gfiles/rarch/index.html", + vos: "archive/vibeOS/index.html", }; const cookingInserts = insert.content; @@ -42,10 +45,18 @@ const vegetables = insert.keywords; const charRandom = insert.chars; const splashRandom = insert.splash; const cacheBustList = { - "styles.css": "styles-1644738239.css", - "h5-nav.js": "h5-nav-1644738239.js", - "common.js": "common-16451543478.js", - "links.js": "links-1644738239.js" + "styles.css": "styles-1644738239.css", + "h5-nav.js": "h5-nav-1644738239.js", + "common.js": "common-16451543478.js", + "links.js": "links-1644738239.js", }; -export default { pages, text404, cookingInserts, vegetables, charRandom, splashRandom, cacheBustList }; \ No newline at end of file +export default { + pages, + text404, + cookingInserts, + vegetables, + charRandom, + splashRandom, + cacheBustList, +}; diff --git a/src/server.mjs b/src/server.mjs index 93f32601..d9d204f7 100644 --- a/src/server.mjs +++ b/src/server.mjs @@ -1,117 +1,130 @@ -import { paintSource, tryReadFile } from './randomization.mjs'; -import loadTemplates from './templates.mjs'; -import pkg from './routes.mjs'; -import { readFile } from 'fs/promises'; -import path from 'path'; -import express from 'express'; -import helmet from 'helmet'; -import http from 'http'; -import createRammerhead from 'rammerhead/src/server/index.js'; -import { createBareServer } from '@tomphttp/bare-server-node'; -import wisp from 'wisp-server-node'; -import { epoxyPath } from '@mercuryworkshop/epoxy-transport'; -import { baremuxPath } from '@mercuryworkshop/bare-mux/node'; -import { uvPath } from '@titaniumnetwork-dev/ultraviolet'; +import { paintSource, tryReadFile } from "./randomization.mjs"; +import loadTemplates from "./templates.mjs"; +import pkg from "./routes.mjs"; +import { readFile } from "fs/promises"; +import path from "path"; +import express from "express"; +import helmet from "helmet"; +import http from "http"; +import createRammerhead from "rammerhead/src/server/index.js"; +import { createBareServer } from "@tomphttp/bare-server-node"; +import wisp from "wisp-server-node"; +import { epoxyPath } from "@mercuryworkshop/epoxy-transport"; +import { baremuxPath } from "@mercuryworkshop/bare-mux/node"; +import { uvPath } from "@titaniumnetwork-dev/ultraviolet"; -const config = JSON.parse(await readFile(new URL('./config.json', import.meta.url))); +const config = JSON.parse( + await readFile(new URL("./config.json", import.meta.url)) +); const { pages, text404 } = pkg; const __dirname = path.resolve(); const port = process.env.PORT || config.port; const app = express(); const router = express.Router(); -const bare = createBareServer('/bare/'); +const bare = createBareServer("/bare/"); const rh = createRammerhead(); -app.get('/baremux/bare.cjs', (req, res) => { - res.setHeader('Content-Type', 'application/javascript'); - res.sendFile(path.join(baremuxPath, 'bare.cjs')); +app.get("/baremux/bare.cjs", (req, res) => { + res.setHeader("Content-Type", "application/javascript"); + res.sendFile(path.join(baremuxPath, "bare.cjs")); }); - const rammerheadScopes = [ - '/rammerhead.js', - '/hammerhead.js', - '/transport-worker.js', - '/task.js', - '/iframe-task.js', - '/worker-hammerhead.js', - '/messaging', - '/sessionexists', - '/deletesession', - '/newsession', - '/editsession', - '/needpassword', - '/syncLocalStorage', - '/api/shuffleDict', - '/mainport' + "/rammerhead.js", + "/hammerhead.js", + "/transport-worker.js", + "/task.js", + "/iframe-task.js", + "/worker-hammerhead.js", + "/messaging", + "/sessionexists", + "/deletesession", + "/newsession", + "/editsession", + "/needpassword", + "/syncLocalStorage", + "/api/shuffleDict", + "/mainport", ]; const rammerheadSession = /^\/[a-z0-9]{32}/; function shouldRouteRh(req) { - const url = new URL(req.url, 'http://0.0.0.0'); - return ( - rammerheadScopes.includes(url.pathname) || - rammerheadSession.test(url.pathname) - ); + const url = new URL(req.url, "http://0.0.0.0"); + return ( + rammerheadScopes.includes(url.pathname) || + rammerheadSession.test(url.pathname) + ); } function routeRhRequest(req, res) { - rh.emit('request', req, res); + rh.emit("request", req, res); } function routeRhUpgrade(req, socket, head) { - rh.emit('upgrade', req, socket, head); + rh.emit("upgrade", req, socket, head); } const server = http.createServer((req, res) => { - if (bare.shouldRoute(req)) { - bare.routeRequest(req, res); - } else if (shouldRouteRh(req)) { - routeRhRequest(req, res); - } else { - app(req, res); - } + if (bare.shouldRoute(req)) { + bare.routeRequest(req, res); + } else if (shouldRouteRh(req)) { + routeRhRequest(req, res); + } else { + app(req, res); + } }); -server.on('upgrade', (req, socket, head) => { - if (bare.shouldRoute(req)) { - bare.routeUpgrade(req, socket, head); - } else if (shouldRouteRh(req)) { - routeRhUpgrade(req, socket, head); - } else if (req.url.endsWith('/wisp/')) { - wisp.routeRequest(req, socket, head); - } +server.on("upgrade", (req, socket, head) => { + if (bare.shouldRoute(req)) { + bare.routeUpgrade(req, socket, head); + } else if (shouldRouteRh(req)) { + routeRhUpgrade(req, socket, head); + } else if (req.url.endsWith("/wisp/")) { + wisp.routeRequest(req, socket, head); + } }); // Apply Helmet middleware for security -app.use(helmet({ - contentSecurityPolicy: false // Disable CSP - })); +app.use( + helmet({ + contentSecurityPolicy: false, // Disable CSP + }) +); // All website files are stored in the /views directory. // This takes one of those files and displays it for a site visitor. // Query strings like /?j are converted into paths like /views/hidden.html // back here. Which query string converts to what is defined in routes.mjs. -router.get('/', async (req, res) => res.send(paintSource(loadTemplates(tryReadFile( -// Return the index page if the query is not found, as there is no -// undefined page in routes.mjs. Also sets it as the default page. - path.join(__dirname, 'views', pages[Object.keys(req.query)[0]] || pages.index) - ))))); - +router.get("/", async (req, res) => + res.send( + paintSource( + loadTemplates( + tryReadFile( + // Return the index page if the query is not found, as there is no + // undefined page in routes.mjs. Also sets it as the default page. + path.join( + __dirname, + "views", + pages[Object.keys(req.query)[0]] || pages.index + ) + ) + ) + ) + ) +); app.use(router); -app.use(express.static(path.join(__dirname, 'views'))); -app.use('/uv/', express.static(uvPath)); -app.use('/epoxy/', express.static(epoxyPath)); -app.use('/baremux/', express.static(baremuxPath)); +app.use(express.static(path.join(__dirname, "views"))); +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) => { - res.status(404).send(paintSource(loadTemplates(text404))); + res.status(404).send(paintSource(loadTemplates(text404))); }); - server.listen(port); -console.log('Holy Unblocker is listening on port ' + port + '.'); \ No newline at end of file +console.log("Holy Unblocker is listening on port " + port + "."); diff --git a/src/templates.mjs b/src/templates.mjs index 7ce2e188..98d91c6f 100644 --- a/src/templates.mjs +++ b/src/templates.mjs @@ -1,32 +1,38 @@ -import { insertText, tryReadFile } from './randomization.mjs'; -import path from 'path'; +import { insertText, tryReadFile } from "./randomization.mjs"; +import path from "path"; export { loadTemplates as default }; const __dirname = path.resolve(); -const header = tryReadFile(path.normalize(__dirname + '/views/pages/misc/deobf/header.html')), +const header = tryReadFile( + path.normalize(__dirname + "/views/pages/misc/deobf/header.html") + ), + footer = tryReadFile( + path.normalize(__dirname + "/views/pages/misc/deobf/footer.html") + ), + documentation = tryReadFile( + path.normalize(__dirname + "/views/pages/misc/deobf/docs.html") + ), + faq = tryReadFile( + path.normalize(__dirname + "/views/pages/misc/deobf/faq.html") + ), + terms = tryReadFile( + path.normalize(__dirname + "/views/pages/misc/deobf/tos.html") + ), + settings = tryReadFile( + path.normalize(__dirname + "/views/pages/misc/deobf/settings.html") + ), + loadTemplates = (str) => { + str = insertText("", str, header); + str = insertText("", str, footer); -footer = tryReadFile(path.normalize(__dirname + '/views/pages/misc/deobf/footer.html')), - -documentation = tryReadFile(path.normalize(__dirname + '/views/pages/misc/deobf/docs.html')), - -faq = tryReadFile(path.normalize(__dirname + '/views/pages/misc/deobf/faq.html')), - -terms = tryReadFile(path.normalize(__dirname + '/views/pages/misc/deobf/tos.html')), - -settings = tryReadFile(path.normalize(__dirname + '/views/pages/misc/deobf/settings.html')), - -loadTemplates = str => { - str = insertText('', str, header); - str = insertText('', str, footer); - -// Used only on docs.html - str = insertText('', str, documentation); -// Used only on faq.html - str = insertText('', str, faq); -// Used only on terms.html - str = insertText('', str, terms); -// Used only on csel.html - str = insertText('', str, settings); + // Used only on docs.html + str = insertText("", str, documentation); + // Used only on faq.html + str = insertText("", str, faq); + // Used only on terms.html + str = insertText("", str, terms); + // Used only on csel.html + str = insertText("", str, settings); return str; -}; \ No newline at end of file + }; diff --git a/test.js b/test.js index f0195a27..5bd22108 100644 --- a/test.js +++ b/test.js @@ -1,19 +1,21 @@ -const axios = require('axios'); +const axios = require("axios"); async function testServerResponse() { - try { - const response = await axios.get('http://localhost:8080/?pathtonowhere'); - if (response.status === 200) { - console.log('Server responded with status code 200. Test passed.'); - process.exit(0); // Exit with success - } else { - console.error(`Expected status code 200 but received ${response.status}. Test failed.`); - process.exit(1); // Exit with failure - } - } catch (error) { - console.error('Error while testing server response:', error.message); - process.exit(1); // Exit with failure + try { + const response = await axios.get("http://localhost:8080/?pathtonowhere"); + if (response.status === 200) { + console.log("Server responded with status code 200. Test passed."); + process.exit(0); // Exit with success + } else { + console.error( + `Expected status code 200 but received ${response.status}. Test failed.` + ); + process.exit(1); // Exit with failure } + } catch (error) { + console.error("Error while testing server response:", error.message); + process.exit(1); // Exit with failure + } } testServerResponse(); diff --git a/views/docs.html b/views/docs.html index 2890b92d..39a6356e 100644 --- a/views/docs.html +++ b/views/docs.html @@ -1,4 +1,4 @@ - + diff --git a/views/error.html b/views/error.html index 024fd0f4..7ae1b68c 100644 --- a/views/error.html +++ b/views/error.html @@ -1,38 +1,53 @@ - + - - - - - - Holy Unblocker | Error - + + + - - - - - + Holy Unblocker | Error + + + + + + - + - +
-
-

Site Error!

-

Might be doing some maintenance or the web server is down.

-

In that case wait a bit until it is resolved!

-
-

Invalid URL? View the FAQ page for help!

-
+
+

Site Error!

+

Might be doing some maintenance or the web server is down.

+

In that case wait a bit until it is resolved!

+
+

+ Invalid URL? View the + FAQ page for help! +

+
- - - \ No newline at end of file + + diff --git a/views/faq.html b/views/faq.html index df589da5..0c175e3e 100644 --- a/views/faq.html +++ b/views/faq.html @@ -1,4 +1,4 @@ - + diff --git a/views/pages/frame.html b/views/pages/frame.html index 1644ebf3..b80f0083 100644 --- a/views/pages/frame.html +++ b/views/pages/frame.html @@ -1,39 +1,53 @@ - + - - - - - Holy Unblocker - + + - - - - - + Holy Unblocker + + + + + + - + - + - - - \ No newline at end of file + + diff --git a/views/pages/misc/deobf/faq.html b/views/pages/misc/deobf/faq.html index 1ff66e3f..547602a0 100644 --- a/views/pages/misc/deobf/faq.html +++ b/views/pages/misc/deobf/faq.html @@ -1,130 +1,297 @@
-

Official Holy Unblocker FAQ and Support

+

Official Holy Unblocker FAQ and Support

- +
- -

Icon Information

-

How to find the Icon URL of a Site

-

Go to the website you want an icon from, then use this bookmarklet (drag it to your bookmarks bar):

-
- Find Icon URL -
- -

Copy the URL that the bookmarklet gives you. Then go back to HU and enter in the URL for the Icon URL in Settings. Enjoy!

+ +

Icon Information

+

How to find the Icon URL of a Site

+

+ Go to the website you want an icon from, then use this bookmarklet (drag it + to your bookmarks bar): +

+
+ Find Icon URL +
+ +

+ Copy the URL that the bookmarklet gives you. Then go back to HU and enter in + the URL for the Icon URL in Settings. Enjoy! +

-
-

I am getting 502 errors. What do I do?

-

The proxy may be down, being worked on or is under high load.

-

When this happens you may either switch sites to fix the error or wait a bit. Sometimes clearing your cache can help by doing Ctrl+Shift+R or reloading the page normally. (Hard Reload which purges cache.)

-
-
-

I am getting an error similar to: "'cdn.example.com' cannot be reached."

-

Right-click the page and do Reload Frame. If that doesn't work the first time, try waiting a bit or switching sites. Lastly doing a Hard Reload may help. (Ctrl+Shift+R)

-
-
-

Is Discord supported? And can I gain access to a better proxy for Discord?

-

Yes, Discord is supported. You can now login normally with Womginx but most of the proxies still require you to login via QR Code or Token. You may view the extended Discord proxy information below for more information.

- -

If you wish for a pro​xy with better support for Disc​ord, be sure to join the T​N Disco​rd.

-

By donating $3 (simply type $upgrade in the TN Discord) you can gain access to the premium Di​sco​rd p​rox​y which is faster, more secure and outside of the current limitation of using Di​scor​d normally with any of the free pro​xi​es.

-

The prem​ium Di​sco​rd p​r​ox​y is outside of these issues:

- -
-
-

Why are YouTube videos not working?

-

If you are having persistent issues even after doing the steps above there is a chance that the instance is down temporarily, especially if large groups of people are also having the issue. The latest release of Alloy currently does not have support for YouTube. However manually putting in full links like https://www.youtube.com/watch?v=mauV2NdCs60 will work. You may also try doing a Hard Reload (Ctrl+Shift+R)

-

A later release of Alloy may fix this issue. Sorry.

-
-
-

When using YouTube I get a similar error to "Cannot GET /watch"

-

Do Ctrl+Shift+R (Hard Reload which clears your cache) and if that doesn't work use the full URL of the video you want to watch with either Alloy or Womginx, Alloy being preferred for an option as it has the best YouTube support.

-
-
-

Parse error, etc. or perhaps even Cannot GET /gkfdsgkfgfdkg

-

Might be possible that you need to wait a bit because of updates that may have occurred and are not visible yet due to cache. In this situation do a Hard Reload or switch Holy Unblocker sites. (Ctrl + Shift + R)

-
-
-

Why is the site I am on not working correctly or having CAPTCHA errors?

-

Captcha support is currently not available on all of the current proxies sadly. Therefore some sites may not work with any of the sites. Read below for issues with links on sites.

-
-
-

Why are page links not working or leading to 404 pages?

-

This is an issue with the latest release of Alloy proxy but it may also occur with other proxies. In this case manually entering the URL of the page you would like to view can solve this or try navigating using the home button. (Reddit, Twitter) - The next release of Alloy may fix this also.

-
-
-

When using YouTube on any of the proxy sites, why does the page not load fully or the video is just white?

-

There are two methods for fixing this:

- -

When using Discord under Alloy or Powermouse, why does the page stay gray/white or the QR code not load?

-
-
-

Once again do the same steps above:

- -
-
-

Discord Proxy Information:

-

Disclaimer:

-

Your account may be at risk of being disabled by Discord if you are using any of the proxies in general, Womginx being a possible exception. Unless you have 2FA or a phone number be careful. -

-
-
-

General Steps:

-

1) Go to either Surf Freely/Web Proxies if you wish to access Discord manually or the Discord page from the navbar.

-

If you selected the Discord page simply choose either Stealth Mode or Classic Mode. For any support view the FAQ questions above.

-

2) Select either Womginx or Alloy. Womginx has support for normal logins but may not work for every filter while Alloy is QR login only but has generally better support in some cases.

-

3) Type out one of these terms:

-

- https://discord.com/login

-

- https://discord.com/app

-

4) Then hit either Stealth or Classic as a mode. Stealth mode hides your history while Classic mode is the normal method of accessing a site.

-
-
-

QR Login FAQ:

-

Make sure you are using Alloy + QR Code for Discord. You CANNOT login normally with Alloy.

-

Powermouse also has QR login support if you wish for an alternative proxy.

-
QR Code Information: https://support.discord.com/hc/en-us/articles/360039213771-QR-Code-Login-FAQ
-

Use the link above through one of the proxies to read if you can't.

-

Common Issues with Solutions:

- -

If none of these solutions work either the proxy is down or you can try to do a hard reload. (Ctrl+Shift+R)

-
-
-

PM also has amazing support for QR logins. Feel free to mess around between PM and Alloy.

-

Token Login Extended:

-

Also, search up on YT on How to find your Discord Token when using Token Login. This only works on Powermouse but not the best option.

-

Token logins on Powermouse (PM Proxy) will require another device also for recovering your Discord account.

-

Best Solution: Do Ctrl+Shift+R (Hard Reload which clears your cache). Sites here are often updated hence issues that may arise.

-
-
\ No newline at end of file +
+

I am getting 502 errors. What do I do?

+

The proxy may be down, being worked on or is under high load.

+

+ When this happens you may either switch sites to fix the error or wait a + bit. Sometimes clearing your cache can help by doing Ctrl+Shift+R or + reloading the page normally. (Hard Reload which purges cache.) +

+
+
+

+ I am getting an error similar to: "'cdn.example.com' cannot be + reached." +

+

+ Right-click the page and do Reload Frame. If that doesn't work the first + time, try waiting a bit or switching sites. Lastly doing a Hard Reload may + help. (Ctrl+Shift+R) +

+
+
+

+ Is Discord supported? And can I gain access to a better proxy for + Discord? +

+

+ Yes, Discord is supported. You can now login normally with Womginx but + most of the proxies still require you to login via QR Code or Token. You + may view the extended Discord proxy information below for more + information. +

+ +

+ If you wish for a pro​xy with better support for Disc​ord, be sure to join + the T​N Disco​rd. +

+

+ By donating $3 (simply type $upgrade in the TN Discord) you can gain + access to the premium Di​sco​rd p​rox​y which is faster, more secure and + outside of the current limitation of using Di​scor​d normally with any of + the free pro​xi​es. +

+

The prem​ium Di​sco​rd p​r​ox​y is outside of these issues:

+ +
+
+

Why are YouTube videos not working?

+

+ If you are having persistent issues even after doing the steps above there + is a chance that the instance is down temporarily, especially if large + groups of people are also having the issue. The latest release of Alloy + currently does not have support for YouTube. However + manually putting in full links like + https://www.youtube.com/watch?v=mauV2NdCs60 will work. You + may also try doing a Hard Reload (Ctrl+Shift+R) +

+

A later release of Alloy may fix this issue. Sorry.

+
+
+

+ When using YouTube I get a similar error to "Cannot GET /watch" +

+

+ Do Ctrl+Shift+R (Hard Reload which clears your cache) and if that doesn't + work use the full URL of the video you want to watch with either Alloy or + Womginx, Alloy being preferred for an option as it has the best YouTube + support. +

+
+
+

+ Parse error, etc. or perhaps even Cannot GET /gkfdsgkfgfdkg + +

+

+ Might be possible that you need to wait a bit because of updates that may + have occurred and are not visible yet due to cache. In this situation do a + Hard Reload or switch Holy Unblocker sites. (Ctrl + Shift + R) +

+
+
+

+ Why is the site I am on not working correctly or having CAPTCHA + errors? +

+

+ Captcha support is currently not available on all of the current proxies + sadly. Therefore some sites may not work with any of the sites. Read below + for issues with links on sites. +

+
+
+

+ Why are page links not working or leading to 404 pages? +

+

+ This is an issue with the latest release of Alloy proxy but it may also + occur with other proxies. In this case manually entering the URL of the + page you would like to view can solve this or try navigating using the + home button. (Reddit, Twitter) The next release of Alloy may fix this + also. +

+
+
+

+ + When using YouTube on any of the proxy sites, why does the page not load + fully or the video is just white? +

+

There are two methods for fixing this:

+ +

+ When using Discord under Alloy or Powermouse, why does the page stay + gray/white or the QR code not load? +

+
+
+

Once again do the same steps above:

+ +
+
+

Discord Proxy Information:

+

Disclaimer:

+

+ Your account may be at risk of being disabled by Discord if you are using + any of the proxies in general, Womginx being a possible exception. Unless + you have 2FA or a phone number be careful. +

+
+
+

General Steps:

+

+ 1) Go to either Surf Freely/Web Proxies if you wish to access Discord + manually or the Discord page from the navbar. +

+

+ If you selected the Discord page simply choose either Stealth Mode or + Classic Mode. For any support view the FAQ questions above. +

+

+ 2) Select either Womginx or Alloy. Womginx has support for normal logins + but may not work for every filter while Alloy is QR login only but has + generally better support in some cases. +

+

3) Type out one of these terms:

+

- https://discord.com/login

+

- https://discord.com/app

+

+ 4) Then hit either Stealth or Classic as a mode. Stealth mode hides your + history while Classic mode is the normal method of accessing a site. +

+
+
+

QR Login FAQ:

+

+ Make sure you are using Alloy + QR Code for Discord. You CANNOT login + normally with Alloy. +

+

+ Powermouse also has QR login support if you wish for an alternative proxy. +

+
+ QR Code Information: + https://support.discord.com/hc/en-us/articles/360039213771-QR-Code-Login-FAQ +
+

Use the link above through one of the proxies to read if you can't.

+

Common Issues with Solutions:

+ +

+ If none of these solutions work either the proxy is down or you can try to + do a hard reload. (Ctrl+Shift+R) +

+
+
+

+ PM also has amazing support for QR logins. Feel free to mess around + between PM and Alloy. +

+

Token Login Extended:

+

+ Also, search up on YT on How to find your Discord Token when using Token + Login. This only works on Powermouse but not the best option. +

+

+ Token logins on Powermouse (PM Proxy) will require another device also for + recovering your Discord account. +

+

+ Best Solution: Do Ctrl+Shift+R (Hard Reload which clears + your cache). Sites here are often updated hence issues that may arise. +

+
+ diff --git a/views/pages/misc/deobf/footer.html b/views/pages/misc/deobf/footer.html index 5cbfca64..df9dffaf 100644 --- a/views/pages/misc/deobf/footer.html +++ b/views/pages/misc/deobf/footer.html @@ -1,31 +1,62 @@
-
-

Holy Unblocker

-

Global Web Proxy Innovation, Done Right.

-
-
-

Services

- -
-
-

About

- -
-
- -
+
+

Holy Unblocker

+

Global Web Proxy Innovation, Done Right.

+
+
+

Services

+ +
+
+

About

+ +
+
+ +
- - + +
- \ No newline at end of file + diff --git a/views/pages/misc/deobf/header.html b/views/pages/misc/deobf/header.html index e511407e..67728042 100644 --- a/views/pages/misc/deobf/header.html +++ b/views/pages/misc/deobf/header.html @@ -7,9 +7,9 @@