v0.9.38
This commit is contained in:
12
.gitignore
vendored
12
.gitignore
vendored
@@ -361,13 +361,13 @@ MigrationBackup/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
/zefie_wtvp_minisrv/ServiceVault/wtv-home/6969.html
|
||||
/zefie_wtvp_minisrv/user_config.json
|
||||
/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.zefie.html
|
||||
/zefie_wtvp_minisrv/UserServiceVault/*-*/
|
||||
/zefie_wtvp_minisrv/UserTemplates/*-*/
|
||||
/zefie_wtvp_minisrv/UserServiceVault/*
|
||||
/zefie_wtvp_minisrv/UserServiceDeps/*
|
||||
/zefie_wtvp_minisrv/ServiceLogPost/*.log
|
||||
/zefie_wtvp_minisrv/SessionStore/*.json
|
||||
/zefie_wtvp_minisrv/SessionStore/*/
|
||||
/zefie_wtvp_minisrv/SessionStore/*
|
||||
/zefie_wtvp_minisrv/ServiceVault/http_pc/viewergen/viewers/HackTV.zip
|
||||
/zefie_wtvp_minisrv/postest.js
|
||||
/zefie_wtvp_minisrv/PageBuilderVault/http_pb/*
|
||||
!/zefie_wtvp_minisrv/PageBuilderVault/http_pb/clipart
|
||||
!*.gitkeep
|
||||
|
||||
6
CREDITS.md
Normal file
6
CREDITS.md
Normal file
@@ -0,0 +1,6 @@
|
||||
The following people have helped contribute towards making minisrv what it is today:
|
||||
|
||||
- eMac - Lzpf and Encryption code
|
||||
- [MattMan69](https://github.com/GraspYonOx) - Templates and resources, testing
|
||||
- [Jarhead](https://github.com/JarHead4) - wtv-favorites, wtv-author (Page Builder), wtv-guide, and some wtv-setup templates
|
||||
- [Sgeo](https://github.com/Sgeo) - wtv-viewer sound patch
|
||||
@@ -66,3 +66,5 @@ This open source server is in beta status. Use at your own risk.
|
||||
- [CashApp $altimit](https://cash.app/$altimit)
|
||||
- Chime: $zefie
|
||||
- [Credit Card or PayPal (powered by StreamElements)](https://zef.pw/ttv-tip)
|
||||
- [Sign up for a service via a referal link](https://zefie.tv/#ad)
|
||||
|
||||
|
||||
@@ -22,11 +22,6 @@ If you would like to see debug information about realtime bytes received from a
|
||||
"allow_guests": false
|
||||
```
|
||||
If you would like to require registration, disabling guest mode, you can set `allow_guests` to `false`. Default is `true`;
|
||||
```
|
||||
"pc_server_hidden_service_enabled": false,
|
||||
"pc_server_hidden_service": "http_pc"
|
||||
```
|
||||
Set `pc_server_hidden_service_enabled` option to `true` to enable the HTTP Server for Browsers. Set `pc_server_hidden_service` to a directory under the ServiceVaults to use solely for PC requests. See `ServiceVault/http_pc` for some example code.
|
||||
```
|
||||
"post_percentages": [ 0, 25, 50, 100]
|
||||
```
|
||||
|
||||
5
zefie_wtvp_minisrv/.gitignore
vendored
5
zefie_wtvp_minisrv/.gitignore
vendored
@@ -373,6 +373,9 @@ FodyWeavers.xsd
|
||||
# minisrv error log file
|
||||
errors.log
|
||||
|
||||
<<<<<<< HEAD
|
||||
# PageBuilder Vault
|
||||
PageBuilderVault/http_pb/*
|
||||
!PageBuilderVault/http_pb/clipart
|
||||
!PageBuilderVault/http_pb/clipart
|
||||
=======
|
||||
>>>>>>> dev
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 549 B |
Binary file not shown.
|
Before Width: | Height: | Size: 9.3 KiB |
@@ -1,70 +0,0 @@
|
||||
<html><head>
|
||||
<meta name="generator" content="WebTV Page Builder (Rebuilt by JarHead)">
|
||||
<meta name="description" content="meow">
|
||||
<title>Cat</title>
|
||||
</head>
|
||||
<body bgcolor="#eeeeee">
|
||||
<table width="100%" cellspacing="4" cellpadding="4" border="0">
|
||||
<tbody><center>
|
||||
<font size="7" color="#000000"><b>Cat</b></font></center></td>
|
||||
</tr><tr height="316">
|
||||
<td width="101" height="316" background="clipart/styleMedia/CAT.gif"></td>
|
||||
<td valign="top" height="316" bgcolor="#669999"><p><TABLE nocolor width=100%><TR>
|
||||
<TD align=center>
|
||||
<font color=#eeeeee>
|
||||
<H3>
|
||||
Cat
|
||||
</H3>
|
||||
</font>
|
||||
</TD>
|
||||
</TR><TR><td><CENTER>
|
||||
<IMG SRC="clipart/Animals/Cats_n_Dogs/an00891_.gif">
|
||||
</CENTER>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD valign=top>is cool
|
||||
</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
</p><p> </p></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<table width="100%" cellspacing="2" cellpadding="0" border="0">
|
||||
<tbody><tr height="0">
|
||||
<td height="0">
|
||||
<spacer type="block" width="30%" height="0">
|
||||
</spacer></td><td height="0">
|
||||
<spacer type="block" width="30%" height="0">
|
||||
</spacer></td><td height="0">
|
||||
<spacer type="block" width="30%" height="0">
|
||||
</spacer></td></tr><tr>
|
||||
<td colspan="3">
|
||||
<hr>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="30%" valign="middle">
|
||||
<font face="Arial,Helvetica,Geneva,Swiss,SunSans-Regular">
|
||||
<b>
|
||||
</b></font></td>
|
||||
<td width="30%" valign="middle">
|
||||
<center>
|
||||
<font size="-2" face="Arial,Helvetica,Geneva,Swiss,SunSans-Regular"><i>
|
||||
<a href="http://community.webtv.zone">Powered by WebTV</a>
|
||||
</i></font></center>
|
||||
</td>
|
||||
<td width="30%" valign="middle" align="right">
|
||||
<font face="Arial,Helvetica,Geneva,Swiss,SunSans-Regular">
|
||||
<b>
|
||||
</b></font></td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<hr></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
|
||||
|
||||
<div style="position: static !important;"></div></body></html>
|
||||
@@ -1,56 +0,0 @@
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<SCRIPT language="JavaScript">
|
||||
var gIsWebTV = false;
|
||||
var AppName = new String;
|
||||
AppName = window.navigator.appName;
|
||||
if (AppName.indexOf("WebTV") >= 0 )
|
||||
gIsWebTV = true;
|
||||
</SCRIPT>
|
||||
<TITLE>WebTV_88150</TITLE>
|
||||
</HEAD>
|
||||
<body
|
||||
background="../clipart/styleMedia/ExternalBackground.gif"
|
||||
bgcolor=#1e4261
|
||||
text=AEBFD1 link=B8BDC7
|
||||
vlink=B8BDC7
|
||||
hspace=0
|
||||
vspace=0
|
||||
>
|
||||
<table cellspacing=0 cellpadding=0 width=100%>
|
||||
<tr>
|
||||
<td width=22 rowspan=100><td><td><td><td><td width=22 rowspan=100>
|
||||
<tr>
|
||||
<td height=12>
|
||||
<tr>
|
||||
<td height=25 valign=top colspan=4>
|
||||
<font size=+1 color=D1D1D1>Pages of WebTV_88150</font>
|
||||
<tr>
|
||||
<td height=14>
|
||||
<tr><td height=10><tr><td>
|
||||
<td width=5>
|
||||
<td>
|
||||
<table>
|
||||
<tr><td colspan=2><font color=AEBFD1><B>
|
||||
<a href=test/index.html>test</a>
|
||||
</B></font>
|
||||
<tr>
|
||||
<td width=12>
|
||||
<td><font size=-1>test description</font>
|
||||
</table>
|
||||
<tr><td height=10>
|
||||
<tr><td height=10><tr><td>
|
||||
<td width=5>
|
||||
<td>
|
||||
<table>
|
||||
<tr><td colspan=2><font color=AEBFD1><B>
|
||||
<a href=Cat/index.html>Cat</a>
|
||||
</B></font>
|
||||
<tr>
|
||||
<td width=12>
|
||||
<td><font size=-1>meow</font>
|
||||
</table>
|
||||
<tr><td height=10>
|
||||
<tr><td height=10></table>
|
||||
</BODY>
|
||||
</HTML>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.5 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.8 KiB |
@@ -1,111 +0,0 @@
|
||||
<html><head>
|
||||
<meta name="generator" content="WebTV Page Builder (Rebuilt by JarHead)">
|
||||
<meta name="description" content="test description">
|
||||
<title>test</title>
|
||||
</head>
|
||||
<body vlink="#ffff99" text="#cccccc" link="#ffcc00" bgcolor="#333333" background="clipart/styleMedia/spacefield.gif"><center>
|
||||
<font size="7" color=#cccccc><b>
|
||||
test
|
||||
</b></font>
|
||||
<p>
|
||||
<table>
|
||||
<tbody><tr><td>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
</center><p>
|
||||
<table>
|
||||
<tbody><tr><td><center><table nocolor="" cellspacing="0" cellpadding="0"><tbody><tr><td>
|
||||
<font color=#cccccc>
|
||||
<h3>
|
||||
my test list
|
||||
</h3>
|
||||
</font>
|
||||
</td></tr><tr><td height="0"><spacer type="block" width="80"> </spacer></td></tr><tr><td><ul type="DISC">
|
||||
<li>
|
||||
this is a test
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr><tr><td><ul type="DISC">
|
||||
<li>
|
||||
listing 2
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr><tr><td><ul type="DISC">
|
||||
<li>
|
||||
whoa its 3
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr><tr><td><ul type="DISC">
|
||||
<li>
|
||||
fuck its 4!
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr></td>
|
||||
</tr></tbody></table>
|
||||
</center><p><TABLE nocolor width=100%><TR>
|
||||
<TD align=center>
|
||||
<font color=#cccccc>
|
||||
<H3>
|
||||
my ancient pc
|
||||
</H3>
|
||||
</font>
|
||||
</TD>
|
||||
</TR><TR><td><CENTER>
|
||||
<IMG SRC="clipart/Business/BS00095_.gif">
|
||||
</CENTER>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD valign=top>my webtv is better
|
||||
</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
</p></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
</center>
|
||||
<table width="100%" cellspacing="2" cellpadding="0" border="0">
|
||||
<tbody><tr height="0">
|
||||
<td height="0">
|
||||
<spacer type="block" width="30%" height="0">
|
||||
</spacer></td><td height="0">
|
||||
<spacer type="block" width="30%" height="0">
|
||||
</spacer></td><td height="0">
|
||||
<spacer type="block" width="30%" height="0">
|
||||
</spacer></td></tr><tr>
|
||||
<td colspan="3">
|
||||
<hr>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="30%" valign="middle">
|
||||
<font face="Arial,Helvetica,Geneva,Swiss,SunSans-Regular">
|
||||
<b>
|
||||
</b></font></td>
|
||||
<td width="30%" valign="middle">
|
||||
<center>
|
||||
<font size="-2" face="Arial,Helvetica,Geneva,Swiss,SunSans-Regular"><i>
|
||||
<a href="http://community.webtv.zone">Powered by WebTV</a>
|
||||
</i></font></center>
|
||||
</td>
|
||||
<td width="30%" valign="middle" align="right">
|
||||
<font face="Arial,Helvetica,Geneva,Swiss,SunSans-Regular">
|
||||
<b>
|
||||
</b></font></td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<hr></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
</center>
|
||||
|
||||
|
||||
<div style="position: static !important;"></div></body></html>
|
||||
Binary file not shown.
@@ -1,36 +0,0 @@
|
||||
var minisrv_service_file = true;
|
||||
|
||||
var foldername = request_headers.query.new_folder_name;
|
||||
var favstore_exists = session_data.favstore.favstoreExists();
|
||||
var folder_exists = session_data.favstore.folderExists(foldername);
|
||||
var folder_array = session_data.favstore.getFolders();
|
||||
|
||||
if (foldername)
|
||||
{
|
||||
if (favstore_exists != true)
|
||||
session_data.favstore.createFavstore();
|
||||
|
||||
if (folder_exists != true)
|
||||
{
|
||||
if (folder_array.length < minisrv_config.services[service_name].max_folders)
|
||||
{
|
||||
if (session_data.favstore.checkFolderName(foldername) == true)
|
||||
{
|
||||
session_data.favstore.createFolder(foldername);
|
||||
headers = `300 OK
|
||||
Connection: Keep-Alive
|
||||
Content-Type: text/html
|
||||
Location: wtv-favorite:/favorite
|
||||
wtv-expire-all: wtv-favorite:`
|
||||
} else {
|
||||
headers = `400 That folder name is not valid. Choose a different name and try again.`
|
||||
}
|
||||
} else {
|
||||
headers = `400 You can only have ${minisrv_config.services[service_name].max_folders} folders at one time. Delete some folders and try again.`
|
||||
}
|
||||
} else {
|
||||
headers = `400 That folder already exists. Choose a different name and try again.`
|
||||
}
|
||||
} else {
|
||||
headers = `400 Please type a folder name.`
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.9 KiB |
@@ -1,55 +0,0 @@
|
||||
headers = `200 OK
|
||||
Connection: Keep-Alive
|
||||
wtv-encrypted: true
|
||||
Expires: Wed, 09 Oct 1991 22:00:00 GMT
|
||||
Content-Type: text/plain`
|
||||
|
||||
|
||||
var email = session_data.getSessionData("messenger_email") + "%40" + session_data.getSessionData("messenger_domain");
|
||||
var password = session_data.decryptPassword(session_data.getSessionData("messenger_password"));
|
||||
var challenge = request_headers.request.split('?')[1];
|
||||
|
||||
if (request_headers.request.split('?')[1].substring(0, 3) != "ct=") {
|
||||
console.log(" *** Logging into Messenger via MSNP3")
|
||||
data = crypto.createHash('md5').update(request_headers.request.split('?')[1] + password).digest("hex");
|
||||
} else {
|
||||
console.log(" *** Logging into Messenger via MSNP8")
|
||||
request_is_async = true; // Make us async
|
||||
const request = https.get('https://msnmsgr.escargot.chat/rdr/pprdr.asp', (response) => {
|
||||
let req_data = '';
|
||||
response.on('data', (chunk) => {
|
||||
req_data += chunk.toString();
|
||||
});
|
||||
|
||||
response.on('end', () => {
|
||||
var passporturls = response.headers['passporturls'].split("DALogin=")[1];
|
||||
request.end();
|
||||
var options = {
|
||||
method: 'GET',
|
||||
headers: { "Authorization": "Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=" + email + ",pwd=" + encodeURIComponent(password) + "," + challenge }
|
||||
}
|
||||
const request2 = https.get(passporturls, options, (response) => {
|
||||
let req_data = '';
|
||||
response.on('data', (chunk) => {
|
||||
req_data += chunk.toString();
|
||||
});
|
||||
|
||||
response.on('end', () => {
|
||||
var pp = response.headers['authentication-info'];
|
||||
pp = pp.split("from-PP='")[1];
|
||||
pp = pp.split("'")[0];
|
||||
data = pp;
|
||||
sendToClient(socket, headers, data);
|
||||
});
|
||||
});
|
||||
request2.on('error', (error) => {
|
||||
console.log(' *** Error (Stage 1)', error);
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
request.on('error', (error) => {
|
||||
console.log(' *** Error (Stage 1)', error);
|
||||
});
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
var minisrv_service_file = true;
|
||||
|
||||
// Allow URL access outside our trusted minisrv
|
||||
|
||||
if (request_headers.query.url) var url = request_headers.query.url;
|
||||
else var url = "client:showalert?message=Please%20provide%20a%20%3Furl%3D%20with%20the%20url%20you%20would%20like%20to%20access.&buttonlabel1=Okay&buttonacction1=client:donothing"
|
||||
|
||||
headers = `200 OK
|
||||
wtv-visit: `+url+`
|
||||
Content-type: text/html`
|
||||
|
||||
|
||||
data = '';
|
||||
0
zefie_wtvp_minisrv/SessionStore/.gitkeep
Normal file
0
zefie_wtvp_minisrv/SessionStore/.gitkeep
Normal file
Binary file not shown.
|
Before Width: | Height: | Size: 4.7 KiB |
0
zefie_wtvp_minisrv/UserServiceDeps/.gitkeep
Normal file
0
zefie_wtvp_minisrv/UserServiceDeps/.gitkeep
Normal file
0
zefie_wtvp_minisrv/UserServiceVault/.gitkeep
Normal file
0
zefie_wtvp_minisrv/UserServiceVault/.gitkeep
Normal file
@@ -1,15 +1,16 @@
|
||||
'use strict';
|
||||
var classPath = __dirname + "/includes/";
|
||||
const path = require('path');
|
||||
var classPath = __dirname + path.sep + "includes" + path.sep + "classes" + path.sep;
|
||||
const { WTVShared, clientShowAlert } = require(classPath + "WTVShared.js");
|
||||
const wtvshared = new WTVShared(); // creates minisrv_config
|
||||
classPath = wtvshared.getAbsolutePath(classPath, __dirname);
|
||||
|
||||
const fs = require('fs');
|
||||
const tls = require('tls');
|
||||
const path = require('path');
|
||||
const zlib = require('zlib');
|
||||
const http = require('follow-redirects').http
|
||||
const https = require('follow-redirects').https
|
||||
const httpx = require(classPath + "/HTTPX.js");
|
||||
const net = require('net');
|
||||
const crypto = require('crypto')
|
||||
const CryptoJS = require('crypto-js');
|
||||
@@ -40,7 +41,7 @@ function shutdown(signal = 'SIGTERM') {
|
||||
};
|
||||
}
|
||||
|
||||
function findServiceByPort(port) {
|
||||
function getServiceByPort(port) {
|
||||
var service_name = null;
|
||||
Object.keys(minisrv_config.services).forEach(function(k) {
|
||||
if (service_name) return;
|
||||
@@ -52,22 +53,39 @@ function findServiceByPort(port) {
|
||||
return service_name;
|
||||
}
|
||||
|
||||
|
||||
function getPortByService(service) {
|
||||
if (minisrv_config.services[service]) return minisrv_config.services[service].port;
|
||||
else return null;
|
||||
}
|
||||
|
||||
function getSocketServer(socket) {
|
||||
var server = null;
|
||||
|
||||
if (socket._server) {
|
||||
if (socket._server._connectionKey) server = socket._server;
|
||||
} else if (socket._parent) {
|
||||
if (socket._parent._server) {
|
||||
if (socket._parent._server._connectionKey) server = socket._parent._server;
|
||||
}
|
||||
}
|
||||
return server;
|
||||
}
|
||||
|
||||
function getSocketDestinationPort(socket) {
|
||||
return parseInt(socket._server._connectionKey.split(':')[2]);
|
||||
return getServerDestinationPort(getSocketServer(socket));
|
||||
}
|
||||
|
||||
function getServerDestinationPort(server) {
|
||||
return parseInt(server._connectionKey.split(':')[2]);
|
||||
}
|
||||
|
||||
function verifyServicePort(service_name, socket) {
|
||||
if (!minisrv_config.config.enable_port_isolation) return service_name;
|
||||
if (socket._server._connectionKey) {
|
||||
var socketPort = getSocketDestinationPort(socket);
|
||||
var server = getSocketServer(socket);
|
||||
if (server) {
|
||||
var socketPort = getServerDestinationPort(server);
|
||||
if (minisrv_config.services[service_name]) {
|
||||
if (minisrv_config.services[service_name].port == socketPort) {
|
||||
if (minisrv_config.services[service_name].port === socketPort) {
|
||||
if (minisrv_config.services[service_name].servicevault_dir)
|
||||
return minisrv_config.services[service_name].servicevault_dir;
|
||||
else
|
||||
@@ -78,6 +96,25 @@ function verifyServicePort(service_name, socket) {
|
||||
return false;
|
||||
}
|
||||
|
||||
function getServiceByVaultDir(vault_dir) {
|
||||
var res = vault_dir;
|
||||
Object.keys(minisrv_config.services).forEach((k) => {
|
||||
if (res != vault_dir) return;
|
||||
if (minisrv_config.services[k].servicevault_dir) {
|
||||
if (minisrv_config.services[k].servicevault_dir === vault_dir) {
|
||||
res = k;
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (k === vault_dir) {
|
||||
res = k;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
return res;
|
||||
}
|
||||
|
||||
function configureService(service_name, service_obj, initial = false) {
|
||||
if (service_obj.disabled) return false;
|
||||
|
||||
@@ -127,10 +164,7 @@ var pc_ports = [];
|
||||
// works for service vault scripts too.
|
||||
if (!String.prototype.reverse) {
|
||||
String.prototype.reverse = function () {
|
||||
var splitString = this.split("");
|
||||
var reverseArray = splitString.reverse();
|
||||
var joinArray = reverseArray.join("");
|
||||
return joinArray;
|
||||
return this.split("").reverse().reverseArray.join("");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,26 +182,7 @@ if (!Object.prototype.getCaseInsensitiveKey) {
|
||||
}
|
||||
|
||||
function getServiceString(service, overrides = {}) {
|
||||
// used externally by service scripts
|
||||
if (service === "all") {
|
||||
var out = "";
|
||||
Object.keys(minisrv_config.services).forEach(function (k) {
|
||||
if (overrides.exceptions) {
|
||||
Object.keys(overrides.exceptions).forEach(function (j) {
|
||||
if (k != overrides.exceptions[j]) out += minisrv_config.services[k].toString(overrides) + "\n";
|
||||
});
|
||||
} else {
|
||||
out += minisrv_config.services[k].toString(overrides) + "\n";
|
||||
}
|
||||
});
|
||||
return out;
|
||||
} else {
|
||||
if (!minisrv_config.services[service]) {
|
||||
throw ("SERVICE ERROR: Attempted to provision unconfigured service: " + service)
|
||||
} else {
|
||||
return minisrv_config.services[service].toString(overrides);
|
||||
}
|
||||
}
|
||||
return wtvshared.getServiceString(service, overrides);
|
||||
}
|
||||
|
||||
|
||||
@@ -233,8 +248,8 @@ var runScriptInVM = function (script_data, user_contextObj = {}, privileged = fa
|
||||
"minisrv_version_string": z_title,
|
||||
"getServiceString": getServiceString,
|
||||
"sendToClient": sendToClient,
|
||||
"ServiceDeps": ServiceDeps,
|
||||
"service_vaults": service_vaults,
|
||||
"service_deps": service_deps,
|
||||
"cwd": __dirname, // current working directory
|
||||
|
||||
// Our prototype overrides
|
||||
@@ -311,10 +326,6 @@ var runScriptInVM = function (script_data, user_contextObj = {}, privileged = fa
|
||||
return contextObj; // updated context object with whatever global varibles the script set
|
||||
}
|
||||
|
||||
function sendToPCClient(headers, data) {
|
||||
|
||||
}
|
||||
|
||||
async function processPath(socket, service_vault_file_path, request_headers = new Array(), service_name, shared_romcache = null, pc_services = false) {
|
||||
var headers, data = null;
|
||||
var request_is_async = false;
|
||||
@@ -346,8 +357,14 @@ async function processPath(socket, service_vault_file_path, request_headers = ne
|
||||
}
|
||||
|
||||
var privileged = false;
|
||||
if (minisrv_config.services[service_name]) privileged = (minisrv_config.services[service_name].privileged) ? true : false;
|
||||
else if (pc_services) privileged = (minisrv_config.services['pc_services'].privileged) ? true : false;
|
||||
if (minisrv_config.services[service_name]) {
|
||||
privileged = (minisrv_config.services[service_name].privileged) ? true : false;
|
||||
} else if (pc_services) {
|
||||
var real_service_name = getServiceByVaultDir(service_name);
|
||||
if (real_service_name) {
|
||||
privileged = (minisrv_config.services[real_service_name].privileged) ? true : false;
|
||||
}
|
||||
}
|
||||
|
||||
if (privileged) {
|
||||
updateFromVM.push(["ssid_sessions", "ssid_sessions"]); // global ssid_sessions object for privileged service scripts, such as wtv-setup, wtv-head-waiter, etc
|
||||
@@ -362,10 +379,9 @@ async function processPath(socket, service_vault_file_path, request_headers = ne
|
||||
if (shared_romcache.indexOf(minisrv_config.config.SharedROMCache) != -1) {
|
||||
var service_path_presplit = shared_romcache.split(path.sep);
|
||||
service_path_presplit.splice(service_path_presplit.findIndex((element) => element === 'ROMCache'), 1);
|
||||
var service_path_romcache = service_path_presplit.join(path.sep);
|
||||
var service_path_romcache = service_vault_dir + path.sep + service_path_presplit.join(path.sep);
|
||||
var service_vault_file_path_romcache = wtvshared.returnAbsolutePath(wtvshared.makeSafePath(service_path_romcache));
|
||||
if (fs.existsSync(service_vault_file_path_romcache)) {
|
||||
|
||||
service_path = service_path.replace(wtvshared.fixPathSlashes(minisrv_config.config.SharedROMCache), 'ROMCache');
|
||||
service_vault_file_path = service_vault_file_path_romcache;
|
||||
usingSharedROMCache = true;
|
||||
@@ -582,7 +598,7 @@ async function processPath(socket, service_vault_file_path, request_headers = ne
|
||||
headers = errpage[0];
|
||||
data = errpage[1];
|
||||
if (pc_services) {
|
||||
if (minisrv_config.services.pc_services.show_verbose_errors)
|
||||
if (minisrv_config.services[real_service_name].show_verbose_errors)
|
||||
data += "<br><br>The interpreter said:<br><pre>" + e.stack + "</pre>";
|
||||
}
|
||||
console.error(" * Scripting error:", e);
|
||||
@@ -766,11 +782,17 @@ minisrv-no-mail-count: true`;
|
||||
}
|
||||
|
||||
if (pc_services) {
|
||||
if (original_service_name == service_name) console.log(" * PC request on service " + service_name + " for " + request_headers.request_url, 'on', socket.id);
|
||||
else console.log(" * PC request on service " + original_service_name + " (Service Vault " + service_name + ") for " + request_headers.request_url, 'on', socket.id);
|
||||
var ssl = (socket.ssl) ? true : false;
|
||||
if (original_service_name == service_name) console.log(" * " + ((ssl) ? "SSL " : "") + "PC request on service " + service_name + " for " + request_headers.request_url, 'on', socket.id);
|
||||
else console.log(" * " + ((ssl) ? "SSL " : "") + "PC request on service " + original_service_name + " (Service Vault " + service_name + ") for " + request_headers.request_url, 'on', socket.id);
|
||||
} else {
|
||||
var service_name = verifyServicePort(shortURL.split(':/')[0], socket);
|
||||
}
|
||||
// Check URL for :/, but not :// (to differentiate wtv urls)
|
||||
if (shortURL.indexOf(':/') >= 0 && shortURL.indexOf('://') == -1) {
|
||||
var allow_double_slash = false;
|
||||
if (minisrv_config.services[service_name]) {
|
||||
if (minisrv_config.services[service_name].allow_double_slash) allow_double_slash = true;
|
||||
}
|
||||
if ((shortURL.indexOf(':/') >= 0) && (shortURL.indexOf('://') == -1 || (shortURL.indexOf('://') && allow_double_slash))) {
|
||||
var ssid = socket.ssid;
|
||||
if (ssid == null) {
|
||||
// prevent possible injection attacks via malformed SSID and filesystem SessionStore
|
||||
@@ -785,8 +807,7 @@ minisrv-no-mail-count: true`;
|
||||
} else {
|
||||
console.log(" * " + reqverb + " for " + request_headers.request_url, 'on', socket.id);
|
||||
}
|
||||
|
||||
var service_name = verifyServicePort(shortURL.split(':/')[0], socket);
|
||||
|
||||
if (!service_name) {
|
||||
// detect if client is trying to load wtv-star due to client-perceived error
|
||||
if (getSocketDestinationPort(socket) == getPortByService("wtv-star")) {
|
||||
@@ -1073,7 +1094,7 @@ function headerStringToObj(headers, response = false) {
|
||||
return headers_obj;
|
||||
}
|
||||
|
||||
async function sendToClient(socket, headers_obj, data) {
|
||||
async function sendToClient(socket, headers_obj, data = null) {
|
||||
var headers = "";
|
||||
var content_length = 0;
|
||||
if (typeof (data) === 'undefined' || data === null) data = '';
|
||||
@@ -1913,6 +1934,17 @@ if (minisrv_config.config.ServiceVaults) {
|
||||
throw ("ERROR: No Service Vaults defined!");
|
||||
}
|
||||
|
||||
var service_deps = new Array();
|
||||
if (minisrv_config.config.ServiceDeps) {
|
||||
Object.keys(minisrv_config.config.ServiceDeps).forEach(function (k) {
|
||||
var service_dep = wtvshared.returnAbsolutePath(minisrv_config.config.ServiceDeps[k]);
|
||||
service_deps.push(service_dep);
|
||||
console.log(" * Configured Service Dependencies at", service_dep, "with priority", (parseInt(k) + 1));
|
||||
})
|
||||
} else {
|
||||
throw ("ERROR: No Service Dependancies Directory (SessionDeps) defined!");
|
||||
}
|
||||
|
||||
if (minisrv_config.config.SessionStore) {
|
||||
var SessionStore = wtvshared.returnAbsolutePath(minisrv_config.config.SessionStore);
|
||||
console.log(" * Configured Session Storage at", SessionStore);
|
||||
@@ -1920,17 +1952,12 @@ if (minisrv_config.config.SessionStore) {
|
||||
throw ("ERROR: No Session Storage Directory (SessionStore) defined!");
|
||||
}
|
||||
|
||||
if (minisrv_config.config.ServiceDeps) {
|
||||
var ServiceDeps = wtvshared.returnAbsolutePath(minisrv_config.config.ServiceDeps);
|
||||
console.log(" * Configured Service Dependencies at", ServiceDeps);
|
||||
} else {
|
||||
throw ("ERROR: No Service Dependencies Directory (SessionDeps) defined!");
|
||||
}
|
||||
|
||||
var service_ip = minisrv_config.config.service_ip;
|
||||
Object.keys(minisrv_config.services).forEach(function (k) {
|
||||
if (configureService(k, minisrv_config.services[k], true)) {
|
||||
console.log(" * Configured Service:", k, "on Port", minisrv_config.services[k].port, "- Service Host:", minisrv_config.services[k].host, "- Bind Port:", !minisrv_config.services[k].nobind, "- PC Services Mode:", (minisrv_config.services[k].pc_services) ? true : false);
|
||||
var using_tls = (minisrv_config.services[k].pc_services && minisrv_config.services[k].https_cert && minisrv_config.services[k].use_https) ? true : false;
|
||||
console.log(" * Configured Service:", k, "on Port", minisrv_config.services[k].port, "- Service Host:", minisrv_config.services[k].host + ((using_tls) ? " (TLS)" : ""), "- Bind Port:", !minisrv_config.services[k].nobind, "- PC Services Mode:", (minisrv_config.services[k].pc_services) ? true : false);
|
||||
|
||||
if (minisrv_config.services[k].local_nntp_port) {
|
||||
if (!wtvnewsserver) {
|
||||
@@ -1992,6 +2019,10 @@ if (minisrv_config.config.user_accounts.max_users_per_account > 99) {
|
||||
minisrv_config.config.user_accounts.max_users_per_account = 99;
|
||||
}
|
||||
|
||||
// shenanigans
|
||||
if (minisrv_config.config.shenanigans) console.log(" * WARNING: Shenanigans level", minisrv_config.config.shenanigans, "enabled");
|
||||
else console.log(" * Shenanigans disabled");
|
||||
|
||||
process.on('uncaughtException', function (err) {
|
||||
console.error((err && err.stack) ? err.stack : err);
|
||||
});
|
||||
@@ -2023,25 +2054,55 @@ if (!minisrv_config.config.bind_ip) minisrv_config.config.bind_ip = "0.0.0.0";
|
||||
pc_bind_ports.every(function (v) {
|
||||
try {
|
||||
var server = express();
|
||||
server.listen(v, minisrv_config.config.bind_ip);
|
||||
var service_name = getServiceByPort(v);
|
||||
var service_handler = http;
|
||||
var server_opts = {};
|
||||
var using_tls = (minisrv_config.services[service_name].https_cert && minisrv_config.services[service_name].use_https) ? true : false;
|
||||
|
||||
if (using_tls) {
|
||||
service_handler = httpx;
|
||||
server_opts =
|
||||
{
|
||||
key: fs.readFileSync(wtvshared.parseConfigVars(minisrv_config.services[service_name].https_cert.key)),
|
||||
cert: fs.readFileSync(wtvshared.parseConfigVars(minisrv_config.services[service_name].https_cert.cert)),
|
||||
};
|
||||
}
|
||||
//service_handler.createServer(server_opts, server).listen(v, minisrv_config.config.bind_ip);
|
||||
|
||||
if (using_tls && !minisrv_config.services[service_name].force_https) {
|
||||
service_handler = httpx; // HTTP and HTTPS on the same port
|
||||
}
|
||||
|
||||
service_handler.createServer(server_opts, server).listen(v, minisrv_config.config.bind_ip);
|
||||
initstring_pc += v + ", ";
|
||||
|
||||
server.get('*', (req, res) => {
|
||||
var request_headers = {};
|
||||
var ssl = (req.socket.ssl) ? true : false;
|
||||
var service_name = getServiceByPort(v);
|
||||
req.socket.minisrv_pc_mode = true;
|
||||
req.socket.res = res;
|
||||
req.socket.service_name = service_name;
|
||||
req.socket.id = parseInt(crc16('CCITT-FALSE', Buffer.from(String(req.socket.remoteAddress) + String(req.socket.remotePort), "utf8")).toString(16), 16);
|
||||
socket_sessions[req.socket.id] = [];
|
||||
var service_name = findServiceByPort(v);
|
||||
socket_sessions[req.socket.id] = [];
|
||||
|
||||
var request_headers = {};
|
||||
request_headers['request'] = "GET " + req.originalUrl + " HTTP/1.1";
|
||||
request_headers.request_url = req.originalUrl;
|
||||
Object.keys(req.headers).forEach(function (k) {
|
||||
request_headers[k] = req.headers[k];
|
||||
});
|
||||
request_headers.query = req.query;
|
||||
if (minisrv_config.config.debug_flags.show_headers) console.log(" * Incoming PC Headers on", service_name, "socket ID", req.socket.id, wtvshared.filterRequestLog(request_headers));
|
||||
request_headers.service_name = service_name;
|
||||
req.socket.minisrv_pc_mode = true;
|
||||
req.socket.res = res;
|
||||
req.socket.service_name = service_name;
|
||||
processURL(req.socket, request_headers, true)
|
||||
|
||||
if (minisrv_config.config.debug_flags.show_headers) console.log(" * Incoming " + ((ssl) ? "HTTPS" : "HTTP") + " PC Headers on", service_name, "socket ID", req.socket.id, wtvshared.filterRequestLog(request_headers));
|
||||
if (!ssl && minisrv_config.services[service_name].force_https && minisrv_config.services[service_name].https_cert) {
|
||||
var headers = `302 Moved
|
||||
Location: https://${(minisrv_config.services[service_name].https_cert.domain) ? minisrv_config.services[service_name].https_cert.domain : minisrv_config.services[service_name].host}:${minisrv_config.services[service_name].port}${req.originalUrl}
|
||||
Content-type: text/html`;
|
||||
sendToClient(req.socket, headers);
|
||||
} else {
|
||||
processURL(req.socket, request_headers, true)
|
||||
}
|
||||
})
|
||||
return true;
|
||||
} catch (e) {
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFgzCCA2sCFBKo/bZ2E7HHlOfsS4UrBJl1UgpTMA0GCSqGSIb3DQEBCwUAMH0x
|
||||
CzAJBgNVBAYTAlVTMREwDwYDVQQIDAhOZXcgWW9yazEXMBUGA1UECgwOWmVmaWUg
|
||||
TmV0d29ya3MxJDAiBgNVBAsMG21pbmlzcnYgZGVmYXVsdCBjZXJ0aWZpY2F0ZTEc
|
||||
MBoGA1UEAwwTbWluaXNydi5wY19zZXJ2aWNlczAgFw0yMjExMzAxNDE3MTVaGA8y
|
||||
MTIyMTEwNjE0MTcxNVowfTELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5ldyBZb3Jr
|
||||
MRcwFQYDVQQKDA5aZWZpZSBOZXR3b3JrczEkMCIGA1UECwwbbWluaXNydiBkZWZh
|
||||
dWx0IGNlcnRpZmljYXRlMRwwGgYDVQQDDBNtaW5pc3J2LnBjX3NlcnZpY2VzMIIC
|
||||
IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyOZ9iOYqr1cZLZKEWT8I5f7A
|
||||
l3bd9wslCPKR9Mj3IwEy8KQjxwqJYl6jPvbNMtIgZo7Y9pFBovJEUIFFd4Ffshrm
|
||||
QZZfDJtw+KvZF3m/GdmgRc147m++Ve6OSOvuSdtAOAiujhmwjHsTif+YTcjsOfAT
|
||||
O9bhThIespeU4qDoYyDD+3A4wxwxCIFN7clSr7TpPS3uUQ7woCsi1nxdU8B5txT2
|
||||
KfXOlyL0uwygxEEUy0XrDdpHFt9sV0LWiy4Ho3wVf3dhv2odSEeh8SK04qWMga4A
|
||||
fXEXWwg+4cuho8p24MuZZRsCrqM1O7Hm8wz9FiBJJF5US1jRLOf9sz/iaEz2Mz7C
|
||||
+skG/3gsQ1cI+c/f4jwafYLwJs9XJ141nAxTHxAg2fjg0+Oqe54rs2v/8mBy6r6L
|
||||
bLBlyNMZ4CFD/OhrE8tnP9WhX/l2DUmsQGq2OaL7i3Tjp2jWEwoY0MVcRYiJgA8L
|
||||
5cbWnIWuR0WrDmiKwk1gLdGhvqLxYkouST68zr8Oy9TX2G2s9hF6IZbNN8/ZzMnm
|
||||
y5KjM+DjSCjxym2F03obVGbzCUaqDUHNY84oddoF7zu8lzP8UVYwjvHOvCCQa2Az
|
||||
30KZjF6YEDYxhY4KtxNDxNJ9EHBxXlyvYRo/XM/YOk0wdoZPGq4tsj4BZrXSfuch
|
||||
AO0Pr8qDOt+134K1t5ECAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAToJKBCsCcBWB
|
||||
mNdj320fu5emb7ZYDyK5wpCBFwMLl/kx/wfNUB6E3GZJdvFBr3zAOrUbwrXZ9+2T
|
||||
MIP1S5uaG5eCmtLZyH0AjsJa70gUwyqk3VSHXErtT7tbLHTCu/Lqn8XeKiRqjKGi
|
||||
+sI3L4KFzlDELFT8iqkR+MOC8cawKsO1LV/8T0XrRx7zfflQFheo+Zkkn3/EsjP9
|
||||
vwKX5+3u5jyLgYdUOVRoUHI2L9hp6ubcqqKTwyKg74PDKsUkg+dSt9QL+UO1FPT8
|
||||
hDlvKg2p7w3UawF675AgzyF6tsgCYBs7ThaNYWgjKZ9ALDvTPTypUCsNnSZ0lNaT
|
||||
iU+dzEocMo2WesE5B1KH6WdAKD54VV4XHPPEzM2WNRTfs+JiTf9aNTJ2tatwvB5w
|
||||
6glFkgICZ4TgHCADHE0h0aPmVEdzJ6bBA4tUTl6GqWUTVgj53LsdB3NcaEasg/7A
|
||||
zzgPzsw6bZivrodyr2aXSV8VPIzoy6RjLNh4sujGBN4QU+v3o6X9me32WljSQzzx
|
||||
5F3pg/okFauWjF8I6VPKVPW5ReUoRI7B/RkrHEqpCzpPltVV5cHmP+2V5Q6UJegC
|
||||
FebNB1npEfOb/ozpxm4b3UhjrnmIO4NZZs8lvZy/naC+F4QOnMpSGfBjsdZuBlBv
|
||||
o3nALXySQNoUsUhfkpOG/8O9K3HrSYk=
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,51 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
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
|
||||
-----END RSA PRIVATE KEY-----
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user