forked from svrjs/svrjs
Update to SVR.JS 3.7.5
This commit is contained in:
parent
750a312b2f
commit
55262f73c5
5 changed files with 69 additions and 65 deletions
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2020 DorianTech S.A.
|
||||
Copyright (c) 2020-2023 DorianTech
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>SVR.JS 3.7.4</title>
|
||||
<title>SVR.JS 3.7.5</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta charset="UTF-8" />
|
||||
<style>
|
||||
|
@ -12,7 +12,7 @@
|
|||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Welcome to SVR.JS 3.7.4</h1>
|
||||
<h1>Welcome to SVR.JS 3.7.5</h1>
|
||||
<br/>
|
||||
<img src="/logo.png" style="width: 256px;" />
|
||||
<br/>
|
||||
|
@ -42,7 +42,7 @@
|
|||
"rewriteMap": [<br/>
|
||||
{<br/>
|
||||
"definingRegex": "/\\/invoke500\\/\\?/",<br/>
|
||||
"replacements": dorians[<br/>
|
||||
"replacements": [<br/>
|
||||
{<br/>
|
||||
"regex": "/\\/invoke500\\/\\?/",<br/>
|
||||
"replacement": "/invoke500.svr?"<br/>
|
||||
|
@ -110,7 +110,8 @@
|
|||
</div>
|
||||
<p>Changes:</p>
|
||||
<ul>
|
||||
<li>Added reverse DNS lookup support.</li>
|
||||
<li>Fixed non-working blacklist.</li>
|
||||
<li>Updated SVR.JS license.</li>
|
||||
</ul>
|
||||
<p>Bugs:</p>
|
||||
<ul>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>SVR.JS 3.7.4 Licenses</title>
|
||||
<title>SVR.JS 3.7.5 Licenses</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta charset="UTF-8" />
|
||||
<style>
|
||||
|
@ -12,12 +12,12 @@
|
|||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>SVR.JS 3.7.4 Licenses</h1>
|
||||
<h2>SVR.JS 3.7.4</h2>
|
||||
<h1>SVR.JS 3.7.5 Licenses</h1>
|
||||
<h2>SVR.JS 3.7.5</h2>
|
||||
<div style="display: inline-block; text-align: left; border-width: 2px; border-style: solid; border-color: gray; padding: 8px;">
|
||||
MIT License<br/>
|
||||
<br/>
|
||||
Copyright (c) 2020 DorianTech S.A.<br/>
|
||||
Copyright (c) 2020-2023 DorianTech<br/>
|
||||
<br/>
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy<br/>
|
||||
of this software and associated documentation files (the "Software"), to deal<br/>
|
||||
|
@ -37,7 +37,7 @@
|
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<br/>
|
||||
SOFTWARE.<br/>
|
||||
</div>
|
||||
<h2>Packages used by SVR.JS 3.7.4 and utilities</h2>
|
||||
<h2>Packages used by SVR.JS 3.7.5 and utilities</h2>
|
||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||
<div style="float: right;">License: MIT</div>
|
||||
<div style="font-size: 20px;">
|
||||
|
|
69
svr.js
69
svr.js
|
@ -15,7 +15,7 @@
|
|||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 DorianTech S.A.
|
||||
* Copyright (c) 2020-2023 DorianTech
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
|
@ -81,7 +81,7 @@ function deleteFolderRecursive(path) {
|
|||
}
|
||||
|
||||
var os = require("os");
|
||||
var version = "3.7.4";
|
||||
var version = "3.7.5";
|
||||
var singlethreaded = false;
|
||||
|
||||
if (process.versions) process.versions.svrjs = version; //Inject SVR.JS into process.versions
|
||||
|
@ -192,9 +192,9 @@ if (!singlethreaded) {
|
|||
});
|
||||
};
|
||||
|
||||
process.removeFakeIPC = function() {
|
||||
process.removeFakeIPC = function () {
|
||||
// Close IPC server
|
||||
process.send = function() {};
|
||||
process.send = function () {};
|
||||
fakeIPCServer.close();
|
||||
}
|
||||
}
|
||||
|
@ -228,7 +228,7 @@ if (!singlethreaded) {
|
|||
}
|
||||
|
||||
oldLog = console.log;
|
||||
console.log = function(a,b,c,d,e,f) {
|
||||
console.log = function (a,b,c,d,e,f) {
|
||||
if(a == "ChildProcess.prototype.send() - Sorry! Not implemented yet") {
|
||||
throw new Error("NOT IMPLEMENTED");
|
||||
} else {
|
||||
|
@ -666,6 +666,9 @@ function ipBlockList(rawBlockList) {
|
|||
|
||||
// Function to add an IP or CIDR block to the block list
|
||||
instance.add = function (rawValue) {
|
||||
// Add to raw block list
|
||||
instance.raw.push(rawValue);
|
||||
|
||||
// Initialize variables
|
||||
var beginIndex = instance.prepared.length;
|
||||
var cidrIndex = instance.cidrs.length;
|
||||
|
@ -752,7 +755,7 @@ function ipBlockList(rawBlockList) {
|
|||
var ipParsedObject = (!isIPv6 ? ipv4ToInt : ipv6ToBlocks)(rawValue);
|
||||
var checkMethod = (!isIPv6 ? checkIfIPv4CIDRMatches : checkIfIPv6CIDRMatches);
|
||||
|
||||
return instance.cidrs.some(function(iCidr) {
|
||||
return instance.cidrs.some(function (iCidr) {
|
||||
return checkMethod(ipParsedObject, iCidr);
|
||||
});
|
||||
};
|
||||
|
@ -872,14 +875,14 @@ if (host != "[offline]" || ifaceEx) {
|
|||
} else {
|
||||
var callbackDone = false;
|
||||
|
||||
var dnsTimeout = setTimeout(function() {
|
||||
var dnsTimeout = setTimeout(function () {
|
||||
callbackDone = true;
|
||||
ipRequestCompleted = true;
|
||||
process.emit("ipRequestCompleted");
|
||||
}, 3000);
|
||||
|
||||
try {
|
||||
dns.reverse(pubip, function(err, hostnames) {
|
||||
dns.reverse(pubip, function (err, hostnames) {
|
||||
if(callbackDone) return;
|
||||
clearTimeout(dnsTimeout);
|
||||
if(!err && hostnames.length > 0) domain = hostnames[0];
|
||||
|
@ -936,14 +939,14 @@ if (host != "[offline]" || ifaceEx) {
|
|||
} else {
|
||||
var callbackDone = false;
|
||||
|
||||
var dnsTimeout = setTimeout(function() {
|
||||
var dnsTimeout = setTimeout(function () {
|
||||
callbackDone = true;
|
||||
ipRequestCompleted = true;
|
||||
process.emit("ipRequestCompleted");
|
||||
}, 3000);
|
||||
|
||||
try {
|
||||
dns.reverse(pubip, function(err, hostnames) {
|
||||
dns.reverse(pubip, function (err, hostnames) {
|
||||
if(callbackDone) return;
|
||||
clearTimeout(dnsTimeout);
|
||||
if(!err && hostnames.length > 0) domain = hostnames[0];
|
||||
|
@ -1061,15 +1064,15 @@ var blacklist = ipBlockList(rawBlackList);
|
|||
|
||||
var nonStandardCodes = [];
|
||||
nonStandardCodesRaw.forEach(function (nonStandardCodeRaw) {
|
||||
var nO = {};
|
||||
var newObject = {};
|
||||
Object.keys(nonStandardCodeRaw).forEach(function (nsKey) {
|
||||
if (nsKey != "users") {
|
||||
nO[nsKey] = nonStandardCodeRaw[nsKey];
|
||||
newObject[nsKey] = nonStandardCodeRaw[nsKey];
|
||||
} else {
|
||||
nO["users"] = ipBlockList(nonStandardCodeRaw.users);
|
||||
newObject["users"] = ipBlockList(nonStandardCodeRaw.users);
|
||||
}
|
||||
});
|
||||
nonStandardCodes.push(nO);
|
||||
nonStandardCodes.push(newObject);
|
||||
});
|
||||
|
||||
var customHeaders = (configJSON.customHeaders == undefined ? {} : JSON.parse(JSON.stringify(configJSON.customHeaders)));
|
||||
|
@ -1163,13 +1166,13 @@ if (secure) {
|
|||
cert = fs.readFileSync((configJSON.cert[0] != "/" && !configJSON.cert.match(/^[A-Z0-9]:\\/)) ? __dirname + "/" + configJSON.cert : configJSON.cert).toString();
|
||||
var sniNames = Object.keys(sni);
|
||||
var sniCredentials = [];
|
||||
for (var i = 0; i < sniNames.length; i++) {
|
||||
sniNames.forEach(function (sniName) {
|
||||
sniCredentials.push({
|
||||
name: sniNames[i],
|
||||
cert: fs.readFileSync((sni[sniNames[i]].cert[0] != "/" && !sni[sniNames[i]].cert.match(/^[A-Z0-9]:\\/)) ? __dirname + "/" + sni[sniNames[i]].cert : sni[sniNames[i]].cert).toString(),
|
||||
key: fs.readFileSync((sni[sniNames[i]].key[0] != "/" && !sni[sniNames[i]].key.match(/^[A-Z0-9]:\\/)) ? __dirname + "/" + sni[sniNames[i]].key : sni[sniNames[i]].key).toString()
|
||||
name: sniName,
|
||||
cert: fs.readFileSync((sni[sniName].cert[0] != "/" && !sni[sniName].cert.match(/^[A-Z0-9]:\\/)) ? __dirname + "/" + sni[sniName].cert : sni[sniName].cert).toString(),
|
||||
key: fs.readFileSync((sni[sniName].key[0] != "/" && !sni[sniName].key.match(/^[A-Z0-9]:\\/)) ? __dirname + "/" + sni[sniName].key : sni[sniName].key).toString()
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var logFile = undefined;
|
||||
|
@ -2815,7 +2818,7 @@ if (!cluster.isPrimary) {
|
|||
});
|
||||
|
||||
var modFunction = ffinals;
|
||||
proxyMods.reverse().forEach(function(proxyMod) {
|
||||
proxyMods.reverse().forEach(function (proxyMod) {
|
||||
modFunction = proxyMod.proxyCallback(req, socket, head, configJSON, serverconsole, modFunction);
|
||||
});
|
||||
modFunction();
|
||||
|
@ -4458,13 +4461,13 @@ if (!cluster.isPrimary) {
|
|||
callServerError(500, undefined, new Error("SVR.JS doesn't support scrypt-hashed passwords on Node.JS versions without scrypt hash support."));
|
||||
return;
|
||||
} else {
|
||||
var cacheEntry = scryptCache.find(function(entry) {
|
||||
var cacheEntry = scryptCache.find(function (entry) {
|
||||
return (entry.password == hashedPassword && entry.salt == list[_i].salt)
|
||||
});
|
||||
if(cacheEntry) {
|
||||
cb(cacheEntry.hash);
|
||||
} else {
|
||||
crypto.scrypt(password, list[_i].salt, 64, function(err, derivedKey) {
|
||||
crypto.scrypt(password, list[_i].salt, 64, function (err, derivedKey) {
|
||||
if(err) {
|
||||
callServerError(500, undefined, err);
|
||||
} else {
|
||||
|
@ -4480,13 +4483,13 @@ if (!cluster.isPrimary) {
|
|||
callServerError(500, undefined, new Error("SVR.JS doesn't support PBKDF2-hashed passwords on Node.JS versions without crypto support."));
|
||||
return;
|
||||
} else {
|
||||
var cacheEntry = pbkdf2Cache.find(function(entry) {
|
||||
var cacheEntry = pbkdf2Cache.find(function (entry) {
|
||||
return (entry.password == hashedPassword && entry.salt == list[_i].salt)
|
||||
});
|
||||
if(cacheEntry) {
|
||||
cb(cacheEntry.hash);
|
||||
} else {
|
||||
crypto.pbkdf2(password, list[_i].salt, 36250, 64, "sha512", function(err, derivedKey) {
|
||||
crypto.pbkdf2(password, list[_i].salt, 36250, 64, "sha512", function (err, derivedKey) {
|
||||
if(err) {
|
||||
callServerError(500, undefined, err);
|
||||
} else {
|
||||
|
@ -4532,7 +4535,7 @@ if (!cluster.isPrimary) {
|
|||
if(usernameMatch.length == 0) {
|
||||
usernameMatch.push({name: username, pass: "FAKEPASS", salt: "FAKESALT"}); //Fake credentials
|
||||
}
|
||||
checkIfPasswordMatches(usernameMatch, password, function(authorized) {
|
||||
checkIfPasswordMatches(usernameMatch, password, function (authorized) {
|
||||
if (!authorized) {
|
||||
if (bruteProtection) {
|
||||
if (process.send) {
|
||||
|
@ -4850,8 +4853,8 @@ function start(init) {
|
|||
if (configJSON.enableHTTP2 && !secure) serverconsole.locwarnmessage("HTTP/2 without HTTPS may not work in web browsers. Web browsers only support HTTP/2 with HTTPS!");
|
||||
if (process.isBun) {
|
||||
serverconsole.locwarnmessage("Bun support is experimental. Some features of SVR.JS, SVR.JS mods and SVR.JS server-side JavaScript may not work as expected.");
|
||||
if(users.some(function(entry) {return entry.pbkdf2;})) serverconsole.locwarnmessage("PBKDF2 password hashing function in Bun blocks the event loop, which may result in denial of service.");
|
||||
if(users.some(function(entry) {return entry.scrypt;})) serverconsole.locwarnmessage("scrypt password hashing function in Bun blocks the event loop, which may result in denial of service.");
|
||||
if(users.some(function (entry) {return entry.pbkdf2;})) serverconsole.locwarnmessage("PBKDF2 password hashing function in Bun blocks the event loop, which may result in denial of service.");
|
||||
if(users.some(function (entry) {return entry.scrypt;})) serverconsole.locwarnmessage("scrypt password hashing function in Bun blocks the event loop, which may result in denial of service.");
|
||||
}
|
||||
if (cluster.isPrimary === undefined) serverconsole.locwarnmessage("You're running SVR.JS on single thread. Reliability may suffer, as the server is stopped after crash.");
|
||||
if (crypto.__disabled__ !== undefined) serverconsole.locwarnmessage("Your Node.JS version doesn't have crypto support! The 'crypto' module is essential for providing cryptographic functionality in Node.JS. Without crypto support, certain security features may be unavailable, and some functionality may not work as expected. It's recommended to use a Node.JS version that includes crypto support to ensure the security and proper functioning of your server.");
|
||||
|
@ -4958,10 +4961,10 @@ function start(init) {
|
|||
clearInterval(pbkdf2CacheIntervalId);
|
||||
if((!cluster.isPrimary && cluster.isPrimary !== undefined) && server.listening) {
|
||||
try {
|
||||
server.close(function() {
|
||||
server.close(function () {
|
||||
if(server2.listening) {
|
||||
try {
|
||||
server2.close(function() {
|
||||
server2.close(function () {
|
||||
if(!process.removeFakeIPC) {
|
||||
if (typeof retcode == "number") {
|
||||
process.exit(retcode);
|
||||
|
@ -5079,10 +5082,10 @@ function start(init) {
|
|||
}
|
||||
if (!cluster.isPrimary) {
|
||||
pbkdf2CacheIntervalId = setInterval(function () {
|
||||
pbkdf2Cache = pbkdf2Cache.filter(function(entry) {
|
||||
pbkdf2Cache = pbkdf2Cache.filter(function (entry) {
|
||||
return entry.addDate > (new Date() - 3600000);
|
||||
});
|
||||
scryptCache = scryptCache.filter(function(entry) {
|
||||
scryptCache = scryptCache.filter(function (entry) {
|
||||
return entry.addDate > (new Date() - 3600000);
|
||||
});
|
||||
}, 1800000);
|
||||
|
@ -5411,7 +5414,7 @@ function start(init) {
|
|||
isWorkerHungUpBuff = true;
|
||||
cluster.workers[allClusters[_id]].on("message", msgListener);
|
||||
cluster.workers[allClusters[_id]].send("\x14KILLPING");
|
||||
setTimeout(function() {
|
||||
setTimeout(function () {
|
||||
if (isWorkerHungUpBuff) {
|
||||
checkWorker(callback, _id+1);
|
||||
} else {
|
||||
|
@ -5431,7 +5434,7 @@ function start(init) {
|
|||
checkWorker(callback, _id+1);
|
||||
}
|
||||
}
|
||||
checkWorker(function() {
|
||||
checkWorker(function () {
|
||||
if (goodWorkers.length > minClusters) {
|
||||
var wN = Math.floor(Math.random() * goodWorkers.length);
|
||||
if (wN == goodWorkers.length) return;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>SVR.JS 3.7.4 Tests</title>
|
||||
<title>SVR.JS 3.7.5 Tests</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta charset="UTF-8" />
|
||||
<style>
|
||||
|
@ -12,7 +12,7 @@
|
|||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>SVR.JS 3.7.4 Tests</h1>
|
||||
<h1>SVR.JS 3.7.5 Tests</h1>
|
||||
<h2>Directory</h2>
|
||||
<iframe src="/testdir" width="50%" height="300px"></iframe>
|
||||
<h2>Directory (with query)</h2>
|
||||
|
|
Reference in a new issue