Update to RedBrick 2.5.0

This commit is contained in:
Dorian Niemiec 2023-11-23 22:45:17 +01:00
parent 63a87ea149
commit 0294279efb
2 changed files with 474 additions and 426 deletions

190
index.js
View file

@ -15,6 +15,19 @@ try {
} }
var configJSONS = JSON.parse(fs.readFileSync(__dirname + "/../../../config.json")); // Read configuration JSON var configJSONS = JSON.parse(fs.readFileSync(__dirname + "/../../../config.json")); // Read configuration JSON
var exttointerpreteruser = {};
var scriptExts = [];
try {
exttointerpreteruser = JSON.parse(fs.readFileSync(__dirname + "/../../../redbrick-interpreters.json"));
} catch (ex) {
}
try {
scriptExts = JSON.parse(fs.readFileSync(__dirname + "/../../../redbrick-scriptexts.json"));
} catch (ex) {
}
function Mod() {} function Mod() {}
Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, ext, uobject, search, defaultpage, users, page404, head, foot, fd, elseCallback, configJSON, callServerError, getCustomHeaders, origHref, redirect, parsePostData) { Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, ext, uobject, search, defaultpage, users, page404, head, foot, fd, elseCallback, configJSON, callServerError, getCustomHeaders, origHref, redirect, parsePostData) {
@ -59,19 +72,12 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e
".rb": ["ruby"], ".rb": ["ruby"],
".php": ["php-cgi"] ".php": ["php-cgi"]
}; };
if(os.platform() == "win32") { if (os.platform() == "win32") {
exttointerpreter[".exe"] = []; exttointerpreter[".exe"] = [];
exttointerpreter[".bat"] = ["cmd", "/c"]; exttointerpreter[".bat"] = ["cmd", "/c"];
exttointerpreter[".cmd"] = ["cmd", "/c"];
exttointerpreter[".vbs"] = ["cscript"]; exttointerpreter[".vbs"] = ["cscript"];
} }
var exttointerpreteruser = {};
fs.readFile(__dirname + "/../../../redbrick-interpreters.json", function (err, data) {
if (!err) {
try {
exttointerpreteruser = JSON.parse(data.toString());
} catch (ex) {}
}
fs.stat(fname, function (err, stats) { fs.stat(fname, function (err, stats) {
if (err) { if (err) {
if (!callServerError) { if (!callServerError) {
@ -210,12 +216,12 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e
} }
for (var i = 0; i < bheaders.length; i++) { for (var i = 0; i < bheaders.length; i++) {
var headerp = bheaders[i].match(/^([^:]*)(?:: (.*))?/); var headerp = bheaders[i].match(/^([^:]*)(?:: (.*))?/);
if(!headerp) headerp = []; if (!headerp) headerp = [];
var headern = headerp[1]; var headern = headerp[1];
var headerv = headerp[2]; var headerv = headerp[2];
if (headern.toLowerCase() == "status") { if (headern.toLowerCase() == "status") {
var httpMatch = headerv.match(/^([0-9]{3})(?: (.*))?$/); var httpMatch = headerv.match(/^([0-9]{3})(?: (.*))?$/);
if(httpMatch) { if (httpMatch) {
code = parseInt(httpMatch[1]); code = parseInt(httpMatch[1]);
if (httpMatch[2]) msg = httpMatch[2]; if (httpMatch[2]) msg = httpMatch[2];
else msg = http.STATUS_CODES[code]; else msg = http.STATUS_CODES[code];
@ -270,7 +276,6 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e
}); });
} }
} }
});
} }
function executeCGIWithEnv(a, b, req, res, pubip, port, software, dh) { function executeCGIWithEnv(a, b, req, res, pubip, port, software, dh) {
@ -299,7 +304,7 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e
nEnv["SERVER_ADDR"] = pubip.replace(/^::ffff:/i, ""); nEnv["SERVER_ADDR"] = pubip.replace(/^::ffff:/i, "");
if (nEnv["SERVER_ADDR"].indexOf(":") != -1) nEnv["SERVER_ADDR"] = "[" + nEnv["SERVER_ADDR"] + "]"; if (nEnv["SERVER_ADDR"].indexOf(":") != -1) nEnv["SERVER_ADDR"] = "[" + nEnv["SERVER_ADDR"] + "]";
} }
if(configJSON.serverAdministratorEmail && configJSON.serverAdministratorEmail != "[no contact information]") { if (configJSON.serverAdministratorEmail && configJSON.serverAdministratorEmail != "[no contact information]") {
nEnv["SERVER_ADMIN"] = configJSON.serverAdministratorEmail; nEnv["SERVER_ADMIN"] = configJSON.serverAdministratorEmail;
} }
nEnv["SERVER_NAME"] = req.headers.host; nEnv["SERVER_NAME"] = req.headers.host;
@ -310,9 +315,9 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e
nEnv["GATEWAY_INTERFACE"] = "CGI/1.1"; nEnv["GATEWAY_INTERFACE"] = "CGI/1.1";
nEnv["REQUEST_URI"] = (!origHref || origHref == href) ? req.url : (origHref + (uobject.search ? ("?" + uobject.search) : "")); nEnv["REQUEST_URI"] = (!origHref || origHref == href) ? req.url : (origHref + (uobject.search ? ("?" + uobject.search) : ""));
nEnv["REMOTE_ADDR"] = (req.socket.realRemoteAddress ? req.socket.realRemoteAddress : ((req.headers["x-forwarded-for"] && configJSON.enableIPSpoofing) ? req.headers["x-forwarded-for"].split(",")[0].replace(/ /g, "") : req.socket.remoteAddress)).replace(/^::ffff:/i, ""); nEnv["REMOTE_ADDR"] = (req.socket.realRemoteAddress ? req.socket.realRemoteAddress : ((req.headers["x-forwarded-for"] && configJSON.enableIPSpoofing) ? req.headers["x-forwarded-for"].split(",")[0].replace(/ /g, "") : req.socket.remoteAddress)).replace(/^::ffff:/i, "");
if(req.socket.realRemoteAddress && req.socket.realRemotePort) { if (req.socket.realRemoteAddress && req.socket.realRemotePort) {
nEnv["REMOTE_PORT"] = req.socket.realRemotePort; nEnv["REMOTE_PORT"] = req.socket.realRemotePort;
} else if(!(req.socket.realRemoteAddress && !req.socket.realRemotePort)) { } else if (!(req.socket.realRemoteAddress && !req.socket.realRemotePort)) {
nEnv["REMOTE_PORT"] = req.socket.remotePort; nEnv["REMOTE_PORT"] = req.socket.remotePort;
} }
nEnv["SCRIPT_NAME"] = a; nEnv["SCRIPT_NAME"] = a;
@ -330,10 +335,38 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e
executeCGI("." + a, req, res, dh, nEnv); executeCGI("." + a, req, res, dh, nEnv);
} }
if (href.match(new RegExp("/cgi-bin(?:$|[?#/])", os.platform() == "win32" ? "i" : ""))) { var isCgiBin = href.match(new RegExp("/cgi-bin(?:$|[?#/])", os.platform() == "win32" ? "i" : ""));
var isScriptExt = scriptExts.indexOf("." + ext) != -1;
if ((href == "/redbrick-interpreters.json" || href == "/redbrick-scriptexts.json" || (os.platform() == "win32" && (href.toLowerCase() == "/redbrick-interpreters.json" || href.toLowerCase() == "/redbrick-scriptexts.json"))) && path.normalize(__dirname + "/../../..") == process.cwd()) {
if (!callServerError) {
res.writeHead(403, "Forbidden", {
"Content-Type": "text/html",
"Server": "RedBrick/" + version
});
res.write(
"<html><head><title>403 Forbidden</title></head><body><h1>403 Forbidden</h1><p>You don't have access to specific page.</p><p style=\"font-style: italic; font-weight: normal;\">SVR.JS " +
configJSON.version +
" (" +
os.platform()[0].toUpperCase() +
os.platform().slice(1) +
"; Node.JS/" +
process.version +
") RedBrick/" +
version +
" " +
(req.headers.host == undefined ? "" : " on " + req.headers.host) +
"</p></body></html>"
);
res.end(JSON.stringify(exttointerpreteruser, null, 2));
} else {
callServerError(403, "RedBrick/" + version);
}
} else {
fs.stat("." + href, function (err, stats) { fs.stat("." + href, function (err, stats) {
if (!err) { if (!err) {
if (!stats.isFile()) { if (!stats.isFile()) {
if (isCgiBin || scriptExts.indexOf(".php") != -1) {
fs.stat("." + href + "/index.php", function (e2, s2) { fs.stat("." + href + "/index.php", function (e2, s2) {
if (!e2 && s2.isFile()) { if (!e2 && s2.isFile()) {
try { try {
@ -383,7 +416,7 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e
callServerError(500, "RedBrick/" + version, ex); callServerError(500, "RedBrick/" + version, ex);
} }
} }
} else { } else if (isCgiBin || scriptExts.indexOf(".cgi") != -1) {
fs.stat("." + href + "/index.cgi", function (e3, s3) { fs.stat("." + href + "/index.cgi", function (e3, s3) {
if (!e3 && s3.isFile()) { if (!e3 && s3.isFile()) {
try { try {
@ -437,9 +470,69 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e
elseCallback(); elseCallback();
} }
}); });
} else {
elseCallback();
}
});
} else if (scriptExts.indexOf(".cgi") != -1) {
fs.stat("." + href + "/index.cgi", function (e3, s3) {
if (!e3 && s3.isFile()) {
try {
executeCGIWithEnv(
(href + "/index.cgi").replace(/\/+/g, "/"),
"",
req,
res,
req.socket.localAddress,
req.socket.localPort,
getCustomHeaders ?
getCustomHeaders()["Server"] +
" RedBrick/" +
version :
"SVR.JS/" +
configJSON.version +
" (" +
os.platform()[0].toUpperCase() +
os.platform().slice(1) +
"; Node.JS/" +
process.version +
") RedBrick/" +
version,
bheaders
);
} catch (ex) {
if (!callServerError) {
res.writeHead(500, "Internal Server Error", abheaders);
res.write(
"<html><head><title>500 Internal Server Error</title></head><body><h1>500 Internal Server Error</h1><p>A server had unexpected exception. Below, the stack trace of the error is shown:</p><code>" +
ex.stack.replace(/\r\n/g, "<br/>").replace(/\n/g, "<br/>").replace(/\r/g, "<br/>").replace(/ /g, "&nbsp;") +
"</code><p>Please contact the developer/administrator of the website.</p><p style=\"font-style: italic; font-weight: normal;\">SVR.JS " +
configJSON.version +
" (" +
os.platform()[0].toUpperCase() +
os.platform().slice(1) +
"; Node.JS/" +
process.version +
") RedBrick/" +
version +
" " +
(req.headers.host == undefined ? "" : " on " + req.headers.host) +
"</p></body></html>"
);
res.end();
} else {
callServerError(500, "RedBrick/" + version, ex);
}
}
} else {
elseCallback();
} }
}); });
} else { } else {
elseCallback();
}
} else {
if (isCgiBin || isScriptExt) {
try { try {
executeCGIWithEnv( executeCGIWithEnv(
href, href,
@ -487,12 +580,15 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e
callServerError(500, "RedBrick/" + version, ex); callServerError(500, "RedBrick/" + version, ex);
} }
} }
} else {
elseCallback();
}
} }
} else if (err && err.code == "ENOTDIR") { } else if (err && err.code == "ENOTDIR") {
function checkPath(pth, cb, a) { function checkPath(pth, cb, a) {
// Function to check the path of the file and execute CGI script // Function to check the path of the file and execute CGI script
var cpth = pth.split("/"); var cpth = pth.split("/");
if (cpth.length < 3) { if (cpth.length < (isCgiBin ? 3 : 2)) {
cb(false); cb(false);
return; return;
} }
@ -505,34 +601,18 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e
fpth: pth, fpth: pth,
rpth: (a !== undefined ? "/" + a : "") rpth: (a !== undefined ? "/" + a : "")
}) })
} else {
fs.stat(pth + "/index.php", function (e2, s2) {
if (!e2 && s2.isFile()) {
cb({
fpth: (pth + "/index.php").replace(/\/+/g, "/"),
rpth: (a !== undefined ? "/" + a : "")
})
} else {
fs.stat(pth + "/index.cgi", function (e3, s3) {
if (!e3 && s3.isFile()) {
cb({
fpth: (pth + "/index.cgi").replace(/\/+/g, "/"),
rpth: (a !== undefined ? "/" + a : "")
})
} else { } else {
b.unshift(cpth.pop()); b.unshift(cpth.pop());
return checkPath(cpth.join("/"), cb, b.join("/")); return checkPath(cpth.join("/"), cb, b.join("/"));
} }
}); });
} }
});
}
});
}
checkPath("." + href, function (pathp) { checkPath("." + href, function (pathp) {
if (!pathp) { if (!pathp) {
elseCallback(); elseCallback();
} else { } else {
var newext = path.extname(pathp.fpth);
if (isCgiBin || scriptExts.indexOf(newext) != -1) {
try { try {
executeCGIWithEnv( executeCGIWithEnv(
pathp.fpth.substr(1), pathp.fpth.substr(1),
@ -580,47 +660,15 @@ Mod.prototype.callback = function (req, res, serverconsole, responseEnd, href, e
callServerError(500, "RedBrick/" + version, ex); callServerError(500, "RedBrick/" + version, ex);
} }
} }
} else {
elseCallback();
}
} }
}); });
} else if (err && err.code == "ENOENT") { } else if (err && err.code == "ENOENT") {
elseCallback(); //Invoke default error handler elseCallback(); //Invoke default error handler
} else {
if (!callServerError) {
res.writeHead(500, "Internal Server Error", abheaders);
res.write(
"<html><head><title>500 Internal Server Error</title></head><body><h1>500 Internal Server Error</h1><p>A server had unexpected exception. Below, the stack trace of the error is shown:</p><code>" +
err.stack.replace(/\r\n/g, "<br/>").replace(/\n/g, "<br/>").replace(/\r/g, "<br/>").replace(/ /g, "&nbsp;") +
"</code><p>Please contact the developer/administrator of the website.</p><p style=\"font-style: italic; font-weight: normal;\">SVR.JS " +
configJSON.version +
" (" +
os.platform()[0].toUpperCase() +
os.platform().slice(1) +
"; Node.JS/" +
process.version +
") RedBrick/" +
version +
" " +
(req.headers.host == undefined ? "" : " on " + req.headers.host) +
"</p></body></html>"
);
res.end();
} else {
callServerError(500, "RedBrick/" + version, err);
}
} }
}); });
} else if ((href == "/redbrick-interpreters.json" || (os.platform() == "win32" && href.toLowerCase() == "/redbrick-interpreters.json")) && path.normalize(__dirname + "/../../..") == process.cwd()) {
if (!callServerError) {
res.writeHead(200, "OK", {
"Content-Type": "application/json",
"Server": "RedBrick/" + version
});
res.end(JSON.stringify(exttointerpreteruser, null, 2));
} else {
callServerError(200, "RedBrick/" + version, exttointerpreteruser);
}
} else {
elseCallback();
} }
} }
} }

View file

@ -1,4 +1,4 @@
{ {
"name": "DorianTech RedBrick CGI engine for SVR.JS", "name": "DorianTech RedBrick CGI engine for SVR.JS",
"version": "2.4.3" "version": "2.5.0"
} }