From b4a04d49cd4b77f52c020580e7b1445651ee724d Mon Sep 17 00:00:00 2001 From: zefie Date: Wed, 4 Aug 2021 19:30:22 -0400 Subject: [PATCH] v0.9.11 - added example docker-compose for minisrv + webone - update: wtv-home:/home: reduce size of title to fit longer version numbers - update: wtv-chat:/home: fix colors - update: login system: do not send tellyscript nor login headers to reconnecting (eg client:redial) client - fix: fixed tellyscript path for wtv-1800:/noflash (bf0app braindead) - update flashrom subsystem: - moved duplicate code into WTVFlashrom class - smarter part information detection - http(s) proxy updates: - allow ~ character - fix HTTPS when using HTTP proxy - include example webone.conf for external HTTP Proxy - update: app.js: enable graceful shutdown with SIGTERM - update: add service ip to wtv-tricks:/info --- docker-compose/docker-compose.yml | 22 ++ docker-compose/minisrv/Dockerfile | 11 + docker-compose/minisrv/run.sh | 3 + docker-compose/webone/Dockerfile | 13 + docker-compose/webone/setup.sh | 21 ++ docker-compose/webone/webone.conf | 332 ++++++++++++++++++ .../ServiceVault/wtv-1800/noflash.js | 2 +- .../ServiceVault/wtv-1800/preregister.js | 13 +- .../ServiceVault/wtv-chat/home.js | 10 +- .../wtv-flashrom/current-noflash.js | 102 +----- .../ServiceVault/wtv-flashrom/get-by-path.js | 107 +----- .../ServiceVault/wtv-flashrom/get-lc2-page.js | 131 ++----- .../ServiceVault/wtv-flashrom/noflash.js | 100 +----- .../wtv-head-waiter/login-stage-two.js | 2 +- .../ServiceVault/wtv-head-waiter/login.js | 8 +- .../ServiceVault/wtv-home/home.js | 2 +- .../ServiceVault/wtv-tricks/info.js | 4 + zefie_wtvp_minisrv/WTVFlashrom.js | 179 ++++++++++ zefie_wtvp_minisrv/app.js | 25 +- zefie_wtvp_minisrv/package.json | 2 +- zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj | 3 + 21 files changed, 684 insertions(+), 408 deletions(-) create mode 100644 docker-compose/docker-compose.yml create mode 100644 docker-compose/minisrv/Dockerfile create mode 100644 docker-compose/minisrv/run.sh create mode 100644 docker-compose/webone/Dockerfile create mode 100644 docker-compose/webone/setup.sh create mode 100644 docker-compose/webone/webone.conf create mode 100644 zefie_wtvp_minisrv/WTVFlashrom.js 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