lots of changes:
- change how we handle modules for services in the VM - fixed wtv-disk:/sync always failed the first time - implement production-like wtv-star handling (when a service port becomes unavailable, it requests the url over the wtv-star port to show an error page) - renamed WTVDownloadList.js to WTVDisk.js - a bit more work on WTVNews (created class) - probably more stuff I can't remember
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
var minisrv_service_file = true;
|
var minisrv_service_file = true;
|
||||||
|
|
||||||
var diskmap = Object.getCaseInsensitiveKey(request_headers.query, "DiskMap");
|
var diskmap = Object.getCaseInsensitiveKey(request_headers.query, "DiskMap");
|
||||||
var wtvdl = new WTVDownloadList(minisrv_config, service_name);
|
var wtvdl = new WTVDisk(minisrv_config, service_name);
|
||||||
|
|
||||||
var force_update = (request_headers.query.force == "true") ? true : false;
|
var force_update = (request_headers.query.force == "true") ? true : false;
|
||||||
var no_delete = (request_headers.query.dont_delete_files == "true") ? true : false;
|
var no_delete = (request_headers.query.dont_delete_files == "true") ? true : false;
|
||||||
@@ -318,6 +318,6 @@ if (request_headers['wtv-request-type'] == 'download') {
|
|||||||
} else if (request_headers.query.group && diskmap) {
|
} else if (request_headers.query.group && diskmap) {
|
||||||
var message = request_headers.query.message || "Retrieving files...";
|
var message = request_headers.query.message || "Retrieving files...";
|
||||||
var main_message = request_headers.query.main_message || "Your receiver is downloading files.";
|
var main_message = request_headers.query.main_message || "Your receiver is downloading files.";
|
||||||
headers = "200 OK\nwtv-connection-close: close\nConnection: close\nContent-Type: text/html";
|
headers = "200 OK\nContent-Type: text/html\nwtv-expire-all: wtv-disk:";
|
||||||
data = wtvdl.getSyncPage(message, request_headers.query.group, diskmap, main_message, message, force_update, no_delete);
|
data = wtvdl.getSyncPage(message, request_headers.query.group, diskmap, main_message, message, force_update, no_delete);
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,15 @@
|
|||||||
var minisrv_service_file = true;
|
var minisrv_service_file = true;
|
||||||
|
|
||||||
|
|
||||||
|
if (request_headers.query.url) {
|
||||||
|
headers = `300 OK
|
||||||
|
Location: ${request_headers.query.url}`;
|
||||||
|
} else {
|
||||||
headers = `200 OK
|
headers = `200 OK
|
||||||
Connection: Keep-Alive
|
Connection: Keep-Alive
|
||||||
wtv-expire-all: wtv-home:/splash
|
wtv-expire-all: wtv-home:/splash
|
||||||
wtv-expire-all: wtv-flashrom:
|
wtv-expire-all: wtv-flashrom:
|
||||||
Content-type: text/html`
|
Content-type: text/html`
|
||||||
|
|
||||||
if (request_headers.query.url) headers += "\nwtv-visit: " + request_headers.query.url;
|
|
||||||
var cryptstatus = (wtv_encrypted ? "Encrypted" : "Not Encrypted")
|
var cryptstatus = (wtv_encrypted ? "Encrypted" : "Not Encrypted")
|
||||||
|
|
||||||
var comp_type = wtvmime.shouldWeCompress(session_data, 'text/html');
|
var comp_type = wtvmime.shouldWeCompress(session_data, 'text/html');
|
||||||
@@ -46,7 +49,7 @@ data = `<HTML>
|
|||||||
|
|
||||||
<a HREF="client:showservices">
|
<a HREF="client:showservices">
|
||||||
<img src="file://rom/Images/Spacer.gif" width=1 height=2>
|
<img src="file://rom/Images/Spacer.gif" width=1 height=2>
|
||||||
<img src="file://rom/Cache/WebTVLogoJewel.gif" width=127 height=98>
|
<img src="${minisrv_config.config.service_logo}"" width=127 height=98>
|
||||||
</A>
|
</A>
|
||||||
|
|
||||||
<!-- BEGIN SEPARATOR -->
|
<!-- BEGIN SEPARATOR -->
|
||||||
@@ -386,50 +389,4 @@ data += `</table>
|
|||||||
</table>
|
</table>
|
||||||
</body>
|
</body>
|
||||||
</html>`
|
</html>`
|
||||||
|
|
||||||
/*
|
|
||||||
data = `<html>
|
|
||||||
<head>
|
|
||||||
<title>Home for ${session_data.getSessionData("subscriber_username") || "minisrv"}</title>
|
|
||||||
<DISPLAY NoLogo>
|
|
||||||
</head>
|
|
||||||
<body bgcolor="#191919" text="#44cc55" link="#36d5ff" vlink="#36d5ff">
|
|
||||||
<b>Welcome to ${minisrv_config.config.service_name}`;
|
|
||||||
if (session_data.getSessionData("registered")) data += ", " + session_data.getSessionData("subscriber_username") + "!";
|
|
||||||
data += `</b><br>
|
|
||||||
<div width="540" align="right">
|
|
||||||
<font size="-4"><i>
|
|
||||||
minisrv v${minisrv_config.version}${(minisrv_config.config.git_commit) ? ' git-'+minisrv_config.config.git_commit : ''}, hosted by ${minisrv_config.config.service_owner}</i></small></font></div><br>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<b>Status</b>: ${cryptstatus} (${compstatus})<br>
|
|
||||||
<b>Connection Speed</b>: &rate;
|
|
||||||
<hr>
|
|
||||||
<ul>
|
|
||||||
<li><a href="client:relog">client:relog (direct)</a></li>
|
|
||||||
<li><a href="wtv-flashrom:/willie">Ultra Willies</a> ~ <a href="wtv-tricks:/tricks">Tricks</a></li>
|
|
||||||
<li><a href="wtv-setup:/setup">Setup (Including BG Music)</a></li>
|
|
||||||
<li><a href="wtv-favorite:/favorite">Favorites</a> <sup>new!</sup> - <a href="wtv-admin:/admin">wtv-admin</a> <sup>new!</sup></li>
|
|
||||||
<li><a href="wtv-guide:/help?topic=Index&subtopic=Main&page=1">Guide/Help</a> <sup>(alpha)</sup> - <a href="${session_data.mailstore.checkMailIntroSeen() ? 'wtv-mail:/listmail' : 'wtv-mail:/DiplomaMail'}">Mail</a> <sup>(beta)</sup>
|
|
||||||
`;
|
|
||||||
if (session_data.hasCap("client-can-do-chat")) {
|
|
||||||
data += "<li><a href=\"wtv-chat:/home\">IRC Chat Test</a></li>\n"
|
|
||||||
}
|
}
|
||||||
if (session_data.hasCap("client-has-disk")) {
|
|
||||||
// only show disk stuff if client has disk
|
|
||||||
data += "<li><a href=\"client:diskhax\">DiskHax</a> ~ <a href=\"client:vfathax\">VFatHax</a></li>\n";
|
|
||||||
if (session_data.hasCap("client-can-do-macromedia-flash2")) {
|
|
||||||
// only show demo if client can do flash2
|
|
||||||
data += "<li>Old DealerDemo: <a href=\"wtv-disk:/sync?group=DealerDemo&diskmap=DealerDemo\">Download</a> ~ <a href=\"file://Disk/Demo/index.html\">Access</a></li>\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data += `<li><a href="http://duckduckgo.com/lite/">DuckDuckGo Lite</a></li>`
|
|
||||||
|
|
||||||
data += "</ul>";
|
|
||||||
|
|
||||||
// for development
|
|
||||||
if (fs.existsSync(service_vaults[0] + "/" + service_name + "/home.zefie.html")) {
|
|
||||||
data += fs.readFileSync(service_vaults[0] + "/" + service_name + "/home.zefie.html", { 'encoding': 'utf8' });
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.0 KiB |
@@ -21,7 +21,7 @@ data = `<HTML>
|
|||||||
<table href="wtv-home:/home" absheight=76 cellspacing=0 cellpadding=0>
|
<table href="wtv-home:/home" absheight=76 cellspacing=0 cellpadding=0>
|
||||||
<tr>
|
<tr>
|
||||||
<td align=right>
|
<td align=right>
|
||||||
<img src="wtv-home:/ROMCache/WebTVLogoJewel.gif" width=87 height=67>
|
<img src="${minisrv_config.config.service_logo}" width=87 height=67>
|
||||||
</table>
|
</table>
|
||||||
<td abswidth=5>
|
<td abswidth=5>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@@ -1,88 +1,23 @@
|
|||||||
var minisrv_service_file = true;
|
var minisrv_service_file = true;
|
||||||
|
|
||||||
async function clientConnect(client) {
|
console.log('f')
|
||||||
response = await client.connect()
|
|
||||||
if (response.code == 200) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function listGroup(client, group) {
|
async function throwError(e) {
|
||||||
try {
|
var errpage = wtvshared.doErrorPage(400, null, e.toString());
|
||||||
return await client.listGroup(group)
|
sendToClient(socket, errpage[0], errpage[1]);
|
||||||
} catch (e) {
|
|
||||||
console.log("WTVNews Error -", "Command: listGroup", e);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function selectGroup(client, group) {
|
|
||||||
try {
|
|
||||||
response = await client.group(request_headers.query.group)
|
|
||||||
if (response.code == 211) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
} catch (e) {
|
|
||||||
console.log("WTVNews Error -", "Command: selectGroup", e);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getArticle(client, articleID) {
|
|
||||||
try {
|
|
||||||
return await client.article(articleID)
|
|
||||||
} catch (e) {
|
|
||||||
console.log("WTVNews Error -", "Command: article", e);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getHeader(client, articleID) {
|
|
||||||
try {
|
|
||||||
return await client.head(articleID)
|
|
||||||
} catch (e) {
|
|
||||||
console.log("WTVNews Error -", "Command: head -", "Article ID: "+articleID, e);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function quitUsenet(client) {
|
|
||||||
response = await client.quit()
|
|
||||||
if (response.code == 205) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getHeaderObj(client, NGArticles) {
|
|
||||||
var messages = [];
|
|
||||||
for (var article in NGArticles) {
|
|
||||||
if (article == "getCaseInsensitiveKey") continue;
|
|
||||||
try {
|
|
||||||
var data = await getHeader(client, NGArticles[article]);
|
|
||||||
if (data.article) messages.push(data.article)
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e, article);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return messages;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async function WebTVListGroup(client, group) {
|
async function WebTVListGroup(group) {
|
||||||
var connected = await clientConnect(client)
|
wtvnews.connectUsenet().then(() => {
|
||||||
if (connected) {
|
wtvnews.selectGroup(group).then(() => {
|
||||||
response = await selectGroup(client, group);
|
wtvnews.listGroup(group).then((response) => {
|
||||||
if (response) {
|
|
||||||
response = await listGroup(client, group);
|
|
||||||
if (response.code == 211) {
|
if (response.code == 211) {
|
||||||
NGCount = response.group.number;
|
NGCount = response.group.number;
|
||||||
NGArticles = response.group.articleNumbers;
|
NGArticles = response.group.articleNumbers;
|
||||||
messages = await getHeaderObj(client, NGArticles);
|
|
||||||
quitUsenet(client);
|
wtvnews.getHeaderObj(NGArticles).then((messages) => {
|
||||||
|
wtvnews.quitUsenet();
|
||||||
headers = `200 OK
|
headers = `200 OK
|
||||||
Connection: Keep-Alive
|
Connection: Keep-Alive
|
||||||
Content-Type: text/html
|
Content-Type: text/html
|
||||||
@@ -107,7 +42,7 @@ top.location="news:${request_headers.query.group}";
|
|||||||
<table href="wtv-home:/home" absheight=76 cellspacing=0 cellpadding=0>
|
<table href="wtv-home:/home" absheight=76 cellspacing=0 cellpadding=0>
|
||||||
<tr>
|
<tr>
|
||||||
<td align=right>
|
<td align=right>
|
||||||
<img src="wtv-home:/ROMCache/WebTVLogoJewel.gif" width=87 height=67>
|
<img src="${minisrv_config.config.service_logo}" width=87 height=67>
|
||||||
</table>
|
</table>
|
||||||
<td abswidth=5>
|
<td abswidth=5>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -274,15 +209,14 @@ ${message.headers.FROM}, ${message.headers.DATE}
|
|||||||
<td height=33 width=256 valign=bottom>
|
<td height=33 width=256 valign=bottom>
|
||||||
</BODY>
|
</BODY>
|
||||||
</HTML>`;
|
</HTML>`;
|
||||||
sendToClient(socket, headers, data);
|
|
||||||
} else {
|
|
||||||
var errpage = wtvshared.doErrorPage("400", "No such group.");
|
|
||||||
sendToClient(socket, errpage[0], errpage[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
sendToClient(socket, headers, data);
|
||||||
|
}).catch((e) => { throwError(e) });;
|
||||||
|
}
|
||||||
|
}).catch((e) => { throwError(e) });;
|
||||||
|
}).catch((e) => { throwError(e) });;
|
||||||
|
}).catch((e) => { throwError(e) });
|
||||||
|
}
|
||||||
|
|
||||||
async function WebTVShowMessage(client, group, article) {
|
async function WebTVShowMessage(client, group, article) {
|
||||||
var connected = await clientConnect(client)
|
var connected = await clientConnect(client)
|
||||||
@@ -321,7 +255,7 @@ ${(response.article.headers.SUBJECT) ? wtvshared.htmlEntitize(response.article.h
|
|||||||
<td abswidth=6>
|
<td abswidth=6>
|
||||||
<img src="wtv-home:/ROMCache/Spacer.gif" width=1>
|
<img src="wtv-home:/ROMCache/Spacer.gif" width=1>
|
||||||
<td align=center>
|
<td align=center>
|
||||||
<img src="wtv-mail:/ROMCache/WebTVLogoJewel.gif" width=87 height=67>
|
<img src="${minisrv_config.config.service_logo}" width=87 height=67>
|
||||||
</table>
|
</table>
|
||||||
<td abswidth=5>
|
<td abswidth=5>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -592,33 +526,27 @@ ${wtvshared.htmlEntitize(message_body, true)}
|
|||||||
`;
|
`;
|
||||||
sendToClient(socket, headers, data);
|
sendToClient(socket, headers, data);
|
||||||
} else {
|
} else {
|
||||||
var errpage = wtvshared.doErrorPage("400", "No such article in group <b>"+group+"</b>");
|
var errpage = wtvshared.doErrorPage(400, null, "No such article in group <b>"+group+"</b>");
|
||||||
sendToClient(socket, errpage[0], errpage[1]);
|
sendToClient(socket, errpage[0], errpage[1]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var errpage = wtvshared.doErrorPage("400", "No such group: <b>"+group+"</b>");
|
var errpage = wtvshared.doErrorPage(400, null, "No such group: <b>"+group+"</b>");
|
||||||
sendToClient(socket, errpage[0], errpage[1]);
|
sendToClient(socket, errpage[0], errpage[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!minisrv_config.services[service_name].upstream_address || !minisrv_config.services[service_name].upstream_port) {
|
if (!minisrv_config.services[service_name].upstream_address || !minisrv_config.services[service_name].upstream_port) {
|
||||||
var errpage = doErrorPage("400");
|
var errpage = doErrorPage();
|
||||||
headers = errpage[0];
|
headers = errpage[0];
|
||||||
data = errpage[1];
|
data = errpage[1];
|
||||||
} else {
|
} else {
|
||||||
var request_is_async = true;
|
var request_is_async = true;
|
||||||
if (request_headers.query.group) {
|
if (request_headers.query.group) {
|
||||||
const Client = require('newsie').default
|
|
||||||
const client = new Client({
|
|
||||||
host: minisrv_config.services[service_name].upstream_address,
|
|
||||||
port: minisrv_config.services[service_name].upstream_port
|
|
||||||
})
|
|
||||||
if (request_headers.query.article) {
|
if (request_headers.query.article) {
|
||||||
WebTVShowMessage(client, request_headers.query.group, request_headers.query.article);
|
WebTVShowMessage(request_headers.query.group, request_headers.query.article);
|
||||||
} else {
|
} else {
|
||||||
WebTVListGroup(client, request_headers.query.group);
|
WebTVListGroup(request_headers.query.group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
var minisrv_service_file = true;
|
var minisrv_service_file = true;
|
||||||
|
|
||||||
|
const wtvbgm = new WTVBGMusic(minisrv_config, session_data);
|
||||||
|
|
||||||
var catsListed = 0;
|
var catsListed = 0;
|
||||||
var categories = wtvbgm.getCategoryList();
|
var categories = wtvbgm.getCategoryList();
|
||||||
var divide = Math.round(categories.length / 2, 0);
|
var divide = Math.round(categories.length / 2, 0);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
var minisrv_service_file = true;
|
var minisrv_service_file = true;
|
||||||
|
|
||||||
|
const wtvbgm = new WTVBGMusic(minisrv_config, session_data);
|
||||||
var music_obj = wtvbgm.getMusicObj();
|
var music_obj = wtvbgm.getMusicObj();
|
||||||
|
|
||||||
headers = `
|
headers = `
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
var minisrv_service_file = true;
|
var minisrv_service_file = true;
|
||||||
|
|
||||||
if (request_headers.query.category) {
|
if (request_headers.query.category) {
|
||||||
|
const wtvbgm = new WTVBGMusic(minisrv_config, session_data);
|
||||||
var musicList = wtvbgm.getCategorySongList(request_headers.query.category);
|
var musicList = wtvbgm.getCategorySongList(request_headers.query.category);
|
||||||
var categoryName = wtvbgm.getCategoryName(request_headers.query.category);
|
var categoryName = wtvbgm.getCategoryName(request_headers.query.category);
|
||||||
|
|
||||||
|
|||||||
@@ -109,10 +109,6 @@ var runScriptInVM = function (script_data, user_contextObj = {}, privileged = fa
|
|||||||
// The ServiceVault scripts will only be allowed to access the following fcnutions/variables.
|
// The ServiceVault scripts will only be allowed to access the following fcnutions/variables.
|
||||||
// Furthermore, only modifications to variables in `updateFromVM` will be saved.
|
// Furthermore, only modifications to variables in `updateFromVM` will be saved.
|
||||||
// Example: an attempt to change "minisrv_config" from a ServiceVault script would be discarded
|
// Example: an attempt to change "minisrv_config" from a ServiceVault script would be discarded
|
||||||
var WTVGuide = require(classPath + "/WTVGuide.js");
|
|
||||||
var WTVBGMusic = require(classPath + "/WTVBGMusic.js");
|
|
||||||
var WTVDownloadList = require(classPath + "/WTVDownloadList.js");
|
|
||||||
var WTVNews = require(classPath + "/WTVNews.js");
|
|
||||||
|
|
||||||
// create global context object
|
// create global context object
|
||||||
var contextObj = {
|
var contextObj = {
|
||||||
@@ -129,9 +125,6 @@ var runScriptInVM = function (script_data, user_contextObj = {}, privileged = fa
|
|||||||
"clientShowAlert": clientShowAlert,
|
"clientShowAlert": clientShowAlert,
|
||||||
"WTVClientSessionData": WTVClientSessionData,
|
"WTVClientSessionData": WTVClientSessionData,
|
||||||
"WTVClientCapabilities": WTVClientCapabilities,
|
"WTVClientCapabilities": WTVClientCapabilities,
|
||||||
"WTVDownloadList": WTVDownloadList,
|
|
||||||
"WTVFlashrom": WTVFlashrom,
|
|
||||||
"WTVNews": WTVNews,
|
|
||||||
"strftime": require('strftime'),
|
"strftime": require('strftime'),
|
||||||
"CryptoJS": CryptoJS,
|
"CryptoJS": CryptoJS,
|
||||||
"crypto": crypto,
|
"crypto": crypto,
|
||||||
@@ -160,11 +153,38 @@ var runScriptInVM = function (script_data, user_contextObj = {}, privileged = fa
|
|||||||
...user_contextObj
|
...user_contextObj
|
||||||
}
|
}
|
||||||
|
|
||||||
if (contextObj.socket) {
|
// per service overrides
|
||||||
if (contextObj.socket.ssid) {
|
var modules_loaded = [];
|
||||||
if (WTVGuide) contextObj.wtvguide = new WTVGuide(minisrv_config, ssid_sessions[contextObj.socket.ssid], contextObj.socket, runScriptInVM);
|
if (minisrv_config.services[contextObj.service_name]) {
|
||||||
contextObj.wtvbgm = new WTVBGMusic(minisrv_config, ssid_sessions[contextObj.socket.ssid]);
|
if (minisrv_config.services[contextObj.service_name].modules) {
|
||||||
|
var vm_modules = minisrv_config.services[contextObj.service_name].modules;
|
||||||
|
Object.keys(vm_modules).forEach(function (k) {
|
||||||
|
var module_file = classPath + path.sep + vm_modules[k] + ".js"
|
||||||
|
try {
|
||||||
|
contextObj[vm_modules[k]] = require(module_file);
|
||||||
|
modules_loaded.push(module_file)
|
||||||
|
} catch (e) {
|
||||||
|
console.error(" *!* Could not load module", module_file, "requested by service", contextObj.service_name)
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch (contextObj.service_name) {
|
||||||
|
case "wtv-guide":
|
||||||
|
// wtv-guide is a special case due to needing this function
|
||||||
|
modules_to_load.push({ "name": "WTVGuide", "file": classPath + "/WTVGuide.js" });
|
||||||
|
contextObj.wtvguide = new tmpmod(minisrv_config, ssid_sessions[contextObj.socket.ssid], contextObj.socket, runScriptInVM);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "wtv-1800":
|
||||||
|
case "wtv-flashrom":
|
||||||
|
// these are special cases because the primary app already loaded this
|
||||||
|
contextObj = { ...contextObj, "WTVFlashrom": WTVFlashrom }
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (contextObj.socket) {
|
||||||
if (contextObj.socket.id)
|
if (contextObj.socket.id)
|
||||||
if (socket_sessions[contextObj.socket.id]) contextObj.wtv_encrypted = (socket_sessions[contextObj.socket.id].secure === true);
|
if (socket_sessions[contextObj.socket.id]) contextObj.wtv_encrypted = (socket_sessions[contextObj.socket.id].secure === true);
|
||||||
}
|
}
|
||||||
@@ -193,10 +213,12 @@ var runScriptInVM = function (script_data, user_contextObj = {}, privileged = fa
|
|||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// unload modules
|
// unload any loaded modules for this vm
|
||||||
wtvshared.unloadModule(classPath + "/WTVGuide.js");
|
if (modules_loaded.length > 0) {
|
||||||
wtvshared.unloadModule(classPath + "/WTVBGMusic.js");
|
Object.keys(modules_loaded).forEach(function (k) {
|
||||||
wtvshared.unloadModule(classPath + "/WTVDownloadList.js");
|
wtvshared.unloadModule(modules_loaded[k]);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return contextObj; // updated context object with whatever global varibles the script set
|
return contextObj; // updated context object with whatever global varibles the script set
|
||||||
}
|
}
|
||||||
@@ -272,7 +294,7 @@ async function processPath(socket, service_vault_file_path, request_headers = ne
|
|||||||
if (minisrv_catchall) {
|
if (minisrv_catchall) {
|
||||||
if (service_path_request_file == minisrv_catchall) {
|
if (service_path_request_file == minisrv_catchall) {
|
||||||
request_is_async = true;
|
request_is_async = true;
|
||||||
var errpage = wtvshared.doErrorPage(401, "Access Denied");
|
var errpage = wtvshared.doErrorPage(401);
|
||||||
sendToClient(socket, errpage[0], errpage[1]);
|
sendToClient(socket, errpage[0], errpage[1]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -323,7 +345,7 @@ async function processPath(socket, service_vault_file_path, request_headers = ne
|
|||||||
wtvshared.getLineFromFile(service_vault_file_path, 0, function (status, line) {
|
wtvshared.getLineFromFile(service_vault_file_path, 0, function (status, line) {
|
||||||
if (!status) {
|
if (!status) {
|
||||||
if (line.match(/minisrv\_service\_file.*true/i)) {
|
if (line.match(/minisrv\_service\_file.*true/i)) {
|
||||||
var errpage = wtvshared.doErrorPage(403, "Access Denied");
|
var errpage = wtvshared.doErrorPage(403);
|
||||||
sendToClient(socket, errpage[0], errpage[1]);
|
sendToClient(socket, errpage[0], errpage[1]);
|
||||||
} else {
|
} else {
|
||||||
sendRawFile(socket, service_vault_file_path);
|
sendRawFile(socket, service_vault_file_path);
|
||||||
@@ -339,7 +361,7 @@ async function processPath(socket, service_vault_file_path, request_headers = ne
|
|||||||
wtvshared.getLineFromFile(service_vault_file_path, 0, function (status, line) {
|
wtvshared.getLineFromFile(service_vault_file_path, 0, function (status, line) {
|
||||||
if (!status) {
|
if (!status) {
|
||||||
if (line.match(/^#!minisrv/i)) {
|
if (line.match(/^#!minisrv/i)) {
|
||||||
var errpage = wtvshared.doErrorPage(403, "Access Denied");
|
var errpage = wtvshared.doErrorPage(403);
|
||||||
sendToClient(socket, errpage[0], errpage[1]);
|
sendToClient(socket, errpage[0], errpage[1]);
|
||||||
} else {
|
} else {
|
||||||
sendRawFile(socket, service_vault_file_path);
|
sendRawFile(socket, service_vault_file_path);
|
||||||
@@ -477,12 +499,12 @@ async function processPath(socket, service_vault_file_path, request_headers = ne
|
|||||||
if (!request_is_async) {
|
if (!request_is_async) {
|
||||||
if (!service_vault_found) {
|
if (!service_vault_found) {
|
||||||
console.error(" * Could not find a Service Vault for " + service_name + ":/" + service_path.replace(service_name + path.sep, "").replace(path.sep, '/'));
|
console.error(" * Could not find a Service Vault for " + service_name + ":/" + service_path.replace(service_name + path.sep, "").replace(path.sep, '/'));
|
||||||
var errpage = wtvshared.doErrorPage(404, null, pc_services);
|
var errpage = wtvshared.doErrorPage(404, null, null, pc_services);
|
||||||
headers = errpage[0];
|
headers = errpage[0];
|
||||||
data = errpage[1];
|
data = errpage[1];
|
||||||
}
|
}
|
||||||
if (headers == null && !request_is_async) {
|
if (headers == null && !request_is_async) {
|
||||||
var errpage = wtvshared.doErrorPage(400, null, pc_services);
|
var errpage = wtvshared.doErrorPage(400, null, null, pc_services);
|
||||||
headers = errpage[0];
|
headers = errpage[0];
|
||||||
data = errpage[1];
|
data = errpage[1];
|
||||||
console.error(" * Scripting or Data error: Headers were not defined. (headers,data) as follows:")
|
console.error(" * Scripting or Data error: Headers were not defined. (headers,data) as follows:")
|
||||||
@@ -495,21 +517,6 @@ async function processPath(socket, service_vault_file_path, request_headers = ne
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function verifyServicePort(service_name, socket) {
|
|
||||||
if (socket._server._connectionKey) {
|
|
||||||
var socketPort = parseInt(socket._server._connectionKey.split(':')[2])
|
|
||||||
if (minisrv_config.services[service_name]) {
|
|
||||||
if (minisrv_config.services[service_name].port == socketPort) {
|
|
||||||
if (minisrv_config.services[service_name].servicevault_dir)
|
|
||||||
return minisrv_config.services[service_name].servicevault_dir;
|
|
||||||
else
|
|
||||||
return service_name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function processURL(socket, request_headers, pc_services = false) {
|
async function processURL(socket, request_headers, pc_services = false) {
|
||||||
var shortURL, headers, data, service_name, original_service_name = "";
|
var shortURL, headers, data, service_name, original_service_name = "";
|
||||||
var enable_multi_query = false;
|
var enable_multi_query = false;
|
||||||
@@ -522,14 +529,7 @@ async function processURL(socket, request_headers, pc_services = false) {
|
|||||||
}
|
}
|
||||||
if (request_headers.request_url.indexOf('?') >= 0) {
|
if (request_headers.request_url.indexOf('?') >= 0) {
|
||||||
shortURL = request_headers.request_url.split('?')[0];
|
shortURL = request_headers.request_url.split('?')[0];
|
||||||
if (!service_name) service_name = verifyServicePort(shortURL.split(':')[0], socket);
|
|
||||||
|
|
||||||
if (!service_name) {
|
|
||||||
var errpage = wtvshared.doErrorPage(500, null, pc_services);
|
|
||||||
socket_sessions[socket.id].close_me = true;
|
|
||||||
sendToClient(socket, errpage[0], errpage[1]);
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (request_headers.request_url.indexOf('?') >= 0) {
|
if (request_headers.request_url.indexOf('?') >= 0) {
|
||||||
shortURL = request_headers.request_url.split('?')[0];
|
shortURL = request_headers.request_url.split('?')[0];
|
||||||
if (minisrv_config.services[service_name]) enable_multi_query = minisrv_config.services[service_name].enable_multi_query || false;
|
if (minisrv_config.services[service_name]) enable_multi_query = minisrv_config.services[service_name].enable_multi_query || false;
|
||||||
@@ -697,12 +697,21 @@ minisrv-no-mail-count: true`;
|
|||||||
|
|
||||||
var service_name = verifyServicePort(shortURL.split(':/')[0], socket);
|
var service_name = verifyServicePort(shortURL.split(':/')[0], socket);
|
||||||
if (!service_name) {
|
if (!service_name) {
|
||||||
var errpage = wtvshared.doErrorPage(500, null, pc_services);
|
// detect if client is trying to load wtv-star due to client-perceived error
|
||||||
|
if (getSocketDestinationPort(socket) == getPortByService("wtv-star")) {
|
||||||
|
// is wtv-star
|
||||||
|
if (minisrv_config.config.debug_flags.debug) console.log(" * client requested", shortURL, "on wtv-star port", getSocketDestinationPort(socket))
|
||||||
|
shortURL = "wtv-star:/star";
|
||||||
|
service_name = "wtv-star";
|
||||||
|
} else {
|
||||||
|
// is actually a request on then wrong port
|
||||||
|
var errpage = wtvshared.doErrorPage(500, null, null, pc_services);
|
||||||
socket_sessions[socket.id].close_me = true;
|
socket_sessions[socket.id].close_me = true;
|
||||||
sendToClient(socket, errpage[0], errpage[1]);
|
sendToClient(socket, errpage[0], errpage[1]);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
var urlToPath = wtvshared.fixPathSlashes(service_name + path.sep + shortURL.split(':/')[1]);
|
var urlToPath = wtvshared.fixPathSlashes(service_name + path.sep + shortURL.split(':/')[1]);
|
||||||
var shared_romcache = null;
|
var shared_romcache = null;
|
||||||
if (shortURL.indexOf(":/ROMCache/") != -1 && minisrv_config.config.enable_shared_romcache) {
|
if (shortURL.indexOf(":/ROMCache/") != -1 && minisrv_config.config.enable_shared_romcache) {
|
||||||
@@ -1516,7 +1525,7 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq
|
|||||||
processURL(socket, headers);
|
processURL(socket, headers);
|
||||||
} else 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)) {
|
||||||
// got too much data ? ... should not ever reach this code (section 2)
|
// got too much data ? ... should not ever reach this code (section 2)
|
||||||
var errpage = wtvshared.doErrorPage(400, "Received too much data in POST request<br>Got " + (socket_sessions[socket.id].post_data.length / 2) + ", expected " + socket_sessions[socket.id].post_data_length) + " (2)";
|
var errpage = wtvshared.doErrorPage(400, null, "Received too much data in POST request<br>Got " + (socket_sessions[socket.id].post_data.length / 2) + ", expected " + socket_sessions[socket.id].post_data_length) + " (2)";
|
||||||
headers = errpage[0];
|
headers = errpage[0];
|
||||||
data = errpage[1];
|
data = errpage[1];
|
||||||
sendToClient(socket, headers, data);
|
sendToClient(socket, headers, data);
|
||||||
@@ -1599,7 +1608,7 @@ async function processRequest(socket, data_hex, skipSecure = false, encryptedReq
|
|||||||
if (socket_sessions[socket.id].expecting_post_data) delete socket_sessions[socket.id].expecting_post_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);
|
socket.setTimeout(minisrv_config.config.socket_timeout * 1000);
|
||||||
// got too much data ? ... should not ever reach this code
|
// got too much data ? ... should not ever reach this code
|
||||||
var errpage = wtvshared.doErrorPage(400, "Received too much data in POST request<br>Got " + (socket_sessions[socket.id].post_data.length / 2) + ", expected " + socket_sessions[socket.id].post_data_length);
|
var errpage = wtvshared.doErrorPage(400, null, "Received too much data in POST request<br>Got " + (socket_sessions[socket.id].post_data.length / 2) + ", expected " + socket_sessions[socket.id].post_data_length);
|
||||||
headers = errpage[0];
|
headers = errpage[0];
|
||||||
data = errpage[1];
|
data = errpage[1];
|
||||||
sendToClient(socket, headers, data);
|
sendToClient(socket, headers, data);
|
||||||
@@ -1899,6 +1908,30 @@ function findServiceByPort(port) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function getPortByService(service) {
|
||||||
|
if (minisrv_config.services[service]) return minisrv_config.services[service].port;
|
||||||
|
else return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSocketDestinationPort(socket) {
|
||||||
|
return parseInt(socket._server._connectionKey.split(':')[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function verifyServicePort(service_name, socket) {
|
||||||
|
if (socket._server._connectionKey) {
|
||||||
|
var socketPort = getSocketDestinationPort(socket);
|
||||||
|
if (minisrv_config.services[service_name]) {
|
||||||
|
if (minisrv_config.services[service_name].port == socketPort) {
|
||||||
|
if (minisrv_config.services[service_name].servicevault_dir)
|
||||||
|
return minisrv_config.services[service_name].servicevault_dir;
|
||||||
|
else
|
||||||
|
return service_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
var initstring = '';
|
var initstring = '';
|
||||||
var initstring_pc = '';
|
var initstring_pc = '';
|
||||||
ports.sort();
|
ports.sort();
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ class WTVDownloadList {
|
|||||||
<head>
|
<head>
|
||||||
<meta
|
<meta
|
||||||
http-equiv=refresh
|
http-equiv=refresh
|
||||||
content="0;url=client:Fetch?group=${escape(group)}&source=${escape(url)}&message=${escape(message)}"
|
content="0;url=client:Fetch?group=${encodeURIComponent(group)}&source=${encodeURIComponent(url)}&message=${encodeURIComponent(message)}"
|
||||||
>
|
>
|
||||||
<display downloadsuccess="${success_url}" downloadfail="${fail_url}">
|
<display downloadsuccess="${success_url}" downloadfail="${fail_url}">
|
||||||
<title>${title}</title>
|
<title>${title}</title>
|
||||||
@@ -343,6 +343,8 @@ class WTVDownloadList {
|
|||||||
message="Preparing..."
|
message="Preparing..."
|
||||||
height=40 width=250>
|
height=40 width=250>
|
||||||
</font>
|
</font>
|
||||||
|
|
||||||
|
<br>
|
||||||
</table>
|
</table>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -1,5 +1,110 @@
|
|||||||
class WTVNews {
|
class WTVNews {
|
||||||
|
|
||||||
|
minisrv_config = null;
|
||||||
|
newsie = require('newsie').default;
|
||||||
|
service_name = null;
|
||||||
|
client = null;
|
||||||
|
|
||||||
|
constructor(minisrv_config, service_name) {
|
||||||
|
this.minisrv_config = minisrv_config;
|
||||||
|
this.service_name = service_name;
|
||||||
|
this.client = new this.newsie({
|
||||||
|
host: this.minisrv_config.services[service_name].upstream_address,
|
||||||
|
port: this.minisrv_config.services[service_name].upstream_port
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
connectUsenet() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.client.connect().then((response) => {
|
||||||
|
if (response.code == 200) {
|
||||||
|
resolve(true);
|
||||||
|
}
|
||||||
|
}).catch((e) => {
|
||||||
|
console.error(" * WTVNews Error:", "Command: connect", e);
|
||||||
|
reject("Could not connect to upstream usenet server");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
listGroup(group) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.client.listGroup(group).then((data) => {
|
||||||
|
resolve(data);
|
||||||
|
}).catch((e) => {
|
||||||
|
console.error(" * WTVNews Error:", "Command: listGroup", e);
|
||||||
|
reject(`No such group <b>${group}</b>`);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
selectGroup(group) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.client.group(group).then((response) => {
|
||||||
|
if (response.code == 211) resolve(true);
|
||||||
|
else reject(`No such group <b>${group}</b>`);
|
||||||
|
}).catch((e) => {
|
||||||
|
console.error(" * WTVNews Error:", "Command: selectGroup", e);
|
||||||
|
reject(`Error selecting group <b>${group}</b>`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getArticle(articleID) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.client.article(articleID).then((data) => {
|
||||||
|
resolve(data)
|
||||||
|
}).catch((e) => {
|
||||||
|
reject(`Error reading article ID ${articleID}`);
|
||||||
|
console.error(" * WTVNews Error:", "Command: article", e);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeader(articleID) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.client.head(articleID).then((data) => {
|
||||||
|
resolve(data);
|
||||||
|
}).catch((e) => {
|
||||||
|
reject(`Error getting header for article ID ${articleID}`);
|
||||||
|
console.error(" * WTVNews Error:", "Command: head -", "Article ID: " + articleID, e);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
quitUsenet() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.client.quit().then((response) => {
|
||||||
|
if (response.code == 205) resolve(true);
|
||||||
|
else {
|
||||||
|
console.error(" * WTVNews Error:", "Command: quit", e);
|
||||||
|
reject(`Unexpected response code ${response.code}`);
|
||||||
|
}
|
||||||
|
}).catch((e) => {
|
||||||
|
console.error(" * WTVNews Error:", "Command: quit", e);
|
||||||
|
reject("Error quitting usenet session");
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeaderObj(NGArticles) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
var messages = [];
|
||||||
|
var failed = false;
|
||||||
|
for (var article in NGArticles) {
|
||||||
|
if (failed) continue;
|
||||||
|
if (article == "getCaseInsensitiveKey") continue;
|
||||||
|
this.getHeader(NGArticles[article]).then((data) => {
|
||||||
|
if (data.article) messages.push(data.article)
|
||||||
|
}).catch((e) => {
|
||||||
|
console.log(e, article);
|
||||||
|
failed = e;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (!failed) resolve(messages);
|
||||||
|
else reject("Could not read message list", failed);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = WTVNews;
|
module.exports = WTVNews;
|
||||||
@@ -556,9 +556,21 @@ class WTVShared {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
doErrorPage(code, data = null, pc_mode = false) {
|
doErrorPage(code, data = null, details = null, pc_mode = false) {
|
||||||
var headers = null;
|
var headers = null;
|
||||||
switch (code) {
|
switch (code) {
|
||||||
|
case 401:
|
||||||
|
if (data === null) data = "Authorization Required.";
|
||||||
|
if (pc_mode) headers = "401 Unauthorized\n";
|
||||||
|
else headers = code + " " + data + "\n";
|
||||||
|
headers += "Content-Type: text/html\n";
|
||||||
|
break;
|
||||||
|
case 403:
|
||||||
|
if (data === null) data = "The publisher of that page has not authorized you to view it.";
|
||||||
|
if (pc_mode) headers = "403 Forbidden\n";
|
||||||
|
else headers = code + " " + data + "\n";
|
||||||
|
headers += "Content-Type: text/html\n";
|
||||||
|
break;
|
||||||
case 404:
|
case 404:
|
||||||
if (data === null) data = "The service could not find the requested page.";
|
if (data === null) data = "The service could not find the requested page.";
|
||||||
if (pc_mode) headers = "404 Not Found\n";
|
if (pc_mode) headers = "404 Not Found\n";
|
||||||
@@ -568,16 +580,11 @@ class WTVShared {
|
|||||||
case 400:
|
case 400:
|
||||||
case 500:
|
case 500:
|
||||||
if (data === null) data = this.minisrv_config.config.service_name + " ran into a technical problem.";
|
if (data === null) data = this.minisrv_config.config.service_name + " ran into a technical problem.";
|
||||||
|
if (details) data += "<br>Details:<br>" + details;
|
||||||
if (pc_mode) headers = "500 Internal Server Error\n";
|
if (pc_mode) headers = "500 Internal Server Error\n";
|
||||||
else headers = code + " " + data + "\n";
|
else headers = code + " " + data + "\n";
|
||||||
headers += "Content-Type: text/html\n";
|
headers += "Content-Type: text/html\n";
|
||||||
break;
|
break;
|
||||||
case 401:
|
|
||||||
if (data === null) data = "Access Denied.";
|
|
||||||
if (pc_mode) headers = "401 Access Denied\n";
|
|
||||||
else headers = code + " " + data + "\n";
|
|
||||||
headers += "Content-Type: text/html\n";
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
headers = code + " " + data + "\n";
|
headers = code + " " + data + "\n";
|
||||||
headers += "Content-Type: text/html\n";
|
headers += "Content-Type: text/html\n";
|
||||||
|
|||||||
@@ -60,7 +60,10 @@
|
|||||||
},
|
},
|
||||||
"wtv-news": {
|
"wtv-news": {
|
||||||
"port": 1605,
|
"port": 1605,
|
||||||
"disabled": true
|
"disabled": true,
|
||||||
|
"modules": [
|
||||||
|
"WTVNews"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"wtv-register": {
|
"wtv-register": {
|
||||||
"port": 1607,
|
"port": 1607,
|
||||||
@@ -93,7 +96,10 @@
|
|||||||
"flags": "0x00000010",
|
"flags": "0x00000010",
|
||||||
"passport_service": "wtv-passport",
|
"passport_service": "wtv-passport",
|
||||||
"connections": 3,
|
"connections": 3,
|
||||||
"privileged": true
|
"privileged": true,
|
||||||
|
"modules": [
|
||||||
|
"WTVBGMusic"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"wtv-music": {
|
"wtv-music": {
|
||||||
"port": 1656,
|
"port": 1656,
|
||||||
@@ -109,7 +115,10 @@
|
|||||||
},
|
},
|
||||||
"wtv-disk": {
|
"wtv-disk": {
|
||||||
"port": 1635,
|
"port": 1635,
|
||||||
"connections": 3
|
"connections": 3,
|
||||||
|
"modules": [
|
||||||
|
"WTVDisk"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"wtv-guide": {
|
"wtv-guide": {
|
||||||
"port": 1621,
|
"port": 1621,
|
||||||
|
|||||||
@@ -1013,8 +1013,7 @@
|
|||||||
<Content Include="ServiceVault\wtv-setup\validate-screen-border.js">
|
<Content Include="ServiceVault\wtv-setup\validate-screen-border.js">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="ServiceVault\wtv-star\ROMCache\HackTVLogoJewel.gif" />
|
<Content Include="ServiceVault\wtv-star\star.js" />
|
||||||
<Content Include="ServiceVault\wtv-star\ROMCache\WebTVLogoJewel.gif" />
|
|
||||||
<Content Include="ServiceVault\wtv-tricks\access.js" />
|
<Content Include="ServiceVault\wtv-tricks\access.js" />
|
||||||
<Content Include="ServiceVault\wtv-tricks\blastbacklist.js" />
|
<Content Include="ServiceVault\wtv-tricks\blastbacklist.js" />
|
||||||
<Content Include="ServiceVault\wtv-tricks\go-offline.js" />
|
<Content Include="ServiceVault\wtv-tricks\go-offline.js" />
|
||||||
@@ -1116,7 +1115,7 @@
|
|||||||
<Content Include="includes\WTVClientCapabilities.js">
|
<Content Include="includes\WTVClientCapabilities.js">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="includes\WTVDownloadList.js">
|
<Content Include="includes\WTVDisk.js">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="includes\WTVFavorites.js" />
|
<Content Include="includes\WTVFavorites.js" />
|
||||||
@@ -1260,7 +1259,6 @@
|
|||||||
<Folder Include="ServiceVault\wtv-register\" />
|
<Folder Include="ServiceVault\wtv-register\" />
|
||||||
<Folder Include="ServiceVault\wtv-setup\" />
|
<Folder Include="ServiceVault\wtv-setup\" />
|
||||||
<Folder Include="ServiceVault\wtv-star\" />
|
<Folder Include="ServiceVault\wtv-star\" />
|
||||||
<Folder Include="ServiceVault\wtv-star\ROMCache\" />
|
|
||||||
<Folder Include="ServiceVault\wtv-tricks\" />
|
<Folder Include="ServiceVault\wtv-tricks\" />
|
||||||
<Folder Include="ServiceVault\wtv-disk\" />
|
<Folder Include="ServiceVault\wtv-disk\" />
|
||||||
<Folder Include="ServiceVault\wtv-1800\" />
|
<Folder Include="ServiceVault\wtv-1800\" />
|
||||||
|
|||||||
Reference in New Issue
Block a user