forked from QuiteAFancyEmerald/Holy-Unblocker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
129 lines (111 loc) · 4.64 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* -----------------------------------------------
* Authors: QuiteAFancyEmerald, BinBashBanana (OlyB), YÖCTDÖNALD'S
* Additional help from Divide and SexyDuceDuce
* MIT license: http://opensource.org/licenses/MIT
* ----------------------------------------------- */
const
alloy = require('./src/alloyproxy'),
path = require('path'),
config = require('./config.json'),
fs = require('fs'),
http = require('http'),
express = require('express'),
app = express(),
port = process.env.PORT || config.port,
server = http.createServer(app);
btoa = (str) => {
return new Buffer.from(str).toString('base64');
}
atob = (str) => {
return new Buffer.from(str, 'base64').toString('utf-8');
}
const text404 = fs.readFileSync(path.normalize(__dirname + '/views/404.html'), 'utf8'),
siteIndex = 'index.html',
pages = {
/* Main */
'in': 'info.html',
'faq': 'faq.html',
'j': 'hidden.html',
's': 'pages/frame.html',
'z': 'pages/surf.html',
'c': 'pages/nav/credits.html',
'x': 'pages/nav/bookmarklets.html',
'i': 'pages/nav/icons.html',
't': '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 */
'a': 'pages/proxnav/alloy.html',
'w': 'pages/proxnav/womginx.html',
'p': 'pages/proxnav/pmprox.html',
'e': 'pages/proxnav/pyb.html',
'o': 'pages/proxnav/pydodge.html',
'y': 'pages/proxnav/youtube.html',
'd': 'pages/proxnav/discordhub.html',
/* Ruffle and Webretro */
'fg': 'archive/gfiles/flash/index.html',
'eg': 'archive/gfiles/rarch/index.html'
},
fileMod = [
"/views/assets/css/styles.min.css",
],
cookingInserts = [
"Random sentence one filled with certain keywords.",
"Random sentence two filled with certain keywords."
],
splashtext = [
'Th<wbr>is is si<wbr>mp<wbr>ly a pu<wbr>bl<wbr>ic dem<wbr>o for Ho<wbr>ly Unb<wbr>locke<wbr>r. Certain functions may not work properly. Jo<wbr>in the <a id="tnlink" target="_blank">T<wbr>N Disc<wbr>ord</a> for official site lin<wbr>ks'
],
vegetables = ['Cooking1', 'Cooking2'],
charRandom = ['­', '​'];
function randomListItem(lis) {
return lis[Math.floor(Math.random() * lis.length)];
}
// The inline function returns are necessary to prevent all replaced things from being the same
function insertCharset(str) {
return str.replace(/­|​|<wbr>/g, function() { return randomListItem(charRandom); });
}
function insertSplash(str) {
return str.replace(/️/g, function() { return splashtext; });
}
function insertCooking(str) {
return str.replace(/<!-- IMPORTANT-HUCOOKINGINSERT-DONOTDELETE -->/g, function() { return '<span style="display: none;" data-fact="' + randomListItem(vegetables) + '" data-type="' + randomListItem(vegetables) + '">' + randomListItem(cookingInserts) + '</span>'; });
}
function cacheBusting(str) {
return str.replace(/styles.min.css/g, 'styles-368357.min.css');
}
function insertAll(str) {
return insertCharset(insertCooking(insertSplash(cacheBusting(str))));
}
/* Cache Busting
const stats = fs.statSync(path.normalize(__dirname + fileMod), 'utf8'),
seconds = (new Date().getTime() - stats.mtime);
fs.renameSync(path.normalize(__dirname + fileMod), 'links-' + seconds + '.js');
function cacheBusting(str) {
return str.replace(/links.js/g, "links" + '-' + seconds + '.js');
}
*/
function tryReadFile(file) {
return fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : text404;
}
// Local alloy proxy
const localAlloy = new alloy({
prefix: '/fetch/',
error: (proxy) => { proxy.res.send(tryReadFile(path.normalize(__dirname + '/views/error.html')).replace('%ERR%', proxy.error.info.message.replace(/<|>/g, ''))); }, // Doing replace functions on "<" and ">" to prevent XSS.
request: [],
response: [],
injection: true
});
app.use(localAlloy.app);
localAlloy.ws(server);
/* Querystring Navigation */
app.get('/', async(req, res) => res.send(insertAll(tryReadFile(path.normalize(__dirname + '/views/' + (['/', '/?'].includes(req.url) ? siteIndex : pages[Object.keys(req.query)[0]]))))));
/* Static Files Served */
app.use(express.static(path.normalize(__dirname + '/views')));
app.use((req, res) => res.status(404, res.send(insertAll(text404))));
server.listen(port);
console.log('Holy Unblocker is listening on port ' + port + '. This is simply a public for Holy Unblocker. Certain functions may not work properly.');