diff options
author | Minteck <minteck@phoenixnet.tech> | 2021-10-17 20:08:04 +0200 |
---|---|---|
committer | Minteck <minteck@phoenixnet.tech> | 2021-10-17 20:08:04 +0200 |
commit | 3a94acf27ea1eff8bd1125450f07c0c366332e80 (patch) | |
tree | 5bd619df0b7e04afc174df98736a527477522acb /server/http.js | |
download | wolfeye-js-3a94acf27ea1eff8bd1125450f07c0c366332e80.tar.gz wolfeye-js-3a94acf27ea1eff8bd1125450f07c0c366332e80.tar.bz2 wolfeye-js-3a94acf27ea1eff8bd1125450f07c0c366332e80.zip |
Initial commit
Diffstat (limited to 'server/http.js')
-rw-r--r-- | server/http.js | 380 |
1 files changed, 380 insertions, 0 deletions
diff --git a/server/http.js b/server/http.js new file mode 100644 index 0000000..4d67836 --- /dev/null +++ b/server/http.js @@ -0,0 +1,380 @@ +global.fs = require('fs') +global.os = require('os') +global.mime = require('node-mime'); +global.dirconf = null; + +module.exports.start = function () { + String.prototype.replacei = function (search, replace) { + var regex = new RegExp(search, "ig"); + return this.replace(regex, replace); + } + + global.http = require('http'); + + http.createServer(function (req, res) { + global.res = res; + req.url_orig = req.url; + log.verbose("request: " + req.connection.remoteAddress + "; " + req.url) + + if (req.url.startsWith("/@info")) { + log.verbose("return info"); + file = wwwdata + req.url.slice(6); + + json = new Object + json.file = req.url.slice(6) + if (fs.existsSync(file)) { + if (fs.lstatSync(file).isDirectory()) { + json.type = "inode/directory" + json.size = null + json.inode = null + json.device = null + json.mode = null + } else { + json.type = mime.lookUpType(file.split(".").pop()); + // json.type = file.split(".").pop(); + json.size = fs.lstatSync(file).size + json.inode = fs.lstatSync(file).ino + json.device = fs.lstatSync(file).dev + json.mode = fs.lstatSync(file).mode + } + } else { + if (json.file.startsWith("/debug")) { + json.type = "mpws-special/debuginfo"; + json.size = null + json.inode = null + json.device = null + json.mode = null + } else if (json.file.startsWith("/@info")) { + json.type = "mpws-special/fileinfo"; + json.size = null + json.inode = null + json.device = null + json.mode = null + } else if (json.file.startsWith("/@json")) { + json.type = "mpws-special/fileapi"; + json.size = null + json.inode = null + json.device = null + json.mode = null + } else { + json.type = "error/notfound"; + json.size = null + json.inode = null + json.device = null + json.mode = null + } + } + + res.writeHead(200, {'Content-Type': 'application/json'}); + res.write(JSON.stringify(json)); + res.end() + return; + } + + if (req.url.startsWith("/@json")) { + log.verbose("return json"); + file = wwwdata + req.url.slice(6); + + json = new Object + json.file = req.url.slice(6) + if (fs.existsSync(file)) { + if (fs.lstatSync(file).isDirectory()) { + json.type = "inode/directory" + json.size = null + json.inode = null + json.device = null + json.mode = null + json.lines = null + } else { + json.type = mime.lookUpType(file.split(".").pop()); + json.size = fs.lstatSync(file).size + json.inode = fs.lstatSync(file).ino + json.device = fs.lstatSync(file).dev + json.mode = fs.lstatSync(file).mode + json.lines = fs.readFileSync(file).toString().split("\n"); + } + } else { + if (json.file.startsWith("/debug")) { + json.type = "mpws-special/debuginfo"; + json.size = null + json.inode = null + json.device = null + json.mode = null + json.lines = null + } else if (json.file.startsWith("/@info")) { + json.type = "mpws-special/fileinfo"; + json.size = null + json.inode = null + json.device = null + json.mode = null + json.lines = null + } else if (json.file.startsWith("/@json")) { + json.type = "mpws-special/fileapi"; + json.size = null + json.inode = null + json.device = null + json.mode = null + json.lines = null + } else { + json.type = "error/notfound"; + json.size = null + json.inode = null + json.device = null + json.mode = null + json.lines = null + } + } + + res.writeHead(200, {'Content-Type': 'application/json'}); + res.write(JSON.stringify(json)); + res.end() + return; + } + + if (req.url == "/debug") { + log.verbose("return debug") + res.writeHead(200, {'Content-Type': 'application/json'}); + var date = new Date(); + var hour = date.getHours(); + // hour = (hour < 10 ? "0" : "") + hour; + var min = date.getMinutes(); + // min = (min < 10 ? "0" : "") + min; + var sec = date.getSeconds(); + // sec = (sec < 10 ? "0" : "") + sec; + var year = date.getFullYear(); + var month = date.getMonth() + 1; + // month = (month < 10 ? "0" : "") + month; + var day = date.getDate(); + // day = (day < 10 ? "0" : "") + day; + debug = { + "version": { + "server": mpws.version, + "kernel": process.version.replace("v", "") + }, + "date": { + "day": day, + "month": month, + "year": year, + "hour": hour, + "min": min, + "sec": sec + }, + "server": { + "process": { + "pid": process.pid, + "name": process.title, + "priority": os.getPriority(process.pid) + }, + "software": { + "hostname": os.hostname(), + "arch": os.arch(), + "platform": os.platform(), + "release": os.release(), + "type": os.type(), + "uptime": os.uptime(), + "tempfiles": os.tmpdir() + }, + "hardware": { + "cpus": os.cpus(), + "network": os.networkInterfaces(), + "memory": { + "total": os.totalmem(), + "free": os.freemem(), + "used": os.totalmem() - os.freemem(), + "process": process.memoryUsage() + } + } + } + } + res.write(JSON.stringify(debug)); + res.end(); + return; + } + // res.writeHead(200, {'Content-Type': 'text/html'}); + // res.write('Node.js says hello!'); + // res.end(); + frhtml = false; + ejs = false; + if (req.url.includes(".")) { + } else { + if (fs.existsSync(wwwdata + req.url + "/index.html")) { + req.url = req.url + "/index.html" + } else if (fs.existsSync(wwwdata + req.url + "/index.fr.html")) { + req.url = req.url + "/index.fr.html" + frhtml = true; + } else { + req.url = req.url + "/index.ejs" + ejs = true; + } + } + if (req.url.endsWith('.fr.html')) { + frhtml = true; + } + if (req.url.includes("..")) { + if (config.errors_show_trace) { + trace = "<div><code>Satellite Server - System Backtrace<br><br>Server Backtrace:<br>401F0000 PERMISSION_DENIED<br>00000001 SERVER_RUNTIME<br>0000001A HTTP_WEBSERVER<br><br>Kernel Backtrace:<br></code></div>" + } else { + trace = ""; + } + log.verbose("return 401") + res.writeHead(401, {'Content-Type': 'text/html'}); + res.write("<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"><title>Satellite Fatal Error</title></head><body><h1>Internal Server Error</h1>Minteck Satellite Server returned an error while trying to request your file.<br><br>0x401: Forbidden<br>" + req.url + "<br><br><b>Minteck Satellite Server " + mpws.version + ", kernel " + process.version + "</b>" + trace + "</body></html>"); + res.end(); + return; + } + global.dirconf = null; + if (fs.existsSync(wwwdata + req.url.substring(0, req.url.indexOf('/')) + "/" + config.access)) { + log.verbose('reading ' + config.access + ' file...') + try { + if (require.cache[require.resolve(wwwdata + req.url.substring(0, req.url.indexOf('/')) + "/" + config.access)]) { + delete require.cache[require.resolve(wwwdata + req.url.substring(0, req.url.indexOf('/')) + "/" + config.access)] + } + global.dirconf = require(wwwdata + req.url.substring(0, req.url.indexOf('/')) + "/" + config.access) + } catch (err) { + global.dirconf = null; + if (config.errors_show_trace) { + trace = "<div><code>Satellite Server - System Backtrace<br><br>Server Backtrace:<br>50A00000 INVALID_DIR_CONF<br>00000001 SERVER_RUNTIME<br>0000001A HTTP_WEBSERVER<br><br>Kernel Backtrace:<br>" + err.toString().replace('\n', '<br>') + "</code></div>" + } else { + trace = ""; + } + log.verbose("return 500") + res.writeHead(500, {'Content-Type': 'text/html'}); + res.write("<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"><title>Satellite Fatal Error</title></head><body><h1>Internal Server Error</h1>Minteck Satellite Server returned an error while trying to request your file.<br><br>0x50A: Invalid Directory Configuration<br>" + req.url + "<br><br><b>Minteck Satellite Server " + mpws.version + ", kernel " + process.version + "</b>" + trace + "</body></html>"); + res.end(); + return; + } + if (dirconf == null) { + } else { + if (typeof (dirconf.access) != "undefined") { + if (typeof (dirconf.access) == "boolean") { + if (dirconf.access == false) { + if (config.errors_show_trace) { + trace = "<div><code>Satellite Server - System Backtrace<br><br>Server Backtrace:<br>401F0000 PERMISSION_DENIED<br>00000001 SERVER_RUNTIME<br>0000001A HTTP_WEBSERVER<br><br>Kernel Backtrace:<br></code></div>" + } else { + trace = ""; + } + log.verbose("return 401") + res.writeHead(500, {'Content-Type': 'text/html'}); + res.write("<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"><title>Satellite Fatal Error</title></head><body><h1>Internal Server Error</h1>Minteck Satellite Server returned an error while trying to request your file.<br><br>0x401: Forbidden<br>" + req.url + "<br><br><b>Minteck Satellite Server " + mpws.version + ", kernel " + process.version + "</b>" + trace + "</body></html>"); + res.end(); + return; + } + } + } + } + } + if (fs.existsSync(wwwdata + req.url) || fs.existsSync(wwwdata + req.url_orig + "/$command.json")) { + if (fs.existsSync(wwwdata + req.url_orig + "/$command.json")) { + res.writeHead(200, { + 'Content-Type': 'application/json', + 'Set-Cookie': '__mpws_request=' + year + month + day + hour + min + sec + }); + filebuffer = fs.readFileSync(wwwdata + req.url_orig + "/$command.json"); + filestring = filebuffer.toString() + filejson = JSON.parse(filestring); + require('./commands.js')(filejson, (callback) => { + output = JSON.stringify(callback); + res.write(output); + res.end(); + }); + return; + } + if (frhtml) { + log.verbose("return " + mime.lookUpType((wwwdata + req.url).split(".").pop())) + log.verbose("parser: frhtml"); + var date = new Date(); + var hour = date.getHours(); + hour = (hour < 10 ? "0" : "") + hour; + var min = date.getMinutes(); + min = (min < 10 ? "0" : "") + min; + var sec = date.getSeconds(); + sec = (sec < 10 ? "0" : "") + sec; + var year = date.getFullYear(); + var month = date.getMonth() + 1; + month = (month < 10 ? "0" : "") + month; + var day = date.getDate(); + day = (day < 10 ? "0" : "") + day; + res.writeHead(200, { + 'Content-Type': mime.lookUpType((wwwdata + req.url).split(".").pop()), + 'Set-Cookie': '__mpws_request=' + year + month + day + hour + min + sec + }); + res.write(require('./frhtml.js').ConvertirVersHTML(fs.readFileSync(wwwdata + req.url).toString())); + res.end(); + return; + } else if (ejs) { + log.verbose("return " + mime.lookUpType((wwwdata + req.url).split(".").pop())) + log.verbose("parser: ejs"); + var date = new Date(); + var hour = date.getHours(); + hour = (hour < 10 ? "0" : "") + hour; + var min = date.getMinutes(); + min = (min < 10 ? "0" : "") + min; + var sec = date.getSeconds(); + sec = (sec < 10 ? "0" : "") + sec; + var year = date.getFullYear(); + var month = date.getMonth() + 1; + month = (month < 10 ? "0" : "") + month; + var day = date.getDate(); + day = (day < 10 ? "0" : "") + day; + res.writeHead(200, { + 'Content-Type': "text/html", + 'Set-Cookie': '__mpws_request=' + year + month + day + hour + min + sec + }); + try { + require('ejs').renderFile(wwwdata + req.url, {wwwdata, private, req, res}, (err, str) => { + if (err) throw err; + res.write(str); + res.end(); + }) + } catch (e) { + res.writeHead(200, { + 'Content-Type': "text/plain", + 'Set-Cookie': '__mpws_request=' + year + month + day + hour + min + sec + }); + res.write(e.stack); + res.end(); + } + return; + } else { + var type = mime.lookUpType((wwwdata + req.url).split(".").pop()); + log.verbose("return " + type) + var date = new Date(); + var hour = date.getHours(); + hour = (hour < 10 ? "0" : "") + hour; + var min = date.getMinutes(); + min = (min < 10 ? "0" : "") + min; + var sec = date.getSeconds(); + sec = (sec < 10 ? "0" : "") + sec; + var year = date.getFullYear(); + var month = date.getMonth() + 1; + month = (month < 10 ? "0" : "") + month; + var day = date.getDate(); + day = (day < 10 ? "0" : "") + day; + res.writeHead(200, { + 'Content-Type': type, + 'Set-Cookie': '__mpws_request=' + year + month + day + hour + min + sec + }); + if (req.url.endsWith("/$command.json")) { + prejson = JSON.parse(fs.readFileSync(wwwdata + req.url)); + prejson.token = "<-- TOKEN TRUNCATED - Access file on real server to get the authentication token -->" + res.write(JSON.stringify(prejson)); + } else { + res.write(fs.readFileSync(wwwdata + req.url)); + } + res.end(); + return; + } + } else { + if (config.errors_show_trace) { + trace = "<div><code>Satellite Server - System Backtrace<br><br>Server Backtrace:<br>404F0000 FILE_NOT_FOUND<br>00000001 SERVER_RUNTIME<br>0000001A HTTP_WEBSERVER<br><br>Kernel Backtrace:<br></code></div>" + } else { + trace = ""; + } + log.verbose("return 404") + res.writeHead(404, {'Content-Type': 'text/html'}); + res.write("<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"><title>Satellite Server Fatal Error</title></head><body><h1>Internal Server Error</h1>Minteck Satellite Server returned an error while trying to request your file.<br><br>0x404: Not Found<br>" + req.url + "<br><br><b>Minteck Satellite Server " + mpws.version + ", kernel " + process.version + "</b>" + trace + "</body></html>"); + res.end(); + } + }).listen(config.port); + log.info('Started Satellite at port ' + config.port) +}
\ No newline at end of file |