diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml
new file mode 100644
index 00000000..c6ef8b6b
--- /dev/null
+++ b/docker-compose/docker-compose.yml
@@ -0,0 +1,22 @@
+version: '3'
+services:
+ webone:
+ build: ./webone
+ restart: unless-stopped
+ stop_signal: SIGKILL
+ volumes:
+ - /home/zefie/docker/wtvminisrv/webone.conf:/etc/webone.conf:ro
+ - /home/zefie/docker/wtvminisrv/webone.conf.d/:/etc/webone.conf.d/:ro
+
+ minisrv:
+ build: ./minisrv
+ restart: unless-stopped
+ links:
+ - webone
+ ports:
+ - "1600-1699:1600-1699"
+ volumes:
+ - /home/zefie/docker/wtvminisrv/user_config.json:/opt/minisrv/zefie_wtvp_minisrv/user_config.json:ro
+ - /home/zefie/docker/wtvminisrv/UserServiceVault:/opt/minisrv/zefie_wtvp_minisrv/UserServiceVault
+
+
diff --git a/docker-compose/minisrv/Dockerfile b/docker-compose/minisrv/Dockerfile
new file mode 100644
index 00000000..57c7e1a4
--- /dev/null
+++ b/docker-compose/minisrv/Dockerfile
@@ -0,0 +1,11 @@
+FROM alpine:latest
+
+RUN apk add git nodejs npm
+RUN cd /opt && git clone --depth=1 https://github.com/zefie/zefie_wtvp_minisrv.git minisrv
+RUN cd /opt/minisrv/zefie_wtvp_minisrv && npm install
+
+COPY ./run.sh /opt/minisrv/zefie_wtvp_minisrv/run.sh
+RUN chmod +x /opt/minisrv/zefie_wtvp_minisrv/run.sh
+
+WORKDIR /opt/minisrv/zefie_wtvp_minisrv
+CMD ./run.sh
diff --git a/docker-compose/minisrv/run.sh b/docker-compose/minisrv/run.sh
new file mode 100644
index 00000000..a6849b7c
--- /dev/null
+++ b/docker-compose/minisrv/run.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+git pull
+node app.js
diff --git a/docker-compose/webone/Dockerfile b/docker-compose/webone/Dockerfile
new file mode 100644
index 00000000..1d41b009
--- /dev/null
+++ b/docker-compose/webone/Dockerfile
@@ -0,0 +1,13 @@
+FROM debian:latest
+
+RUN apt-get update && apt-get install --yes curl && \
+curl -L https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -o /tmp/packages-microsoft-prod.deb && \
+apt-get install --yes /tmp/packages-microsoft-prod.deb && \
+rm /tmp/packages-microsoft-prod.deb && \
+apt-get update && \
+apt-get install --yes curl imagemagick ffmpeg jpegoptim
+
+COPY ./setup.sh /tmp/setup.sh
+RUN bash /tmp/setup.sh
+
+CMD /usr/local/bin/webone
diff --git a/docker-compose/webone/setup.sh b/docker-compose/webone/setup.sh
new file mode 100644
index 00000000..3069c0b7
--- /dev/null
+++ b/docker-compose/webone/setup.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+get_latest_release() {
+ curl --silent "https://api.github.com/repos/$1/releases/latest"
+}
+
+debfile=$(get_latest_release atauenis/webone | \
+grep "browser_download_url" | \
+grep "amd64" | \
+grep "deb" | \
+sed -E 's/.*"([^"]+)".*/\1/')
+
+if [ ! -z "${debfile}" ]; then
+ curl --silent -L "${debfile}" -o /tmp/webone.deb
+ if [ ! -f /bin/systemctl ]; then
+ # Create dummy systemctl
+ touch /bin/systemctl
+ chmod +x /bin/systemctl
+ fi
+ apt-get install --yes /tmp/webone.deb
+ rm /tmp/webone.deb
+fi
diff --git a/docker-compose/webone/webone.conf b/docker-compose/webone/webone.conf
new file mode 100644
index 00000000..820fb8b4
--- /dev/null
+++ b/docker-compose/webone/webone.conf
@@ -0,0 +1,332 @@
+; WebOne Configuration File
+; Its format is like INI, but also can contain raw lists inside some sections.
+; For binary options use: 1/0, y/n, yes/no, on/off, enable/disable, true/false.
+; Help and documentation: https://github.com/atauenis/webone/wiki/Configuration-file
+
+[Server]
+; Server settings
+; Port=Port to listen
+; DefaultHostName=Proxy's host name (set to valid IP or domain name for use with/on Linux or macOS)
+; Authenticate=Set if the proxy needs to be protected by "login:password" or leave blank
+; OutputEncoding=Codepage for patched output content (list of available: http://localhost/!codepages/)
+; HideClientErrors=Hide client connection error messages in log (for Netscape 3 PNG rejections)
+; SearchInArchive=Enable searching for unavailable pages (Server Not Found or 404) in archive.org
+; ShortenArchiveErrors=Enable shortening of 404s on web.archive.org to get off large scipts and images
+; SecurityProtocols=Forcely set SSL/TLS protocols that can be used for retrieving web content
+; ValidateCertificates=Break network operations when the remote TLS certificate is bad
+; UserAgent=Override user-agent string to fetch uncut content
+; TemporaryDirectory=Directory which should be used for temporary files (%TEMP%, $TEMP or any other)
+; LogFile=Path to server log file. To use a log file without erasing, use AppendLogFile instead
+; DisplayStatusPage=Set status page display style (no, short, full)
+Port=8080
+DefaultHostName=%HostName%
+;Authenticate=login:password
+;OutputEncoding=AsIs
+;OutputEncoding=Windows
+;OutputEncoding=DOS
+OutputEncoding=Apple
+HideClientErrors=yes
+SearchInArchive=yes
+ShortenArchiveErrors=yes
+;SecurityProtocols=4032
+ValidateCertificates=yes
+UserAgent=%Original% WebOne/%WOVer%
+;UserAgent=Mozilla/4.75 [en] (Windows NT 5.0; U)
+TemporaryDirectory=%TEMP%
+LogFile=%SYSLOGDIR%/webone.log
+;AppendLogFile=%SYSLOGDIR%/webone.log
+DisplayStatusPage=short
+
+
+[ForceHttps]
+; list of domains that should be always accessed via HTTPS
+phantom.sannata.org
+www.phantom.sannata.org
+login.vk.com
+m.vk.com
+vk.com
+webdav
+webdav.yandex.ru
+web.archive.org
+googlevideo.com
+commondatastorage.googleapis.com
+rutracker.org
+www.vogons.org
+
+
+[InternalRedirectOn]
+; list of URLs where 302 redirections should be handled at all by WebOne, not browser
+; (Empty)
+
+
+[ForceUtf8]
+; list of URLs that should be always downloaded as UTF-8
+^http://.*yandex.ru/
+
+
+[TextTypes]
+; list of MIME type mask that means files which should be patched during transfer
+text/
+javascript
+json
+cdf
+x-netcdf
+xml
+
+
+; Sets of traffic edits
+[Edit:jquery.min.js]
+; Redirect all requests to jQuery of versions other than 1.9.1 to Google's CDN with
+; the last version supported by Firefox 3.6. This will not touch WebDAV traffic.
+; Title: RegExp mask of URLs that should be touched by this Set of edits.
+; IgnoreUrl: RegExp mask(s) of URLs which should NOT be touched by this Set of edits.
+; OnUrl: additional URL RegExp masks not listed in section's title.
+; AddRedirect: the destination URL of this redirection rule
+IgnoreUrl=1.9.1
+IgnoreUrl=webdav
+OnUrl=jquery2.js
+OnUrl=jquery-[0-9]*\.[0-9]*\.[0-9]*\.min\.js
+IgnoreUrl=webdav
+AddRedirect=http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
+
+[Edit:jquery-ui.js]
+; similar to jquery main file, but for jquery-ui
+IgnoreUrl=1.9.1
+IgnoreUrl=webdav
+OnUrl=jquery-ui[a-z0-9\.\-]*.js
+AddRedirect=http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js
+
+[Edit:bootstrap.min.js]
+IgnoreUrl=2.3.1
+IgnoreUrl=webdav
+AddRedirect=http://maxcdn.bootstrapcdn.com/bootstrap/2.3.1/js/bootstrap.min.js
+
+
+[Edit:(^http://.*/styles/prosilver/theme/)(.*)]
+; downgrade stylesheets of phpBB proSilver skin to version 3.0 on old browsers
+OnHeader=User-Agent: .*MSIE [3456]
+OnHeader=User-Agent: Mozilla/3
+OnHeader=User-Agent: Mozilla/4
+IgnoreUrl=webdav
+AddRedirect=http://atauenis.github.io/webone-webfixes/prosilver/theme/$2
+
+
+[Edit:^http://super8russia.ning.com]
+; another example of redirect, but to Wayback Machine
+; IgnoreUrl is not need here (the RegExp used here is quite detailed)
+AddRedirect=http://web.archive.org/web/2010/%URL%
+
+
+[Edit::443]
+; another example of redirect, but with remove of 443 port (final murder of SSL)
+; the redirect is internal (hidden, seamless) so we're using AddInternalRedirect here
+AddInternalRedirect=%UrlNoPort%
+
+; Dead hosting providers
+[Edit:^(http://www\.|http://)geocities.com/]
+AddRedirect=http://web.archive.org/web/2008/%URL%
+
+[Edit:^http://web.ukonline.co.uk/]
+AddRedirect=http://web.archive.org/web/2007/%URL%
+
+[Edit:^(http://www\.|http://)narod.ru/]
+AddRedirect=http://web.archive.org/web/2012/http://narod.yandex.ru/%UrlNoDomain%
+
+[Edit:^http://narod.yandex.ru/]
+AddRedirect=http://web.archive.org/web/2012/%URL%
+
+[Edit:^http://.*.by.ru/]
+IgnoreUrl=web.archive.org
+AddRedirect=http://web.archive.org/web/2011/%URL%Redirect=http://web.archive.org/web/2011/%URL%
+
+
+; Microsoft software interactivity
+[Edit:^http://ie.search.msn.com/]
+AddRedirect=http://web.archive.org/web/2000/%URL%
+
+[Edit:^http://[a-z\.]*windowsmedia.com/]
+AddRedirect=http://web.archive.org/web/2002/%URL%
+
+[Edit:^http://go.microsoft.com/]
+AddRedirect=http://web.archive.org/web/2005/%URL%
+
+[Edit:^(http://www\.|http://)microsoft.com/isapi/]
+AddRedirect=http://web.archive.org/web/2005/%URL%
+
+[Edit:^http://[a-z\.]*.windows.com/]
+AddRedirect=http://web.archive.org/web/2005/%URL%
+
+[Edit:^(http://www\.|http://)iechannelguide.com]
+AddRedirect=http://web.archive.org/web/1997/%URL%
+
+[Edit:^(http://www\.|http://)microsoft.com/IE/]
+AddRedirect=http://web.archive.org/web/1997/%URL%
+
+[Edit:\.cdf$]
+IgnoreUrl=web.archive.org
+AddRedirect=http://web.archive.org/web/1998/%URL%
+
+; YouTube playback (youtube-dl & yt.bat)
+; uncomment lines below to enable
+;[Edit:^(http://www\.|http://)youtube.com/watch]
+;AddRedirect=http://%Proxy%/!convert/?url=%Url%&util=yt.bat&type=video/x-ms-asf
+;AddConvert=yt.bat
+;AddResponseHeader=Content-Type: video/x-ms-asf
+
+; YouTube playback (via original ViewTube)
+; uncomment lines below to enable
+;[Edit:^(http://www\.|http://).*.googlevideo.com/]
+;AddRedirect=http://%Proxy%/!convert/?url=%Url%&util=ffmpeg&arg=-vcodec%20wmv1%20-acodec%20wmav1%20-f%20asf&type=video/x-ms-asf
+
+
+
+; Content patches
+; Apply some edits to page's content. Here are two edits, in example:
+; 1. Replace "eval()" with direct calls for IE3/4
+; 2. Fix work with _tmr JS variable in inline scripts (for IE4 too)
+; AddFind: the find mask.
+; AddReplace: the replacement.
+[Edit:^http://old-dos.ru]
+AddFind=eval\(('|")(.*?)\1\)
+AddReplace=$2
+AddFind=var _tmr = _tmr .* \[\];
+AddReplace=var _tmr = _tmr;
+
+[Edit:.*]
+OnContentType=application/x-netcdf
+AddFind=HREF="http://
+AddReplace=HREF="http://web.archive.org/web/1998/
+
+[Edit:\.cdf$]
+AddFind= HREF="http://
+AddReplace= HREF="http://web.archive.org/web/1998/
+
+[Edit:^http(s?)://web.archive.org/web/]
+AddFind=
-
Welcome to `+ z_title + `
+Welcome to `+ z_title + `
Encryption Status: ${cryptstatus}
Connection Speed: &rate;
diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/info.js b/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/info.js
index 00bf7b82..87f93ade 100644
--- a/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/info.js
+++ b/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/info.js
@@ -76,6 +76,10 @@ Content-Type: text/html`
Client IP number:
|
| ${socket.remoteAddress}
+ |
+ | Service IP number:
+ |
+ | ${service_ip}
|
|
|
diff --git a/zefie_wtvp_minisrv/WTVFlashrom.js b/zefie_wtvp_minisrv/WTVFlashrom.js
new file mode 100644
index 00000000..fa37ed32
--- /dev/null
+++ b/zefie_wtvp_minisrv/WTVFlashrom.js
@@ -0,0 +1,179 @@
+class WTVFlashrom {
+
+ fs = require('fs');
+ https = require('https');
+ use_zefie_server = true;
+ bf0app_update = false;
+ service_vaults = new Array();
+ service_name = "";
+ zdebug = false;
+
+
+ constructor(service_vaults, service_name, use_zefie_server = true, bf0app_update = false, debug = false) {
+ this.service_vaults = service_vaults;
+ this.service_name = service_name;
+ this.use_zefie_server = use_zefie_server;
+ this.bf0app_update = bf0app_update;
+ this.zdebug = debug;
+ }
+
+ async doLocalFlashROM(flashrom_file_path, callback, info_only = false) {
+ // use local flashrom files;
+ console.log(info_only);
+ var self = this;
+ try {
+ this.fs.readFile(flashrom_file_path, null, function (err, data) {
+ if (err) {
+ errpage = doErrorPage(400)
+ var headers = errpage[0];
+ data = err.toString();
+ callback(data, headers);
+ } else {
+ if (info_only) {
+ callback(self.getFlashromData(data, flashrom_file_path));
+ } else {
+ self.sendToClient(data, flashrom_file_path, callback);
+ }
+ }
+ });
+ } catch (e) {
+ var errpage = doErrorPage(404, "The service could not find the requested ROM.")
+ var headers = errpage[0];
+ var data = errpage[1];
+ callback(data, headers);
+ }
+ }
+
+ formatPartNum(partnum) {
+ if (partnum < 10) return "00" + partnum; // 1s
+ else if (partnum >= 10 && partnum < 100) return "0" + partnum; // 10s
+ else return partnum; // 100s
+ }
+
+
+ getFlashromData(data, path) {
+ var flashrom_info = new Array();
+ var flashrom_magic = "96031889";
+ var part_header = new Buffer.alloc(32);
+ data.copy(part_header, 0, 0, 32);
+ flashrom_info.header_length = data.readUInt16BE(26);
+
+ flashrom_info.is_bootrom = (/\.brom$/).test(path);
+
+ // re-read entire header
+ var part_header = new Buffer.alloc(flashrom_info.header_length);
+ data.copy(part_header, 0, 0, flashrom_info.header_length);
+
+ flashrom_info.magic = part_header.toString('hex', 0, 4);
+ flashrom_info.valid_flashrom = false;
+ if (flashrom_info.magic == flashrom_magic) flashrom_info.valid_flashrom = true;
+ if (!flashrom_info.valid_flashrom) console.error(" * Warning! FlashROM File Magic (" + flashrom_info.magic + ") did not match expected magic (" + flashrom_magic + ")...");
+
+ if (this.zdebug) console.log(" # FlashROM File Magic (" + flashrom_info.magic + "), expected magic (" + flashrom_magic + "), OK = " + flashrom_info.valid_flashrom + "...");
+ flashrom_info.byte_progress = data.readUInt32BE(68);
+ if (this.zdebug) console.log(" # Flashrom Part Bytes Sent:", flashrom_info.byte_progress);
+ flashrom_info.compression_type = parseInt(part_header[16], 16);
+ if (this.zdebug) console.log(" # Flashrom Part Compression Type:", flashrom_info.compression_type);
+ flashrom_info.part_data_size = data.readUInt32BE(4);
+ if (this.zdebug) console.log(" # Flashrom Part Data Size:", flashrom_info.part_data_size);
+ flashrom_info.part_total_size = flashrom_info.part_data_size + flashrom_info.header_length;
+ if (this.zdebug) console.log(" # Flashrom Part Total Size:", flashrom_info.part_total_size);
+
+ flashrom_info.total_parts_size = data.readUInt32BE(32);
+ if (this.zdebug) console.log(" # Flashrom All Parts Total Size:", flashrom_info.total_parts_size);
+
+ // read current part number bit from part header
+ flashrom_info.part_number = data.readUInt16BE(28);
+
+ if (this.zdebug) console.log(" # Flashrom Current Part Number:", flashrom_info.part_number);
+
+ // read current part display message from part header
+ flashrom_info.message = new Buffer.from(part_header.toString('hex').substring(36 * 2, 68 * 2), 'hex').toString('ascii').replace(/[^0-9a-z\ \.\-]/gi, "");
+
+ flashrom_info.is_last_part = ((flashrom_info.byte_progress + flashrom_info.part_total_size) == flashrom_info.total_parts_size) ? true : false;
+ flashrom_info.rompath = 'wtv-flashrom:/get-by-path?path=' + path + '&raw=true';
+ if (this.zdebug) console.log(" # Flashrom Part Bytes Sent (after this part):", flashrom_info.byte_progress + flashrom_info.part_total_size);
+ if (this.zdebug) console.log(" # Flashrom Part is Last Part", flashrom_info.is_last_part);
+
+ if (flashrom_info.is_last_part && this.bf0app_update) {
+ flashrom_info.next_rompath = null;
+ } else if (flashrom_info.is_last_part && !this.bf0app_update) {
+ flashrom_info.next_rompath = "wtv-flashrom:/lc2-download-complete?";
+ } else {
+ flashrom_info.next_part_number = this.formatPartNum(flashrom_info.part_number + 1);
+ flashrom_info.next_rompath = flashrom_info.rompath.replace("part" + this.formatPartNum(flashrom_info.part_number), "part" + flashrom_info.next_part_number);
+ }
+ return flashrom_info;
+ }
+
+ async sendToClient(data, request_path, callback) {
+ var headers = "200 OK\n";
+ if (this.bf0app_update) headers += "minisrv-use-carriage-return: false\n";
+ var flashrom_info = this.getFlashromData(data, request_path)
+ if (flashrom_info.is_bootrom) headers += "Content-Type: binary/x-wtv-bootrom"; // maybe?
+ else headers += "Content-Type: binary/x-wtv-flashblock";
+ if (flashrom_info.next_rompath != null) headers += "\nwtv-visit: " + flashrom_info.next_rompath;
+ callback(data, headers);
+ }
+
+ async getFlashRom(request_path, callback, length = 0) {
+ var flashrom_file_path = null;
+ var self = this;
+ Object.keys(self.service_vaults).forEach(function (g) {
+ if (flashrom_file_path != null) return;
+ flashrom_file_path = self.service_vaults[g] + "/" + self.service_name + "/" + request_path;
+ if (!self.fs.existsSync(flashrom_file_path)) flashrom_file_path = null;
+ });
+ if (this.use_zefie_server && !flashrom_file_path) {
+ // get flashrom files from archive.midnightchannel.net
+ var options = {
+ host: "archive.midnightchannel.net",
+ path: "/zefie/files/wtv-flashrom/" + request_path,
+ timeout: 5000,
+ method: 'GET'
+ }
+ if (length > 0) {
+ options.headers = {
+ 'Range': 'bytes=0-' + length
+ }
+ }
+
+ const req = this.https.request(options, function (res) {
+ var data_hex = '';
+ res.setEncoding('hex');
+
+ res.on('data', d => {
+ data_hex += d;
+ })
+
+ res.on('end', function () {
+ console.log(` * Zefie's FlashROM Server HTTP Status: ${res.statusCode} ${res.statusMessage}`)
+ if (res.statusCode == 200) {
+ var data = Buffer.from(data_hex, 'hex');
+ } else if (res.statusCode == 206) {
+ headers = "";
+ var data = self.getFlashromData(Buffer.from(data_hex, 'hex'), request_path);
+ } else if (res.statusCode == 404) {
+ var errpage = doErrorPage(404, "The service could not find the requested ROM on zefie's server.")
+ var headers = errpage[0];
+ var data = errpage[1];
+ } else {
+ var errpage = doErrorPage(400)
+ var headers = errpage[0];
+ var data = errpage[1];
+ }
+ if (res.statusCode == "206") {
+ self.sendToClient(data, request_path, callback);
+ } else {
+ callback(data);
+ }
+ });
+ });
+ req.end();
+ } else {
+ this.doLocalFlashROM(flashrom_file_path, callback, ((length != 0) ? true : false));
+ }
+ }
+}
+
+module.exports = WTVFlashrom;
\ No newline at end of file
diff --git a/zefie_wtvp_minisrv/app.js b/zefie_wtvp_minisrv/app.js
index aec02651..50ffea09 100644
--- a/zefie_wtvp_minisrv/app.js
+++ b/zefie_wtvp_minisrv/app.js
@@ -14,6 +14,20 @@ var WTVSec = require('./WTVSec.js');
var WTVClientCapabilities = require('./WTVClientCapabilities.js');
var WTVClientSessionData = require('./WTVClientSessionData.js');
+process
+ .on('SIGTERM', shutdown('SIGTERM'))
+ .on('SIGINT', shutdown('SIGINT'))
+ .on('uncaughtException', shutdown('uncaughtException'));
+
+
+function shutdown(signal) {
+ return (err) => {
+ console.log("Received signal", signal);
+ if (err) console.error(err.stack || err);
+ process.exit(err ? 1 : 0);
+ };
+}
+
// Where we store our session information
var ssid_sessions = new Array();
var socket_sessions = new Array();
@@ -285,7 +299,7 @@ async function processURL(socket, request_headers) {
}
async function doHTTPProxy(socket, request_headers) {
- var request_type = (request_headers.request_url.substring(0,5) == 'https') ? 'https' : 'http'
+ var request_type = (request_headers.request_url.substring(0, 5) == "https") ? "https" : "http";
if (zshowheaders) console.log(request_type.toUpperCase() +" Proxy: Client Request Headers on socket ID", socket.id, (await filterSSID(request_headers)));
switch (request_type) {
case "https":
@@ -304,7 +318,7 @@ async function doHTTPProxy(socket, request_headers) {
request_data.port = request_data.host.split(':')[1];
request_data.host = request_data.host.split(':')[0];
} else {
- if (request_type === 'https') request_data.port = 443;
+ if (request_type === "https") request_data.port = 443;
else request_data.port = 80;
}
for (var i = 0; i < 3; i++) request_url_split.shift();
@@ -332,10 +346,11 @@ async function doHTTPProxy(socket, request_headers) {
var ProxyAgent = require('proxy-agent');
options.agent = new ProxyAgent("socks://" + (minisrv_config.services[request_type].external_proxy_host || "127.0.0.1") + ":" + minisrv_config.services[request_type].external_proxy_port);
} else {
+ var proxy_agent = http;
options.host = minisrv_config.services[request_type].external_proxy_host;
options.port = minisrv_config.services[request_type].external_proxy_port;
options.path = request_headers.request.split(' ')[1];
- options.headers.Host = request_data.host;
+ options.headers.Host = request_data.host + ":" + request_data.port;
}
}
const req = proxy_agent.request(options, function (res) {
@@ -579,7 +594,7 @@ function headersAreStandard(string, verbose = false) {
// in unencrypted headers, and returns true only if every character in the string matches
// the regex. Once we know the string is binary, we can better process it with the
// raw base64 or hex data in processRequest() below.
- return /^([A-Za-z0-9\+\/\=\-\.\,\ \"\;\:\?\&\r\n\(\)\%\<\>\_]{8,})$/.test(string);
+ return /^([A-Za-z0-9\+\/\=\-\.\,\ \"\;\:\?\&\r\n\(\)\%\<\>\_\~]{8,})$/.test(string);
}
async function processRequest(socket, data_hex, skipSecure = false, encryptedRequest = false) {
@@ -1329,4 +1344,4 @@ initstring = initstring.substring(0, initstring.length - 2);
console.log(" * Started server on ports " + initstring + "...")
var listening_ip_string = (minisrv_config.config.bind_ip != "0.0.0.0") ? "IP: " + minisrv_config.config.bind_ip : "all interfaces";
-console.log(" * Listening on", listening_ip_string,"~","Service IP:", service_ip);
+console.log(" * Listening on", listening_ip_string,"~","Service IP:", service_ip);
\ No newline at end of file
diff --git a/zefie_wtvp_minisrv/package.json b/zefie_wtvp_minisrv/package.json
index 17144fb1..0d3f521b 100644
--- a/zefie_wtvp_minisrv/package.json
+++ b/zefie_wtvp_minisrv/package.json
@@ -1,6 +1,6 @@
{
"name": "zefie_wtvp_minisrv",
- "version": "0.9.10",
+ "version": "0.9.11",
"description": "WebTV Service (WTVP) Emulation Server",
"main": "app.js",
"homepage": "https://github.com/zefie/zefie_wtvp_minisrv",
diff --git a/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj b/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj
index 6b73bcde..ef2322c7 100644
--- a/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj
+++ b/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj
@@ -221,6 +221,9 @@
Code
+
+ Code
+
Code