From f6db75fca244ba39ca0af0cd7eeea06b932f1e2b Mon Sep 17 00:00:00 2001 From: zefie Date: Thu, 13 Oct 2022 02:26:22 -0400 Subject: [PATCH] sync usenet progress before bed - image attachments on webtv cause server error - only affects inline embeds - midi and audio attachments should still work fine --- .../ServiceVault/wtv-news/get-attachment.js | 1 - .../ServiceVault/wtv-news/news.js | 4 +- zefie_wtvp_minisrv/app.js | 30 ++----------- zefie_wtvp_minisrv/includes/WTVNews.js | 10 ++++- zefie_wtvp_minisrv/includes/WTVNewsServer.js | 44 +++++++++++++++---- zefie_wtvp_minisrv/includes/WTVShared.js | 30 +++++++++++++ 6 files changed, 79 insertions(+), 40 deletions(-) diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-news/get-attachment.js b/zefie_wtvp_minisrv/ServiceVault/wtv-news/get-attachment.js index 83bcc556..3913cd11 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-news/get-attachment.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-news/get-attachment.js @@ -39,7 +39,6 @@ if ((!attachment_id && attachment_id != 0) || !group || !article) { if (message_data.attachments) { if (attachment_id < message_data.attachments.length) { var attachment = message_data.attachments[attachment_id]; - console.log(attachment); var encoding = attachment.content_encoding.toLowerCase() if (encoding == 'base64') { data = Buffer.from(attachment.data, encoding); diff --git a/zefie_wtvp_minisrv/ServiceVault/wtv-news/news.js b/zefie_wtvp_minisrv/ServiceVault/wtv-news/news.js index 234e6647..3c937f4a 100644 --- a/zefie_wtvp_minisrv/ServiceVault/wtv-news/news.js +++ b/zefie_wtvp_minisrv/ServiceVault/wtv-news/news.js @@ -562,14 +562,14 @@ ${wtvshared.htmlEntitize(message_body, true)} case "image/jpeg": case "image/png": case "image/gif": - data += `

`; + data += `

`; break; case "audio/wav": case "audio/mp2": case "audio/mp3": case "audio/mid": case "audio/midi": - data += ` + data += `
  ${(v.filename) ? (v.filename) : "Audio file"} (${v.content_type.split('/')[1]} attachment)


diff --git a/zefie_wtvp_minisrv/app.js b/zefie_wtvp_minisrv/app.js index dfb31814..29a9ad87 100644 --- a/zefie_wtvp_minisrv/app.js +++ b/zefie_wtvp_minisrv/app.js @@ -1039,7 +1039,7 @@ async function sendToClient(socket, headers_obj, data) { // add Connection header if missing, default to Keep-Alive if (!headers_obj.Connection) { headers_obj.Connection = "Keep-Alive"; - headers_obj = moveObjectElement('Connection', 'Response', headers_obj); + headers_obj = wtvshared.moveObjectElement('Connection', 'Response', headers_obj); } var content_length = 0; @@ -1131,7 +1131,7 @@ async function sendToClient(socket, headers_obj, data) { // encrypt if needed if (socket_sessions[socket.id].secure == true && !socket_sessions[socket.id].do_not_encrypt) { headers_obj["wtv-encrypted"] = 'true'; - headers_obj = moveObjectElement('wtv-encrypted', 'Connection', headers_obj); + headers_obj = wtvshared.moveObjectElement('wtv-encrypted', 'Connection', headers_obj); if (content_length > 0 && socket_sessions[socket.id].wtvsec) { if (!minisrv_config.config.debug_flags.quiet) console.log(" * Encrypting response to client ...") 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.update_ticket) { 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; } } @@ -1282,30 +1282,6 @@ function concatArrayBuffer(buffer1, buffer2) { 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) { // 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 diff --git a/zefie_wtvp_minisrv/includes/WTVNews.js b/zefie_wtvp_minisrv/includes/WTVNews.js index 70c19909..b83a4bef 100644 --- a/zefie_wtvp_minisrv/includes/WTVNews.js +++ b/zefie_wtvp_minisrv/includes/WTVNews.js @@ -398,10 +398,16 @@ class WTVNews { attachments: attachments } } 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 { - 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 } } } diff --git a/zefie_wtvp_minisrv/includes/WTVNewsServer.js b/zefie_wtvp_minisrv/includes/WTVNewsServer.js index 4e291be4..f4605100 100644 --- a/zefie_wtvp_minisrv/includes/WTVNewsServer.js +++ b/zefie_wtvp_minisrv/includes/WTVNewsServer.js @@ -43,6 +43,7 @@ class WTVNewsServer { }, _postArticle: function (session) { try { + console.log(session.post_data); session.group.name = self.getHeader(session.post_data, "newsgroups"); if (session.group.name.indexOf(',') >= 0) return false; // cross post not implemented return self.postArticle(session.group.name, session.post_data) @@ -147,8 +148,10 @@ class WTVNewsServer { } getHeader(message, header) { - var search = Object.keys(message.headers).find(e => (e.toLowerCase() == header.toLowerCase())); - if (search) return message.headers[search]; + if (message.headers) { + var search = Object.keys(message.headers).find(e => (e.toLowerCase() == header.toLowerCase())); + if (search) return message.headers[search]; + } return null; } @@ -157,12 +160,21 @@ class WTVNewsServer { return true; } - getNextAvailableArticleID(group) { - return this.selectGroup(group).max_index + 1; + getArticleIdMeta(group) { + 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) { - var articleNumber = this.getNextAvailableArticleID(group); + var articleNumber = this.getArticleIdMeta(group).last_article_id; if (!articleNumber) return false; try { post_data.articleNumber = articleNumber; @@ -171,9 +183,19 @@ class WTVNewsServer { var messageId = "<" + this.wtvshared.generatePassword(16) + "@" + this.minisrv_config.config.domain_name + ">"; 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['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 return this.createArticle(group, articleNumber, post_data); } catch (e) { @@ -187,6 +209,7 @@ class WTVNewsServer { var file = g + this.path.sep + articleNumber + ".newz"; try { this.fs.writeFileSync(file, JSON.stringify(article)); + this.incrementArticleIdMeta(group); return true; } catch (e) { console.error(" * WTVNewsServer Error: createArticle: ", e); @@ -220,6 +243,8 @@ class WTVNewsServer { try { var data = JSON.parse(this.fs.readFileSync(g)); data.index = data.articleNumber; + if (!data.body) data.body = ['']; + if (!data.headers.Subject) data.headers.Subject = "(No subject)"; return data } catch (e) { console.error(" * WTVNewsServer Error: getArticle: ", e); @@ -246,6 +271,7 @@ class WTVNewsServer { } try { this.fs.readdirSync(g).forEach(file => { + if (file == "meta.json") return; var articleNumber = parseInt(file.split('.')[0]); if (out.min_index == null) out.min_index = articleNumber; else if (articleNumber < out.min_index) out.min_index = articleNumber; @@ -263,7 +289,6 @@ class WTVNewsServer { getGroups() { var groups = []; 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)); }); return groups; @@ -275,6 +300,7 @@ class WTVNewsServer { try { var articleNumbers = []; this.fs.readdirSync(g).forEach(file => { + if (file == "meta.json") return; var articleNumber = parseInt(file.split('.')[0]); articleNumbers.push(articleNumber); }); @@ -300,6 +326,7 @@ class WTVNewsServer { try { var articleNumbers = []; this.fs.readdirSync(g).forEach(file => { + if (file == "meta.json") return; var articleNumber = parseInt(file.split('.')[0]); articleNumbers.push(articleNumber); }); @@ -329,6 +356,7 @@ class WTVNewsServer { var articles = []; try { this.fs.readdirSync(g).forEach(file => { + if (file == "meta.json") return; var articleNumber = parseInt(file.split('.')[0]); if (articleNumber < start) return; if (articleNumber > end) return false; diff --git a/zefie_wtvp_minisrv/includes/WTVShared.js b/zefie_wtvp_minisrv/includes/WTVShared.js index 7cdaf55b..a288ab30 100644 --- a/zefie_wtvp_minisrv/includes/WTVShared.js +++ b/zefie_wtvp_minisrv/includes/WTVShared.js @@ -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) { if (notices || reload_notice) console.log(" *** Reading global configuration...");