From dd5b274784a09b0882b91c2cfecef985570343d0 Mon Sep 17 00:00:00 2001 From: zefie Date: Tue, 10 Aug 2021 00:20:03 -0400 Subject: [PATCH] rewrite wtv-disk system - move wtv-update to wtv-disk - allow accessing wtv-disk:/sync?group=&diskmap= - rewrite Download List generation to be more proper - only send files if diskmap has changed - allow force redownload with &force=true --- .../content/DealerDemo/allyouneed.html | 0 .../content/DealerDemo/allyouneed.swf | Bin .../content/DealerDemo/attractloop.swf | Bin .../content/DealerDemo/communicate.html | 0 .../content/DealerDemo/communicate.swf | Bin .../DealerDemo/images/buttonsplus_all.gif | Bin .../DealerDemo/images/buttonsplus_comm.gif | Bin .../images/buttonsplus_interactive.gif | Bin .../images/buttonsplus_internet.gif | Bin .../DealerDemo/images/buttonsplus_try.gif | Bin .../content/DealerDemo/images/spacer.gif | Bin .../content/DealerDemo/index.html | 0 .../content/DealerDemo/interactive.html | 0 .../content/DealerDemo/interactive.swf | Bin .../content/DealerDemo/internet.html | 0 .../content/DealerDemo/internet.swf | Bin .../content/DealerDemo/mainmenu.html | 0 .../content/DealerDemo/mainmenu.swf | Bin .../content/DealerDemo/trymsntv.html | 0 .../content/DealerDemo/trymsntv.swf | Bin .../content/diskmaps/DealerDemo.json | 0 .../ServiceVault/wtv-disk/sync.js | 311 ++++++++++++++++++ .../ServiceVault/wtv-home/home.js | 2 +- .../ServiceVault/wtv-update/DealerDemo.js | 51 --- .../ServiceVault/wtv-update/sync.js | 187 ----------- .../ServiceVault/wtv-update/updatesuccess.txt | 4 - zefie_wtvp_minisrv/app.js | 7 +- zefie_wtvp_minisrv/config.json | 2 +- zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj | 12 +- 29 files changed, 322 insertions(+), 254 deletions(-) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/allyouneed.html (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/allyouneed.swf (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/attractloop.swf (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/communicate.html (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/communicate.swf (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/images/buttonsplus_all.gif (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/images/buttonsplus_comm.gif (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/images/buttonsplus_interactive.gif (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/images/buttonsplus_internet.gif (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/images/buttonsplus_try.gif (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/images/spacer.gif (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/index.html (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/interactive.html (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/interactive.swf (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/internet.html (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/internet.swf (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/mainmenu.html (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/mainmenu.swf (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/trymsntv.html (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/DealerDemo/trymsntv.swf (100%) rename zefie_wtvp_minisrv/ServiceVault/{wtv-update => wtv-disk}/content/diskmaps/DealerDemo.json (100%) create mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-disk/sync.js delete mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-update/DealerDemo.js delete mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-update/sync.js delete mode 100644 zefie_wtvp_minisrv/ServiceVault/wtv-update/updatesuccess.txt diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/allyouneed.html b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/allyouneed.html similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/allyouneed.html rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/allyouneed.html diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/allyouneed.swf b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/allyouneed.swf similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/allyouneed.swf rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/allyouneed.swf diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/attractloop.swf b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/attractloop.swf similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/attractloop.swf rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/attractloop.swf diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/communicate.html b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/communicate.html similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/communicate.html rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/communicate.html diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/communicate.swf b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/communicate.swf similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/communicate.swf rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/communicate.swf diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/images/buttonsplus_all.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/images/buttonsplus_all.gif similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/images/buttonsplus_all.gif rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/images/buttonsplus_all.gif diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/images/buttonsplus_comm.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/images/buttonsplus_comm.gif similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/images/buttonsplus_comm.gif rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/images/buttonsplus_comm.gif diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/images/buttonsplus_interactive.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/images/buttonsplus_interactive.gif similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/images/buttonsplus_interactive.gif rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/images/buttonsplus_interactive.gif diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/images/buttonsplus_internet.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/images/buttonsplus_internet.gif similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/images/buttonsplus_internet.gif rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/images/buttonsplus_internet.gif diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/images/buttonsplus_try.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/images/buttonsplus_try.gif similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/images/buttonsplus_try.gif rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/images/buttonsplus_try.gif diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/images/spacer.gif b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/images/spacer.gif similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/images/spacer.gif rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/images/spacer.gif diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/index.html b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/index.html similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/index.html rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/index.html diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/interactive.html b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/interactive.html similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/interactive.html rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/interactive.html diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/interactive.swf b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/interactive.swf similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/interactive.swf rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/interactive.swf diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/internet.html b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/internet.html similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/internet.html rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/internet.html diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/internet.swf b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/internet.swf similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/internet.swf rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/internet.swf diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/mainmenu.html b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/mainmenu.html similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/mainmenu.html rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/mainmenu.html diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/mainmenu.swf b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/mainmenu.swf similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/mainmenu.swf rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/mainmenu.swf diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/trymsntv.html b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/trymsntv.html similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/trymsntv.html rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/trymsntv.html diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/trymsntv.swf b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/trymsntv.swf similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/DealerDemo/trymsntv.swf rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/DealerDemo/trymsntv.swf diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/content/diskmaps/DealerDemo.json b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/diskmaps/DealerDemo.json similarity index 100% rename from zefie_wtvp_minisrv/ServiceVault/wtv-update/content/diskmaps/DealerDemo.json rename to zefie_wtvp_minisrv/ServiceVault/wtv-disk/content/diskmaps/DealerDemo.json diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-disk/sync.js b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/sync.js new file mode 100644 index 00000000..8f8429b6 --- /dev/null +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-disk/sync.js @@ -0,0 +1,311 @@ +// todo: async + +var force_update = (request_headers.query.force == "true") ? true : false; +console.log(force_update); +if (request_headers['wtv-request-type'] == 'download') { + var path = require("path"); + + var content_dir = "content/" + var diskmap_dir = content_dir + "diskmaps/"; + + function generateDownloadList(diskmap_group_data, update_list, diskmap_data) { + // create WebTV Download List + var newest_file_epoch = 0; + var download_list = ''; + + if (diskmap_data.execute && diskmap_data.execute_when == "atStart") { + download_list += "EXECUTE " + diskmap_data.execute + "\n\n"; + } + + if (diskmap_data.partition_size) { + download_list += "CREATE " + diskmap_data.base + "\n"; + download_list += "partition-size: " + diskmap_data.partition_size + "\n\n"; + } + + download_list += "CREATE-GROUP " + diskmap_group_data + "-UPDATE\n"; + download_list += "state: invalid\n"; + download_list += "base: " + diskmap_data.base + ".GROUP-UPDATE/\n\n"; + + download_list += "CREATE-GROUP " + diskmap_group_data + "\n"; + download_list += "state: invalid\n"; + download_list += "service-owned: " + (diskmap_data.service_owned || false) + "\n"; + download_list += "base: " + diskmap_data.base + "\n\n"; + + Object.keys(update_list).forEach(function (k) { + if (!update_list[k].invalid) return; + download_list += "DELETE " + update_list[k].file.replace(diskmap_data.base, "") + "\n"; + download_list += "group: " + diskmap_group_data + "\n\n"; + }); + + Object.keys(update_list).forEach(function (k) { + if (update_list[k].checksum_match && !force_update) return; + if (!update_list[k].invalid && !force_update) return; + download_list += "DISPLAY " + update_list[k].display + "\n\n"; + download_list += "GET " + update_list[k].file.replace(diskmap_data.base, "") + "\n"; + download_list += "group: " + diskmap_group_data + "-UPDATE\n"; + download_list += "location: " + service_name + ":/" + update_list[k].location + "\n"; + download_list += "file-permission: r\n" + download_list += "wtv-checksum: " + update_list[k].checksum + "\n"; + download_list += "service-source-location: /webtv/content/" + service_name.replace("wtv-", "") + "d/" + update_list[k].location + "\n"; + download_list += "client-dest-location: " + update_list[k].file + "\n\n"; + }); + + download_list += "CREATE-GROUP " + diskmap_group_data + "\n"; + download_list += "state: invalid\n"; + download_list += "service-owned: " + (diskmap_data.service_owned || false) + "\n"; + download_list += "base: " + diskmap_data.base + "\n\n"; + + + Object.keys(update_list).forEach(function (k) { + if (!update_list[k].invalid) return; + download_list += "RENAME " + update_list[k].file.replace(diskmap_data.base, "") + "\n"; + download_list += "group: " + diskmap_group_data + "-UPDATE\n"; + download_list += "destination-group: " + diskmap_group_data + "\n"; + download_list += "location: " + update_list[k].file.replace(diskmap_data.base, "") + "\n\n"; + }); + + download_list += "SET-GROUP " + diskmap_group_data + "\n"; + download_list += "state: ok\n"; + download_list += "version: " + diskmap_data.version + "\n"; + download_list += "last-checkup-time: " + new Date().toUTCString().replace("GMT", "+0000") + "\n\n"; + + if (diskmap_data.execute && diskmap_data.execute_when == "atEnd") { + download_list += "EXECUTE " + diskmap_data.execute + "\n\n"; + } + + download_list += "DELETE-GROUP " + diskmap_group_data + "-UPDATE\n\n"; + download_list += "DELETE " + diskmap_data.base + ".GROUP-UPDATE/\n\n"; + 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_current_directory = ''; + var post_data_current_file = false; + var post_data_current_group = ''; + var post_data_last_modified = false; + var post_data_content_length = false; + var post_data_current_group_state = false; + var post_data_fileinfo = new Array(); + var entry_type = false; + var post_data_current_version = false; + var post_data_current_checksum = false; + var post_data_last_checkup_time = 0; + Object.keys(post_data).forEach(function (k) { + if (post_data[k].substring(0, 7) == "file://") { + entry_type = "folder"; + post_data_current_file = false; + post_data_current_version = false; + post_data_last_checkup_time = 0; + post_data_current_group = ''; + post_data_current_group_state = false; + post_data_last_modified = false; + post_data_content_length = false; + post_data_current_checksum = false; + post_data_current_directory = post_data[k]; + } else { + if (post_data[k].indexOf(":") > 0) { + var post_data_line = post_data[k].split(": ") + var post_data_line_name = post_data_line[0]; + post_data_line.shift(); + var post_data_line_data = post_data_line.join(": "); + + switch (post_data_line_name.toLowerCase()) { + case "last-modified": + post_data_last_modified = (new Date(new Date(Date.parse(post_data_line_data)).toUTCString()) / 1000); + break; + case "content-length": + post_data_content_length = parseInt(post_data_line_data); + break; + case "version": + post_data_current_version = parseInt(post_data_line_data); + break; + case "group": + post_data_current_group = post_data_line_data; + break; + case "state": + post_data_current_group_state = post_data_line_data; + break; + case "wtv-checksum": + post_data_current_checksum = post_data_line_data; + break; + case "last-checkup-time": + post_data_last_checkup_time = (new Date(new Date(Date.parse(post_data_line_data)).toUTCString()) / 1000); + break; + } + } else { + if (!entry_type && post_data[k] != "") { + entry_type = "file"; + post_data_current_file = post_data[k]; + } + + if (post_data[k] == "" && entry_type) { + var post_data_current_path = ((entry_type == "file") ? (post_data_current_directory + post_data_current_file) : post_data_current_directory); + var index = post_data_current_path.replace(/[\:\/]/g, "_").toLowerCase() + "_" + post_data_current_group; + if (index.match(/\/$/)) entry_type = "folder"; + if (!post_data_fileinfo[index]) post_data_fileinfo[index] = new Array(); + post_data_fileinfo[index].entry_type = entry_type; + post_data_fileinfo[index].file = post_data_current_path; + post_data_fileinfo[index].group = post_data_current_group; + post_data_fileinfo[index].version = post_data_current_version || 0; + if (post_data_current_checksum) post_data_fileinfo[index].checksum = post_data_current_checksum; + if (post_data_current_group_state) post_data_fileinfo[index].state = post_data_current_group_state; + if (post_data_last_checkup_time) post_data_fileinfo[index].last_checkup = post_data_last_checkup_time; + if (post_data_last_modified) post_data_fileinfo[index].last_modified = post_data_last_modified; + if (post_data_content_length) post_data_fileinfo[index].content_length = post_data_content_length; + entry_type = false; + } + } + } + }); + var wtv_download_list = new Array(); + var newest_file_epoch = 0; + Object.keys(diskmap_group_data.files).forEach(function (k) { + if (!diskmap_group_data.files[k].location) diskmap_group_data.files[k].location = diskmap_group_data.location + diskmap_group_data.files[k].file.replace(diskmap_group_data.base, ""); + var post_match_file = null; + Object.keys(service_vaults).forEach(function (g) { + if (post_match_file != null) return; + post_match_file = service_vaults[g] + "/" + service_name + "/" + diskmap_group_data.files[k].location; + 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, + flags: 'r' + })); + 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(); + + 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]); + }); + // check to see if client says they have this version + diskmap_group_data.version = newest_file_epoch; + Object.keys(wtv_download_list).forEach(function (k) { + wtv_download_list[k].version = newest_file_epoch; + Object.keys(post_data_fileinfo).forEach(function (g) { + if (post_data_fileinfo[g].file == wtv_download_list[k] || post_data_fileinfo[g].file == wtv_download_list[k].base) { + diskmap_group_data.group_exists = true; + if (diskmap_group_data.files[k].checksum.toLowerCase() == post_data_fileinfo[g].checksum) wtv_download_list[k].invalid = false; + else if (post_data_fileinfo[g].version == wtv_download_list[k].version && post_data_fileinfo[g].state != "invalid") wtv_download_list[k].invalid = false; + } + }); + }); + var diskmap_group_name = (diskmap_subgroup == null) ? diskmap_primary_group : diskmap_primary_group + "-" + diskmap_subgroup; + output_data = generateDownloadList(diskmap_group_name, wtv_download_list, diskmap_group_data); + return output_data; + } + + if (request_headers.query.diskmap && request_headers.query.group && request_headers.post_data) { + var diskmap_json_file = null; + Object.keys(service_vaults).forEach(function (g) { + if (diskmap_json_file != null) return; + diskmap_json_file = service_vaults[g] + "/" + service_name + "/" + diskmap_dir + request_headers.query.diskmap + ".json"; + if (!fs.existsSync(diskmap_json_file)) diskmap_json_file = null; + }); + + if (diskmap_json_file != null) { + if (fs.lstatSync(diskmap_json_file)) { + try { + // read diskmap + var diskmap_data = JSON.parse(fs.readFileSync(diskmap_json_file).toString()); + if (!diskmap_data[request_headers.query.group]) { + throw ("Invalid diskmap data (group does not match)"); + } + data = ''; + diskmap_data = diskmap_data[request_headers.query.group]; + if (!diskmap_data.location) { + Object.keys(diskmap_data).forEach(function (k) { + if (diskmap_data[k]) data += processGroup(request_headers.query.group, diskmap_data[k], k); + }); + } else { + data = processGroup(request_headers.query.group, diskmap_data); + } + + headers = "200 OK\nContent-Type: wtv/download-list"; + } catch (e) { + var errpage = doErrorPage(400); + headers = errpage[0]; + data = errpage[1]; + console.error(" # " + service_name+":/sync error", e); + } + } + } else { + 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"); + } + } else { + var errpage = doErrorPage(400); + headers = errpage[0]; + data = errpage[1]; + if (zdebug) 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. + +

+ +

+ + + +
+ + +`; + +} \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js b/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js index bb241925..56e1609a 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-home/home.js @@ -58,7 +58,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 MSNTV DealerDemo: Download ~ Access (after Download)
  • \n"; } } diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/DealerDemo.js b/zefie_wtvp_minisrv/ServiceVault/wtv-update/DealerDemo.js deleted file mode 100644 index ecf03f93..00000000 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-update/DealerDemo.js +++ /dev/null @@ -1,51 +0,0 @@ -headers = `200 OK -Content-Type: text/html` - -data = ` - - - - Retrieving Files - - - - - - - -
    - - - - - - -
    - Retrieving Files -
    -
    -
    -
    - - - -
    - - - Your Internet terminal is retrieving some files. -

    This may take a while. - -

    - -

    - - - -
    - -` \ No newline at end of file diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/sync.js b/zefie_wtvp_minisrv/ServiceVault/wtv-update/sync.js deleted file mode 100644 index 032a8dc5..00000000 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-update/sync.js +++ /dev/null @@ -1,187 +0,0 @@ -// todo: async - -var path = require("path"); - -var content_dir = "content/" -var diskmap_dir = content_dir + "diskmaps/"; - -function generateDownloadList(diskmap_group_data, update_list, diskmap_data) { - // create WebTV Download List - - var newest_file_epoch = 0; - var download_list = ''; - - if (diskmap_data.partition_size) { - download_list += "CREATE " + diskmap_data.base + "\n"; - download_list += "partition-size: " + diskmap_data.partition_size + "\n\n"; - } - - download_list += "CREATE-GROUP " + diskmap_group_data + "-UPDATE\n"; - download_list += "state: invalid\n"; - download_list += "base: " + diskmap_data.base + ".GROUP-UPDATE/\n\n"; - - Object.keys(update_list).forEach(function (k) { - if (parseInt(update_list[k]["Last-modified"]) > newest_file_epoch) newest_file_epoch = parseInt(update_list[k]["Last-modified"]); - download_list += "DISPLAY " + update_list[k].display + "\n\n"; - download_list += "GET " + update_list[k].file.replace(diskmap_data.base, "") + "\n"; - download_list += "group: " + diskmap_group_data + "-UPDATE\n"; - download_list += "location: " + service_name + ":/" + update_list[k].location + "\n"; - download_list += "file-permission: r\n" - download_list += "wtv-checksum: " + update_list[k]["wtv-checksum"] + "\n"; - download_list += "service-source-location: /webtv/content/" + service_name.replace("wtv-","") + "d/" + update_list[k].location + "\n"; - download_list += "client-dest-location: " + update_list[k].file + "\n\n"; - }); - - download_list += "CREATE-GROUP " + diskmap_group_data + "\n"; - download_list += "state: invalid\n"; - download_list += "service-owned: " + (diskmap_data.service_owned || false) + "\n"; - download_list += "base: " + diskmap_data.base + "\n\n"; - - Object.keys(update_list).forEach(function (k) { - download_list += "DELETE " + update_list[k].file.replace(diskmap_data.base, "") + "\n"; - download_list += "group: " + diskmap_group_data + "\n\n"; - }); - - Object.keys(update_list).forEach(function (k) { - download_list += "RENAME " + update_list[k].file.replace(diskmap_data.base, "") + "\n"; - download_list += "group: " + diskmap_group_data + "-UPDATE\n"; - download_list += "destination-group: " + diskmap_group_data + "\n"; - download_list += "location: " + update_list[k].file.replace(diskmap_data.base, "") + "\n\n"; - }); - - download_list += "DELETE-GROUP " + diskmap_group_data + "-UPDATE\n\n"; - - download_list += "SET-GROUP " + diskmap_group_data + "\n"; - download_list += "state: ok\n"; - download_list += "version: " + newest_file_epoch + "\n"; - download_list += "last-checkup-time: " + new Date().toUTCString().replace("GMT", "+0000") + "\n\n"; - - 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_current_directory = ''; - var post_data_current_file = ''; - var post_data_fileinfo = new Array(); - var post_data_filecount = -1; - - Object.keys(post_data).forEach(function (k) { - if (post_data[k] == "") return; - if (post_data[k].substring(0, 7) == "file://") { - post_data_current_directory = post_data[k]; - post_data_current_file = post_data[k]; - } - if (post_data[k].indexOf(":") > 0) { - var post_data_line = post_data[k].split(": ") - var post_data_line_name = post_data_line[0]; - post_data_line.shift(); - var post_data_line_data = post_data_line.join(": "); - - if (!post_data_fileinfo[post_data_filecount]) post_data_fileinfo[post_data_filecount] = new Array(); - - if (post_data_line_name == "Last-modified") { - post_data_fileinfo[post_data_filecount][post_data_line_name] = (new Date(new Date(Date.parse(post_data_line_data)).toUTCString()) / 1000); - } else if (post_data_line_name == "Content-length") { - post_data_fileinfo[post_data_filecount][post_data_line_name] = parseInt(post_data_line_data); - } - else { - post_data_fileinfo[post_data_filecount][post_data_line_name] = post_data_line_data; - } - } else { - post_data_filecount++; - post_data_current_file = post_data_current_directory + post_data[k]; - post_data_fileinfo[post_data_filecount] = new Array(); - post_data_fileinfo[post_data_filecount].file = post_data_current_file - } - }); - var wtv_download_list = new Array(); - Object.keys(diskmap_group_data.files).forEach(function (k) { - if (!diskmap_group_data.files[k].location) diskmap_group_data.files[k].location = diskmap_group_data.location + diskmap_group_data.files[k].file.replace(diskmap_group_data.base, ""); - var post_match_file = null; - Object.keys(service_vaults).forEach(function (g) { - if (post_match_file != null) return; - post_match_file = service_vaults[g] + "/" + service_name + "/" + diskmap_group_data.files[k].location; - if (!fs.existsSync(post_match_file)) post_match_file = null; - }); - - var file_in_postdata = function (post_file) { - return post_file.file === diskmap_group_data.files[k].file - } - - var post_match_file_lstat = fs.lstatSync(post_match_file); - var post_match_result = post_data_fileinfo.find(file_in_postdata) || null; - var post_match_file_data = new Buffer.from(fs.readFileSync(post_match_file, { - encoding: null, - flags: 'r' - })); - 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]["wtv-checksum"] = CryptoJS.MD5(CryptoJS.lib.WordArray.create(post_match_file_data)).toString(CryptoJS.enc.Hex).toLowerCase(); - if (!diskmap_group_data.files[k].display) diskmap_group_data.files[k].display = diskmap_group_data.display; - - if (post_match_result) { - // md5s match, so client doesn't need file - if (diskmap_group_data.files[k]['wtv-checksum'].toLowerCase() == post_match_result["wtv-checksum"]) return; - // last modified is equal to or newer than the last update, and file size match, so assume same file and client does not need it - else if ((post_match_result["Last-modified"] >= diskmap_group_data.files[k]["Last-modified"]) && (post_match_result["Content-length"] == diskmap_group_data.files[k]["Content-length"])) return; - // otherwise send to client - else wtv_download_list.push(diskmap_group_data.files[k]); - } else { - wtv_download_list.push(diskmap_group_data.files[k]); - } - var diskmap_group_name = (diskmap_subgroup == null) ? diskmap_primary_group : diskmap_primary_group + "-" + diskmap_subgroup; - output_data = generateDownloadList(diskmap_group_name, wtv_download_list, diskmap_group_data) - }); - return output_data; -} - -if (request_headers.query.diskmap && request_headers.query.group && request_headers.post_data) { - var diskmap_json_file = null; - Object.keys(service_vaults).forEach(function (g) { - if (diskmap_json_file != null) return; - diskmap_json_file = service_vaults[g] + "/" + service_name + "/" + diskmap_dir + request_headers.query.diskmap + ".json"; - if (!fs.existsSync(diskmap_json_file)) diskmap_json_file = null; - }); - - if (diskmap_json_file != null) { - if (fs.lstatSync(diskmap_json_file)) { - try { - // read diskmap - var diskmap_data = JSON.parse(fs.readFileSync(diskmap_json_file).toString()); - if (!diskmap_data[request_headers.query.group]) { - throw ("Invalid diskmap data (group does not match)"); - } - data = ''; - diskmap_data = diskmap_data[request_headers.query.group]; - if (!diskmap_data.display) { - Object.keys(diskmap_data).forEach(function (k) { - if (diskmap_data[k]) data += processGroup(request_headers.query.group,diskmap_data[k],k); - }); - } else { - data = processGroup(request_headers.query.group, diskmap_data); - } - - headers = "200 OK\nContent-Type: wtv/download-list"; - } catch (e) { - var errpage = doErrorPage(400); - headers = errpage[0]; - data = errpage[1]; - console.log("wtv-update:/sync error", e); - } - } - } else { - var errpage = doErrorPage(404,"The requested DiskMap does not exist."); - headers = errpage[0]; - data = errpage[1]; - if (zdebug) console.log(" # wtv-update:/sync error", "could not find diskmap"); - } -} else { - var errpage = doErrorPage(400); - headers = errpage[0]; - data = errpage[1]; - if (zdebug) console.log(" # wtv-update:/sync error", "missing query arguments"); -} - diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-update/updatesuccess.txt b/zefie_wtvp_minisrv/ServiceVault/wtv-update/updatesuccess.txt deleted file mode 100644 index 9655cb3d..00000000 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-update/updatesuccess.txt +++ /dev/null @@ -1,4 +0,0 @@ -200 OK -Content-Type: text/url - -client:ShowAlert?message=HackTV%20Update%20was%20successful%21&buttonlabel2=Go%20to%20HackTV&action2=file%3A%2F%2FDisk%2FBrowser%2FGames%2FGames.html&buttonlabel1=Okay&buttonaction1=client:goback&image=file://disk/browser/Games/hacktv2.gif&noback=true \ No newline at end of file diff --git a/zefie_wtvp_minisrv/app.js b/zefie_wtvp_minisrv/app.js index ef2fa158..ac1624bb 100644 --- a/zefie_wtvp_minisrv/app.js +++ b/zefie_wtvp_minisrv/app.js @@ -718,9 +718,10 @@ function shouldWeCompress(ssid, headers_obj) { else if (content_type == "application/json") compress_data = true; if (compression_type == 2) { // gzip only - if (content_type.match(/^audio\/(x-)?[midi|wav]/)) compress_data = true; // midi & wav - if (content_type.match(/^audio\/(x-)?[s3m|mod|xm]/)) compress_data = true; // s3m, mod, xm - if (content_type.match(/^audio\/(x-)?[midi|wav]/)) compress_data = true; // midi & wav + 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 + } } } diff --git a/zefie_wtvp_minisrv/config.json b/zefie_wtvp_minisrv/config.json index 6cad0dfb..80bd772d 100644 --- a/zefie_wtvp_minisrv/config.json +++ b/zefie_wtvp_minisrv/config.json @@ -72,7 +72,7 @@ "port": 1630, "connections": 3 }, - "wtv-update": { + "wtv-disk": { "port": 1635, "connections": 3 }, diff --git a/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj b/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj index ad4244e0..24b592f9 100644 --- a/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj +++ b/zefie_wtvp_minisrv/zefie_wtvp_minisrv.njsproj @@ -252,15 +252,13 @@ Code - + Code - + Code - - @@ -307,13 +305,13 @@ - + - - + + \ No newline at end of file