From b96718555b72547f181646f3392c3e16e741df1e Mon Sep 17 00:00:00 2001 From: zefie Date: Tue, 10 Aug 2021 01:17:39 -0400 Subject: [PATCH] v0.9.18 - numerous bug fixes - too much to remember - rewrote sync system yet again - more classes - WTVShared class for shared functions - clientShowAlert class for easy client:showalert urls - User File Store - Can upload with PUT commands in wtv-disk - Programmically access files with new functions in WTVClientSessionData - TODO: file browser - other stuff I can't remember - work on post data bug - proper gzip download for disk system (aka WNI reinventing the Content-Encoding: gzip wheel) - send Last-Modified for static files - send wtv-checksum for all disk system downloads - update to v90 modem firmware - offer kflex with `Old` diskmap --- .gitignore | 1 + .../ServiceVault/wtv-1800/noflash.js | 2 +- .../ServiceVault/wtv-1800/preregister.js | 21 +- .../Locale/en-US/kflex/modem_firmware.dat.gz | Bin 0 -> 92828 bytes .../Locale/en-US/v90/modem_firmware.dat.gz | Bin 0 -> 87108 bytes .../Locale/ja-JP/modem_firmware.dat.gz | Bin 0 -> 92827 bytes .../content/diskmaps/ModemFirmware.json | 18 + .../content/diskmaps/ModemFirmwareOld.json | 18 + .../ServiceVault/wtv-disk/sync.js | 227 +++-- .../ServiceVault/wtv-disk/userstore.js | 21 + .../wtv-flashrom/content/content-serve.js | 3 +- .../wtv-flashrom/current-noflash.js | 2 +- .../ServiceVault/wtv-flashrom/get-by-path.js | 2 +- .../ServiceVault/wtv-flashrom/get-lc2-page.js | 2 +- .../wtv-flashrom/initiate-lc2-download.js | 3 +- .../ServiceVault/wtv-flashrom/noflash.js | 2 +- .../ServiceVault/wtv-flashrom/willie.js | 4 +- .../wtv-head-waiter/login-stage-two.js | 11 +- .../ServiceVault/wtv-head-waiter/login.js | 2 +- .../ServiceVault/wtv-home/home.js | 11 +- .../ServiceVault/wtv-log/log.js | 4 +- .../wtv-register/ValidateReviewAccountInfo.js | 2 +- .../ServiceVault/wtv-tricks/info.js | 2 +- .../ServiceVault/wtv-tricks/unregister.js | 6 +- zefie_wtvp_minisrv/WTVClientSessionData.js | 157 ++-- zefie_wtvp_minisrv/WTVDownloadList.js | 310 +++++++ zefie_wtvp_minisrv/WTVFlashrom.js | 42 +- zefie_wtvp_minisrv/WTVLzpf.js | 22 +- zefie_wtvp_minisrv/WTVMime.js | 198 +++++ zefie_wtvp_minisrv/WTVSec.js | 14 +- zefie_wtvp_minisrv/WTVShared.js | 195 +++++ zefie_wtvp_minisrv/app.js | 785 ++++++++---------- zefie_wtvp_minisrv/config.json | 3 + zefie_wtvp_minisrv/package.json | 2 +- zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj | 13 + 35 files changed, 1399 insertions(+), 706 deletions(-) create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/Modem_Firmware/Locale/en-US/kflex/modem_firmware.dat.gz create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/Modem_Firmware/Locale/en-US/v90/modem_firmware.dat.gz create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/Modem_Firmware/Locale/ja-JP/modem_firmware.dat.gz create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/diskmaps/ModemFirmware.json create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/diskmaps/ModemFirmwareOld.json create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-disk/userstore.js create mode 100644 zefie_wtvp_minisrv/WTVDownloadList.js create mode 100644 zefie_wtvp_minisrv/WTVMime.js create mode 100644 zefie_wtvp_minisrv/WTVShared.js diff --git a/.gitignore b/.gitignore index 25a2816b..527f3261 100644 --- a/.gitignore +++ b/.gitignore @@ -367,3 +367,4 @@ FodyWeavers.xsd /zefie_wtvp_minisrv/UserServiceVault/*-*/ /zefie_wtvp_minisrv/ServiceLogPost/*.log /zefie_wtvp_minisrv/SessionStore/*.json +/zefie_wtvp_minisrv/SessionStore/*/ diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-1800/noflash.js b/zefie_wtvp_minisrv/ServiceVault/wtv-1800/noflash.js index 984e5442..1c68e5b8 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-1800/noflash.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-1800/noflash.js @@ -1,5 +1,5 @@ if (socket.ssid != null && !ssid_sessions[socket.ssid].get("wtvsec_login")) { - var wtvsec_login = new WTVSec(); + var wtvsec_login = new WTVSec(minisrv_config); wtvsec_login.IssueChallenge(); wtvsec_login.set_incarnation(request_headers["wtv-incarnation"]); ssid_sessions[socket.ssid].set("wtvsec_login", wtvsec_login); diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-1800/preregister.js b/zefie_wtvp_minisrv/ServiceVault/wtv-1800/preregister.js index fd2bfc70..56180d57 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-1800/preregister.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-1800/preregister.js @@ -2,7 +2,7 @@ if (socket.ssid) { if (ssid_sessions[socket.ssid].loadSessionData() == true) { - console.log(" * Loaded session data from disk for", filterSSID(socket.ssid)) + console.log(" * Loaded session data from disk for", wtvshared.filterSSID(socket.ssid)) ssid_sessions[socket.ssid].setSessionData("registered", (ssid_sessions[socket.ssid].getSessionData("registered") == true) ? true : false); } else { ssid_sessions[socket.ssid].session_data = {}; @@ -20,15 +20,15 @@ } } }); - if (i > 0 && zdebug) console.log(" # Closed", i, "previous sockets for", filterSSID(socket.ssid)); + if (i > 0 && minisrv_config.config.debug_flags.debug) console.log(" # Closed", i, "previous sockets for", wtvshared.filterSSID(socket.ssid)); } } if (ssid_sessions[socket.ssid].data_store.wtvsec_login) { - if (zdebug) console.log(" # Recreating primary WTVSec login instance for", filterSSID(socket.ssid)); + if (minisrv_config.config.debug_flags.debug) console.log(" # Recreating primary WTVSec login instance for", wtvshared.filterSSID(socket.ssid)); delete ssid_sessions[socket.ssid].data_store.wtvsec_login; } - ssid_sessions[socket.ssid].data_store.wtvsec_login = new WTVSec(); + ssid_sessions[socket.ssid].data_store.wtvsec_login = new WTVSec(minisrv_config); ssid_sessions[socket.ssid].data_store.wtvsec_login.IssueChallenge(); ssid_sessions[socket.ssid].data_store.wtvsec_login.set_incarnation(request_headers["wtv-incarnation"] || 1); } else { @@ -115,24 +115,23 @@ if (ssid_sessions[socket.ssid].data_store.wtvsec_login) { gourl = "wtv-head-waiter:/login-stage-two?relogin=true"; } - if (request_headers.query.reconnect) { - gourl = null; - } - - if (!file_path != null && !zquiet) console.log(" * Sending TellyScript", file_path, "on socket", socket.id); + if (request_headers.query.reconnect) gourl = null; if (request_headers.query.guest_login) { send_tellyscript = false; - gourl += "&guest_login=true" + if (gourl != null) gourl += "&guest_login=true" if (request_headers.query.skip_splash) gourl += "&skip_splash=true"; } + if (!file_path != null && send_tellyscript && !minisrv_config.config.debug_flags.quiet) console.log(" * Sending TellyScript", file_path, "on socket", socket.id); + + headers = "200 OK\n" if (bf0app_update) headers += "minisrv-use-carriage-return: false\n"; headers += "Connection: Keep-Alive\n"; headers += "wtv-initial-key: " + ssid_sessions[socket.ssid].data_store.wtvsec_login.challenge_key.toString(CryptoJS.enc.Base64) + "\n"; headers += "Content-Type: " + prereg_contype + "\n"; - headers += "wtv-service: reset\n"; + if (!request_headers.query.reconnect) headers += "wtv-service: reset\n"; if (!bf0app_update) headers += getServiceString('wtv-1800') + "\n"; if (bf0app_update) headers += getServiceString('wtv-head-waiter', { "flags": "0x00000001" }) + "\n"; diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/Modem_Firmware/Locale/en-US/kflex/modem_firmware.dat.gz b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/Modem_Firmware/Locale/en-US/kflex/modem_firmware.dat.gz new file mode 100644 index 0000000000000000000000000000000000000000..8d7099629f9b36940ef4249828538c499cd700c9 GIT binary patch literal 92828 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�I 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%0Dc#Thd`y71cdTL*X7c_&A9-JNnGrFXvf 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 F0ssI+7>WP@ literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/Modem_Firmware/Locale/en-US/v90/modem_firmware.dat.gz b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/Modem_Firmware/Locale/en-US/v90/modem_firmware.dat.gz new file mode 100644 index 0000000000000000000000000000000000000000..f1df9b1990e46ca73d73ba45833e53b3b2121220 GIT binary patch literal 87108 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 literal 0 HcmV?d00001 diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/Modem_Firmware/Locale/ja-JP/modem_firmware.dat.gz b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/Modem_Firmware/Locale/ja-JP/modem_firmware.dat.gz new file mode 100644 index 0000000000000000000000000000000000000000..45e80dc87ff5088541e794740aa60fbe85382f3f GIT binary patch literal 92827 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 0) { + + if (diskmap_data.partition_size) { + wtvdl.createPartition(diskmap_data.base, diskmap_data.partition_size); + } + + if (!diskmap_data.nogroup) { + // only send group commands if group mode is enable + // useful to disable for PUT + wtvdl.createUpdateGroup(diskmap_group_data, diskmap_data.base, "invalid", (diskmap_data.service_owned || false)); + } + + Object.keys(update_list).forEach(function (k) { + // file { "action": "delete" } + // Useful to purge files we no longer want on the client + if (update_list[k].action != "DELETE") { + // skip deleting valid files if we aren't specifically requesting their deletion + if (update_list[k].checksum_match && !force_update) return; + if (!update_list[k].invalid && !force_update) return; + } + wtvdl.delete(update_list[k].file.replace(diskmap_data.base, ""), diskmap_group_data); + }); + + Object.keys(update_list).forEach(function (k) { + if (update_list[k].checksum_match && !force_update) return; + if (!update_list[k].invalid && !force_update) return; + if (update_list[k].display) wtvdl.display(update_list[k].display); + switch (update_list[k].action) { + case "PUT": + wtvdl.put(update_list[k].file.replace(diskmap_data.base, ""), service_name + ":/" + update_list[k].location, update_list[k].display); + break; + + case "GET": + wtvdl.get(update_list[k].file.replace(diskmap_data.base, ""), update_list[k].file, service_name + ":/" + update_list[k].location, diskmap_group_data, update_list[k].checksum, update_list[k].uncompressed_size || null, update_list[k].original_filename) + break; + } + }); + + if (!diskmap_data.nogroup) { + wtvdl.createGroup(diskmap_group_data, diskmap_data.base, "invalid", (diskmap_data.service_owned || false)); + + + // this rename loop is a part of the group system + Object.keys(update_list).forEach(function (k) { + if (update_list[k].checksum_match && !force_update) return; + if (!update_list[k].invalid && !force_update) return; + wtvdl.rename(update_list[k].file.replace(diskmap_data.base, ""), update_list[k].file.replace(diskmap_data.base, ""), diskmap_group_data, diskmap_group_data); + }); + + wtvdl.setGroup(diskmap_group_data, 'ok', diskmap_data.version); + } + + } + + if (diskmap_data.execute && diskmap_data.execute_when) { + if (diskmap_data.execute_when.toLowerCase().match(/end/)) { + wtvdl.execute(diskmap_data.execute); + } + } + + if (files_to_send > 0) { + if (!diskmap_data.nogroup) { + wtvdl.deleteGroupUpdate(diskmap_group_data, diskmap_data.base); + } + } + var download_list = wtvdl.getDownloadList(); + if (minisrv_config.config.show_diskmap) console.log(download_list); return download_list; } function processGroup(diskmap_primary_group, diskmap_group_data, diskmap_subgroup = null) { // parse webtv post var output_data = ''; - var post_data = request_headers.post_data.toString(CryptoJS.enc.Latin1).split("\n"); + var post_data = new Array(); + if (request_headers.post_data) post_data = request_headers.post_data.toString(CryptoJS.enc.Latin1).split("\n"); var post_data_current_directory = ''; var post_data_current_file = false; var post_data_current_group = ''; @@ -172,6 +188,8 @@ if (request_headers['wtv-request-type'] == 'download') { if (!fs.existsSync(post_match_file)) post_match_file = null; }); + + var post_match_file_lstat = fs.lstatSync(post_match_file); var post_match_file_data = new Buffer.from(fs.readFileSync(post_match_file, { encoding: null, @@ -180,10 +198,23 @@ if (request_headers['wtv-request-type'] == 'download') { diskmap_group_data.files[k].base = diskmap_group_data.base; diskmap_group_data.files[k].last_modified = (new Date(new Date(post_match_file_lstat.mtime).toUTCString()) / 1000); diskmap_group_data.files[k].content_length = post_match_file_lstat.size; - diskmap_group_data.files[k].checksum = CryptoJS.MD5(CryptoJS.lib.WordArray.create(post_match_file_data)).toString(CryptoJS.enc.Hex).toLowerCase(); + diskmap_group_data.files[k].action = (diskmap_group_data.files[k].action) ? diskmap_group_data.files[k].action.toUpperCase() : "GET"; + + if (wtvshared.getFileExt(post_match_file).toLowerCase() == "gz") { + // we need the checksum of the uncompressed data + var gunzipped = zlib.gunzipSync(post_match_file_data); + diskmap_group_data.files[k].checksum = CryptoJS.MD5(CryptoJS.lib.WordArray.create(gunzipped)).toString(CryptoJS.enc.Hex).toLowerCase(); + var gzip_fn_end = post_match_file_data.indexOf("\0", 10); + if (!diskmap_group_data.files[k].dont_extract_filename) { + diskmap_group_data.files[k].original_filename = post_match_file_data.toString('utf8', 10, gzip_fn_end); + } + //diskmap_group_data.files[k].uncompressed_size = gunzipped.byteLength; + gunzipped = null; + } else { + diskmap_group_data.files[k].checksum = CryptoJS.MD5(CryptoJS.lib.WordArray.create(post_match_file_data)).toString(CryptoJS.enc.Hex).toLowerCase(); + } if (parseInt(diskmap_group_data.files[k].last_modified) > newest_file_epoch) newest_file_epoch = parseInt(diskmap_group_data.files[k].last_modified); - if (!diskmap_group_data.files[k].display) diskmap_group_data.files[k].display = diskmap_group_data.display; diskmap_group_data.files[k].invalid = true; wtv_download_list.push(diskmap_group_data.files[k]); @@ -205,7 +236,7 @@ if (request_headers['wtv-request-type'] == 'download') { return output_data; } - if (request_headers.query.diskmap && request_headers.query.group && request_headers.post_data) { + if (request_headers.query.diskmap && request_headers.query.group) { var diskmap_json_file = null; Object.keys(service_vaults).forEach(function (g) { if (diskmap_json_file != null) return; @@ -243,69 +274,17 @@ if (request_headers['wtv-request-type'] == 'download') { var errpage = doErrorPage(404, "The requested DiskMap does not exist."); headers = errpage[0]; data = errpage[1]; - if (zdebug) console.error(" # " + service_name +":/sync error", "could not find diskmap"); + if (minisrv_config.config.debug_flags.debug) console.error(" # " + service_name +":/sync error", "could not find diskmap"); } } else { var errpage = doErrorPage(400); headers = errpage[0]; data = errpage[1]; - if (zdebug) console.error(" # " + service_name + ":/sync error", "missing query arguments"); + if (minisrv_config.config.debug_flags.debug) console.error(" # " + service_name + ":/sync error", "missing query arguments"); } } else if (request_headers.query.group && request_headers.query.diskmap) { var message = request_headers.query.message || "Retrieving files..."; var main_message = request_headers.query.main_message || "Your receiver is downloading files."; - headers = `200 OK -Content-Type: text/html`; - - data = ` - - - - - Retrieving files... - - - - - - - -
- - - - - - -
- ${message} -
-
-
-
- - - -
- - - ${main_message} -

This may take a while. - -

- -

- - - -
- - -`; - + headers = "200 OK\nwtv-connection-close: close\nConnection: close\nContent-Type: text/html"; + data = wtvdl.getSyncPage(message, request_headers.query.group, request_headers.query.diskmap, main_message, message, force_update) } \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-disk/userstore.js b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/userstore.js new file mode 100644 index 00000000..f53bd496 --- /dev/null +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/userstore.js @@ -0,0 +1,21 @@ +if (request_headers.post_data) { + if (request_headers.query.partialPath || request_headers.query.path) { + if (socket.ssid) { + if (ssid_sessions[socket.ssid]) { + if (ssid_sessions[socket.ssid].isRegistered()) { + var result = ssid_sessions[socket.ssid].storeUserStoreFile(request_headers.query.path || request_headers.query.partialPath, new Buffer.from(request_headers.post_data.toString(CryptoJS.enc.Hex), 'hex'), request_headers.query['last-modified-seconds'] || null, (request_headers.query.no_overwrite) ? false : true); + if (result) { + headers = "200 OK\n"; + headers += "Content-Type: text/plain"; + } + } + } + } + } +} + +if (!headers) { + var errpage = doErrorPage(400) + headers = errpage[0]; + data = errpage[1]; +} \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/content/content-serve.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/content/content-serve.js index b8209c2a..95fdea50 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/content/content-serve.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/content/content-serve.js @@ -1,6 +1,5 @@ const WTVFlashrom = require("./WTVFlashrom.js"); request_is_async = true; -console.log(request_headers); var bf0app_update = false; var request_path = request_headers.request_url.replace(service_name + ":/", ""); @@ -15,7 +14,7 @@ if ((romtype == "bf0app" || !romtype) && (bootver == "105" || !bootver)) { } if (!ssid_sessions[socket.ssid].data_store.WTVFlashrom) { - ssid_sessions[socket.ssid].data_store.WTVFlashrom = new WTVFlashrom(service_vaults, service_name, minisrv_config.services[service_name].use_zefie_server, bf0app_update, minisrv_config.services[service_name].debug); + ssid_sessions[socket.ssid].data_store.WTVFlashrom = new WTVFlashrom(minisrv_config, service_vaults, service_name, minisrv_config.services[service_name].use_zefie_server, bf0app_update); } ssid_sessions[socket.ssid].data_store.WTVFlashrom.getFlashRom(request_path, function (data, headers) { diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/current-noflash.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/current-noflash.js index 642803cf..25858295 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/current-noflash.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/current-noflash.js @@ -22,7 +22,7 @@ if (ssid_sessions[socket.ssid].get("wtv-client-rom-type") == "bf0app" && ssid_se } if (!ssid_sessions[socket.ssid].data_store.WTVFlashrom) { - ssid_sessions[socket.ssid].data_store.WTVFlashrom = new WTVFlashrom(service_vaults, service_name, minisrv_config.services[service_name].use_zefie_server, bf0app_update, minisrv_config.services[service_name].debug); + ssid_sessions[socket.ssid].data_store.WTVFlashrom = new WTVFlashrom(minisrv_config, service_vaults, service_name, minisrv_config.services[service_name].use_zefie_server, bf0app_update); } ssid_sessions[socket.ssid].data_store.WTVFlashrom.getFlashRom(request_path, function (data, headers) { diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-by-path.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-by-path.js index a2ad57e0..317c5fa4 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-by-path.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-by-path.js @@ -15,7 +15,7 @@ if ((romtype == "bf0app" || !romtype) && (bootver == "105" || !bootver)) { if (request_headers.query.raw || bf0app_update) { if (!ssid_sessions[socket.ssid].data_store.WTVFlashrom) { - ssid_sessions[socket.ssid].data_store.WTVFlashrom = new WTVFlashrom(service_vaults, service_name, minisrv_config.services[service_name].use_zefie_server, bf0app_update, minisrv_config.services[service_name].debug); + ssid_sessions[socket.ssid].data_store.WTVFlashrom = new WTVFlashrom(minisrv_config, service_vaults, service_name, minisrv_config.services[service_name].use_zefie_server, bf0app_update); } ssid_sessions[socket.ssid].data_store.WTVFlashrom.getFlashRom(request_path, function (data, headers) { diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-lc2-page.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-lc2-page.js index a7f93034..b71cfd69 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-lc2-page.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/get-lc2-page.js @@ -8,7 +8,7 @@ if (!request_headers.query.path) { headers = errpage[0]; data = errpage[1]; } else { - var wtvflashrom = new WTVFlashrom(service_vaults, service_name, minisrv_config.services[service_name].use_zefie_server, minisrv_config.services[service_name].debug); + var wtvflashrom = new WTVFlashrom(minisrv_config, service_vaults, service_name, minisrv_config.services[service_name].use_zefie_server, false, true); var request_path = request_headers.query.path; // read flashrom header info into array using WTVFlashrom class diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/initiate-lc2-download.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/initiate-lc2-download.js index 3a00509a..dc6ca784 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/initiate-lc2-download.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/initiate-lc2-download.js @@ -5,8 +5,9 @@ var romtype = ssid_sessions[socket.ssid].get("wtv-client-rom-type"); url = "client:updateflash?ipaddr=" + minisrv_config.services[service_name].host + "&port=" + minisrv_config.services[service_name].port + "&path=" + escape(service_name + ":/" +request_headers.query.path); if (request_headers.query.numparts) url += escape("&numparts=" + request_headers.query.numparts); } - headers = "200 OK\n"; + headers = "300 OK\n"; headers += "wtv-visit: " + url + "\n"; + headers += "Location: " + url + "\n"; headers += "Content-type: text/html"; data = ''; } else { diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/noflash.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/noflash.js index 03c990e9..1ee36f57 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/noflash.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/noflash.js @@ -22,7 +22,7 @@ if (ssid_sessions[socket.ssid].get("wtv-client-rom-type") == "bf0app" && ssid_se } if (!ssid_sessions[socket.ssid].data_store.WTVFlashrom) { - ssid_sessions[socket.ssid].data_store.WTVFlashrom = new WTVFlashrom(service_vaults, service_name, 0, minisrv_config.services[service_name].use_zefie_server, bf0app_update, minisrv_config.services[service_name].debug); + ssid_sessions[socket.ssid].data_store.WTVFlashrom = new WTVFlashrom(minisrv_config, service_vaults, service_name, 0, minisrv_config.services[service_name].use_zefie_server, bf0app_update, minisrv_config.services[service_name].debug); } ssid_sessions[socket.ssid].data_store.WTVFlashrom.getFlashRom(request_path, function (data, headers) { diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.js b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.js index 765de4e3..2ac678cf 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-flashrom/willie.js @@ -32,7 +32,7 @@ const req = https.request(options, function (res) { }); res.on('error', function (e) { - if (!zquiet) console.log(" * Upstream Ultra Willies HTTP Error:", e); + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Upstream Ultra Willies HTTP Error:", e); var errpage = doErrorPage(400) headers = errpage[0]; data = errpage[1]; @@ -40,7 +40,7 @@ const req = https.request(options, function (res) { }); res.on('end', function () { - if (!zquiet) console.log(" * Upstream Ultra Willies HTTP Response:", res.statusCode, res.statusMessage); + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Upstream Ultra Willies HTTP Response:", res.statusCode, res.statusMessage); if (request_headers.query.clear_cache) { headers += "\nwtv-expire-all: "+service_name; } diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login-stage-two.js b/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login-stage-two.js index fde0566b..55efe6c4 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login-stage-two.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login-stage-two.js @@ -2,7 +2,7 @@ var challenge_response, challenge_header = ''; var gourl; if (socket.ssid != null && !ssid_sessions[socket.ssid].get("wtvsec_login")) { - var wtvsec_login = new WTVSec(1,zdebug); + var wtvsec_login = new WTVSec(minisrv_config); wtvsec_login.IssueChallenge(); wtvsec_login.set_incarnation(request_headers["wtv-incarnation"]); ssid_sessions[socket.ssid].set("wtvsec_login", wtvsec_login); @@ -16,13 +16,13 @@ if (socket.ssid !== null) { var client_challenge_response = request_headers["wtv-challenge-response"] || null; if (challenge_response && client_challenge_response) { if (challenge_response.toString(CryptoJS.enc.Base64) == client_challenge_response) { - console.log(" * wtv-challenge-response success for " + filterSSID(socket.ssid)); + console.log(" * wtv-challenge-response success for " + wtvshared.filterSSID(socket.ssid)); wtvsec_login.PrepareTicket(); } else { - console.log(" * wtv-challenge-response FAILED for " + filterSSID(socket.ssid)); - if (zdebug) console.log("Response Expected:", challenge_response.toString(CryptoJS.enc.Base64)); - if (zdebug) console.log("Response Received:", client_challenge_response) + console.log(" * wtv-challenge-response FAILED for " + wtvshared.filterSSID(socket.ssid)); + if (minisrv_config.config.debug_flags.debug) console.log("Response Expected:", challenge_response.toString(CryptoJS.enc.Base64)); + if (minisrv_config.config.debug_flags.debug) console.log("Response Received:", client_challenge_response) gourl = "wtv-head-waiter:/login?reissue_challenge=true"; } } else { @@ -147,6 +147,7 @@ wtv-open-isp-disabled: false wtv-offline-mail-enable: false wtv-demo-mode: 0 wtv-wink-deferrer-retries: 3 +wtv-name-server: 8.8.8.8 wtv-visit: ${home_url} Content-Type: text/html`; } \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login.js b/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login.js index 9f44b498..38e60ef4 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-head-waiter/login.js @@ -54,7 +54,7 @@ wtv-log-url: wtv-log:/log`; if (challenge_header != "") headers += "\n" + challenge_header; headers += ` wtv-relogin-url: wtv-head-waiter:/relogin?relogin=true -wtv-reconnect-url: wwtv-head-waiter:/relogin?reconnect=true +wtv-reconnect-url: wtv-head-waiter:/relogin?reconnect=true wtv-visit: ${gourl} Content-type: text/html`; data = ''; diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js b/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js index 56e1609a..6b804319 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js @@ -5,14 +5,9 @@ wtv-expire-all: wtv-flashrom: Content-type: text/html` if (request_headers.query.url) headers += "\nwtv-visit: " + request_headers.query.url; +var cryptstatus = ((socket_sessions[socket.id].secure === true) ? "Encrypted" : "Not Encrypted") -if (ssid_sessions[socket.ssid].get('box-does-psuedo-encryption')) { - var cryptstatus = "
Psuedo-encrypted"; -} else { - var cryptstatus = ((socket_sessions[socket.id].secure === true) ? "Encrypted" : "Not Encrypted") -} - -var comp_type = shouldWeCompress(socket.ssid,'text/html'); +var comp_type = wtvmime.shouldWeCompress(ssid_sessions[socket.ssid],'text/html'); var compstatus = "uncompressed"; switch (comp_type) { case 1: @@ -58,7 +53,7 @@ if (ssid_sessions[socket.ssid].hasCap("client-has-disk")) { data += "

  • DiskHax ~ VFatHax
  • \n"; if (ssid_sessions[socket.ssid].hasCap("client-can-do-macromedia-flash2")) { // only show demo if client can do flash2 - data += "
  • Old MSNTV DealerDemo: Download ~ Access (after Download)
  • \n"; + data += "
  • Old DealerDemo: Download ~ Access
  • \n"; } } diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-log/log.js b/zefie_wtvp_minisrv/ServiceVault/wtv-log/log.js index 47fa7299..b3e69ae5 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-log/log.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-log/log.js @@ -22,7 +22,7 @@ Content-length: 0`; logdata_outstring_hex += request_headers.post_data.toString(CryptoJS.enc.Hex); if (minisrv_config.services[service_name].write_logs_to_disk) { fs.writeFile(fullpath, logdata_outstring_hex, "Hex", function () { - if (!zquiet) console.log(" * Wrote POST log data from", filterSSID(socket.ssid), "for", socket.id); + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Wrote POST log data from", wtvshared.filterSSID(socket.ssid), "for", socket.id); sendToClient(socket, headers, data); }); } else { @@ -41,7 +41,7 @@ Content-length: 0`; var logdata_outstring_hex = Buffer.from(logdata_outstring, 'utf8').toString('hex'); if (minisrv_config.services[service_name].write_logs_to_disk) { fs.writeFile(fullpath, logdata_outstring_hex, "Hex", function () { - if (!zquiet) console.log(" * Wrote GET log data from", filterSSID(socket.ssid), "for", socket.id); + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Wrote GET log data from", wtvshared.filterSSID(socket.ssid), "for", socket.id); sendToClient(socket, headers, data); }); } else { diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-register/ValidateReviewAccountInfo.js b/zefie_wtvp_minisrv/ServiceVault/wtv-register/ValidateReviewAccountInfo.js index 32315cbf..9479296b 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-register/ValidateReviewAccountInfo.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-register/ValidateReviewAccountInfo.js @@ -17,7 +17,7 @@ if (!request_headers.query.registering || ssid_sessions[socket.ssid].setSessionData("subscriber_contact_method", request_headers.query.subscriber_contact_method); ssid_sessions[socket.ssid].setSessionData("subscriber_userid", '1' + Math.floor(Math.random() * 1000000000000000000)); ssid_sessions[socket.ssid].setSessionData("registered", true); - if (!ssid_sessions[socket.ssid].storeSessionData()) { + if (!ssid_sessions[socket.ssid].storeSessionData(true)) { var errpage = doErrorPage(400); headers = errpage[0]; data = errpage[1]; diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/info.js b/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/info.js index 06550461..bc3d6111 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/info.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/info.js @@ -18,7 +18,7 @@ Content-Type: text/html` var wtv_system_version = ssid_sessions[socket.ssid].get("wtv-system-version"); var wtv_client_bootrom_version = ssid_sessions[socket.ssid].get("wtv-client-bootrom-version"); - var wtv_client_serial_number = filterSSID(ssid_sessions[socket.ssid].get("wtv-client-serial-number")); + var wtv_client_serial_number = wtvshared.filterSSID(ssid_sessions[socket.ssid].get("wtv-client-serial-number")); var wtv_client_rom_type = ssid_sessions[socket.ssid].get("wtv-client-rom-type"); var wtv_system_chipversion_str = ssid_sessions[socket.ssid].get("wtv-system-chipversion"); var wtv_system_sysconfig_hex = parseInt(ssid_sessions[socket.ssid].get("wtv-system-sysconfig")).toString(16); diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/unregister.js b/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/unregister.js index 7f40113f..1f0af15a 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/unregister.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-tricks/unregister.js @@ -2,7 +2,9 @@ headers = `200 OK Content-Type: text/html`; if (!ssid_sessions[socket.ssid].getSessionData("registered")) { - var redirect = [10, "client:goback?"]; + headers += "\nwtv-noback-all: wtv-"; + headers += "\nwtv-expire-all: wtv-"; + var redirect = [5, "client:relogin?"]; var message = "Error: Your box is not registered. You are accessing " + minisrv_config.config.service_name + " in Guest Mode. There is nothing to delete!"; } else if (request_headers.query.confirm_unregister) { if (ssid_sessions[socket.ssid].unregisterBox()) { @@ -14,7 +16,7 @@ if (!ssid_sessions[socket.ssid].getSessionData("registered")) { } else { var redirect = [10, "client:goback?"]; var message = "There was an error deleting your account data. Please try again later. If the problem persists, please contact " + minisrv_config.config.service_owner + " to request manual deletion."; - message += "SSID verifcation may be required to perform a manual deletion.< br >
    Returning from whence you came...

    "; + message += "SSID verifcation may be required to perform a manual deletion.

    Returning from whence you came...

    "; message += `Click here if you are not automatically redirected.`; } } else { diff --git a/zefie_wtvp_minisrv/WTVClientSessionData.js b/zefie_wtvp_minisrv/WTVClientSessionData.js index d44c948d..1737eda2 100644 --- a/zefie_wtvp_minisrv/WTVClientSessionData.js +++ b/zefie_wtvp_minisrv/WTVClientSessionData.js @@ -4,55 +4,109 @@ class WTVClientSessionData { fs = require('fs'); path = require('path'); + ssid = null; data_store = null; session_store = null; login_security = null; capabilities = null; session_storage = ""; - hide_ssid_in_logs = true; + minisrv_config = []; + wtvshared = null; + wtvmime = null; - filterSSID(obj) { - if (this.hide_ssid_in_logs === true) { - if (typeof (obj) == "string") { - if (obj.substr(0, 8) == "MSTVSIMU") { - return obj.substr(0, 10) + ('*').repeat(10) + obj.substr(20); - } else if (obj.substr(0, 5) == "1SEGA") { - return obj.substr(0, 6) + ('*').repeat(6) + obj.substr(13); - } else { - return obj.substr(0, 6) + ('*').repeat(9); - } - } else { - if (obj["wtv-client-serial-number"]) { - var ssid = obj["wtv-client-serial-number"]; - if (ssid.substr(0, 8) == "MSTVSIMU") { - obj["wtv-client-serial-number"] = ssid.substr(0, 10) + ('*').repeat(10) + ssid.substr(20); - } else if (ssid.substr(0, 5) == "1SEGA") { - obj["wtv-client-serial-number"] = ssid.substr(0, 6) + ('*').repeat(6) + ssid.substr(13); - } else { - obj["wtv-client-serial-number"] = ssid.substr(0, 6) + ('*').repeat(9); - } - } - return obj; - } - } else { - return obj; - } - } + constructor(minisrv_config, ssid) { + if (!minisrv_config) throw ("minisrv_config required"); + var WTVShared = require('./WTVShared.js')['WTVShared']; + var WTVMime = require('./WTVMime.js'); + this.minisrv_config = minisrv_config; + this.wtvshared = new WTVShared(minisrv_config); + this.wtvmime = new WTVMime(minisrv_config); - constructor(ssid, hide_ssid_in_logs, session_storage_directory) { this.ssid = ssid; - if (hide_ssid_in_logs) this.hide_ssid_in_logs = hide_ssid_in_logs; - if (!session_storage_directory) session_storage_directory = __dirname + "/SessionStore"; - this.session_storage = session_storage_directory; this.data_store = new Array(); this.session_store = {}; } - getUTCTime(offset = 0) { - return new Date((new Date).getTime() + offset).toUTCString(); + /** + * Returns the absolute path to the user's file store, or false if unregistered + * @returns {string|boolean} Absolute path to the user's file store, or false if unregistered + */ + getUserStoreDirectory() { + if (!this.isRegistered()) return false; + return this.minisrv_config.config.SessionStore + this.path.sep + this.ssid + this.path.sep; } + /** + * Store a file in the user's file store + * @param {string} path Relative path to User's file store + * @param {Buffer} data File data + * @param {number|null} last_modified Unix timestamp to set last modified date to + * @param {boolean} overwrite Overwrite if file exists + * @returns {boolean} Whether or not the file was written + */ + storeUserStoreFile(path, data, last_modified = null, overwrite = true) { + var store_dir = this.getUserStoreDirectory(); + if (!store_dir) return false; // unregistered + var result = false; + var path_split = path.split('/'); + var file_name = path_split.pop(); + var store_dir_path = this.wtvshared.makeSafePath(store_dir, path_split.join('/').replace('/', this.path.sep)); + var store_full_path = this.wtvshared.makeSafePath(store_dir_path, file_name); + + try { + if (!this.fs.existsSync(store_dir_path)) this.fs.mkdirSync(store_dir_path, { recursive: true }); + var file_exists = this.fs.existsSync(store_full_path); + if (!file_exists || (file_exists && overwrite)) result = this.fs.writeFileSync(store_full_path, data); + if (result !== false && last_modified) { + var file_timestamp = new Date(last_modified * 1000); + fs.utimesSync(store_full_path, Date.now(), file_timestamp) + } + } catch (e) { + console.error(" # User File Store failed", e); + } + return (result === false) ? false : true; + } + + /** + * Retrieves a file from the user store + * @param {string} path Path relative to the User File Store + * @returns {Buffer|false} Buffer data, or false if could not open file + */ + getUserStoreFile(path) { + var store_dir = this.getUserStoreDirectory(); + if (!store_dir) return false; // unregistered + var store_dir_path = this.wtvshared.makeSafePath(store_dir, path.replace('/', this.path.sep)); + if (this.fs.existsSync(store_dir_path)) return this.fs.readFileSync(store_dir_path); + else return false; + } + + /** + * Retrieves a file from the user store with a file://Disk/ url + * @param {string} url file://Disk/ base url + * @returns {Buffer|false} Buffer data, or false if could not open file + */ + getUserStoreFileByURL(url) { + var path_split = url.split('/'); + path_split.shift(); + path_split.shift(); + var store_dir_path = path_split.join('/').replace('/', this.path.sep); + return this.getUserStoreFile(store_dir_path); + } + + /** + * Retrieves the Content-Type of a User Store File + * @param {string} path Path relative to the User File Store + * @returns {string|false} Content-Type, or false if could not open file + */ + getUserStoreContentType(path) { + return this.wtvmime.getSimpleContentType(path); + } + + /** + * Returns the number of user cookies + * @returns {number} Number of cookies + */ countCookies() { return Object.keys(this.session_store.cookies).length || 0; } @@ -60,7 +114,7 @@ class WTVClientSessionData { resetCookies() { this.session_store.cookies = {}; // webtv likes to have at least one cookie in the list, set a dummy cookie for zefie's site expiring in 1 year. - this.addCookie("wtv.zefie.com", "/", this.getUTCTime(365 * 86400000), "cookie_type=chocolatechip"); + this.addCookie("wtv.zefie.com", "/", this.wtvshared.getUTCTime(365 * 86400000), "cookie_type=chocolatechip"); } addCookie(domain, path = null, expires = null, data = null) { @@ -174,8 +228,8 @@ class WTVClientSessionData { loadSessionData(raw_data = false) { try { - if (this.fs.lstatSync(this.session_storage + this.path.sep + this.ssid + ".json")) { - var json_data = this.fs.readFileSync(this.session_storage + this.path.sep + this.ssid + ".json", 'Utf8') + if (this.fs.lstatSync(this.minisrv_config.config.SessionStore + this.path.sep + this.ssid + ".json")) { + var json_data = this.fs.readFileSync(this.minisrv_config.config.SessionStore + this.path.sep + this.ssid + ".json", 'Utf8') if (raw_data) return json_data; var session_data = JSON.parse(json_data); @@ -184,12 +238,12 @@ class WTVClientSessionData { } } catch (e) { // Don't log error 'file not found', it just means the client isn't registered yet - if (e.code != "ENOENT") console.error(" # Error loading session data for", this.filterSSID(this.ssid), e); + if (e.code != "ENOENT") console.error(" # Error loading session data for", this.wtvshared.filterSSID(this.ssid), e); return false; } } - saveSessionData() { + saveSessionData(force_write = false) { if (this.isRegistered()) { // load data from disk and merge new data var temp_store = this.session_store; @@ -198,17 +252,18 @@ class WTVClientSessionData { temp_store = null; } else { // do not write file if user is not registered, return true because this is not an error - return true; + // force write needed to set the initial reg + if (!force_write) return true; } try { // only save if file has changed var json_save_data = JSON.stringify(this.session_store); var json_load_data = this.loadSessionData(true); - if (json_save_data != json_load_data) this.fs.writeFileSync(this.session_storage + this.path.sep + this.ssid + ".json", JSON.stringify(this.session_store), "Utf8"); + if (json_save_data != json_load_data) this.fs.writeFileSync(this.minisrv_config.config.SessionStore + this.path.sep + this.ssid + ".json", JSON.stringify(this.session_store), "Utf8"); return true; } catch (e) { - console.error(" # Error saving session data for", this.filterSSID(this.ssid), e); + console.error(" # Error saving session data for", this.wtvshared.filterSSID(this.ssid), e); return false; } } @@ -218,9 +273,9 @@ class WTVClientSessionData { return this.loadSessionData(); } - storeSessionData() { + storeSessionData(force_write = false) { // alias - return this.saveSessionData(); + return this.saveSessionData(force_write); } SaveIfRegistered() { @@ -231,7 +286,7 @@ class WTVClientSessionData { isRegistered() { var self = this; var ssid_match = false; - this.fs.readdirSync(this.session_storage).forEach(file => { + this.fs.readdirSync(this.minisrv_config.config.SessionStore).forEach(file => { if (!file.match(/.*\.json/ig)) return; if (ssid_match) return; if (file.split('.')[0] == self.ssid) ssid_match = true; @@ -240,15 +295,19 @@ class WTVClientSessionData { } unregisterBox() { + var user_store_base = this.wtvshared.makeSafePath(this.wtvshared.getAbsolutePath(this.minisrv_config.config.SessionStore), this.path.sep + this.ssid); try { - if (this.fs.lstatSync(this.session_storage + this.path.sep + this.ssid + ".json")) { - this.fs.unlinkSync(this.session_storage + this.path.sep + this.ssid + ".json"); + if (this.fs.existsSync(user_store_base + ".json")) { + this.fs.unlinkSync(user_store_base + ".json"); this.session_store = {}; - return true; } + if (this.fs.existsSync(user_store_base)) { + this.fs.rmdirSync(user_store_base, { recursive: true }); + } + return true; } catch (e) { // Don't log error 'file not found', it just means the client isn't registered yet - console.error(" # Error deleting session data for", this.filterSSID(this.ssid), e); + console.error(" # Error deleting session data for", this.wtvshared.filterSSID(this.ssid), e); return false; } } diff --git a/zefie_wtvp_minisrv/WTVDownloadList.js b/zefie_wtvp_minisrv/WTVDownloadList.js new file mode 100644 index 00000000..9daa7e45 --- /dev/null +++ b/zefie_wtvp_minisrv/WTVDownloadList.js @@ -0,0 +1,310 @@ +/** + * wtv/download-list creation helper class + * By: zefie + */ +class WTVDownloadList { + + download_list = ""; + service_name = ""; + content_type = "wtv/download-list"; + wtvshared = null; + clientShowAlert = null; + minisrv_config = []; + + /** + * Constructs the WTVDownloadList Class + * @param {string} service_name Service name to use in wtv-urls + */ + constructor(minisrv_config, service_name = "wtv-disk") { + var { WTVShared, clientShowAlert } = require('./WTVShared.js'); + this.minisrv_config = minisrv_config; + this.wtvshared = new WTVShared(minisrv_config); + this.clientShowAlert = clientShowAlert; + this.service_name = service_name + this.clear(); + } + + /** + * Clears the download list + */ + clear() { + this.download_list = ""; + } + + /** + * Alias to clear() (clears the download list) + */ + reset() { + this.clear(); + } + + /** + * Returns the download list. + * @returns {string} Download list for client; + */ + getDownloadList() { + return this.download_list; + } + + /** + * Adds a DISPLAY command to the download list + * @param {string} message Message to display to the client + */ + display(message) { + this.download_list += "DISPLAY " + message + "\n\n"; + } + + /** + * Adds an EXECUTE command to the download list + * @param {string} command client command to execute + */ + execute(command) { + this.download_list += "EXECUTE " + command + "\n\n"; + } + + /** + * Adds a CREATE partition command to the download list + * @param {string} path file://Disk/ path to desired partition + * @param {string} size Size of the desired partition + */ + createPartition(path, size) { + this.download_list += "CREATE " + path + "\n"; + this.download_list += "partition-size: " + size + "\n\n"; + } + + /** + * Adds a CREATE-GROUP command to the download list + * @param {string} name Group name + * @param {string} path file://Disk/ path of desired group + * @param {string} state Group state + * @param {boolean|null} service_owned Sets service owned flag. (null = don't set) + */ + createGroup(name, path, state = 'invalid', service_owned = null) { + this.download_list += "CREATE-GROUP " + name + "\n"; + this.download_list += "state: " + state + "\n"; + if (service_owned !== null) this.download_list += "service-owned: " + service_owned + "\n"; + this.download_list += "base: " + path + "\n\n"; + } + + /** + * An alias for createGroup() that handles creating the '-UPDATE' group for you + * @param {string} name Group name + * @param {string} path file://Disk/ path of desired group + * @param {string} state Group state + * @param {boolean} service_owned Sets service owned flag. + */ + createUpdateGroup(name, path, state = 'invalid', service_owned = false) { + this.createGroup(name + "-UPDATE", path, state); + this.createGroup(name, path, state, service_owned); + } + + /** + * Adds a DELETE command to the download list + * @param {string} path Non-absolute path of client destination file (relative to group base) if group defined, otherwise absolute file://Disk/ path to delete + * @param {string} group Group to which it belongs + */ + delete(path, group = null) { + path = this.wtvshared.stripGzipFromPath(path); + this.download_list += "DELETE " + path + "\n"; + if (group !== null) this.download_list += "group: " + group + "\n\n"; + } + + /** + * Adds a PUT command to the download list + * @param {string} path Absolute file://Disk/ path of a file to upload to the service + * @param {string} destination Destination address (wtv url on service) in which to POST upload the file to + */ + put(path, destination) { + this.download_list += "PUT " + path + "\n"; + this.download_list += "location: " + destination + "\n\n"; + } + + /** + * Alias to put() for User Store + * @param {string} path Absolute file://Disk/ path of a file to upload to the service + * @param {string} destination Destination file path in the User Store + */ + putUserStoreDest(path, destination) { + this.put(path, this.service_name + ":/userstore?partialPath=" + escape(destination)); + } + + /** + * Alias to putUserStoreDest() that generates the destination + * @param {any} path + */ + putUserStore(path) { + var destination = path.replace("file://", ""); + this.putUserStoreDest(path, destination); + } + /** + * Adds a GET command to the download list + * @param {string} file Non-absolute path of client destination file (relative to group base) + * @param {string} path Absolute file://Disk/ path of destination + * @param {string} source wtv-url to fetch file from + * @param {string} group Group this file belongs to + * @param {string} display Message to display while working on this file + * @param {string} checksum md5sum of the file + * @param {string} file_permission File permissions + */ + get(file, path, source, group, checksum = null, uncompressed_size = null, original_filename = null, file_permission = 'r') { + if (original_filename) { + file = file.split('/'); + var file_name = file[file.length - 1]; + path = path.replace(file_name, original_filename); + file.pop(); + if (file.length > 0) file = file.join('/') + '/' + original_filename; + else file = original_filename; + } + this.download_list += "GET " + file + "\n"; + + this.download_list += "group: " + group + "-UPDATE\n"; + this.download_list += "location: " + source + "\n"; + this.download_list += "file-permission: " + file_permission + "\n"; + if (checksum != null) this.download_list += "wtv-checksum: " + checksum + "\n"; + if (uncompressed_size != null) this.download_list += "wtv-uncompressed-filesize: " + uncompressed_size + "\n"; + this.download_list += "service-source-location: /webtv/content/" + source.substr(source.indexOf('-') + 1, source.indexOf(':/') - source.indexOf('-') - 1) + "d/" + source.substr(source.indexOf(':/') + 2) + "\n"; + this.download_list += "client-dest-location: " + path + "\n\n"; + } + + /** + * Adds a RENAME command to the download list + * @param {string} srcfile Non-absolute path of client source file (relative to source group base) + * @param {string} destfile Non-absolute path of client destination file (relative to destination group base) + * @param {string} srcgroup Source Group + * @param {string} destgroup Destination Group + */ + rename(srcfile, destfile, srcgroup, destgroup) { + srcfile = this.wtvshared.stripGzipFromPath(srcfile); + destfile = this.wtvshared.stripGzipFromPath(destfile); + this.download_list += "RENAME " + srcfile + "\n"; + this.download_list += "group: " + srcgroup + "-UPDATE\n"; + this.download_list += "destination-group: " + destgroup + "\n"; + this.download_list += "location: " + destfile + "\n\n"; + } + + /** + * Adds a SET-GROUP command to the download list + * @param {string} group Group to set state of + * @param {string} state State to set group to + * @param {string} version Version to set group to + */ + setGroup(group, state, version) { + this.download_list += "SET-GROUP " + group + "\n"; + this.download_list += "state: " + state + "\n"; + this.download_list += "version: " + version + "\n"; + this.download_list += "last-checkup-time: " + new Date().toUTCString().replace("GMT", "+0000") + "\n\n"; + } + + /** + * Adds a DELETE-GROUP command to the download list + * @param {string} group Group to delete + */ + deleteGroup(group) { + this.download_list += "DELETE-GROUP " + group + "\n\n"; + } + + /** + * An alias for deleteGroup() that handles deleting the '-UPDATE' group files for you + * @param {string} group Group to delete + * @param {string} path Group base path + */ + deleteGroupUpdate(group, path) { + this.deleteGroup(group + "-UPDATE"); + this.delete(path + ".GROUP-UPDATE/"); + } + + /** + * Generates the Download page + * @param {object} minisrv_config minisrv config object + * @param {string} title Page title + * @param {string} group + * @param {string|null} diskmap + * @param {string|null} main_message Message displayed in the center of the page + * @param {string|null} message Initial progress bar message + * @param {boolean|null} force_update Force this update even if the client reports the files are synced + * @param {string|null} success_url Where the client goes when the process succeeds + * @param {string|null} fail_url Where the client goes when the process fails. + * @param {string|null} url Use your own URL for client:fetch?source= instead of our generated one + * @returns {string} HTML Download Page + */ + getSyncPage(title, group, diskmap = null, main_message = null, message = null, force_update = null, success_url = null, fail_url = null, url = null) { + // Begin Set defaults + if (main_message === null) main_message = "Your receiver is downloading files."; + + if (message === null) message = "Retrieving files"; + + if (force_update === null) force_update = false; + + if (url === null) url = this.service_name + ":/sync?diskmap=" + escape(diskmap) + "&force=" + force_update; + + if (success_url === null) success_url = new this.clientShowAlert({ + 'image': this.minisrv_config.config.service_logo, + 'message': "Download successful!", + 'buttonlabel1': "Okay", + 'buttonaction1': "client:goback", + 'noback': true, + }).getURL(); + + if (fail_url === null) fail_url = new this.clientShowAlert({ + 'image': this.minisrv_config.config.service_logo, + 'message': "Download failed...", + 'buttonlabel1': "Fuck!", + 'buttonaction1': "client:goback", + 'noback': true, + }).getURL(); + // End set defaults + return ` + + + + ${title} + + + + + + + +
    + + + + + + +
    + ${message} +
    +
    +
    +
    + + + +
    + + + ${main_message} +

    This may take a while. + +

    + +

    + + + +
    + + + +` + } + +} + +module.exports = WTVDownloadList; \ No newline at end of file diff --git a/zefie_wtvp_minisrv/WTVFlashrom.js b/zefie_wtvp_minisrv/WTVFlashrom.js index 986c4666..cf8b6c9e 100644 --- a/zefie_wtvp_minisrv/WTVFlashrom.js +++ b/zefie_wtvp_minisrv/WTVFlashrom.js @@ -5,16 +5,18 @@ class WTVFlashrom { use_zefie_server = true; bf0app_update = false; service_vaults = new Array(); + no_debug = false; service_name = ""; - zdebug = false; + minisrv_config = []; - constructor(service_vaults, service_name, use_zefie_server = true, bf0app_update = false, debug = false) { + constructor(minisrv_config, service_vaults, service_name, use_zefie_server = true, bf0app_update = false, no_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 = true; + this.no_debug = no_debug; + this.minisrv_config = minisrv_config; } @@ -95,31 +97,37 @@ class WTVFlashrom { 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 + "..."); + //if (this.minisrv_config.config.debug_flags.debug && !this.no_debug) 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); + //if (this.minisrv_config.config.debug_flags.debug && !this.no_debug) 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); + //if (this.minisrv_config.config.debug_flags.debug && !this.no_debug) 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); + flashrom_info.percent_complete = ((((flashrom_info.byte_progress + flashrom_info.part_total_size) / flashrom_info.total_parts_size)) * 100).toFixed(1); + + if (this.minisrv_config.config.debug_flags.debug && !this.no_debug) console.log(" # Flashrom Part Size :", flashrom_info.part_total_size); + if (this.minisrv_config.config.debug_flags.debug && !this.no_debug) console.log(" # Flashrom Bytes Sent :", flashrom_info.byte_progress); + if (this.minisrv_config.config.debug_flags.debug && !this.no_debug) console.log(" # Flashrom Bytes Sent+:", flashrom_info.byte_progress + flashrom_info.part_total_size, "(" + flashrom_info.percent_complete + "% complete)"); + if (this.minisrv_config.config.debug_flags.debug && !this.no_debug) console.log(" # Flashrom 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); + if (this.minisrv_config.config.debug_flags.debug && !this.no_debug) console.log(" # Flashrom Curr Part Number :", flashrom_info.part_number); + flashrom_info.is_last_part = ((flashrom_info.byte_progress + flashrom_info.part_total_size) == flashrom_info.total_parts_size) ? true : false; + + if (flashrom_info.is_last_part) { + if (this.minisrv_config.config.debug_flags.debug && !this.no_debug) console.log(" # Flashrom Curr Part is Last:", flashrom_info.is_last_part); + } else { + flashrom_info.next_part_number = flashrom_info.part_number + 1; + if (this.minisrv_config.config.debug_flags.debug && !this.no_debug) console.log(" # Flashrom Next Part Number :", flashrom_info.next_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:/${path}`; - 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; @@ -138,7 +146,7 @@ class WTVFlashrom { var flashrom_info = this.getFlashromInfo(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; + if (flashrom_info.next_rompath != null && this.bf0app_update) headers += "\nwtv-visit: " + flashrom_info.next_rompath; callback(data, headers); } @@ -179,7 +187,7 @@ class WTVFlashrom { }) res.on('end', function () { - console.log(` * Zefie's FlashROM Server HTTP Status: ${res.statusCode} ${res.statusMessage}`) + if (self.minisrv_config.config.debug_flags.debug) 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) { diff --git a/zefie_wtvp_minisrv/WTVLzpf.js b/zefie_wtvp_minisrv/WTVLzpf.js index 5bfea2ea..09eb3cfd 100644 --- a/zefie_wtvp_minisrv/WTVLzpf.js +++ b/zefie_wtvp_minisrv/WTVLzpf.js @@ -400,8 +400,6 @@ class WTVLzpf { this.EncodeLiteral(code_length, code); } } - - return Buffer.from(this.encoded_data); } /** @@ -442,32 +440,26 @@ class WTVLzpf { // End this.AddByte((this.current_literal >>> 0x18) & 0xFF); this.AddByte(0x20); + + return Buffer.from(this.encoded_data); } /** * Converts the data to a Javascript Buffer object * - * @param data {String|Buffer|CryptoJS.lib.WordArray} Data to convert + * @param data {String|Buffer} Data to convert * * @returns {Buffer} Javascript Buffer object */ ConvertToBuffer(data) { - if (data.words) { - var WTVSec = require("./WTVSec.js"); - wtvsec = new WTVSec(1); - data = wtvsec.wordArrayToBuffer(data); - WTVSec, wtvsec = null; - } else if (!data.byteLength) { - // otherwise if its not already a Buffer, convert it to one - data = new Buffer.from(data); - } + data = new Buffer.from(data.toString('binary')); return data; } /** * Compress data using WebTV's Lzpf compression algorithm and adds the footer to the end. * - * @param uncompressed_data {String|Buffer|CryptoJS.lib.WordArray} data to compress + * @param uncompressed_data {String|Buffer} data to compress * * @returns {Buffer} Lzpf compression data */ @@ -475,9 +467,7 @@ class WTVLzpf { uncompressed_data = this.ConvertToBuffer(uncompressed_data); this.Begin(); this.EncodeBlock(uncompressed_data, true); - this.Finish(); - - return Buffer.from(this.encoded_data); + return this.Finish(); } } diff --git a/zefie_wtvp_minisrv/WTVMime.js b/zefie_wtvp_minisrv/WTVMime.js new file mode 100644 index 00000000..ac9e1eaf --- /dev/null +++ b/zefie_wtvp_minisrv/WTVMime.js @@ -0,0 +1,198 @@ +/** + * Simple class for WebTV Mime Types and overrides + */ + + +class WTVMime { + + mime = require('mime-types'); + wtvshared = null; + minisrv_config = []; + + + constructor(minisrv_config) { + var WTVShared = require('./WTVShared.js')['WTVShared']; + this.minisrv_config = minisrv_config; + this.wtvshared = new WTVShared(minisrv_config); + if (!String.prototype.reverse) { + String.prototype.reverse = function () { + var splitString = this.split(""); + var reverseArray = splitString.reverse(); + var joinArray = reverseArray.join(""); + return joinArray; + } + } + } + + + shouldWeCompress(ssid_session, headers_obj) { + var compress_data = false; + var compression_type = 0; // no compression + if (ssid_session) { + if (ssid_session.capabilities) { + if (ssid_session.capabilities['client-can-receive-compressed-data']) { + + if (this.minisrv_config.config.enable_lzpf_compression || this.minisrv_config.config.force_compression_type) { + compression_type = 1; // lzpf + } + + if (ssid_session) { + // if gzip is enabled... + if (this.minisrv_config.config.enable_gzip_compression || this.minisrv_config.config.force_compression_type) { + var is_bf0app = ssid_session.get("wtv-client-rom-type") == "bf0app"; + var is_minibrowser = (ssid_session.get("wtv-needs-upgrade") || ssid_session.get("wtv-used-8675309")); + var is_softmodem = ssid_session.get("wtv-client-rom-type").match(/softmodem/); + if (!is_bf0app && ((!is_softmodem && !is_minibrowser) || (is_softmodem && !is_minibrowser))) { + // softmodem boxes do not appear to support gzip in the minibrowser + // LC2 appears to support gzip even in the MiniBrowser + // LC2 and newer approms appear to support gzip + // bf0app does not appear to support gzip + compression_type = 2; // gzip + } + } + } + + + + // mostly for debugging + if (this.minisrv_config.config.force_compression_type == "lzpf") compression_type = 1; + if (this.minisrv_config.config.force_compression_type == "gzip") compression_type = 2; + + // do not compress if already encoded + if (headers_obj["Content-Encoding"]) return 0; + + // should we bother to compress? + var content_type = ""; + if (typeof (headers_obj) == 'string') content_type = headers_obj; + else content_type = (typeof (headers_obj["wtv-modern-content-type"]) != 'undefined') ? headers_obj["wtv-modern-content-type"] : headers_obj["Content-Type"]; + + if (content_type) { + // both lzpf and gzip + if (content_type.match(/^text\//) && content_type != "text/tellyscript") compress_data = true; + else if (content_type.match(/^application\/(x-?)javascript$/)) compress_data = true; + else if (content_type == "application/json") compress_data = true; + if (compression_type == 2) { + // gzip only + if (content_type.match(/^audio\/(x-)?[s3m|mod|xm]$/)) compress_data = true; // s3m, mod, xm + if (content_type.match(/^audio\/(x-)?[midi|wav|wave]$/)) compress_data = true; // midi & wav + if (content_type.match(/^binary\/x-wtv-approm$/)) compress_data = true; // approms + if (content_type.match(/^binary\/doom-data$/)) compress_data = true; // DOOM WADs + } + } + } + } + } + + // return compression_type if compress_data = true + return (compress_data) ? compression_type : 0; + } + + /** + * Gets the WebTV Content-Type + * @param {string} path Path to a file + * @returns {string} Content-Type + */ + getSimpleContentType(path) { + return this.getContentType(path)[0]; + } + + /** + * Gets both the WebTV Content-Type and the Modern Content-Type + * @param {string} path Path to a file + * @returns {Array} (WebTV Content-Type, Modern Content-Type) + */ + getContentType(path) { + var file_ext = this.wtvshared.getFileExt(path).toLowerCase(); + var wtv_mime_type = ""; + var modern_mime_type = ""; + // process WebTV overrides, fall back to generic mime lookup + switch (file_ext) { + case "aif": + wtv_mime_type = "audio/x-aif"; + break; + case "aifc": + wtv_mime_type = "audio/x-aifc"; + break; + case "aiff": + wtv_mime_type = "audio/x-aiff"; + break; + case "ani": + wtv_mime_type = "x-wtv-animation"; + break; + case "brom": + wtv_mime_type = "binary/x-wtv-bootrom"; + break; + case "cdf": + wtv_mime_type = "application/netcdf"; + break; + case "dat": + wtv_mime_type = "binary/cache-data"; + break; + case "dl": + wtv_mime_type = "wtv/download-list"; + break; + case "gsm": + wtv_mime_type = "audio/x-gsm"; + break; + case "gz": + wtv_mime_type = "application/gzip"; + break; + case "ini": + wtv_mime_type = "wtv/jack-configuration"; + break; + case "mips-code": + wtv_mime_type = "code/x-wtv-code-mips"; + break; + case "o": + wtv_mime_type = "binary/x-wtv-approm"; + break; + case "ram": + wtv_mime_type = "audio/x-pn-realaudio"; + break; + case "rom": + wtv_mime_type = "binary/x-wtv-flashblock"; + break; + case "rsp": + wtv_mime_type = "wtv/jack-response"; + break; + case "swa": + case "swf": + wtv_mime_type = "application/x-shockwave-flash"; + break; + case "srf": + case "spl": + wtv_mime_type = "wtv/jack-data"; + break; + case "ttf": + wtv_mime_type = "wtv/jack-fonts"; + break; + case "tvch": + wtv_mime_type = "wtv/tv-channels"; + break; + case "tvl": + wtv_mime_type = "wtv/tv-listings"; + break; + case "tvsl": + wtv_mime_type = "wtv/tv-smartlinks"; + break; + case "wad": + wtv_mime_type = "binary/doom-data"; + break; + case "mp2": + case "hsb": + case "rmf": + case "s3m": + case "mod": + case "xm": + wtv_mime_type = "application/Music"; + break; + } + + modern_mime_type = this.mime.lookup(path); + if (wtv_mime_type == "") wtv_mime_type = modern_mime_type; + return new Array(wtv_mime_type, modern_mime_type); + } + +} + +module.exports = WTVMime; diff --git a/zefie_wtvp_minisrv/WTVSec.js b/zefie_wtvp_minisrv/WTVSec.js index cbdfe98a..a73a5c31 100644 --- a/zefie_wtvp_minisrv/WTVSec.js +++ b/zefie_wtvp_minisrv/WTVSec.js @@ -31,19 +31,18 @@ class WTVSec { hRC4_Key1 = null; hRC4_Key2 = null; RC4Session = new Array(); - zdebug = false; - + minisrv_config = []; /** * * Initialize the WTVSec class. * * @param {Number} wtv_incarnation Sets the wtv-incarnation for this instance - * @param {Boolean} zdebug Enable debugging + * @param {Boolean} minisrv_config.config.debug_flags.debug Enable debugging * */ - constructor(wtv_incarnation = 1, zdebug = false) { - this.zdebug = zdebug; + constructor(minisrv_config, wtv_incarnation = 1) { + this.minisrv_config = minisrv_config; this.initial_shared_key = CryptoJS.enc.Base64.parse(this.initial_shared_key_b64); if (this.initial_shared_key.sigBytes === 8) { @@ -238,7 +237,8 @@ class WTVSec { * #returns {Buffer} JS Buffer object */ wordArrayToBuffer(wordArray) { - return new Buffer.from(wordArray.toString(CryptoJS.enc.Hex), 'hex'); + if (wordArray) return new Buffer.from(wordArray.toString(CryptoJS.enc.Hex), 'hex'); + else return null; } /** @@ -247,7 +247,7 @@ class WTVSec { * */ SecureOn(rc4session = null) { - if (this.zdebug) console.log(" # Generating RC4 sessions with wtv-incarnation: " + this.incarnation); + if (this.minisrv_config.config.debug_flags.debug) console.log(" # Generating RC4 sessions with wtv-incarnation: " + this.incarnation); var buf = new Uint8Array([0xff & this.incarnation, 0xff & (this.incarnation >> 8), 0xff & (this.incarnation >> 16), 0xff & (this.incarnation >> 24)]); endianness(buf, 4); diff --git a/zefie_wtvp_minisrv/WTVShared.js b/zefie_wtvp_minisrv/WTVShared.js new file mode 100644 index 00000000..f3d6493d --- /dev/null +++ b/zefie_wtvp_minisrv/WTVShared.js @@ -0,0 +1,195 @@ +/** + * Shared functions across all classes and apps + */ + +class WTVShared { + + path = require('path'); + fs = require('fs'); + minisrv_config = []; + + constructor(minisrv_config) { + this.minisrv_config = minisrv_config; + if (!String.prototype.reverse) { + String.prototype.reverse = function () { + var splitString = this.split(""); + var reverseArray = splitString.reverse(); + var joinArray = reverseArray.join(""); + return joinArray; + } + } + } + + /** + * Returns the Last-Modified date in Unix Timestamp format + * @param {string} file Path to a file + */ + getFileLastModified(file) { + var stats = this.fs.lstatSync(file); + if (stats) return new Date(stats.mtimeMs); + return false; + } + + /** + * Returns the Last-Modified date in a RFC7231 compliant UTC Date String + * @param {string} file Path to a file + */ + getFileLastModifiedUTCString(file) { + return this.getFileLastModified(file).toUTCString(); + } + + /** + * Returns a RFC7231 compliant UTC Date String from the current time + * @param {Number} offset Offset from current time (+/-) + * @returns {string} A RFC7231 compliant UTC Date String from the current time + */ + getUTCTime(offset = 0) { + return new Date((new Date).getTime() + offset).toUTCString(); + } + + /** + * Returns a censored SSID + * @param {string|Array} obj SSID String or Headers Object + */ + filterSSID(obj) { + if (this.minisrv_config.config.hide_ssid_in_logs === true) { + if (typeof (obj) == "string") { + if (obj.substr(0, 8) == "MSTVSIMU") { + return obj.substr(0, 10) + ('*').repeat(10) + obj.substr(20); + } else if (obj.substr(0, 5) == "1SEGA") { + return obj.substr(0, 6) + ('*').repeat(6) + obj.substr(13); + } else { + return obj.substr(0, 6) + ('*').repeat(9); + } + } else { + if (obj["wtv-client-serial-number"]) { + var ssid = obj["wtv-client-serial-number"]; + if (ssid.substr(0, 8) == "MSTVSIMU") { + obj["wtv-client-serial-number"] = ssid.substr(0, 10) + ('*').repeat(10) + ssid.substr(20); + } else if (ssid.substr(0, 5) == "1SEGA") { + obj["wtv-client-serial-number"] = ssid.substr(0, 6) + ('*').repeat(6) + ssid.substr(13); + } else { + obj["wtv-client-serial-number"] = ssid.substr(0, 6) + ('*').repeat(9); + } + } + return obj; + } + } else { + return obj; + } + } + + /** + * Returns an absolute path + * @param {string} path + * @param {string} directory Root directory + */ + getAbsolutePath(path, directory = __dirname) { + if (path.substring(0, 1) != this.path.sep && path.substring(1, 1) != ":") { + // non-absolute path, so use current directory as base + path = (directory + this.path.sep + path); + } else { + // already absolute path + } + return path; + } + + /** + * Returns a percentage + * @param {number} partialValue + * @param {number} totalValue + * @returns {number} percentage + */ + getPercentage = function (partialValue, totalValue) { + return Math.floor((100 * partialValue) / totalValue); + } + + /** + * If the file ends with .gz, remove it + * @param {string} path + * @return {string} path without gz, or unmodified path if it isnt a gz + */ + stripGzipFromPath(path) { + var path_split = path.split('.'); + if (path_split[path_split.length - 1].toLowerCase() == "gz") { + path_split.pop(); + path = path_split.join("."); + } + return path; + } + + /** + * Gets the file extension from a path + * @param {string} path + * @returns {String} File Extension (without dot) + */ + getFileExt(path) { + return path.reverse().split(".")[0].reverse(); + } + + /** + * Strips bad things from paths + * @param {string} base Base path + * @param {string} target Sub path + */ + makeSafePath(base, target) { + target.replace(/[\|\&\;\$\%\@\"\<\>\+\,\\]/g, ""); + if (this.path.sep != "/") target = target.replace(/\//g, this.path.sep); + var targetPath = this.path.posix.normalize(target) + return base + this.path.sep + targetPath; + } + + /** + * Makes sure an SSID is clean, and doesn't contain any exploitable characters + * @param {string} ssid + * @returns {string} Sanitized SSID + */ + makeSafeSSID(ssid = "") { + ssid = ssid.replace(/[^a-zA-Z0-9]/g, ""); + if (ssid.length == 0) ssid = null; + return ssid; + } +} + +class clientShowAlert { + message = null; + buttonlabel1 = null; + buttonlabel2 = null; + buttonaction1 = null; + buttonaction2 = null; + noback = null; + image = null; + + constructor(image = null, message = null, buttonlabel1 = null, buttonaction1 = null, buttonlabel2 = null, buttonaction2 = null, noback = null) { + this.message = message; + this.buttonlabel1 = buttonlabel1; + this.buttonlabel2 = buttonlabel2; + this.buttonaction1 = buttonaction1; + this.buttonaction2 = buttonaction2; + this.message = message; + this.noback = noback; + if (typeof image === 'object') { + this.image = null; + Object.keys(image).forEach(function (k) { + if (this[k] === null) this[k] = image[k]; + }, this); + } else { + this.image = image; + } + } + + getURL() { + var url = "client:ShowAlert?"; + if (this.message) url += "message=" + escape(this.message) + "&"; + if (this.buttonlabel1) url += "buttonlabel1=" + escape(this.buttonlabel1) + "&"; + if (this.buttonaction1) url += "buttonaction1=" + escape(this.buttonaction1) + "&"; + if (this.buttonlabel2) url += "buttonlabel2=" + escape(this.buttonlabel2) + "&"; + if (this.buttonaction2) url += "buttonaction2=" + escape(this.buttonaction2) + "&"; + if (this.image) url += "image=" + escape(this.image) + "&"; + if (this.noback) url += "noback=true&"; + return url.substring(0, url.length - 1); + } +} + +module.exports.WTVShared = WTVShared; +module.exports.clientShowAlert = clientShowAlert; \ No newline at end of file diff --git a/zefie_wtvp_minisrv/app.js b/zefie_wtvp_minisrv/app.js index ac1624bb..c7810f1b 100644 --- a/zefie_wtvp_minisrv/app.js +++ b/zefie_wtvp_minisrv/app.js @@ -8,13 +8,14 @@ const https = require('https'); const strftime = require('strftime'); // used externally by service scripts const net = require('net'); const CryptoJS = require('crypto-js'); -const mime = require('mime-types'); const { crc16 } = require('easy-crc'); const process = require('process'); var WTVSec = require('./WTVSec.js'); var WTVLzpf = require('./WTVLzpf.js'); var WTVClientCapabilities = require('./WTVClientCapabilities.js'); var WTVClientSessionData = require('./WTVClientSessionData.js'); +var WTVMime = require("./WTVMime.js"); +var { WTVShared, clientShowAlert } = require("./WTVShared.js"); process .on('SIGTERM', shutdown('SIGTERM')) @@ -70,10 +71,6 @@ function getServiceString(service, overrides = {}) { } } -function getFileExt(path) { - return path.reverse().split(".")[0].reverse(); -} - function doErrorPage(code, data = null, pc_mode = false) { var headers = null; switch (code) { @@ -105,99 +102,6 @@ function doErrorPage(code, data = null, pc_mode = false) { return new Array(headers, data); } - -function getConType(path) { - var file_ext = getFileExt(path).toLowerCase(); - var wtv_mime_type = ""; - var modern_mime_type = ""; - // process WebTV overrides, fall back to generic mime lookup - switch (file_ext) { - case "aif": - wtv_mime_type = "audio/x-aif"; - break; - case "aifc": - wtv_mime_type = "audio/x-aifc"; - break; - case "aiff": - wtv_mime_type = "audio/x-aiff"; - break; - case "ani": - wtv_mime_type = "x-wtv-animation"; - break; - case "brom": - wtv_mime_type = "binary/x-wtv-bootrom"; - break; - case "cdf": - wtv_mime_type = "application/netcdf"; - break; - case "dat": - wtv_mime_type = "binary/cache-data"; - break; - case "dl": - wtv_mime_type = "wtv/download-list"; - break; - case "gsm": - wtv_mime_type = "audio/x-gsm"; - break; - case "gz": - wtv_mime_type = "application/gzip"; - break; - case "ini": - wtv_mime_type = "wtv/jack-configuration"; - break; - case "mips-code": - wtv_mime_type = "code/x-wtv-code-mips"; - break; - case "o": - wtv_mime_type = "binary/x-wtv-approm"; - break; - case "ram": - wtv_mime_type = "audio/x-pn-realaudio"; - break; - case "rom": - wtv_mime_type = "binary/x-wtv-flashblock"; - break; - case "rsp": - wtv_mime_type = "wtv/jack-response"; - break; - case "swa": - case "swf": - wtv_mime_type = "application/x-shockwave-flash"; - break; - case "srf": - case "spl": - wtv_mime_type = "wtv/jack-data"; - break; - case "ttf": - wtv_mime_type = "wtv/jack-fonts"; - break; - case "tvch": - wtv_mime_type = "wtv/tv-channels"; - break; - case "tvl": - wtv_mime_type = "wtv/tv-listings"; - break; - case "tvsl": - wtv_mime_type = "wtv/tv-smartlinks"; - break; - case "wad": - wtv_mime_type = "binary/doom-data"; - break; - case "mp2": - case "hsb": - case "rmf": - case "s3m": - case "mod": - case "xm": - wtv_mime_type = "application/Music"; - break; - } - - modern_mime_type = mime.lookup(path); - if (wtv_mime_type == "") wtv_mime_type = modern_mime_type; - return new Array(wtv_mime_type, modern_mime_type); -} - async function processPath(socket, service_vault_file_path, request_headers = new Array(), service_name) { var headers, data = null; var request_is_async = false; @@ -206,7 +110,7 @@ async function processPath(socket, service_vault_file_path, request_headers = ne try { service_vaults.forEach(function (service_vault_dir) { if (service_vault_found) return; - service_vault_file_path = makeSafePath(service_vault_dir, service_path); + service_vault_file_path = wtvshared.makeSafePath(service_vault_dir, service_path); // deny access to catchall file name directly var service_path_split = service_path.split("/"); @@ -230,8 +134,9 @@ async function processPath(socket, service_vault_file_path, request_headers = ne // file exists, read it and return it service_vault_found = true; request_is_async = true; - if (!zquiet) console.log(" * Found " + service_vault_file_path + " to handle request (Direct File Mode) [Socket " + socket.id + "]"); - var contypes = getConType(service_vault_file_path); + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Found " + service_vault_file_path + " to handle request (Direct File Mode) [Socket " + socket.id + "]"); + request_headers.service_file_path = service_vault_file_path; + var contypes = wtvmime.getContentType(service_vault_file_path); headers = "200 OK\n" headers += "Content-Type: " + contypes[0] + "\n"; headers += "wtv-modern-content-type" + contypes[1]; @@ -241,8 +146,9 @@ async function processPath(socket, service_vault_file_path, request_headers = ne } else if (fs.existsSync(service_vault_file_path + ".txt")) { // raw text format, entire payload expected (headers and content) service_vault_found = true; - if (!zquiet) console.log(" * Found " + service_vault_file_path + ".txt to handle request (Raw TXT Mode) [Socket " + socket.id + "]"); request_is_async = true; + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Found " + service_vault_file_path + ".txt to handle request (Raw TXT Mode) [Socket " + socket.id + "]"); + request_headers.service_file_path = service_vault_file_path + ".txt"; fs.readFile(service_vault_file_path + ".txt", 'Utf-8', function (err, file_raw) { if (file_raw.indexOf("\n\n") > 0) { // split headers and data by newline (unix format) @@ -272,18 +178,20 @@ async function processPath(socket, service_vault_file_path, request_headers = ne // In Asynchronous mode, you are expected to call sendToClient(socket,headers,data) by the end of your script // `socket` is already defined and should be passed-through. service_vault_found = true; - if (!zquiet) console.log(" * Found " + service_vault_file_path + ".js to handle request (JS Interpreter mode) [Socket " + socket.id + "]"); + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Found " + service_vault_file_path + ".js to handle request (JS Interpreter mode) [Socket " + socket.id + "]"); + request_headers.service_file_path = service_vault_file_path + ".js"; // expose var service_dir for script path to the root of the wtv-service var service_dir = service_vault_dir + path.sep + service_name; socket_sessions[socket.id].starttime = Math.floor(new Date().getTime() / 1000); var jscript_eval = fs.readFileSync(service_vault_file_path + ".js").toString(); eval(jscript_eval); - if (request_is_async && !zquiet) console.log(" * Script requested Asynchronous mode"); + if (request_is_async && !minisrv_config.config.debug_flags.quiet) console.log(" * Script requested Asynchronous mode"); } else if (fs.existsSync(service_vault_file_path + ".html")) { // Standard HTML with no headers, WTV Style service_vault_found = true; - if (!zquiet) console.log(" * Found " + service_vault_file_path + ".html to handle request (HTML Mode) [Socket " + socket.id + "]"); + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Found " + service_vault_file_path + ".html to handle request (HTML Mode) [Socket " + socket.id + "]"); + request_headers.service_file_path = service_vault_file_path + ".html"; request_is_async = true; headers = "200 OK\n" headers += "Content-Type: text/html" @@ -303,12 +211,13 @@ async function processPath(socket, service_vault_file_path, request_headers = ne while (service_check_dir.join(path.sep) != service_vault_dir) { var catchall_file = service_check_dir.join(path.sep) + path.sep + minisrv_catchall_file_name; if (fs.existsSync(catchall_file)) { - if (!zquiet) console.log(" * Found catchall at " + catchall_file + ".html to handle request (HTML Mode) [Socket " + socket.id + "]"); + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Found catchall at " + catchall_file + " to handle request (JS Interpreter Mode) [Socket " + socket.id + "]"); + request_headers.service_file_path = catchall_file; var jscript_eval = fs.readFileSync(catchall_file).toString(); // don't pass these vars to the script var service_check_dir, minisrv_catchall_file_name = null; eval(jscript_eval); - if (request_is_async && !zquiet) console.log(" * Script requested Asynchronous mode"); + if (request_is_async && !minisrv_config.config.debug_flags.quiet) console.log(" * Script requested Asynchronous mode"); } else { service_check_dir.pop(); } @@ -345,47 +254,6 @@ async function processPath(socket, service_vault_file_path, request_headers = ne } } -function filterSSID(obj) { - if (minisrv_config.config.hide_ssid_in_logs === true) { - if (typeof (obj) == "string") { - if (obj.substr(0, 8) == "MSTVSIMU") { - return obj.substr(0, 10) + ('*').repeat(10) + obj.substr(20); - } else if (obj.substr(0, 5) == "1SEGA") { - return obj.substr(0, 6) + ('*').repeat(6) + obj.substr(13); - } else { - return obj.substr(0, 6) + ('*').repeat(9); - } - } else { - if (makeSafeSSID(obj["wtv-client-serial-number"])) { - var ssid = makeSafeSSID(obj["wtv-client-serial-number"]); - if (ssid.substr(0, 8) == "MSTVSIMU") { - obj["wtv-client-serial-number"] = ssid.substr(0, 10) + ('*').repeat(10) + ssid.substr(20); - } else if (ssid.substr(0, 5) == "1SEGA") { - obj["wtv-client-serial-number"] = ssid.substr(0, 6) + ('*').repeat(6) + ssid.substr(13); - } else { - obj["wtv-client-serial-number"] = ssid.substr(0, 6) + ('*').repeat(9); - } - } - return obj; - } - } else { - return obj; - } -} - -function makeSafeSSID(ssid = "") { - ssid = ssid.replace(/[^a-zA-Z0-9]/g, ""); - if (ssid.length == 0) ssid = null; - return ssid; -} - -function makeSafePath(base, target) { - target.replace(/[\|\&\;\$\%\@\"\<\>\+\,\\]/g, ""); - if (path.sep != "/") target = target.replace(/\//g, path.sep); - var targetPath = path.posix.normalize(target) - return base + path.sep + targetPath; -} - async function processURL(socket, request_headers) { var shortURL, headers, data = ""; request_headers.query = new Array(); @@ -406,30 +274,36 @@ async function processURL(socket, request_headers) { } else { shortURL = unescape(request_headers.request_url); } + if (request_headers['wtv-request-type']) socket_sessions[socket.id].wtv_request_type = request_headers['wtv-request-type']; if (request_headers.post_data) { - var post_data_string = request_headers.post_data.toString(CryptoJS.enc.Utf8).replace("\0", ""); - if (isUnencryptedString(post_data_string)) { - if (post_data_string.indexOf('=')) { - if (post_data_string.indexOf('&')) { - var qraw = post_data_string.split('&'); - if (qraw.length > 0) { - for (let i = 0; i < qraw.length; i++) { - var qraw_split = qraw[i].split("="); - if (qraw_split.length == 2) { - var k = qraw_split[0]; - request_headers.query[k] = unescape(qraw[i].split("=")[1].replace(/\+/g, "%20")); + var post_data_string = ''; + try { + post_data_string = request_headers.post_data.toString(CryptoJS.enc.Utf8).replace("\0", ""); // if not text this will probably throw an exception + if (isUnencryptedString(post_data_string)) { + if (post_data_string.indexOf('=')) { + if (post_data_string.indexOf('&')) { + var qraw = post_data_string.split('&'); + if (qraw.length > 0) { + for (let i = 0; i < qraw.length; i++) { + var qraw_split = qraw[i].split("="); + if (qraw_split.length == 2) { + var k = qraw_split[0]; + request_headers.query[k] = unescape(qraw[i].split("=")[1].replace(/\+/g, "%20")); + } } } - } - } else { - var qraw_split = post_data_string.split("="); - if (qraw_split.length == 2) { - var k = qraw_split[0]; - request_headers.query[k] = unescape(qraw_split[1].replace(/\+/g, "%20")); + } else { + var qraw_split = post_data_string.split("="); + if (qraw_split.length == 2) { + var k = qraw_split[0]; + request_headers.query[k] = unescape(qraw_split[1].replace(/\+/g, "%20")); + } } } } + } catch (e) { + // do nothing } } @@ -469,26 +343,22 @@ async function processURL(socket, request_headers) { var ssid = socket.ssid; if (ssid == null) { // prevent possible injection attacks via SSID and filesystem SessionStore - ssid = makeSafeSSID(request_headers["wtv-client-serial-number"]); + ssid = wtvshared.makeSafeSSID(request_headers["wtv-client-serial-number"]); if (ssid == "") ssid = null; } var reqverb = "Request"; - if (request_headers.encrypted || request_headers.secure) { - reqverb = "Encrypted " + reqverb; - } - if (request_headers.psuedo_encryption) { - reqverb = "Psuedo-encrypted " + reqverb; - } + if (request_headers.encrypted || request_headers.secure) reqverb = "Encrypted " + reqverb; if (ssid != null) { - console.log(" * " + reqverb + " for " + request_headers.request_url + " from WebTV SSID " + (await filterSSID(ssid)), 'on', socket.id); + console.log(" * " + reqverb + " for " + request_headers.request_url + " from WebTV SSID " + (await wtvshared.filterSSID(ssid)), 'on', socket.id); } else { console.log(" * " + reqverb + " for " + request_headers.request_url, 'on', socket.id); } // assume webtv since there is a :/ in the GET var service_name = shortURL.split(':/')[0]; var urlToPath = service_name + path.sep + shortURL.split(':/')[1]; - if (zshowheaders) console.log(" * Incoming headers on socket ID", socket.id, (await filterSSID(request_headers))); + if (minisrv_config.config.debug_flags.show_headers) console.log(" * Incoming headers on socket ID", socket.id, (await wtvshared.filterSSID(request_headers))); + socket_sessions[socket.id].request_headers = request_headers; processPath(socket, urlToPath, request_headers, service_name); } else if (shortURL.indexOf('http://') >= 0 || shortURL.indexOf('https://') >= 0) { doHTTPProxy(socket, request_headers); @@ -505,7 +375,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"; - if (zshowheaders) console.log(request_type.toUpperCase() +" Proxy: Client Request Headers on socket ID", socket.id, (await filterSSID(request_headers))); + if (minisrv_config.config.debug_flags.show_headers) console.log(request_type.toUpperCase() +" Proxy: Client Request Headers on socket ID", socket.id, (await wtvshared.filterSSID(request_headers))); switch (request_type) { case "https": var proxy_agent = https; @@ -670,68 +540,6 @@ function headerStringToObj(headers, response = false) { return headers_obj; } -function shouldWeCompress(ssid, headers_obj) { - var compress_data = false; - var compression_type = 0; // no compression - if (ssid_sessions[ssid]) { - if (ssid_sessions[ssid].capabilities) { - if (ssid_sessions[ssid].capabilities['client-can-receive-compressed-data']) { - - if (minisrv_config.config.enable_lzpf_compression || minisrv_config.config.force_compression_type) { - compression_type = 1; // lzpf - } - - if (ssid_sessions[ssid]) { - // if gzip is enabled... - if (minisrv_config.config.enable_gzip_compression || minisrv_config.config.force_compression_type) { - var is_bf0app = ssid_sessions[ssid].get("wtv-client-rom-type") == "bf0app"; - var is_minibrowser = (ssid_sessions[ssid].get("wtv-needs-upgrade") || ssid_sessions[ssid].get("wtv-used-8675309")); - var is_softmodem = ssid_sessions[ssid].get("wtv-client-rom-type").match(/softmodem/); - if (!is_bf0app && ((!is_softmodem && !is_minibrowser) || (is_softmodem && !is_minibrowser))) { - // softmodem boxes do not appear to support gzip in the minibrowser - // LC2 appears to support gzip even in the MiniBrowser - // LC2 and newer approms appear to support gzip - // bf0app does not appear to support gzip - compression_type = 2; // gzip - } - } - } - - - - // mostly for debugging - if (minisrv_config.config.force_compression_type == "lzpf") compression_type = 1; - if (minisrv_config.config.force_compression_type == "gzip") compression_type = 2; - - // do not compress if already encoded - if (headers_obj["Content-Encoding"]) return 0; - - // should we bother to compress? - var content_type = ""; - if (typeof (headers_obj) == 'string') content_type = headers_obj; - else content_type = (typeof (headers_obj["wtv-modern-content-type"]) != 'undefined') ? headers_obj["wtv-modern-content-type"] : headers_obj["Content-Type"]; - - if (content_type) { - // both lzpf and gzip - if (content_type.match(/^text\//) && content_type != "text/tellyscript") compress_data = true; - else if (content_type.match(/^application\/(x-?)javascript$/)) compress_data = true; - else if (content_type == "application/json") compress_data = true; - if (compression_type == 2) { - // gzip only - if (content_type.match(/^audio\/(x-)?[s3m|mod|xm]$/)) compress_data = true; // s3m, mod, xm - if (content_type.match(/^audio\/(x-)?[midi|wav|wave]$/)) compress_data = true; // midi & wav - if (content_type.match(/^binary\/x-wtv-approm$/)) compress_data = true; // midi & wav - - } - } - } - } - } - - // return compression_type if compress_data = true - return (compress_data) ? compression_type : 0; -} - async function sendToClient(socket, headers_obj, data) { var headers = ""; var content_length = 0; @@ -766,13 +574,39 @@ async function sendToClient(socket, headers_obj, data) { delete headers_obj["Content-type"]; } + // Add last modified if not a dynamic script + if (socket_sessions[socket.id]) { + if (socket_sessions[socket.id].request_headers) { + if (wtvshared.getFileExt(socket_sessions[socket.id].request_headers.service_file_path).toLowerCase() !== "js") { + var last_modified = wtvshared.getFileLastModifiedUTCString(socket_sessions[socket.id].request_headers.service_file_path); + if (last_modified) headers_obj["Last-Modified"] = last_modified; + } + } + } + + if (content_length > 0) { + if (socket_sessions[socket.id].wtv_request_type == "download") { + if (headers_obj['Content-Type'] != "wtv/download-list") { + if (wtvshared.getFileExt(socket_sessions[socket.id].request_headers.request_url).toLowerCase() == "gz") { + // we need the checksum of the uncompressed data + var gunzipped = zlib.gunzipSync(data); + headers_obj['wtv-checksum'] = CryptoJS.MD5(CryptoJS.lib.WordArray.create(gunzipped)).toString(CryptoJS.enc.Hex).toLowerCase(); + headers_obj['wtv-uncompressed-size'] = gunzipped.byteLength; + gunzipped = null; + } else { + headers_obj['wtv-checksum'] = CryptoJS.MD5(CryptoJS.lib.WordArray.create(data)).toString(CryptoJS.enc.Hex).toLowerCase(); + } + } + } + } + // if box can do compression, see if its worth enabling // small files actually get larger, so don't compress them var compression_type = 0; - if (content_length >= 256) compression_type = shouldWeCompress(socket.ssid, headers_obj); + if (content_length >= 256) compression_type = wtvmime.shouldWeCompress(ssid_sessions[socket.ssid], headers_obj); // compress if needed - if (compression_type > 0 && content_length > 0 && headers_obj['http_response'].substring(0,3) == "200") { + if (compression_type > 0 && content_length > 0 && headers_obj['http_response'].substring(0, 3) == "200") { var uncompressed_content_length = content_length; switch (compression_type) { case 1: @@ -801,21 +635,27 @@ async function sendToClient(socket, headers_obj, data) { // ultimately send original content length if lzpf compressed_content_length = data.byteLength; } - var compression_percentage = ((compressed_content_length / uncompressed_content_length) * 100).toFixed(1).toString() + "%"; - if (uncompressed_content_length != compressed_content_length) if (zdebug) console.log(" # Compression stats: Orig Size:", uncompressed_content_length, "~ Comp Size:", compressed_content_length, "~ Ratio:", compression_percentage); + var compression_ratio = (uncompressed_content_length / compressed_content_length).toFixed(2); + var compression_percentage = ((1 - (compressed_content_length / uncompressed_content_length)) * 100).toFixed(1); + if (uncompressed_content_length != compressed_content_length) if (minisrv_config.config.debug_flags.debug) console.log(" # Compression stats: Orig Size:", uncompressed_content_length, "~ Comp Size:", compressed_content_length, "~ Ratio:", compression_ratio, "Saved:", compression_percentage.toString() + "%"); } // encrypt if needed - if (socket_sessions[socket.id].secure == true) { + if (socket_sessions[socket.id].secure == true && !socket_sessions[socket.id].do_not_encrypt) { headers_obj["wtv-encrypted"] = 'true'; headers_obj = moveObjectElement('wtv-encrypted', 'Connection', headers_obj); if (content_length > 0 && socket_sessions[socket.id].wtvsec) { - if (!zquiet) console.log(" * Encrypting response to client ...") + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Encrypting response to client ...") var enc_data = socket_sessions[socket.id].wtvsec.Encrypt(1, data); data = enc_data; } } + if (socket_sessions[socket.id].do_not_encrypt) { + if (headers_obj["wtv-encrypted"]) delete headers_obj["wtv-encrypted"]; + if (headers_obj["secure"]) delete headers_obj["secure"]; + } + // calculate content length // make sure we are using our Content-length and not one set in a script. if (headers_obj["Content-Length"]) delete headers_obj["Content-Length"]; @@ -841,8 +681,23 @@ async function sendToClient(socket, headers_obj, data) { headers_obj['http_response'] = "HTTP/1.0 " + headers_obj['http_response']; } +/* // wtv-request-type download wants minimal headers? + if (data.byteLength > 0) { + if (socket_sessions[socket.id].wtv_request_type == "download") { + if (headers_obj['Content-Type'] != "wtv/download-list") { + // minimalize headers + var new_headers = { "http_response": headers_obj['http_response'].split(" ")[0] + " " } + if (headers_obj['wtv-encrypted']) new_headers['wtv-encrypted'] = headers_obj['wtv-encrypted']; + new_headers["content-type"] = headers_obj['Content-Type']; + new_headers["content-length"] = headers_obj['Content-length']; + + headers_obj = new_headers; + } + } + } +*/ // header object to string - if (zshowheaders) console.log(" * Outgoing headers on socket ID", socket.id, (await filterSSID(headers_obj))); + if (minisrv_config.config.debug_flags.show_headers) console.log(" * Outgoing headers on socket ID", socket.id, (await wtvshared.filterSSID(headers_obj))); Object.keys(headers_obj).forEach(function (k) { if (k == "http_response") { headers += headers_obj[k] + end_of_line; @@ -856,40 +711,67 @@ async function sendToClient(socket, headers_obj, data) { } }); + if (headers_obj["Connection"]) { + if (headers_obj["Connection"].toLowerCase() == "close" && wtv_connection_close == "true") { + socket_sessions[socket.id].destroy_me = true; + } + } // send to client var toClient = null; if (typeof data == 'string') { toClient = headers + end_of_line + data; - socket.write(toClient); + sendToSocket(socket, Buffer.from(toClient)); } else if (typeof data == 'object') { - if (zquiet) var verbosity_mod = (headers_obj["wtv-encrypted"] == 'true') ? " encrypted response" : ""; + if (minisrv_config.config.debug_flags.quiet) var verbosity_mod = (headers_obj["wtv-encrypted"] == 'true') ? " encrypted response" : ""; if (socket_sessions[socket.id].secure_headers == true) { // encrypt headers - if (zquiet) verbosity_mod += " with encrypted headers"; + if (minisrv_config.config.debug_flags.quiet) verbosity_mod += " with encrypted headers"; var enc_headers = socket_sessions[socket.id].wtvsec.Encrypt(1, headers + end_of_line); - socket.write(new Uint8Array(concatArrayBuffer(enc_headers, data))); + sendToSocket(socket, new Buffer.from(concatArrayBuffer(enc_headers, data))); } else { - socket.write(new Uint8Array(concatArrayBuffer(Buffer.from(headers + end_of_line), data))); + sendToSocket(socket, new Buffer.from(concatArrayBuffer(Buffer.from(headers + end_of_line), data))); } - if (zquiet) console.log(" * Sent" + verbosity_mod + " " + headers_obj.http_response + " to client (Content-Type:", headers_obj['Content-Type'], "~", headers_obj['Content-length'], "bytes)"); + if (minisrv_config.config.debug_flags.quiet) console.log(" * Sent" + verbosity_mod + " " + headers_obj.http_response + " to client (Content-Type:", headers_obj['Content-Type'], "~", headers_obj['Content-length'], "bytes)"); } +} - if (socket_sessions[socket.id].expecting_post_data) delete socket_sessions[socket.id].expecting_post_data; - if (socket_sessions[socket.id].header_buffer) delete socket_sessions[socket.id].header_buffer; - if (socket_sessions[socket.id].secure_buffer) delete socket_sessions[socket.id].secure_buffer; - if (socket_sessions[socket.id].buffer) delete socket_sessions[socket.id].buffer; - if (socket_sessions[socket.id].headers) delete socket_sessions[socket.id].headers; - if (socket_sessions[socket.id].post_data) delete socket_sessions[socket.id].post_data; - if (socket_sessions[socket.id].post_data_length) delete socket_sessions[socket.id].post_data_length; - if (socket_sessions[socket.id].post_data_percents_shown) delete socket_sessions[socket.id].post_data_percents_shown; +async function sendToSocket(socket, data) { + // buffer size = lesser of minisrv_config.config.chunk_size or size remaining + var chunk_size = 16384; + var can_write = true; + var expected_data_out = 0; + while ((socket.bytesWritten == 0 || socket.bytesWritten != expected_data_out) && can_write) { + if (expected_data_out === 0) expected_data_out = data.byteLength + (socket_sessions[socket.id].socket_total_written || 0); + if (socket.bytesWritten == expected_data_out) break; - if (socket_sessions[socket.id].close_me) socket.end(); - if (headers_obj["Connection"]) { - if (headers_obj["Connection"].toLowerCase() == "close" && wtv_connection_close == "true") { - socket.destroy(); + var data_left = (expected_data_out - socket.bytesWritten); + var buffer_size = (data_left >= chunk_size) ? chunk_size : data_left; + var offset = (data.byteLength - data_left); + var chunk = new Buffer.alloc(buffer_size); + data.copy(chunk, 0, offset, (offset + buffer_size)); + can_write = socket.write(chunk); + if (!can_write) { + socket.once('drain', function () { + sendToSocket(socket, data); + }); + break; } } + if (socket.bytesWritten == expected_data_out) { + socket_sessions[socket.id].socket_total_written = socket.bytesWritten; + if (socket_sessions[socket.id].expecting_post_data) delete socket_sessions[socket.id].expecting_post_data; + if (socket_sessions[socket.id].header_buffer) delete socket_sessions[socket.id].header_buffer; + if (socket_sessions[socket.id].secure_buffer) delete socket_sessions[socket.id].secure_buffer; + if (socket_sessions[socket.id].buffer) delete socket_sessions[socket.id].buffer; + if (socket_sessions[socket.id].headers) delete socket_sessions[socket.id].headers; + if (socket_sessions[socket.id].post_data) delete socket_sessions[socket.id].post_data; + if (socket_sessions[socket.id].post_data_length) delete socket_sessions[socket.id].post_data_length; + if (socket_sessions[socket.id].post_data_percents_shown) delete socket_sessions[socket.id].post_data_percents_shown; + socket.setTimeout(minisrv_config.config.socket_timeout * 1000); + if (socket_sessions[socket.id].close_me) socket.end(); + if (socket_sessions[socket.id].destroy_me) socket.destroy(); + } } function concatArrayBuffer(buffer1, buffer2) { @@ -922,6 +804,89 @@ function moveObjectElement(currentKey, afterKey, obj) { if (next !== -1) return result; else return obj; } +function checkSecurity(socket) { + var out = null; + var ip2long = function (ip) { + var components; + + if (components = ip.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/)) { + var iplong = 0; + var power = 1; + for (var i = 4; i >= 1; i -= 1) { + iplong += power * parseInt(components[i]); + power *= 256; + } + return iplong; + } + else return -1; + }; + + var isInSubnet = function (ip, subnet) { + var mask, base_ip, long_ip = ip2long(ip); + if ((mask = subnet.match(/^(.*?)\/(\d{1,2})$/)) && ((base_ip = ip2long(mask[1])) >= 0)) { + var freedom = Math.pow(2, 32 - parseInt(mask[2])); + return (long_ip > base_ip) && (long_ip < base_ip + freedom - 1); + } + else return false; + }; + + var rejectSSIDConnection = function (ssid, blacklist) { + if (blacklist) console.log(" * Request from SSID", wtvshared.filterSSID(ssid), "(" + socket.remoteAddr + "), but that SSID is in the blacklist, rejecting."); + else console.log(" * Request from SSID", wtvshared.filterSSID(socket.ssid), "(" + socket.remoteAddress + "), but that SSID is not in the whitelist, rejecting."); + + var errpage = doErrorPage(401, "Access to this service is denied."); + out = errpage; + } + + var checkSSIDIPWhitelist = function (ssid, blacklist) { + var ssid_access_list_ip_override = false; + if (minisrv_config.config.ssid_ip_allow_list) { + if (minisrv_config.config.ssid_ip_allow_list[socket.ssid]) { + Object.keys(minisrv_config.config.ssid_ip_allow_list[socket.ssid]).forEach(function (k) { + if (minisrv_config.config.ssid_ip_allow_list[socket.ssid][k].indexOf('/') > 0) { + if (isInSubnet(socket.remoteAddress, minisrv_config.config.ssid_ip_allow_list[socket.ssid][k])) { + // remoteAddr is in allowed subnet + ssid_access_list_ip_override = true; + } + } else { + if (socket.remoteAddress == minisrv_config.config.ssid_ip_allow_list[socket.ssid][k]) { + // remoteAddr directly matches IP + ssid_access_list_ip_override = true; + } + } + }); + if (!ssid_access_list_ip_override) rejectSSIDConnection(socket.ssid, blacklist); + } else { + rejectSSIDConnection(socket.ssid, blacklist); + } + } else { + rejectSSIDConnection(socket.ssid, blacklist); + } + if (ssid_access_list_ip_override && minisrv_config.config.debug_flags.debug) console.log(" * Request from disallowed SSID", wtvshared.filterSSID(ssid), "was allowed due to IP address whitelist"); + } + + // process whitelist first + if (socket.ssid && minisrv_config.config.ssid_allow_list) { + var ssid_is_in_whitelist = minisrv_config.config.ssid_allow_list.findIndex(element => element == socket.ssid); + if (ssid_is_in_whitelist == -1) { + // no whitelist match, but lets see if the remoteAddress is allowed + checkSSIDIPWhitelist(socket.ssid, false); + } + } + + // now check blacklist + if (socket.ssid && minisrv_config.config.ssid_block_list) { + var ssid_is_in_blacklist = minisrv_config.config.ssid_block_list.findIndex(element => element == socket.ssid); + if (ssid_is_in_blacklist != -1) { + // blacklist match, but lets see if the remoteAddress is allowed + checkSSIDIPWhitelist(socket.ssid, true); + } + } + + // Passed Security + return out; +} + function isUnencryptedString(string, verbose = false) { // a generic "isAscii" check is not sufficient, as the test will see the binary // compressed / encrypted data as ASCII. This function checks for characters expected @@ -931,11 +896,6 @@ function isUnencryptedString(string, verbose = false) { return /^([A-Za-z0-9\+\/\=\-\.\,\ \"\;\:\?\&\r\n\(\)\%\<\>\_\~\*\@\#\\]{8,})$/.test(string); } -function filterSSID(ssid) { - var WTVCSD = new WTVClientSessionData(null,minisrv_config.config.hide_ssid_in_logs); - return WTVCSD.filterSSID(ssid); -} - async function processRequest(socket, data_hex, skipSecure = false, encryptedRequest = false) { // This function sucks and needs to be rewritten @@ -971,8 +931,8 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq // its not a POST and it failed the isUnencryptedString test, so we think this is an encrypted blob if (socket_sessions[socket.id].secure != true) { // first time so reroll sessions - if (zdebug) console.log(" # [ UNEXPECTED BINARY BLOCK ] First sign of encryption, re-creating RC4 sessions for socket id", socket.id); - socket_sessions[socket.id].wtvsec = new WTVSec(1, zdebug); + if (minisrv_config.config.debug_flags.debug) console.log(" # [ UNEXPECTED BINARY BLOCK ] First sign of encryption, re-creating RC4 sessions for socket id", socket.id); + socket_sessions[socket.id].wtvsec = new WTVSec(minisrv_config); socket_sessions[socket.id].wtvsec.IssueChallenge(); socket_sessions[socket.id].wtvsec.SecureOn(); socket_sessions[socket.id].secure = true; @@ -1003,10 +963,10 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq if (!headers) return; if (headers["wtv-client-serial-number"] != null && socket.ssid == null) { - socket.ssid = makeSafeSSID(headers["wtv-client-serial-number"]); + socket.ssid = wtvshared.makeSafeSSID(headers["wtv-client-serial-number"]); if (socket.ssid != null) { if (!ssid_sessions[socket.ssid]) { - ssid_sessions[socket.ssid] = new WTVClientSessionData(socket.ssid,minisrv_config.config.hide_ssid_in_logs); + ssid_sessions[socket.ssid] = new WTVClientSessionData(minisrv_config, socket.ssid); ssid_sessions[socket.ssid].SaveIfRegistered(); } if (!ssid_sessions[socket.ssid].data_store.sockets) ssid_sessions[socket.ssid].data_store.sockets = new Set(); @@ -1015,96 +975,21 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq } } - var ip2long = function (ip) { - var components; - - if (components = ip.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/)) { - var iplong = 0; - var power = 1; - for (var i = 4; i >= 1; i -= 1) { - iplong += power * parseInt(components[i]); - power *= 256; - } - return iplong; - } - else return -1; - }; - - var isInSubnet = function (ip, subnet) { - var mask, base_ip, long_ip = ip2long(ip); - if ((mask = subnet.match(/^(.*?)\/(\d{1,2})$/)) && ((base_ip = ip2long(mask[1])) >= 0)) { - var freedom = Math.pow(2, 32 - parseInt(mask[2])); - return (long_ip > base_ip) && (long_ip < base_ip + freedom - 1); - } - else return false; - }; - - var rejectSSIDConnection = function (ssid, blacklist) { - if (blacklist) console.log(" * Request from SSID", filterSSID(ssid), "(" + socket.remoteAddr + "), but that SSID is in the blacklist, rejecting."); - else console.log(" * Request from SSID", filterSSID(socket.ssid), "(" + socket.remoteAddress + "), but that SSID is not in the whitelist, rejecting."); - - var errpage = doErrorPage(401, "Access to this service is denied."); - headers = errpage[0]; - data = errpage[1]; + var failed_security = checkSecurity(socket); + if (failed_security) { socket_sessions[socket.id].close_me = true; + headers = failed_security[0]; + data = failed_security[1]; } - var checkSSIDIPWhitelist = function (ssid, blacklist) { - var ssid_access_list_ip_override = false; - if (minisrv_config.config.ssid_ip_allow_list) { - if (minisrv_config.config.ssid_ip_allow_list[socket.ssid]) { - Object.keys(minisrv_config.config.ssid_ip_allow_list[socket.ssid]).forEach(function (k) { - if (minisrv_config.config.ssid_ip_allow_list[socket.ssid][k].indexOf('/') > 0) { - if (isInSubnet(socket.remoteAddress, minisrv_config.config.ssid_ip_allow_list[socket.ssid][k])) { - // remoteAddr is in allowed subnet - ssid_access_list_ip_override = true; - } - } else { - if (socket.remoteAddress == minisrv_config.config.ssid_ip_allow_list[socket.ssid][k]) { - // remoteAddr directly matches IP - ssid_access_list_ip_override = true; - } - } - }); - if (!ssid_access_list_ip_override) rejectSSIDConnection(socket.ssid, blacklist); - } else { - rejectSSIDConnection(socket.ssid, blacklist); - } - } else { - rejectSSIDConnection(socket.ssid, blacklist); - } - if (ssid_access_list_ip_override && zdebug) console.log(" * Request from disallowed SSID", filterSSID(ssid), "was allowed due to IP address whitelist"); - } - - // process whitelist first - if (socket.ssid && minisrv_config.config.ssid_allow_list) { - var ssid_is_in_whitelist = minisrv_config.config.ssid_allow_list.findIndex(element => element == socket.ssid); - if (ssid_is_in_whitelist == -1) { - // no whitelist match, but lets see if the remoteAddress is allowed - checkSSIDIPWhitelist(socket.ssid, false); - } - } - - // now check blacklist - if (socket.ssid && minisrv_config.config.ssid_block_list) { - var ssid_is_in_blacklist = minisrv_config.config.ssid_block_list.findIndex(element => element == socket.ssid); - if (ssid_is_in_blacklist != -1) { - // blacklist match, but lets see if the remoteAddress is allowed - checkSSIDIPWhitelist(socket.ssid, true); - } - } - - // Passed Security - if (headers["wtv-capability-flags"] != null) { if (!ssid_sessions[socket.ssid]) { - ssid_sessions[socket.ssid] = new WTVClientSessionData(socket.ssid,minisrv_config.config.hide_ssid_in_logs); + ssid_sessions[socket.ssid] = new WTVClientSessionData(minisrv_config, socket.ssid); ssid_sessions[socket.ssid].SaveIfRegistered(); } if (!ssid_sessions[socket.ssid].capabilities) ssid_sessions[socket.ssid].capabilities = new WTVClientCapabilities(headers["wtv-capability-flags"]); } - // log all client wtv- headers to the SessionData for that SSID // this way we can pull up client info such as wtv-client-rom-type or wtv-system-sysconfig if (socket.ssid) { @@ -1121,14 +1006,14 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq if (ssid_sessions[socket.ssid]) { if (headers["wtv-ticket"]) { if (!ssid_sessions[socket.ssid].data_store.wtvsec_login) { - ssid_sessions[socket.ssid].data_store.wtvsec_login = new WTVSec(); + ssid_sessions[socket.ssid].data_store.wtvsec_login = new WTVSec(minisrv_config); ssid_sessions[socket.ssid].data_store.wtvsec_login.IssueChallenge(); ssid_sessions[socket.ssid].data_store.wtvsec_login.set_incarnation(headers["wtv-incarnation"]); ssid_sessions[socket.ssid].data_store.wtvsec_login.ticket_b64 = headers["wtv-ticket"]; ssid_sessions[socket.ssid].data_store.wtvsec_login.DecodeTicket(ssid_sessions[socket.ssid].data_store.wtvsec_login.ticket_b64); } else { if (ssid_sessions[socket.ssid].data_store.wtvsec_login.ticket_b64 != headers["wtv-ticket"]) { - if (zdebug) console.log(" # New ticket from client"); + if (minisrv_config.config.debug_flags.debug) console.log(" # New ticket from client"); ssid_sessions[socket.ssid].data_store.wtvsec_login.ticket_b64 = headers["wtv-ticket"]; ssid_sessions[socket.ssid].data_store.wtvsec_login.DecodeTicket(ssid_sessions[socket.ssid].data_store.wtvsec_login.ticket_b64); ssid_sessions[socket.ssid].data_store.wtvsec_login.set_incarnation(headers["wtv-incarnation"]); @@ -1140,11 +1025,11 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq if ((headers.secure === true || headers.encrypted === true) && !skipSecure) { if (!socket_sessions[socket.id].wtvsec) { - if (!zquiet) console.log(" * Starting new WTVSec instance on socket", socket.id); + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Starting new WTVSec instance on socket", socket.id); if (ssid_sessions[socket.ssid].get("wtv-incarnation")) { - socket_sessions[socket.id].wtvsec = new WTVSec(ssid_sessions[socket.ssid].get("wtv-incarnation"), zdebug); + socket_sessions[socket.id].wtvsec = new WTVSec(minisrv_config, ssid_sessions[socket.ssid].get("wtv-incarnation")); } else { - socket_sessions[socket.id].wtvsec = new WTVSec(1, zdebug); + socket_sessions[socket.id].wtvsec = new WTVSec(minisrv_config); } socket_sessions[socket.id].wtvsec.DecodeTicket(headers["wtv-ticket"]); socket_sessions[socket.id].wtvsec.ticket_b64 = headers["wtv-ticket"]; @@ -1152,7 +1037,7 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq } if (socket_sessions[socket.id].secure != true) { // first time so reroll sessions - if (zdebug) console.log(" # [ SECURE ON BLOCK (" + socket.id + ") ]"); + if (minisrv_config.config.debug_flags.debug) console.log(" # [ SECURE ON BLOCK (" + socket.id + ") ]"); socket_sessions[socket.id].secure = true; } if (!headers.request_url) { @@ -1166,46 +1051,37 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq } var enc_data = CryptoJS.enc.Hex.parse(data_hex.substring(header_length * 2)); if (enc_data.sigBytes > 0) { - if (isUnencryptedString(enc_data.toString(CryptoJS.enc.Latin1), (!skipSecure && !encryptedRequest))) { - // some builds (like our targeted 3833), send SECURE ON but then unencrypted headers - if (zdebug) console.log(" # Psuedo-encrypted Request (SECURE ON)", "on", socket.id); - // don't actually encrypt output - headers.psuedo_encryption = true; - ssid_sessions[socket.ssid].set("box-does-psuedo-encryption", true); - socket_sessions[socket.id].secure = false; - var secure_headers = await processRequest(socket, enc_data.toString(CryptoJS.enc.Hex), true, true); - } else { - // SECURE ON and detected encrypted data - ssid_sessions[socket.ssid].set("box-does-psuedo-encryption", false); - var dec_data = CryptoJS.lib.WordArray.create(socket_sessions[socket.id].wtvsec.Decrypt(0, enc_data)) - if (!socket_sessions[socket.id].secure_buffer) socket_sessions[socket.id].secure_buffer = ""; - socket_sessions[socket.id].secure_buffer += dec_data.toString(CryptoJS.enc.Hex); - var secure_headers = null; - if (headers['request']) { - if (headers['request'] == "GET") { - if (socket_sessions[socket.id].secure_buffer.indexOf("0d0a0d0a") || socket_sessions[socket.id].secure_buffer.indexOf("0a0a")) { - secure_headers = await processRequest(socket, socket_sessions[socket.id].secure_buffer, true, true); - } - } else { - secure_headers = await processRequest(socket, socket_sessions[socket.id].secure_buffer, true, true); + + // SECURE ON and detected encrypted data + var dec_data = CryptoJS.lib.WordArray.create(socket_sessions[socket.id].wtvsec.Decrypt(0, enc_data)) + if (!socket_sessions[socket.id].secure_buffer) socket_sessions[socket.id].secure_buffer = ""; + socket_sessions[socket.id].secure_buffer += dec_data.toString(CryptoJS.enc.Hex); + var secure_headers = null; + if (headers['request']) { + if (headers['request'] == "GET") { + if (socket_sessions[socket.id].secure_buffer.indexOf("0d0a0d0a") || socket_sessions[socket.id].secure_buffer.indexOf("0a0a")) { + secure_headers = await processRequest(socket, socket_sessions[socket.id].secure_buffer, true, true); } } else { - secure_headers = await processRequest(socket, socket_sessions[socket.id].secure_buffer, true, true); - } - if (!secure_headers) return; - - delete socket_sessions[socket.id].secure_buffer; - if (zdebug) console.log(" # Encrypted Request (SECURE ON)", "on", socket.id); - if (zshowheaders) console.log(secure_headers); - if (!secure_headers.request) { - socket_sessions[socket.id].secure = false; - var errpage = doErrorPage(400); - headers = errpage[0]; - data = errpage[1]; - sendToClient(socket, headers, data); - return; + secure_headers = await processRequest(socket, socket_sessions[socket.id].secure_buffer, true, true); } + } else { + secure_headers = await processRequest(socket, socket_sessions[socket.id].secure_buffer, true, true); } + if (!secure_headers) return; + + delete socket_sessions[socket.id].secure_buffer; + if (minisrv_config.config.debug_flags.debug) console.log(" # Encrypted Request (SECURE ON)", "on", socket.id); + if (minisrv_config.config.debug_flags.show_headers) console.log(secure_headers); + if (!secure_headers.request) { + socket_sessions[socket.id].secure = false; + var errpage = doErrorPage(400); + headers = errpage[0]; + data = errpage[1]; + sendToClient(socket, headers, data); + return; + } + // Merge new headers into existing headers object Object.keys(secure_headers).forEach(function (k) { headers[k] = secure_headers[k]; @@ -1232,8 +1108,9 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq } // handle POST - if (headers['request']) { + if (headers['request'] && !socket_sessions[socket.id].expecting_post_data) { if (headers['request'].substring(0, 4) == "POST") { + socket.setTimeout(minisrv_config.config.post_data_socket_timeout * 1000); if (typeof socket_sessions[socket.id].post_data == "undefined") { if (socket_sessions[socket.id].post_data_percents_shown) delete socket_sessions[socket.id].post_data_percents_shown; socket_sessions[socket.id].post_data_length = headers['Content-length'] || headers['Content-Length'] || 0; @@ -1241,35 +1118,36 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq socket_sessions[socket.id].post_data = ""; socket_sessions[socket.id].headers = headers; var post_string = "POST"; - if (socket_sessions[socket.id].secure == true) { - post_string = "Encrypted " + post_string; - } + if (socket_sessions[socket.id].secure) post_string = "Encrypted " + post_string; // the client may have just sent the data with the primary headers, so lets look for that. if (data_hex.indexOf("0d0a0d0a") != -1) socket_sessions[socket.id].post_data = data_hex.substring(data_hex.indexOf("0d0a0d0a") + 8); if (data_hex.indexOf("0a0a") != -1) socket_sessions[socket.id].post_data = data_hex.substring(data_hex.indexOf("0a0a") + 4); - } + if (socket_sessions[socket.id].post_data.length == (socket_sessions[socket.id].post_data_length * 2)) { // got all expected data if (socket_sessions[socket.id].expecting_post_data) delete socket_sessions[socket.id].expecting_post_data; - console.log(" * Incoming", post_string, "request on", socket.id, "from", filterSSID(socket.ssid), "to", headers['request_url'], "(got all expected", socket_sessions[socket.id].post_data_length, "bytes of data from client already)"); + console.log(" * Incoming", post_string, "request on", socket.id, "from", wtvshared.filterSSID(socket.ssid), "to", headers['request_url'], "(got all expected", socket_sessions[socket.id].post_data_length, "bytes of data from client already)"); headers.post_data = CryptoJS.enc.Hex.parse(socket_sessions[socket.id].post_data); - if (socket_sessions[socket.id].headers) delete socket_sessions[socket.id].headers; + delete socket_sessions[socket.id].headers; + delete socket_sessions[socket.id].post_data; + delete socket_sessions[socket.id].post_data_length; processURL(socket, headers); - } else { - // expecting more data (see below) - socket_sessions[socket.id].expecting_post_data = true; - console.log(" * Incoming", post_string, "request on", socket.id, "from", filterSSID(socket.ssid), "to", headers['request_url'], "(expecting", socket_sessions[socket.id].post_data_length, "bytes of data from client...)"); - } - if (socket_sessions[socket.id].post_data.length > (socket_sessions[socket.id].post_data_length * 2)) { - // got too much data ? ... should not ever reach this code - var errpage = doErrorPage(400, "Received too much data in POST request
    Got " + (socket_sessions[socket.id].post_data.length / 2) + ", expected " + socket_sessions[socket.id].post_data_length); + } else if (socket_sessions[socket.id].post_data.length > (socket_sessions[socket.id].post_data_length * 2)) { + // got too much data ? ... should not ever reach this code (section 2) + var errpage = doErrorPage(400, "Received too much data in POST request
    Got " + (socket_sessions[socket.id].post_data.length / 2) + ", expected " + socket_sessions[socket.id].post_data_length) + " (2)"; headers = errpage[0]; data = errpage[1]; sendToClient(socket, headers, data); return; - } + } else { + // expecting more data (see below) + socket_sessions[socket.id].expecting_post_data = true; + if (!socket_sessions[socket.id].post_data) socket_sessions[socket.id].post_data = ''; + socket_sessions[socket.id].post_data += CryptoJS.enc.Hex.parse(socket_sessions[socket.id].post_data); + console.log(" * Incoming", post_string, "request on", socket.id, "from", wtvshared.filterSSID(socket.ssid), "to", headers['request_url'], "(expecting", socket_sessions[socket.id].post_data_length, "bytes of data from client...)"); + } return; } else { delete socket_sessions[socket.id].headers; @@ -1306,15 +1184,12 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq console.log(" * ", Math.floor(new Date().getTime() / 1000), "Receiving", post_string, "data on", socket.id, "[", socket_sessions[socket.id].post_data.length / 2, "of", socket_sessions[socket.id].post_data_length, "bytes ]"); } else { // calculate and display percentage of data received - var getPercentage = function (partialValue, totalValue) { - return Math.floor((100 * partialValue) / totalValue); - } - var postPercent = getPercentage(socket_sessions[socket.id].post_data.length, (socket_sessions[socket.id].post_data_length * 2)); + var postPercent = wtvshared.getPercentage(socket_sessions[socket.id].post_data.length, (socket_sessions[socket.id].post_data_length * 2)); if (minisrv_config.config.post_percentages) { if (minisrv_config.config.post_percentages.includes(postPercent)) { if (!socket_sessions[socket.id].post_data_percents_shown) socket_sessions[socket.id].post_data_percents_shown = new Array(); if (!socket_sessions[socket.id].post_data_percents_shown[postPercent]) { - console.log(" * Received", postPercent, "% of", socket_sessions[socket.id].post_data_length, "bytes on", socket.id, "from", filterSSID(socket.ssid)); + console.log(" * Received", postPercent, "% of", socket_sessions[socket.id].post_data_length, "bytes on", socket.id, "from", wtvshared.filterSSID(socket.ssid)); socket_sessions[socket.id].post_data_percents_shown[postPercent] = true; } if (postPercent == 100) delete socket_sessions[socket.id].post_data_percents_shown; @@ -1325,20 +1200,21 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq if (socket_sessions[socket.id].post_data.length == (socket_sessions[socket.id].post_data_length * 2)) { // got all expected data if (socket_sessions[socket.id].expecting_post_data) delete socket_sessions[socket.id].expecting_post_data; + socket.setTimeout(minisrv_config.config.socket_timeout * 1000); headers.post_data = CryptoJS.enc.Hex.parse(socket_sessions[socket.id].post_data); if (socket_sessions[socket.id].secure == true) { - if (zdebug) console.log(" # Encrypted POST Content (SECURE ON)", "on", socket.id, "[", headers.post_data.sigBytes, "bytes ]"); + if (minisrv_config.config.debug_flags.debug) console.log(" # Encrypted POST Content (SECURE ON)", "on", socket.id, "[", headers.post_data.sigBytes, "bytes ]"); } else { - if (zdebug) console.log(" # Unencrypted POST Content", "on", socket.id); + if (minisrv_config.config.debug_flags.debug) console.log(" # Unencrypted POST Content", "on", socket.id); } delete socket_sessions[socket.id].headers; delete socket_sessions[socket.id].post_data; delete socket_sessions[socket.id].post_data_length; processURL(socket, headers); return; - } - if (socket_sessions[socket.id].post_data.length > (socket_sessions[socket.id].post_data_length * 2)) { + } else if (socket_sessions[socket.id].post_data.length > (socket_sessions[socket.id].post_data_length * 2)) { if (socket_sessions[socket.id].expecting_post_data) delete socket_sessions[socket.id].expecting_post_data; + socket.setTimeout(minisrv_config.config.socket_timeout * 1000); // got too much data ? ... should not ever reach this code var errpage = doErrorPage(400, "Received too much data in POST request
    Got " + (socket_sessions[socket.id].post_data.length / 2) + ", expected " + socket_sessions[socket.id].post_data_length); headers = errpage[0]; @@ -1350,7 +1226,7 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq } else if (!skipSecure) { if (!encryptedRequest) { if (socket_sessions[socket.id].secure != true) { - socket_sessions[socket.id].wtvsec = new WTVSec(1, zdebug); + socket_sessions[socket.id].wtvsec = new WTVSec(minisrv_config); socket_sessions[socket.id].wtvsec.IssueChallenge(); socket_sessions[socket.id].wtvsec.SecureOn(); socket_sessions[socket.id].secure = true; @@ -1414,7 +1290,7 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq async function cleanupSocket(socket) { try { if (socket_sessions[socket.id]) { - if (!zquiet) console.log(" * Cleaning up disconnected socket", socket.id); + if (!minisrv_config.config.debug_flags.quiet) console.log(" * Cleaning up disconnected socket", socket.id); delete socket_sessions[socket.id]; } if (socket.ssid) { @@ -1434,7 +1310,7 @@ async function cleanupSocket(socket) { // set timeout to check ssid_sessions[socket.ssid].data_store.socket_check = setTimeout(function (ssid) { if (ssid_sessions[ssid].currentConnections() === 0) { - if (!zquiet) console.log(" * WebTV SSID", filterSSID(ssid), " has not been seen in", (timeout / 1000), "seconds, cleaning up session data for this SSID"); + if (!minisrv_config.config.debug_flags.quiet) console.log(" * WebTV SSID", wtvshared.filterSSID(ssid), " has not been seen in", (timeout / 1000), "seconds, cleaning up session data for this SSID"); delete ssid_sessions[ssid]; } }, timeout, socket.ssid); @@ -1453,21 +1329,25 @@ async function handleSocket(socket) { socket_sessions[socket.id] = []; socket.minisrv_pc_mode = false; socket.setEncoding('hex'); //set data encoding (Text: 'ascii', 'utf8' ~ Binary: 'hex', 'base64' (do not trust 'binary' encoding)) - socket.setTimeout(10800000); // 3 hours + socket.setTimeout(minisrv_config.config.socket_timeout * 1000); socket.on('data', function (data_hex) { - if (!socket_sessions[socket.id].secure && !socket_sessions[socket.id].expecting_post_data) { - // buffer unencrypted data until we see the classic double-newline, or get blank - if (!socket_sessions[socket.id].header_buffer) socket_sessions[socket.id].header_buffer = ""; - socket_sessions[socket.id].header_buffer += data_hex; - if (socket_sessions[socket.id].header_buffer.indexOf("0d0a0d0a") != -1 || socket_sessions[socket.id].header_buffer.indexOf("0a0a") != -1) { - data_hex = socket_sessions[socket.id].header_buffer; - delete socket_sessions[socket.id].header_buffer; + if (socket_sessions[socket.id]) { + if (!socket_sessions[socket.id].secure && !socket_sessions[socket.id].expecting_post_data) { + // buffer unencrypted data until we see the classic double-newline, or get blank + if (!socket_sessions[socket.id].header_buffer) socket_sessions[socket.id].header_buffer = ""; + socket_sessions[socket.id].header_buffer += data_hex; + if (socket_sessions[socket.id].header_buffer.indexOf("0d0a0d0a") != -1 || socket_sessions[socket.id].header_buffer.indexOf("0a0a") != -1) { + data_hex = socket_sessions[socket.id].header_buffer; + delete socket_sessions[socket.id].header_buffer; + processRequest(this, data_hex); + } + } else { + // stream encrypted requests through the processor + if (socket_sessions[socket.id].header_buffer) delete socket_sessions[socket.id].header_buffer; processRequest(this, data_hex); } } else { - // stream encrypted requests through the processor - if (socket_sessions[socket.id].header_buffer) delete socket_sessions[socket.id].header_buffer; - processRequest(this, data_hex); + cleanupSocket(socket); } }); @@ -1563,7 +1443,7 @@ try { } } } catch (e) { - if (zdebug) console.error(" * Notice: Could not find user configuration (user_config.json). Using default configuration."); + if (minisrv_config.config.debug_flags.debug) console.error(" * Notice: Could not find user configuration (user_config.json). Using default configuration."); } if (throw_me) { @@ -1645,40 +1525,41 @@ process.on('uncaughtException', function (err) { }); // defaults -var zdebug = false; -var zquiet = true; // will squash zdebug even if its true -var zshowheaders = false; +minisrv_config.config.debug_flags = []; +minisrv_config.config.debug_flags.debug = false; +minisrv_config.config.debug_flags.quiet = true; // will squash minisrv_config.config.debug_flags.debug even if its true +minisrv_config.config.debug_flags.show_headers = false; if (minisrv_config.config.verbosity) { switch (minisrv_config.config.verbosity) { case 0: - zdebug = false; - zquiet = true; - zshowheaders = false; + minisrv_config.config.debug_flags.debug = false; + minisrv_config.config.debug_flags.quiet = true; + minisrv_config.config.debug_flags.show_headers = false; console.log(" * Console Verbosity level 0 (quietest)") break; case 1: - zdebug = false; - zquiet = true; - zshowheaders = true; + minisrv_config.config.debug_flags.debug = false; + minisrv_config.config.debug_flags.quiet = true; + minisrv_config.config.debug_flags.show_headers = true; console.log(" * Console Verbosity level 1 (headers shown)") break; case 2: - zdebug = true; - zquiet = true; - zshowheaders = false; + minisrv_config.config.debug_flags.debug = true; + minisrv_config.config.debug_flags.quiet = true; + minisrv_config.config.debug_flags.show_headers = false; console.log(" * Console Verbosity level 2 (verbose without headers)") break; case 3: - zdebug = true; - zquiet = true; - zshowheaders = true; + minisrv_config.config.debug_flags.debug = true; + minisrv_config.config.debug_flags.quiet = true; + minisrv_config.config.debug_flags.show_headers = true; console.log(" * Console Verbosity level 3 (verbose with headers)") break; default: - zdebug = true; - zquiet = false; - zshowheaders = true; + minisrv_config.config.debug_flags.debug = true; + minisrv_config.config.debug_flags.quiet = false; + minisrv_config.config.debug_flags.show_headers = true; console.log(" * Console Verbosity level 4 (debug verbosity)") break; } @@ -1702,6 +1583,8 @@ bind_ports.forEach(function (v) { initstring = initstring.substring(0, initstring.length - 2); +const wtvshared = new WTVShared(minisrv_config); +const wtvmime = new WTVMime(minisrv_config); 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"; diff --git a/zefie_wtvp_minisrv/config.json b/zefie_wtvp_minisrv/config.json index 80bd772d..db14be70 100644 --- a/zefie_wtvp_minisrv/config.json +++ b/zefie_wtvp_minisrv/config.json @@ -13,12 +13,15 @@ "hide_ssid_in_logs": true, "post_percentages": [ 0, 25, 50, 100 ], "verbosity": 2, + "socket_timeout": 86400, + "post_data_socket_timeout": 30, "error_log_file": "errors.log", "catchall_file_name": "catchall.js", "enable_lzpf_compression": false, "enable_gzip_compression": true, "pc_server_hidden_service": "http_pc", "pc_server_hidden_service_enabled": false, + "show_diskmap": false, "allow_guests": true }, "services": { diff --git a/zefie_wtvp_minisrv/package.json b/zefie_wtvp_minisrv/package.json index f16d9473..3486c8d5 100644 --- a/zefie_wtvp_minisrv/package.json +++ b/zefie_wtvp_minisrv/package.json @@ -1,6 +1,6 @@ { "name": "zefie_wtvp_minisrv", - "version": "0.9.16", + "version": "0.9.18", "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 17205247..29397b0b 100644 --- a/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj +++ b/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj @@ -52,6 +52,10 @@ Code + + + Code + Code @@ -275,12 +279,18 @@ Code + + Code + Code Code + + Code + Code @@ -288,6 +298,9 @@ Code + + Code +