sync usenet progress before bed
- image attachments on webtv cause server error - only affects inline embeds - midi and audio attachments should still work fine
This commit is contained in:
@@ -39,7 +39,6 @@ if ((!attachment_id && attachment_id != 0) || !group || !article) {
|
|||||||
if (message_data.attachments) {
|
if (message_data.attachments) {
|
||||||
if (attachment_id < message_data.attachments.length) {
|
if (attachment_id < message_data.attachments.length) {
|
||||||
var attachment = message_data.attachments[attachment_id];
|
var attachment = message_data.attachments[attachment_id];
|
||||||
console.log(attachment);
|
|
||||||
var encoding = attachment.content_encoding.toLowerCase()
|
var encoding = attachment.content_encoding.toLowerCase()
|
||||||
if (encoding == 'base64') {
|
if (encoding == 'base64') {
|
||||||
data = Buffer.from(attachment.data, encoding);
|
data = Buffer.from(attachment.data, encoding);
|
||||||
|
|||||||
@@ -562,14 +562,14 @@ ${wtvshared.htmlEntitize(message_body, true)}
|
|||||||
case "image/jpeg":
|
case "image/jpeg":
|
||||||
case "image/png":
|
case "image/png":
|
||||||
case "image/gif":
|
case "image/gif":
|
||||||
data += `<img border=2 src="wtv-news:/get-attachment?group=${group}&article=${article}&attachment_id=${k}wtv-title=Video%20Snapshot" width="380" height="290"><br><br>`;
|
data += `<img border=2 src="wtv-news:/get-attachment?group=${group}&article=${article}&attachment_id=${k}&wtv-title=Video%20Snapshot"><br><br>`;
|
||||||
break;
|
break;
|
||||||
case "audio/wav":
|
case "audio/wav":
|
||||||
case "audio/mp2":
|
case "audio/mp2":
|
||||||
case "audio/mp3":
|
case "audio/mp3":
|
||||||
case "audio/mid":
|
case "audio/mid":
|
||||||
case "audio/midi":
|
case "audio/midi":
|
||||||
data += `<table href="wtv-news:/get-attachment?group=${group}&article=${article}&attachment_id=${k}&wtv-title=Audio%20file" width=386 cellspacing=0 cellpadding=0>
|
data += `<table href="wtv-news:/get-attachment?group=${group}&article=${article}&attachment_id=${k}&wtv-title=${(v.filename) ? encodeURIComponent(v.filename) : "Audio%20file"}" width=386 cellspacing=0 cellpadding=0>
|
||||||
<td align=left valign=middle><img src="wtv-news:/ROMCache/FileSound.gif" align=absmiddle><font color="#189CD6"> ${(v.filename) ? (v.filename) : "Audio file"} (${v.content_type.split('/')[1]} attachment)</font>
|
<td align=left valign=middle><img src="wtv-news:/ROMCache/FileSound.gif" align=absmiddle><font color="#189CD6"> ${(v.filename) ? (v.filename) : "Audio file"} (${v.content_type.split('/')[1]} attachment)</font>
|
||||||
<td align=right valign=middle>
|
<td align=right valign=middle>
|
||||||
</table><br><br>
|
</table><br><br>
|
||||||
|
|||||||
@@ -1039,7 +1039,7 @@ async function sendToClient(socket, headers_obj, data) {
|
|||||||
// add Connection header if missing, default to Keep-Alive
|
// add Connection header if missing, default to Keep-Alive
|
||||||
if (!headers_obj.Connection) {
|
if (!headers_obj.Connection) {
|
||||||
headers_obj.Connection = "Keep-Alive";
|
headers_obj.Connection = "Keep-Alive";
|
||||||
headers_obj = moveObjectElement('Connection', 'Response', headers_obj);
|
headers_obj = wtvshared.moveObjectElement('Connection', 'Response', headers_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
var content_length = 0;
|
var content_length = 0;
|
||||||
@@ -1131,7 +1131,7 @@ async function sendToClient(socket, headers_obj, data) {
|
|||||||
// encrypt if needed
|
// encrypt if needed
|
||||||
if (socket_sessions[socket.id].secure == true && !socket_sessions[socket.id].do_not_encrypt) {
|
if (socket_sessions[socket.id].secure == true && !socket_sessions[socket.id].do_not_encrypt) {
|
||||||
headers_obj["wtv-encrypted"] = 'true';
|
headers_obj["wtv-encrypted"] = 'true';
|
||||||
headers_obj = moveObjectElement('wtv-encrypted', 'Connection', headers_obj);
|
headers_obj = wtvshared.moveObjectElement('wtv-encrypted', 'Connection', headers_obj);
|
||||||
if (content_length > 0 && socket_sessions[socket.id].wtvsec) {
|
if (content_length > 0 && socket_sessions[socket.id].wtvsec) {
|
||||||
if (!minisrv_config.config.debug_flags.quiet) 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);
|
var enc_data = socket_sessions[socket.id].wtvsec.Encrypt(1, data);
|
||||||
@@ -1168,7 +1168,7 @@ async function sendToClient(socket, headers_obj, data) {
|
|||||||
if (ssid_sessions[socket.ssid].data_store.wtvsec_login.ticket_b64) {
|
if (ssid_sessions[socket.ssid].data_store.wtvsec_login.ticket_b64) {
|
||||||
if (ssid_sessions[socket.ssid].data_store.wtvsec_login.update_ticket) {
|
if (ssid_sessions[socket.ssid].data_store.wtvsec_login.update_ticket) {
|
||||||
headers_obj["wtv-ticket"] = ssid_sessions[socket.ssid].data_store.wtvsec_login.ticket_b64;
|
headers_obj["wtv-ticket"] = ssid_sessions[socket.ssid].data_store.wtvsec_login.ticket_b64;
|
||||||
headers_obj = moveObjectElement("wtv-ticket", "Connection", headers_obj);
|
headers_obj = wtvshared.moveObjectElement("wtv-ticket", "Connection", headers_obj);
|
||||||
ssid_sessions[socket.ssid].data_store.wtvsec_login.update_ticket = false;
|
ssid_sessions[socket.ssid].data_store.wtvsec_login.update_ticket = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1282,30 +1282,6 @@ function concatArrayBuffer(buffer1, buffer2) {
|
|||||||
return tmp.buffer;
|
return tmp.buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
function moveObjectElement(currentKey, afterKey, obj) {
|
|
||||||
var result = {};
|
|
||||||
var val = obj[currentKey];
|
|
||||||
delete obj[currentKey];
|
|
||||||
var next = -1;
|
|
||||||
var i = 0;
|
|
||||||
if (typeof afterKey == 'undefined' || afterKey == null) afterKey = '';
|
|
||||||
Object.keys(obj).forEach(function (k) {
|
|
||||||
var v = obj[k];
|
|
||||||
if ((afterKey == '' && i == 0) || next == 1) {
|
|
||||||
result[currentKey] = val;
|
|
||||||
next = 0;
|
|
||||||
}
|
|
||||||
if (k == afterKey) { next = 1; }
|
|
||||||
result[k] = v;
|
|
||||||
++i;
|
|
||||||
});
|
|
||||||
if (next == 1) {
|
|
||||||
result[currentKey] = val;
|
|
||||||
}
|
|
||||||
if (next !== -1) return result; else return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function isUnencryptedString(string) {
|
function isUnencryptedString(string) {
|
||||||
// a generic "isAscii" check is not sufficient, as the test will see the binary
|
// 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
|
// compressed / encrypted data as ASCII. This function checks for characters expected
|
||||||
|
|||||||
@@ -398,10 +398,16 @@ class WTVNews {
|
|||||||
attachments: attachments
|
attachments: attachments
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return { text: message.article.body.join("\n") }
|
var message_body = '';
|
||||||
|
if (message.article.body) message_body = message.article.body.join("\n")
|
||||||
|
|
||||||
|
return { text: message_body }
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return { text: message.article.body.join("\n") }
|
var message_body = '';
|
||||||
|
if (message.article.body) message_body = message.article.body.join("\n")
|
||||||
|
|
||||||
|
return { text: message_body }
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class WTVNewsServer {
|
|||||||
},
|
},
|
||||||
_postArticle: function (session) {
|
_postArticle: function (session) {
|
||||||
try {
|
try {
|
||||||
|
console.log(session.post_data);
|
||||||
session.group.name = self.getHeader(session.post_data, "newsgroups");
|
session.group.name = self.getHeader(session.post_data, "newsgroups");
|
||||||
if (session.group.name.indexOf(',') >= 0) return false; // cross post not implemented
|
if (session.group.name.indexOf(',') >= 0) return false; // cross post not implemented
|
||||||
return self.postArticle(session.group.name, session.post_data)
|
return self.postArticle(session.group.name, session.post_data)
|
||||||
@@ -147,8 +148,10 @@ class WTVNewsServer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getHeader(message, header) {
|
getHeader(message, header) {
|
||||||
|
if (message.headers) {
|
||||||
var search = Object.keys(message.headers).find(e => (e.toLowerCase() == header.toLowerCase()));
|
var search = Object.keys(message.headers).find(e => (e.toLowerCase() == header.toLowerCase()));
|
||||||
if (search) return message.headers[search];
|
if (search) return message.headers[search];
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,12 +160,21 @@ class WTVNewsServer {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
getNextAvailableArticleID(group) {
|
getArticleIdMeta(group) {
|
||||||
return this.selectGroup(group).max_index + 1;
|
const g = this.getGroupPath(group) + this.path.sep + "meta.json";
|
||||||
|
if (this.fs.existsSync(g)) return JSON.parse(this.fs.readFileSync(g));
|
||||||
|
return { group: group, last_article_id: (this.selectGroup(group).max_index + 1) }
|
||||||
|
}
|
||||||
|
|
||||||
|
incrementArticleIdMeta(group) {
|
||||||
|
const g = this.getGroupPath(group) + this.path.sep + "meta.json";
|
||||||
|
var meta = this.getArticleIdMeta(group);
|
||||||
|
meta.last_article_id = meta.last_article_id + 1;
|
||||||
|
this.fs.writeFileSync(g, JSON.stringify(meta))
|
||||||
}
|
}
|
||||||
|
|
||||||
postArticle(group, post_data) {
|
postArticle(group, post_data) {
|
||||||
var articleNumber = this.getNextAvailableArticleID(group);
|
var articleNumber = this.getArticleIdMeta(group).last_article_id;
|
||||||
if (!articleNumber) return false;
|
if (!articleNumber) return false;
|
||||||
try {
|
try {
|
||||||
post_data.articleNumber = articleNumber;
|
post_data.articleNumber = articleNumber;
|
||||||
@@ -171,9 +183,19 @@ class WTVNewsServer {
|
|||||||
var messageId = "<" + this.wtvshared.generatePassword(16) + "@" + this.minisrv_config.config.domain_name + ">";
|
var messageId = "<" + this.wtvshared.generatePassword(16) + "@" + this.minisrv_config.config.domain_name + ">";
|
||||||
post_data.messageId = post_data.headers['Message-ID'] = messageId;
|
post_data.messageId = post_data.headers['Message-ID'] = messageId;
|
||||||
}
|
}
|
||||||
//Tue, 11 Oct 2022 17:25:16 -0400
|
|
||||||
|
if (!post_data.headers.Path) post_data.headers.Path = "@" + this.minisrv_config.config.domain_name;
|
||||||
|
if (!post_data.headers.Subject) post_data.headers.Subject = "(No subject)";
|
||||||
|
|
||||||
post_data.headers.Date = this.strftime("%a, %-d %b %Y %H:%M:%S %z", Date.parse(post_data.headers.date))
|
post_data.headers.Date = this.strftime("%a, %-d %b %Y %H:%M:%S %z", Date.parse(post_data.headers.date))
|
||||||
post_data.headers['INJECTION-DATE'] = this.strftime("%a, %-d %b %Y %H:%M:%S %z", Date.parse(Date.now()))
|
post_data.headers['Injection-Date'] = this.strftime("%a, %-d %b %Y %H:%M:%S %z", Date.parse(Date.now()))
|
||||||
|
post_data.headers = this.wtvshared.moveObjectElement('Path', null, post_data.headers, true);
|
||||||
|
post_data.headers = this.wtvshared.moveObjectElement('From', 'Path', post_data.headers, true);
|
||||||
|
post_data.headers = this.wtvshared.moveObjectElement('Newsgroups', 'From', post_data.headers, true);
|
||||||
|
post_data.headers = this.wtvshared.moveObjectElement('Subject', 'Newsgroups', post_data.headers, true);
|
||||||
|
post_data.headers = this.wtvshared.moveObjectElement('Date', 'Subject', post_data.headers, true);
|
||||||
|
post_data.headers = this.wtvshared.moveObjectElement('Organization', 'Date', post_data.headers, true);
|
||||||
|
post_data.headers = this.wtvshared.moveObjectElement('Message-ID', 'Organization', post_data.headers, true);
|
||||||
if (this.articleExists(group, articleNumber)) return false // should not occur, but just in case
|
if (this.articleExists(group, articleNumber)) return false // should not occur, but just in case
|
||||||
return this.createArticle(group, articleNumber, post_data);
|
return this.createArticle(group, articleNumber, post_data);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -187,6 +209,7 @@ class WTVNewsServer {
|
|||||||
var file = g + this.path.sep + articleNumber + ".newz";
|
var file = g + this.path.sep + articleNumber + ".newz";
|
||||||
try {
|
try {
|
||||||
this.fs.writeFileSync(file, JSON.stringify(article));
|
this.fs.writeFileSync(file, JSON.stringify(article));
|
||||||
|
this.incrementArticleIdMeta(group);
|
||||||
return true;
|
return true;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(" * WTVNewsServer Error: createArticle: ", e);
|
console.error(" * WTVNewsServer Error: createArticle: ", e);
|
||||||
@@ -220,6 +243,8 @@ class WTVNewsServer {
|
|||||||
try {
|
try {
|
||||||
var data = JSON.parse(this.fs.readFileSync(g));
|
var data = JSON.parse(this.fs.readFileSync(g));
|
||||||
data.index = data.articleNumber;
|
data.index = data.articleNumber;
|
||||||
|
if (!data.body) data.body = [''];
|
||||||
|
if (!data.headers.Subject) data.headers.Subject = "(No subject)";
|
||||||
return data
|
return data
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(" * WTVNewsServer Error: getArticle: ", e);
|
console.error(" * WTVNewsServer Error: getArticle: ", e);
|
||||||
@@ -246,6 +271,7 @@ class WTVNewsServer {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
this.fs.readdirSync(g).forEach(file => {
|
this.fs.readdirSync(g).forEach(file => {
|
||||||
|
if (file == "meta.json") return;
|
||||||
var articleNumber = parseInt(file.split('.')[0]);
|
var articleNumber = parseInt(file.split('.')[0]);
|
||||||
if (out.min_index == null) out.min_index = articleNumber;
|
if (out.min_index == null) out.min_index = articleNumber;
|
||||||
else if (articleNumber < out.min_index) out.min_index = articleNumber;
|
else if (articleNumber < out.min_index) out.min_index = articleNumber;
|
||||||
@@ -263,7 +289,6 @@ class WTVNewsServer {
|
|||||||
getGroups() {
|
getGroups() {
|
||||||
var groups = [];
|
var groups = [];
|
||||||
this.fs.readdirSync(this.data_path).forEach(file => {
|
this.fs.readdirSync(this.data_path).forEach(file => {
|
||||||
console.log(file);
|
|
||||||
if (this.fs.lstatSync(this.data_path + this.path.sep + file).isDirectory()) groups.push(this.selectGroup(file));
|
if (this.fs.lstatSync(this.data_path + this.path.sep + file).isDirectory()) groups.push(this.selectGroup(file));
|
||||||
});
|
});
|
||||||
return groups;
|
return groups;
|
||||||
@@ -275,6 +300,7 @@ class WTVNewsServer {
|
|||||||
try {
|
try {
|
||||||
var articleNumbers = [];
|
var articleNumbers = [];
|
||||||
this.fs.readdirSync(g).forEach(file => {
|
this.fs.readdirSync(g).forEach(file => {
|
||||||
|
if (file == "meta.json") return;
|
||||||
var articleNumber = parseInt(file.split('.')[0]);
|
var articleNumber = parseInt(file.split('.')[0]);
|
||||||
articleNumbers.push(articleNumber);
|
articleNumbers.push(articleNumber);
|
||||||
});
|
});
|
||||||
@@ -300,6 +326,7 @@ class WTVNewsServer {
|
|||||||
try {
|
try {
|
||||||
var articleNumbers = [];
|
var articleNumbers = [];
|
||||||
this.fs.readdirSync(g).forEach(file => {
|
this.fs.readdirSync(g).forEach(file => {
|
||||||
|
if (file == "meta.json") return;
|
||||||
var articleNumber = parseInt(file.split('.')[0]);
|
var articleNumber = parseInt(file.split('.')[0]);
|
||||||
articleNumbers.push(articleNumber);
|
articleNumbers.push(articleNumber);
|
||||||
});
|
});
|
||||||
@@ -329,6 +356,7 @@ class WTVNewsServer {
|
|||||||
var articles = [];
|
var articles = [];
|
||||||
try {
|
try {
|
||||||
this.fs.readdirSync(g).forEach(file => {
|
this.fs.readdirSync(g).forEach(file => {
|
||||||
|
if (file == "meta.json") return;
|
||||||
var articleNumber = parseInt(file.split('.')[0]);
|
var articleNumber = parseInt(file.split('.')[0]);
|
||||||
if (articleNumber < start) return;
|
if (articleNumber < start) return;
|
||||||
if (articleNumber > end) return false;
|
if (articleNumber > end) return false;
|
||||||
|
|||||||
@@ -214,6 +214,36 @@ class WTVShared {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
moveObjectElement(currentKey, afterKey, obj, caseInsensitive = false) {
|
||||||
|
var result = {};
|
||||||
|
if (caseInsensitive) {
|
||||||
|
Object.keys(obj).forEach((k) => {
|
||||||
|
if (k.toLowerCase() == currentKey.toLowerCase()) {
|
||||||
|
currentKey = k;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
var val = obj[currentKey];
|
||||||
|
delete obj[currentKey];
|
||||||
|
var next = -1;
|
||||||
|
var i = 0;
|
||||||
|
if (typeof afterKey == 'undefined' || afterKey == null) afterKey = '';
|
||||||
|
Object.keys(obj).forEach(function (k) {
|
||||||
|
var v = obj[k];
|
||||||
|
if ((afterKey == '' && i == 0) || next == 1) {
|
||||||
|
result[currentKey] = val;
|
||||||
|
next = 0;
|
||||||
|
}
|
||||||
|
if (k == afterKey || (caseInsensitive && k.toLowerCase() == afterKey.toLowerCase())) { next = 1; }
|
||||||
|
result[k] = v;
|
||||||
|
++i;
|
||||||
|
});
|
||||||
|
if (next == 1) {
|
||||||
|
result[currentKey] = val;
|
||||||
|
}
|
||||||
|
if (next !== -1) return result; else return obj;
|
||||||
|
}
|
||||||
|
|
||||||
readMiniSrvConfig(user_config = true, notices = true, reload_notice = false) {
|
readMiniSrvConfig(user_config = true, notices = true, reload_notice = false) {
|
||||||
if (notices || reload_notice) console.log(" *** Reading global configuration...");
|
if (notices || reload_notice) console.log(" *** Reading global configuration...");
|
||||||
|
|||||||
Reference in New Issue
Block a user