From f99de19792661c73bd81d4a665874ce26a1ba816 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Mon, 24 Jul 2023 12:17:47 -0600 Subject: [PATCH 01/37] Make real name and other properties optional - pass 1 --- core/achievement.js | 2 +- core/client_connections.js | 2 +- core/fse.js | 6 +----- core/my_messages.js | 5 +---- core/nua.js | 15 ++++++++------- core/user.js | 7 +++++-- core/user_2fa_otp_web_register.js | 6 +++--- core/user_config.js | 20 ++++++++------------ core/web_password_reset.js | 2 +- core/wfc.js | 4 +--- 10 files changed, 30 insertions(+), 39 deletions(-) diff --git a/core/achievement.js b/core/achievement.js index d73372ca..b28bb1b8 100644 --- a/core/achievement.js +++ b/core/achievement.js @@ -505,7 +505,7 @@ class Achievements { getFormatObject(info) { return { userName: info.user.username, - userRealName: info.user.properties[UserProps.RealName], + userRealName: info.user.realName(), userLocation: info.user.properties[UserProps.Location], userAffils: info.user.properties[UserProps.Affiliations], nodeId: info.client.node, diff --git a/core/client_connections.js b/core/client_connections.js index 3dbf0e45..a94f65b5 100644 --- a/core/client_connections.js +++ b/core/client_connections.js @@ -87,7 +87,7 @@ function getActiveConnectionList( // entry.text = ac.user?.username || 'N/A'; entry.userName = ac.user?.username || 'N/A'; - entry.realName = ac.user?.getProperty(UserProps.RealName) || 'N/A'; + entry.realName = ac.user?.realName() || 'N/A'; entry.location = ac.user?.getProperty(UserProps.Location) || 'N/A'; entry.affils = entry.affiliation = ac.user?.getProperty(UserProps.Affiliations) || 'N/A'; diff --git a/core/fse.js b/core/fse.js index c5413989..6d883ba8 100644 --- a/core/fse.js +++ b/core/fse.js @@ -982,11 +982,7 @@ exports.FullScreenEditorModule = const area = getMessageAreaByTag(self.messageAreaTag); if (fromView !== undefined) { if (area && area.realNames) { - fromView.setText( - self.client.user.properties[ - UserProps.RealName - ] || self.client.user.username - ); + fromView.setText(self.client.user.realName()); } else { fromView.setText(self.client.user.username); } diff --git a/core/my_messages.js b/core/my_messages.js index 50bba7ae..a50a6884 100644 --- a/core/my_messages.js +++ b/core/my_messages.js @@ -20,10 +20,7 @@ exports.getModule = class MyMessagesModule extends MenuModule { initSequence() { const filter = { - toUserName: [ - this.client.user.username, - this.client.user.getProperty(UserProps.RealName), - ], + toUserName: [this.client.user.username, this.client.user.realName()], sort: 'modTimestamp', resultType: 'messageList', limit: 1024 * 16, // we want some sort of limit... diff --git a/core/nua.js b/core/nua.js index 4f6f355d..9eabc232 100644 --- a/core/nua.js +++ b/core/nua.js @@ -13,6 +13,7 @@ const UserProps = require('./user_property.js'); // deps const _ = require('lodash'); +const moment = require('moment'); exports.moduleInfo = { name: 'NUA', @@ -95,15 +96,15 @@ exports.getModule = class NewUserAppModule extends MenuModule { areaTag = areaTag || ''; newUser.properties = { - [UserProps.RealName]: formData.value.realName, + [UserProps.RealName]: formData.value.realName || '', [UserProps.Birthdate]: getISOTimestampString( - formData.value.birthdate + formData.value.birthdate || moment() ), - [UserProps.Sex]: formData.value.sex, - [UserProps.Location]: formData.value.location, - [UserProps.Affiliations]: formData.value.affils, - [UserProps.EmailAddress]: formData.value.email, - [UserProps.WebAddress]: formData.value.web, + [UserProps.Sex]: formData.value.sex || '', + [UserProps.Location]: formData.value.location || '', + [UserProps.Affiliations]: formData.value.affils || '', + [UserProps.EmailAddress]: formData.value.email || '', + [UserProps.WebAddress]: formData.value.web || '', [UserProps.AccountCreated]: getISOTimestampString(), [UserProps.MessageConfTag]: confTag, diff --git a/core/user.js b/core/user.js index 58cf69d9..aac33ef2 100644 --- a/core/user.js +++ b/core/user.js @@ -124,9 +124,12 @@ module.exports = class User { return isMember; } + realName() { + return this.getProperty(UserProps.RealName) || this.username; + } + getSanitizedName(type = 'username') { - const name = - 'real' === type ? this.getProperty(UserProps.RealName) : this.username; + const name = 'real' === type ? this.realName() : this.username; return sanatizeFilename(name) || `user${this.userId.toString()}`; } diff --git a/core/user_2fa_otp_web_register.js b/core/user_2fa_otp_web_register.js index edae1d5b..735b6f36 100644 --- a/core/user_2fa_otp_web_register.js +++ b/core/user_2fa_otp_web_register.js @@ -93,9 +93,9 @@ module.exports = class User2FA_OTPWebRegister { } const message = { - to: `${ - user.getProperty(UserProps.RealName) || user.username - } <${user.getProperty(UserProps.EmailAddress)}>`, + to: `${user.realName()} <${user.getProperty( + UserProps.EmailAddress + )}>`, // from will be filled in subject: '2-Factor Authentication Registration', text: textTemplate, diff --git a/core/user_config.js b/core/user_config.js index a612e95c..63bfdc16 100644 --- a/core/user_config.js +++ b/core/user_config.js @@ -115,15 +115,15 @@ exports.getModule = class UserConfigModule extends MenuModule { formData = _.clone(formData); const newProperties = { - [UserProps.RealName]: formData.value.realName, + [UserProps.RealName]: formData.value.realName || '', [UserProps.Birthdate]: getISOTimestampString( - formData.value.birthdate + formData.value.birthdate || moment() ), - [UserProps.Sex]: formData.value.sex, - [UserProps.Location]: formData.value.location, - [UserProps.Affiliations]: formData.value.affils, - [UserProps.EmailAddress]: formData.value.email, - [UserProps.WebAddress]: formData.value.web, + [UserProps.Sex]: formData.value.sex || '', + [UserProps.Location]: formData.value.location || '', + [UserProps.Affiliations]: formData.value.affils || '', + [UserProps.EmailAddress]: formData.value.email || '', + [UserProps.WebAddress]: formData.value.web || '', [UserProps.TermHeight]: formData.value.termHeight.toString(), [UserProps.ThemeId]: self.availThemeInfo[formData.value.theme].themeId, @@ -233,11 +233,7 @@ exports.getModule = class UserConfigModule extends MenuModule { function populateViews(callback) { const user = self.client.user; - self.setViewText( - 'menu', - MciCodeIds.RealName, - user.properties[UserProps.RealName] - ); + self.setViewText('menu', MciCodeIds.RealName, user.realName()); self.setViewText( 'menu', MciCodeIds.BirthDate, diff --git a/core/web_password_reset.js b/core/web_password_reset.js index dbc4f88d..757a1983 100644 --- a/core/web_password_reset.js +++ b/core/web_password_reset.js @@ -143,7 +143,7 @@ class WebPasswordReset { } const message = { - to: `${user.properties[UserProps.RealName] || user.username} <${ + to: `${user.realName()} <${ user.properties[UserProps.EmailAddress] }>`, // from will be filled in diff --git a/core/wfc.js b/core/wfc.js index 749593ab..eca853f0 100644 --- a/core/wfc.js +++ b/core/wfc.js @@ -506,9 +506,7 @@ exports.getModule = class WaitingForCallerModule extends MenuModule { // Current currentUserName: this.client.user.username, - currentUserRealName: - this.client.user.getProperty(UserProps.RealName) || - this.client.user.username, + currentUserRealName: this.client.user.realName(), availIndicator: availIndicator, visIndicator: visIndicator, lastLoginUserName: lastLoginStats.userName, From 5a4563c799614325dd5334ba05f9da8abec03ddc Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Thu, 24 Aug 2023 09:13:29 -0600 Subject: [PATCH 02/37] PR feedback: Better handling of real name and email --- WHATSNEW.md | 1 + core/achievement.js | 6 +++--- core/client_connections.js | 2 +- core/user.js | 20 +++++++++++++++++--- core/user_2fa_otp_web_register.js | 4 +--- core/user_config.js | 2 +- core/web_password_reset.js | 4 +--- core/wfc.js | 2 +- 8 files changed, 26 insertions(+), 15 deletions(-) diff --git a/WHATSNEW.md b/WHATSNEW.md index 060bf502..8a2c8405 100644 --- a/WHATSNEW.md +++ b/WHATSNEW.md @@ -9,6 +9,7 @@ This document attempts to track **major** changes and additions in ENiGMA½. For * Finally, the system will search for `index.html` and `index.htm` in that order, if another suitable route cannot be established. * CombatNet has shut down, so the module (`combatnet.js`) has been removed. * The Menu Flag `popParent` has been removed and `noHistory` has been updated to work as expected. In general things should "Just Work", but check your `menu.hjson` entries if you see menu stack issues. +* Various New User Application (NUA) properties are now optional. If you would like to reduce the information users are required, remove optional fields from NUA artwork and collect less. These properties will be stored as "" (empty). Optional properties are as follows: Real name, Birth date, Sex, Location, Affiliations (Affils), Email, and Web address. ## 0.0.13-beta * **Note for contributors**: ENiGMA has switched to [Prettier](https://prettier.io) for formatting/style. Please see [CONTRIBUTING](CONTRIBUTING.md) and the Prettier website for more information. diff --git a/core/achievement.js b/core/achievement.js index b28bb1b8..582468a3 100644 --- a/core/achievement.js +++ b/core/achievement.js @@ -505,9 +505,9 @@ class Achievements { getFormatObject(info) { return { userName: info.user.username, - userRealName: info.user.realName(), - userLocation: info.user.properties[UserProps.Location], - userAffils: info.user.properties[UserProps.Affiliations], + userRealName: info.user.realName(false) || 'N/A', + userLocation: info.user.properties[UserProps.Location] || 'N/A', + userAffils: info.user.properties[UserProps.Affiliations] || 'N/A', nodeId: info.client.node, title: info.details.title, //text : info.global ? info.details.globalText : info.details.text, diff --git a/core/client_connections.js b/core/client_connections.js index a94f65b5..447669c2 100644 --- a/core/client_connections.js +++ b/core/client_connections.js @@ -87,7 +87,7 @@ function getActiveConnectionList( // entry.text = ac.user?.username || 'N/A'; entry.userName = ac.user?.username || 'N/A'; - entry.realName = ac.user?.realName() || 'N/A'; + entry.realName = ac.user?.realName(false) || 'N/A'; entry.location = ac.user?.getProperty(UserProps.Location) || 'N/A'; entry.affils = entry.affiliation = ac.user?.getProperty(UserProps.Affiliations) || 'N/A'; diff --git a/core/user.js b/core/user.js index aac33ef2..125850bf 100644 --- a/core/user.js +++ b/core/user.js @@ -124,15 +124,29 @@ module.exports = class User { return isMember; } - realName() { - return this.getProperty(UserProps.RealName) || this.username; + realName(withUsernameFallback = true) { + const realName = this.getProperty(UserProps.RealName); + if (realName) { + return realName; + } + if (withUsernameFallback) { + return this.username; + } } getSanitizedName(type = 'username') { - const name = 'real' === type ? this.realName() : this.username; + const name = 'real' === type ? this.realName(true) : this.username; return sanatizeFilename(name) || `user${this.userId.toString()}`; } + emailAddress() { + const email = this.getProperty(UserProps.EmailAddress); + if (email) { + const realName = this.realName(false); + return realName ? `${realName} <${email}>` : email; + } + } + isAvailable() { return (this.statusFlags & User.StatusFlags.NotAvailable) == 0; } diff --git a/core/user_2fa_otp_web_register.js b/core/user_2fa_otp_web_register.js index 735b6f36..2d04280c 100644 --- a/core/user_2fa_otp_web_register.js +++ b/core/user_2fa_otp_web_register.js @@ -93,9 +93,7 @@ module.exports = class User2FA_OTPWebRegister { } const message = { - to: `${user.realName()} <${user.getProperty( - UserProps.EmailAddress - )}>`, + to: user.emailAddress(), // from will be filled in subject: '2-Factor Authentication Registration', text: textTemplate, diff --git a/core/user_config.js b/core/user_config.js index 63bfdc16..b597ac4d 100644 --- a/core/user_config.js +++ b/core/user_config.js @@ -233,7 +233,7 @@ exports.getModule = class UserConfigModule extends MenuModule { function populateViews(callback) { const user = self.client.user; - self.setViewText('menu', MciCodeIds.RealName, user.realName()); + self.setViewText('menu', MciCodeIds.RealName, user.realName(false) || ''); self.setViewText( 'menu', MciCodeIds.BirthDate, diff --git a/core/web_password_reset.js b/core/web_password_reset.js index 757a1983..f5cf73c7 100644 --- a/core/web_password_reset.js +++ b/core/web_password_reset.js @@ -143,9 +143,7 @@ class WebPasswordReset { } const message = { - to: `${user.realName()} <${ - user.properties[UserProps.EmailAddress] - }>`, + to: user.emailAddress(), // from will be filled in subject: 'Forgot Password', text: textTemplate, diff --git a/core/wfc.js b/core/wfc.js index eca853f0..41a258b2 100644 --- a/core/wfc.js +++ b/core/wfc.js @@ -506,7 +506,7 @@ exports.getModule = class WaitingForCallerModule extends MenuModule { // Current currentUserName: this.client.user.username, - currentUserRealName: this.client.user.realName(), + currentUserRealName: this.client.user.realName(false) || 'N/A', availIndicator: availIndicator, visIndicator: visIndicator, lastLoginUserName: lastLoginStats.userName, From 0b157ddd1bb12df42baa1525237271f1e85fb2e9 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Thu, 24 Aug 2023 18:00:02 -0500 Subject: [PATCH 03/37] Changed ansi parser to use SAUCE width when available --- core/art.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/core/art.js b/core/art.js index 5e46591c..6a4da757 100644 --- a/core/art.js +++ b/core/art.js @@ -46,6 +46,16 @@ function getFontNameFromSAUCE(sauce) { } } +function getWidthFromSAUCE(sauce) { + if (sauce.Character) { + let sauceWidth = _.toNumber(sauce.Character.characterWidth); + if(!(_.isNaN(sauceWidth) && sauceWidth > 0)) { + return sauceWidth; + } + } + return null; +} + function sliceAtEOF(data, eofMarker) { let eof = data.length; const stopPos = Math.max(data.length - 256, 0); // 256 = 2 * sizeof(SAUCE) @@ -270,10 +280,18 @@ function display(client, art, options, cb) { } } + // Use width from SAUCE if available - if the width is less than the term width, + // we need to set that as the width for the parser so that wide terminals + // display correctly + let parseWidth = getWidthFromSAUCE(options.sauce); + if(_.isNil(parseWidth) || parseWidth > client.term.termWidth) { + parseWidth = client.term.termWidth; + } + const ansiParser = new aep.ANSIEscapeParser({ mciReplaceChar: options.mciReplaceChar, termHeight: client.term.termHeight, - termWidth: client.term.termWidth, + termWidth: parseWidth, trailingLF: options.trailingLF, startRow: options.startRow, }); From ccaaa71e2367176e8a481acb47e33c0dc0450398 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Fri, 25 Aug 2023 14:24:47 -0500 Subject: [PATCH 04/37] Make the terminal go to new line if the width of the term is greater than the art width --- core/ansi_escape_parser.js | 21 ++++++++++++++------- core/art.js | 11 ++--------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/core/ansi_escape_parser.js b/core/ansi_escape_parser.js index 27d5490d..76dc15b5 100644 --- a/core/ansi_escape_parser.js +++ b/core/ansi_escape_parser.js @@ -37,6 +37,10 @@ function ANSIEscapeParser(options) { this.mciReplaceChar = miscUtil.valueWithDefault(options.mciReplaceChar, ''); this.termHeight = miscUtil.valueWithDefault(options.termHeight, 25); this.termWidth = miscUtil.valueWithDefault(options.termWidth, 80); + this.breakWidth = this.termWidth; + if(!(_.isNil(options.artWidth)) && options.artWidth > 0 && options.artWidth < this.breakWidth) { + this.breakWidth = options.artWidth; + } this.trailingLF = miscUtil.valueWithDefault(options.trailingLF, 'default'); this.row = Math.min(options?.startRow ?? 1, this.termHeight); @@ -90,8 +94,8 @@ function ANSIEscapeParser(options) { switch (charCode) { case CR: - self.emit('literal', text.slice(start, pos)); - start = pos; + self.emit('literal', text.slice(start, pos + 1)); + start = pos + 1; self.column = 1; @@ -105,8 +109,8 @@ function ANSIEscapeParser(options) { self.column = 1; } - self.emit('literal', text.slice(start, pos)); - start = pos; + self.emit('literal', text.slice(start, pos + 1)); + start = pos + 1; self.row += 1; @@ -114,13 +118,16 @@ function ANSIEscapeParser(options) { break; default: - if (self.column === self.termWidth) { + if (self.column === self.breakWidth) { self.emit('literal', text.slice(start, pos + 1)); start = pos + 1; + // If the art is terminal, then we need to force the terminal to go to the next line. + if(self.column < self.termWidth) { + self.emit('literal', '\r\n'); + } self.column = 1; self.row += 1; - self.positionUpdated(); } else { self.column += 1; @@ -135,7 +142,7 @@ function ANSIEscapeParser(options) { // // Finalize this chunk // - if (self.column > self.termWidth) { + if (self.column > self.breakWidth) { self.column = 1; self.row += 1; diff --git a/core/art.js b/core/art.js index 6a4da757..100f2404 100644 --- a/core/art.js +++ b/core/art.js @@ -280,18 +280,11 @@ function display(client, art, options, cb) { } } - // Use width from SAUCE if available - if the width is less than the term width, - // we need to set that as the width for the parser so that wide terminals - // display correctly - let parseWidth = getWidthFromSAUCE(options.sauce); - if(_.isNil(parseWidth) || parseWidth > client.term.termWidth) { - parseWidth = client.term.termWidth; - } - const ansiParser = new aep.ANSIEscapeParser({ mciReplaceChar: options.mciReplaceChar, termHeight: client.term.termHeight, - termWidth: parseWidth, + termWidth: client.term.termWidth, + artWidth: getWidthFromSAUCE(options.sauce), trailingLF: options.trailingLF, startRow: options.startRow, }); From 7d46607ddc0150adf962664e3bca5fe21b61b731 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Fri, 25 Aug 2023 14:33:28 -0500 Subject: [PATCH 05/37] Updated the WHATSNEW to include info about the art change. --- WHATSNEW.md | 1 + 1 file changed, 1 insertion(+) diff --git a/WHATSNEW.md b/WHATSNEW.md index 060bf502..107bd533 100644 --- a/WHATSNEW.md +++ b/WHATSNEW.md @@ -9,6 +9,7 @@ This document attempts to track **major** changes and additions in ENiGMA½. For * Finally, the system will search for `index.html` and `index.htm` in that order, if another suitable route cannot be established. * CombatNet has shut down, so the module (`combatnet.js`) has been removed. * The Menu Flag `popParent` has been removed and `noHistory` has been updated to work as expected. In general things should "Just Work", but check your `menu.hjson` entries if you see menu stack issues. +* Art handling has been changed to respect the art width contained in SAUCE when present in the case where the terminal width is greater than the art width. This fixes art files that assume wrapping at 80 columns on wide (mostly new utf8) terminals. ## 0.0.13-beta * **Note for contributors**: ENiGMA has switched to [Prettier](https://prettier.io) for formatting/style. Please see [CONTRIBUTING](CONTRIBUTING.md) and the Prettier website for more information. From bf0bf830535c13aff64fbf556e54ad1f062d271f Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Fri, 25 Aug 2023 14:38:32 -0500 Subject: [PATCH 06/37] Small logic change to improve SAUCE handling --- core/art.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/art.js b/core/art.js index 100f2404..2261585f 100644 --- a/core/art.js +++ b/core/art.js @@ -49,7 +49,7 @@ function getFontNameFromSAUCE(sauce) { function getWidthFromSAUCE(sauce) { if (sauce.Character) { let sauceWidth = _.toNumber(sauce.Character.characterWidth); - if(!(_.isNaN(sauceWidth) && sauceWidth > 0)) { + if(!(_.isNaN(sauceWidth)) && sauceWidth > 0) { return sauceWidth; } } From 8758722b6b7b3ebc1956031ec9eefcd2c6c2c73b Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Fri, 25 Aug 2023 18:34:45 -0500 Subject: [PATCH 07/37] Fixed PR review comments --- core/ansi_escape_parser.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/ansi_escape_parser.js b/core/ansi_escape_parser.js index 76dc15b5..99411102 100644 --- a/core/ansi_escape_parser.js +++ b/core/ansi_escape_parser.js @@ -38,7 +38,9 @@ function ANSIEscapeParser(options) { this.termHeight = miscUtil.valueWithDefault(options.termHeight, 25); this.termWidth = miscUtil.valueWithDefault(options.termWidth, 80); this.breakWidth = this.termWidth; - if(!(_.isNil(options.artWidth)) && options.artWidth > 0 && options.artWidth < this.breakWidth) { + // toNumber takes care of null, undefined etc as well. + let artWidth = _.toNumber(options.artWidth); + if(!(_.isNaN(artWidth)) && artWidth > 0 && artWidth < this.breakWidth) { this.breakWidth = options.artWidth; } this.trailingLF = miscUtil.valueWithDefault(options.trailingLF, 'default'); @@ -122,7 +124,7 @@ function ANSIEscapeParser(options) { self.emit('literal', text.slice(start, pos + 1)); start = pos + 1; - // If the art is terminal, then we need to force the terminal to go to the next line. + // If we hit breakWidth before termWidth then we need to force the terminal to go to the next line. if(self.column < self.termWidth) { self.emit('literal', '\r\n'); } From adc2e1ba98805b193b1aa6790cf29cd9ef4dc049 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Sat, 26 Aug 2023 10:37:12 -0500 Subject: [PATCH 08/37] Fixed Dockerfile to run on Windows --- docker/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index b53c72df..82815691 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -21,6 +21,7 @@ RUN apt-get update \ lhasa \ unrar-free \ p7zip-full \ + dos2unix \ && npm install -g pm2 \ && cd /enigma-bbs && npm install --only=production \ && pm2 start main.js \ @@ -37,6 +38,7 @@ RUN apt-get update \ # sexyz COPY docker/bin/sexyz /usr/local/bin +RUN dos2unix /enigma-bbs/docker/bin/docker-entrypoint.sh && apt-get remove dos2unix -y RUN chmod +x /enigma-bbs/docker/bin/docker-entrypoint.sh # enigma storage mounts From 1d00482b0283f3e9293f13506b01e7a3610da361 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Sat, 26 Aug 2023 10:54:39 -0500 Subject: [PATCH 09/37] Updated node & added .dockerignore --- .dockerignore | 3 +++ docker/Dockerfile | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..960be9a0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +node_modules +package-lock.json +yarn.lock \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile index 82815691..c09b7a5c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:14-buster-slim +FROM node:18-buster-slim LABEL maintainer="dave@force9.org" @@ -22,8 +22,9 @@ RUN apt-get update \ unrar-free \ p7zip-full \ dos2unix \ + && npm install -g npm@latest \ && npm install -g pm2 \ - && cd /enigma-bbs && npm install --only=production \ + && cd /enigma-bbs && npm install \ && pm2 start main.js \ && mkdir -p /enigma-bbs-pre/art \ && mkdir /enigma-bbs-pre/mods \ From 80dcc14a50a6cea293214b48af8337207ce470a5 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Sat, 26 Aug 2023 11:05:39 -0500 Subject: [PATCH 10/37] Small doc change to add running custom container --- docs/_docs/installation/docker.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/_docs/installation/docker.md b/docs/_docs/installation/docker.md index a6959b81..f2f7affa 100644 --- a/docs/_docs/installation/docker.md +++ b/docs/_docs/installation/docker.md @@ -71,5 +71,9 @@ Customising the Docker image is easy! 1. Clone the ENiGMA-BBS source. 2. Build the image ```bash -docker build -f ./docker/Dockerfile . +docker build -t enigmabbs -f ./docker/Dockerfile . +``` +3. Run the image +```bash +docker run -it -p 8888:8888 --name "ENiGMABBS" -v "$(pwd)/config:/enigma-bbs/config" -v "$(pwd)/db:/enigma-bbs/db" -v "$(pwd)/logs:/enigma-bbs/logs" -v "$(pwd)/filebase:/enigma-bbs/filebase" -v "$(pwd)/art:/enigma-bbs/art" -v "$(pwd)/mods:/enigma-bbs/mods" -v "$(pwd)/mail:/mail" enigmabbs ``` From 13ae7789a5f857011c2480ec1ae06f0051353e1d Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Sat, 26 Aug 2023 20:03:48 -0500 Subject: [PATCH 11/37] No need to copy the ephemeral directories --- .dockerignore | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 960be9a0..749db005 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,12 @@ node_modules package-lock.json -yarn.lock \ No newline at end of file +yarn.lock + +filebase +db +drop +file_base +logs +mail +docs/_site +docs/.sass-cache \ No newline at end of file From 5ba1ca14642cc70b1392779b9d1016ce37140220 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Sun, 27 Aug 2023 12:25:36 -0500 Subject: [PATCH 12/37] Initial devcontainer setup --- .devcontainer/Dockerfile | 9 +++++++++ .devcontainer/devcontainer.json | 14 ++++++++++++++ .gitattributes | 10 ++++++++++ .gitignore | 3 +-- .vscode/launch.json | 17 +++++++++++++++++ 5 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 .vscode/launch.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000..b095a6df --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,9 @@ +FROM library/node:lts-bookworm + +ARG DEBIAN_FRONTEND=noninteractive +RUN apt update \ + && apt install -y --no-install-recommends sudo \ + && apt autoremove -y \ + && rm -rf /var/lib/apt/lists/* \ + && echo "node ALL=(ALL) NOPASSWD: ALL" >/etc/sudoers.d/node \ + && chmod 0440 /etc/sudoers.d/node diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..52828b2b --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,14 @@ +{ + "name": "Basic Node.js", + "build": { "dockerfile": "Dockerfile" }, +"remoteUser": "node", +"features": { + "ghcr.io/devcontainers/features/python:1": { + "installTools": true, + "version": "3.11" + }, + "ghcr.io/devcontainers-contrib/features/curl-apt-get:1": {}, + "ghcr.io/jungaretti/features/ripgrep:1": {}, + "ghcr.io/warrenbuckley/codespace-features/sqlite:1": {} +} +} diff --git a/.gitattributes b/.gitattributes index b1892ede..5463d1aa 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,3 +6,13 @@ *.TXT eol=crlf *.diz eol=crlf *.DIZ eol=crlf + +# Don't mess with shell script line endings +*.sh text eol=lf + +# Same thing for optutil.js which functions as a shell script +optutil.js text eol=lf + +# The devcontainer is also unix +.devcontainer/Dockerfile text eol=lf +.devcontainer/devcontainer.json text eol=lf \ No newline at end of file diff --git a/.gitignore b/.gitignore index b55cbcfa..2d3facac 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,4 @@ logs/ mail/ node_modules/ docs/_site/ -docs/.sass-cache/ -.vscode/ +docs/.sass-cache/ \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..c52eeffb --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/main.js" + } + ] +} \ No newline at end of file From 97ae34a9713b7f3024e3308a09d59eaa60e7d3ed Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Sun, 27 Aug 2023 17:31:35 -0600 Subject: [PATCH 13/37] Quick fix on SAUCE --- core/art.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/art.js b/core/art.js index 2261585f..2145f5ad 100644 --- a/core/art.js +++ b/core/art.js @@ -41,13 +41,13 @@ const SUPPORTED_ART_TYPES = { }; function getFontNameFromSAUCE(sauce) { - if (sauce.Character) { + if (sauce && sauce.Character) { return sauce.Character.fontName; } } function getWidthFromSAUCE(sauce) { - if (sauce.Character) { + if (sauce && sauce.Character) { let sauceWidth = _.toNumber(sauce.Character.characterWidth); if(!(_.isNaN(sauceWidth)) && sauceWidth > 0) { return sauceWidth; From 8a6506c475cb62ed4ff4c88ad8d69418beaa0a3f Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Sun, 27 Aug 2023 19:04:17 -0500 Subject: [PATCH 14/37] Additional changes needed to run --- .devcontainer/Dockerfile | 2 +- .devcontainer/devcontainer.json | 11 ++++++++--- .vscode/launch.json | 6 ++++++ .vscode/tasks.json | 25 +++++++++++++++++++++++++ docs/Gemfile | 1 + 5 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 .vscode/tasks.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index b095a6df..fcb42c10 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -2,7 +2,7 @@ FROM library/node:lts-bookworm ARG DEBIAN_FRONTEND=noninteractive RUN apt update \ - && apt install -y --no-install-recommends sudo \ + && apt install -y --no-install-recommends sudo telnet \ && apt autoremove -y \ && rm -rf /var/lib/apt/lists/* \ && echo "node ALL=(ALL) NOPASSWD: ALL" >/etc/sudoers.d/node \ diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 52828b2b..f6ab6d83 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,14 +1,19 @@ { "name": "Basic Node.js", "build": { "dockerfile": "Dockerfile" }, -"remoteUser": "node", +"remoteUser": "root", +"forwardPorts": [8888, 4000], +"postCreateCommand": "gem install jekyll bundler && /bin/rm -rf node_modules && npm install && cd docs && bundle install && cd ..", "features": { "ghcr.io/devcontainers/features/python:1": { "installTools": true, - "version": "3.11" + "version": "latest" }, "ghcr.io/devcontainers-contrib/features/curl-apt-get:1": {}, "ghcr.io/jungaretti/features/ripgrep:1": {}, - "ghcr.io/warrenbuckley/codespace-features/sqlite:1": {} + "ghcr.io/warrenbuckley/codespace-features/sqlite:1": {}, + "ghcr.io/devcontainers/features/ruby:1": { + "version": "3.1" + } } } diff --git a/.vscode/launch.json b/.vscode/launch.json index c52eeffb..9b1822fd 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,12 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "name": "Browse local Documentation - Chrome", + "request": "attach", + "type": "chrome", + "url": "http://localhost:4000/enigma-bbs/" + }, { "type": "node", "request": "launch", diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..c0880b20 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,25 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Start Jekyll (ENiGMA½ documentation server)", + "command": "cd docs && bundle exec jekyll serve", + "type": "shell" + }, + { + "label": "(re)build Jekyll bundles", + "command": "cd docs && bundle install", + "type": "shell" + }, + { + "label": "(re)build node modules", + "command": "/bin/rm -rf node_modules && npm install", + "type": "shell" + }, + { + "label": "ENiGMA½ new configuration", + "command": "./oputil.js config new", + "type": "shell" + } + ] +} \ No newline at end of file diff --git a/docs/Gemfile b/docs/Gemfile index ec96435d..ed87567f 100644 --- a/docs/Gemfile +++ b/docs/Gemfile @@ -30,3 +30,4 @@ end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] +gem "webrick" \ No newline at end of file From 5f0a03638e9195ea59830ac80e9cd04f8f0f97b7 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Mon, 28 Aug 2023 13:08:54 -0500 Subject: [PATCH 15/37] Added some handy extensions and tasks --- .devcontainer/devcontainer.json | 5 +++++ .vscode/tasks.json | 1 + 2 files changed, 6 insertions(+) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f6ab6d83..57d83312 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -15,5 +15,10 @@ "ghcr.io/devcontainers/features/ruby:1": { "version": "3.1" } +}, +"customizations": { + "vscode": { + "extensions": ["ms-azuretools.vscode-docker","alexcvzz.vscode-sqlite","yzhang.markdown-all-in-one", "DavidAnson.vscode-markdownlint", "christian-kohler.npm-intellisense", "dbaeumer.vscode-eslint", "bierner.markdown-yaml-preamble"] + } } } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index c0880b20..8f033263 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,6 +4,7 @@ { "label": "Start Jekyll (ENiGMA½ documentation server)", "command": "cd docs && bundle exec jekyll serve", + "isBackground": true, "type": "shell" }, { From 602d693cafc5a55c43fb0e19ba63110e17184ffa Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Mon, 28 Aug 2023 13:10:38 -0500 Subject: [PATCH 16/37] Added additional local extensions --- .vscode/extensions.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..bfd63065 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "ms-vscode-remote.remote-containers", + "laktak.hjson" + ] +} \ No newline at end of file From c2d7abc94e19ca48c90c42b8ea2e3da7dd51149d Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Mon, 28 Aug 2023 14:17:47 -0500 Subject: [PATCH 17/37] Removed browse task as it won't run without debugging --- .vscode/launch.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 9b1822fd..c52eeffb 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,12 +4,6 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ - { - "name": "Browse local Documentation - Chrome", - "request": "attach", - "type": "chrome", - "url": "http://localhost:4000/enigma-bbs/" - }, { "type": "node", "request": "launch", From 1bd328452b86be7814eddbf667b9871e802f9981 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Mon, 28 Aug 2023 15:39:19 -0500 Subject: [PATCH 18/37] Added documentation for development setup --- docs/_config.yml | 1 + docs/_docs/installation/development.md | 38 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 docs/_docs/installation/development.md diff --git a/docs/_config.yml b/docs/_config.yml index 8520d124..34a77aa3 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -54,6 +54,7 @@ collections: - installation/network.md - installation/testing.md - installation/production.md + - installation/development.md - configuration/creating-config.md - configuration/sysop-setup.md - configuration/config-files.md diff --git a/docs/_docs/installation/development.md b/docs/_docs/installation/development.md new file mode 100644 index 00000000..ac27b528 --- /dev/null +++ b/docs/_docs/installation/development.md @@ -0,0 +1,38 @@ +--- +layout: page +title: Development Environment Setup +--- +_Note:_ This is only useful for people who are looking to contribute to the ENiGMA½ source base itself. Those that are just setting up a new BBS system do not need this section. + +The easiest way to get started with development on ENiGMA½ is via the pre-configured Visual Studio Code remote docker container environment. This setup will download and configure everything needed with minimal interaction. It also works cross-platform. + +* Install [Visual Studio Code](https://code.visualstudio.com/download) +* Install [Docker](https://docs.docker.com/engine/install/) +* Clone the [ENiGMA½](https://github.com/NuSkooler/enigma-bbs) repository. +* Choose "Open Folder" from Visual Studio Code and open the location where you cloned the repository. + +That's it! Visual Studio Code should prompt you for everything else that is needed, including some useful extensions for development. + +## Tasks + +Once it completes, there are a few tasks and run-configs that are useful. Open up the command pallete and search/choose "Tasks> Run Task". From there you can run the following tasks: + +### Start Jekyll (ENiGMA½ documentation server) + +This task will start the Jekyll server to perform local testing of changes to documentation. After running this task, open a browser to (http://localhost:4000/enigma-bbs/) to see the documentation. + +### (re)build Jekyll bundles + +When the image is created the Jekyll bundles are installed, so in general there shouldn't be much need to run this task. This is available however in case soemthing goes wrong or you are working on the Jekyll setup itself. + +### (re)build node modules + +Used to re-generate the node modules. Generally shouldn't be necessary unless something is broken or you are adding/changing versions of dependencies. + +### ENiGMA½ new configuration + +This task executes `oputil.js` in order to create a new BBS configuration (useful if you have just checked out the code and haven't setup any configuration yet.) + +## Run / Debug config + +There is also a default "Launch Program" config (hotkey access via F5 / Ctrl-Shift-D.) This will launch ENiGMA½. Once it has launched, access the system via telnet, port 8888 as usual. \ No newline at end of file From 60ee842c71ed5184662fdfe4914eea56fe9c57c1 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Wed, 30 Aug 2023 19:14:20 +0000 Subject: [PATCH 19/37] Updated Gemfile.lock to fix Github Actions failure --- docs/Gemfile.lock | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index de223cb6..8eb98aeb 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -6,8 +6,8 @@ GEM i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.5) + public_suffix (>= 2.0.2, < 6.0) colorator (1.1.0) concurrent-ruby (1.2.2) cssminify2 (2.0.1) @@ -19,14 +19,14 @@ GEM ffi (1.15.5) forwardable-extended (2.6.0) gemoji (3.0.1) - html-pipeline (2.14.0) + html-pipeline (2.14.3) activesupport (>= 2) nokogiri (>= 1.4) htmlcompressor (0.4.0) http_parser.rb (0.8.0) i18n (1.14.1) concurrent-ruby (~> 1.0) - jekyll (4.2.1) + jekyll (4.2.2) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) @@ -49,7 +49,7 @@ GEM uglifier (~> 4.1) jekyll-relative-links (0.6.1) jekyll (>= 3.3, < 5.0) - jekyll-sass-converter (2.1.0) + jekyll-sass-converter (2.2.0) sassc (> 2.0.1, < 3.0) jekyll-seo-tag (2.7.1) jekyll (>= 3.8, < 5.0) @@ -64,30 +64,30 @@ GEM gemoji (~> 3.0) html-pipeline (~> 2.2) jekyll (>= 3.0, < 5.0) - json (2.6.1) + json (2.6.3) json-minify (0.0.3) json (> 0) - kramdown (2.3.1) + kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - liquid (4.0.3) - listen (3.7.1) + liquid (4.0.4) + listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.4.0) minitest (5.19.0) - nokogiri (1.14.3-x86_64-linux) + nokogiri (1.15.4-x86_64-linux) racc (~> 1.4) pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (4.0.6) - racc (1.6.2) - rb-fsevent (0.11.0) + public_suffix (5.0.3) + racc (1.7.1) + rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) - rexml (3.2.5) - rouge (3.28.0) + rexml (3.2.6) + rouge (3.30.0) safe_yaml (1.0.5) sassc (2.4.0) ffi (~> 1.9) @@ -98,6 +98,7 @@ GEM uglifier (4.2.0) execjs (>= 0.3.0, < 3) unicode-display_width (1.8.0) + webrick (1.8.1) PLATFORMS x86_64-linux @@ -111,6 +112,7 @@ DEPENDENCIES jekyll-theme-hacker (~> 0.2.0) jemoji (~> 0.12.0) tzinfo-data + webrick BUNDLED WITH - 2.3.5 + 2.4.19 From 6fb77f3a5f18530e0e38ad088c3fdffffea41b48 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Sat, 2 Sep 2023 23:50:41 -0500 Subject: [PATCH 20/37] Added additional escape control sequences --- core/ansi_escape_parser.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ansi_escape_parser.js b/core/ansi_escape_parser.js index 99411102..796a1cf7 100644 --- a/core/ansi_escape_parser.js +++ b/core/ansi_escape_parser.js @@ -24,7 +24,7 @@ function ANSIEscapeParser(options) { this.graphicRendition = {}; this.parseState = { - re: /(?:\x1b\x5b)([?=;0-9]*?)([ABCDHJKfhlmnpsu])/g, // eslint-disable-line no-control-regex + re: /(?:\x1b\x5b)([?=;0-9]*?)([ABCDHJKfhlmnpsutEFGST])/g, // eslint-disable-line no-control-regex }; options = miscUtil.valueWithDefault(options, { @@ -231,7 +231,7 @@ function ANSIEscapeParser(options) { self.parseState = { // ignore anything past EOF marker, if any buffer: input.split(String.fromCharCode(0x1a), 1)[0], - re: /(?:\x1b\x5b)([?=;0-9]*?)([ABCDHJKfhlmnpsu])/g, // eslint-disable-line no-control-regex + re: /(?:\x1b\x5b)([?=;0-9]*?)([ABCDHJKfhlmnpsutEFGST])/g, // eslint-disable-line no-control-regex stop: false, }; }; From f4a90900ae6ff36c39e840d41d64b1ef9e1aaaf4 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Sun, 3 Sep 2023 11:01:43 -0600 Subject: [PATCH 21/37] TIC attachment doc updates --- docs/_docs/filebase/tic-support.md | 58 ++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/docs/_docs/filebase/tic-support.md b/docs/_docs/filebase/tic-support.md index e1d01ffb..9639b5b7 100644 --- a/docs/_docs/filebase/tic-support.md +++ b/docs/_docs/filebase/tic-support.md @@ -3,7 +3,7 @@ layout: page title: TIC Support --- ## TIC Support -ENiGMA½ supports FidoNet-Style TIC file attachments by mapping TIC areas to local file areas. +ENiGMA½ supports FidoNet-Style TIC file attachments by mapping external TIC area tags to local file areas. Under a given node defined in the `ftn_bso` config section in `config.hjson` (see [BSO Import/Export](../messageareas/bso-import-export.md)), TIC configuration may be supplied: @@ -17,9 +17,9 @@ Under a given node defined in the `ftn_bso` config section in `config.hjson` (se packetPassword: mypass encoding: cp437 archiveType: zip - tic: { + tic: { // <--- General TIC config for 46:* password: TESTY-TEST - uploadBy: Agoranet TIC + uploadBy: AgoraNet TIC allowReplace: true } } @@ -29,7 +29,15 @@ Under a given node defined in the `ftn_bso` config section in `config.hjson` (se } ``` -You then need to configure the mapping between TIC areas you want to carry, and the file base area and storage tag for them to be tossed to. Optionally you can also add hashtags to the tossed files to assist users in searching for files: +Valid `tic` members: + +| Item | Required | Description | +|--------|---------------|------------------| +| `password` | :-1: | TIC packet password, if required | +| `uploadedBy` | :-1: | Sets the "uploaded by" field for TIC attachments, for example "AgoraNet TIC" | +| `allowReplace` | :-1: | Set to `true` to allow TIC attachments to replace each other. This is especially handy for things like weekly node list attachments | + +Next, we need to configure the mapping between TIC areas you want to carry, and the file base area (and, optionally, specific storage tag) for them to be tossed to. You can also add hashtags to the tossed files to assist users in searching for files: ```hjson ticAreas: { @@ -41,10 +49,22 @@ ticAreas: { } ``` -Multiple TIC areas can be mapped to a single file base area. + +> :information_source: Note that in the example above `agn_node` represents the **external** network area tag, usually represented in all caps. In this case, `AGN_NODE`. + +Valid `ticAreas` members under a given node mapping are as follows: + +| Item | Required | Description | +|--------|---------------|------------------| +| `areaTag` | :+1: | Specifies the local areaTag in which to place TIC attachments | +| `storageTag` | :-1: | Optionally, set a specific storageTag. If not set, the default for this area will be used. | +| `hashTags` | :-1: | One or more optional hash tags to assign TIC attachments in this area. | + + +💡 Multiple TIC areas can be mapped to a single file base area. ### Example Configuration -An example configuration linking file base areas, FTN BSO node configuration and TIC area configuration. +Example configuration fragments mapping file base areas, FTN BSO node configuration and TIC area configuration. ```hjson fileBase: { @@ -79,22 +99,24 @@ scannerTossers: { } } } + + ticAreas: { + // here we map AgoraNet AGN_NODE -> local msgNetworks file area + agn_node: { + areaTag: msgNetworks + storageTag: msg_network + hashTags: agoranet,nodelist + } + agn_info: { + areaTag: msgNetworks + storageTag: msg_network + hashTags: agoranet,infopack + } + } } } -ticAreas: { - agn_node: { - areaTag: msgNetworks - storageTag: msg_network - hashTags: agoranet,nodelist - } - agn_info: { - areaTag: msgNetworks - storageTag: msg_network - hashTags: agoranet,infopack - } -} ``` ## See Also From e87e7ad2775b2df4139e232eb6ed5597cdb251c7 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Sun, 3 Sep 2023 21:35:50 -0500 Subject: [PATCH 22/37] Updated Docker action --- .github/workflows/docker.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 43e0e6cf..165fc522 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -11,23 +11,23 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up QEMU - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v2 - name: Login to DockerHub - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: tags: enigmabbs/enigma-bbs:latest file: docker/Dockerfile From 3adbb517e8ec8fba6691d0b45a9a6510b6405f90 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Tue, 5 Sep 2023 14:55:57 -0500 Subject: [PATCH 23/37] Updated art lengths to be 24 lines --- .../luciano_blocktronics/2FACONFSCR.ans | Bin 2672 -> 3638 bytes art/themes/luciano_blocktronics/BBSADD.ANS | Bin 2112 -> 2980 bytes art/themes/luciano_blocktronics/BBSLIST.ANS | Bin 2392 -> 3734 bytes art/themes/luciano_blocktronics/FBLISTEXP.ANS | Bin 309 -> 307 bytes art/themes/luciano_blocktronics/FDLMGR.ANS | Bin 2337 -> 3398 bytes art/themes/luciano_blocktronics/FWDLMGR.ANS | Bin 2410 -> 3532 bytes art/themes/luciano_blocktronics/MSGLIST.ANS | Bin 2264 -> 3425 bytes art/themes/luciano_blocktronics/MSRCHLST.ANS | Bin 2219 -> 3328 bytes art/themes/luciano_blocktronics/MYMSGLST.ANS | Bin 2122 -> 3267 bytes art/themes/luciano_blocktronics/NEWMSGS.ANS | Bin 2340 -> 3480 bytes art/themes/luciano_blocktronics/ONELINER.ANS | Bin 1817 -> 3061 bytes .../luciano_blocktronics/PRVMSGLIST.ANS | Bin 2280 -> 3429 bytes art/themes/luciano_blocktronics/STATUS.ANS | Bin 5083 -> 5083 bytes art/themes/luciano_blocktronics/SYSSTAT.ANS | Bin 3066 -> 3490 bytes art/themes/luciano_blocktronics/ULDETAIL.ANS | Bin 1941 -> 3339 bytes art/themes/luciano_blocktronics/USERLST.ANS | Bin 2047 -> 3164 bytes art/themes/luciano_blocktronics/WHOSON.ANS | Bin 1162 -> 2363 bytes art/themes/luciano_blocktronics/theme.hjson | 10 +++++----- art/themes/luciano_blocktronics/wfc.ans | Bin 3138 -> 3130 bytes art/themes/luciano_blocktronics/wfchelp.ans | Bin 606 -> 592 bytes .../wfckicknodeprompt.ans | Bin 65 -> 193 bytes 21 files changed, 5 insertions(+), 5 deletions(-) diff --git a/art/themes/luciano_blocktronics/2FACONFSCR.ans b/art/themes/luciano_blocktronics/2FACONFSCR.ans index 3c2560007a954e0fedf9f1c121b4844f005e5026..114c25ab125f75188b76d15afdd02c474d5f3a38 100644 GIT binary patch literal 3638 zcmcInO;6iE5QQEq^>EA&8iA;1p6*RmI^e(7%QF9sLKf>VH!8 zy_wndI)tE7x=68i=j+Xz$!u6UOp2w$R#Ld7!{wr!)T=71atTsbFQ{xl6_Q#FZxvOY zW_|3;^vET3Px$K}PiNBGf5ACh2 zx98gX*{9ACs^L{pw7NF7H}3Q;k4SSEf-7LV7G8UgYDuemn|-7&T14 z=A-;#FwWfwdCUf5Aau@!j<5a?-_ud*8R>KQx2I2r=tC}(`B6%Y-{p;!wW5UHN>a?% zo`KH?6~j8}+^McMj0&dFO}ramfbe2QFC3HTg4wr&#Vol136}67O`B>e+Tm*(@W=>y zDxt8&p%}rvcxcc?J{psuj)nVe!g~)Pse{e0DvUAQn^if%9xkUm%pgti8QX!ha=Py< zHly-(mFRfl4>Q`r@%gs_BSby~hAI3@auotZ9!&#>%nlmJQp(k!DRL>V-b&lTq^Q6u zImcGyDK;RCQj{f?YOg@UY6K7*L)hZNL=9<6MdghmUIA=y$_sU?CKLK(B~%j9!NL74 zF53KYL-kM<0e1%oV5|WzmI5L!9>`AGf?Ja@#~I0(i5O|t-lX#C@SwSiL{Lx`&J2K9 zhkB@7$dR508OnU1f$aEYS?f0~%Gv5(ha(UozimXr=%}w5w1^yxol&BH~ zFbrP##k3<&)CM67)Gu88zMYg00EU+N!OLoKbK}YL7(?z}faD{0!BNc_+!*6=<Pghl0qJ{@R z;Y6$TXl4lXpC?RuENCRftA2ZbtCJ+ud7_mjX)Ae`to(eju&}teyYO;B*0b%+uKWD4 It-J8~2kgB2pa1{> literal 2672 zcmb_e%TC)s6opl#Y`dw-W;QIV+K!0}S%oxhS%e^B%7Rr$O;wc%uRwnb@jJ2VKdE}o zojYTjpss49#B=99&OP@Lw$7q{8uh!8HCtz~Em!qZl~uWQ7Fo#SAwH-CS*?J#ib}@t z(|sE?+3^-~BQ|BntX9rpmip_}ic*8%-NgRkSI?eIN5>{Vo!}7JcOv>U80M2>GdRh= zj1KdI;UGVl98x>7??u5(4o40B{9xQX9u20`)5-Bi4dXy4#KexKKm!hX!U5CVtIvQn zpDpIar7{4tbsoJ4mccHu`C#9HYCEu34}~{3>cHU9D9Oc4Z;^}OxLRJDyX91 zUmBF0KNqE4$4Z4wRTUA8y^#X>tRH?9zsw!DUChoe3v+X8=2zc9lR%24LG1au#rbUh z^Zr_N@4Rv#0N9!VsUVFlq)I?xwwT`*OEpfUx9y^(`n^~bx3gto7QpyI#E@Zyrd~^1 zggOUVt%|l$VX`wUF$r-$&1?x-8d<$b!(h;fAD6^Q(~P}|aG;1|1sAYHc?G*yj(fiH zB_F9f!Y6`l;B_`qdS#~Umii33?xwT=@^1-?*VaKt+)*kfwwsPuJ|hLiak=5 zE1aR|Y`bBH(4lfxFBZDuA`zGP#vjsGAN*eT@*ESiXfKE=IB@r24j>^OTmzSo*Pas) zURz+MB}JEyP$pF3oF6RnF0`N za;wxQlD>48Tl7I84#nY838^*XNLJF?U^Oz_-X2TG?|`+38zCF{=8y=xmpJV zD3YvvuC4YIk$gucUwZcOQ9&T?v$XvM@(#`#Dy~<>30%1;gesd<_p`LLGOVRv3!-CB zLm6su=K58Nqy{snmY BfCB&k diff --git a/art/themes/luciano_blocktronics/BBSADD.ANS b/art/themes/luciano_blocktronics/BBSADD.ANS index f341f486907a3a0ee288900adbfe8584d3b705fd..1a34d8843c42d9cb67e4ba6baaca4d2facdb4cd6 100644 GIT binary patch literal 2980 zcmcIl%W4}z5R}Qy`GF8!_Tu|$SCJCy1UfCJee zXI0r2%wRL1hVRt-5jrSYkPYU4!`jJr+<}{tV+x>BS0aD;!IZLI9`-tL9Hs zCD%Qwe6VMzkQ*eJ9_k54(p0)a!HR7waH~4X4||aqNK=-Aeg~xz(LTO-Nhr+u{tz@0BkxYZ1=Vkn@e0$TeY`k=At`=tAB7^Y95gw|n z!dxjlXfG9!bg2ja?eL{WZ_s=^J%qH^0b&EFT}x{Y_Mh{F=$Q7r*&w3Px!E6jpbNR#aE#!mgh+b(7MvrM8a+++4NOlT3R&*SXQ+ODR4Ab(U;Rj(ky`4>$Ti&I6W8BwxjmX{-YM@p~kp}AB^m+@j z?~oW<35)LS{ARNJF`sRDzj1GjyS*3l@5{T%uWii-?v1h4JMo^)m(#@-_RzgC!h2PD z-JhFh52m9M^}YJ^mevjNo-KV9}0m**%C(m91Vx=wE< zvzzJd6L+f0d2;o+XX@D`3F651sWw10)$7Z%ujdze{_IqCI}~|Q=I`?U>B~;%=;%x5 TRY%W@kMBQc-#(n#YW4pY`DPx< literal 2112 zcmb_d!D<^Z5Oq!kUwdkO(WQ6oYQ3Apr__W}XrYj_7oVKqLLstCZ3z9Xd`&^y=vVsQ z%xG=mPE$@MNXImr+_7?G1YD(s^;%@pu3BT#oGrlh1(K!ui; zR$u|SBSOBAJNbNM(j*s1tV;5bk+>DQBnF>*CzM#shgQac_Oy7D)fK4&OmQW35C9d< z3y0eu1{jQ)uwxiI8?;Ogf095y zcJxgOukZ)*l?6pr0_l7V*;({Wsx5j6F1SurT32WSSY(cjK!(_08Eg5)9Ia&?ioTRg zRx{LIZH0Coxjm^-Shd>t+mt*emoS!%kDMC}h6pw$+f&+{2fcJYa~QbKaQ>d5lBQ=C zu+f&$S{RapQ>Cvn``m1ijdB#~?rD<2&ofLHsmufC&%T%pKkQuX301jZBLDytO|>CF zH0}$QJ2W=U^W}N7`9h6+>9tT|o-PZR_@G$-9#piW$@VbSU%1;ar`)27cMh8P=4R{G z%eX2a=M?SUTwYf|jeO(yW5zg!a5gox9Hx}I3-imh$_TFu7m%DG9^-;jo z0;W#_wwtfJ`{j>gBU=k-iyGq~F2 uJbrz3@p*pfJ^Jr|J+-e|-}$p&FGi!2lTV{pBY9rFfBVsWd3T{-!~Z`8Jho>5 diff --git a/art/themes/luciano_blocktronics/BBSLIST.ANS b/art/themes/luciano_blocktronics/BBSLIST.ANS index ec2974e905ea067a18bcb8580a01f300cd981141..c4abd67436ea9c95ce35bf584c04b53766343094 100644 GIT binary patch literal 3734 zcmcgvO>fgc5KYC617}1e@TE5-TqiWNIhCqHNK`^9^wLvGj8v(PX%ndWud4nXTllZ= z-puT-?Kmlgf|0V``Fb;N#=E6|5@-FBL7YYXldY^Q!c&!1*@rd?4@|}|g(jHct)giZ z@mJRTz;0*Uc>u$^rlA8sKPTN@lU%L4V=+3D#V zYr+;_H=AUsm9Z=2Y<~KXNHAFuAC_Iu-`6hq^Xqy3%_YEsG9)mt1hB5CrW<`}gt`(} znSd|S^I5uRqYn)o>%T%r4wArCdg{;tCR{^4A_uQ63#|9cVx@hH3`yWT|1w#e%g|5WBo1kR_qm9ft=@G7gv)@KXndrWRO@N5YjO{%NHr;UQU!<2l>Vzu|5=}l$g#I zm)B8#HA^oYBoO$ivhC8|9fQWY9$IJGA1>8O`xTtuA-4S5DB(!$@-K0YZjFbdtc2Y# z&emIZMR2gJ#@AM?jiW9^1qUFJhdlBC{C!V#2QF{{y)%s2mV8hM@PI7MOq2kKFjS*4 z@?c&nl?1VcP@Hg$Nd#A}%mET_Lk2Wla0M?ufYJ$@pA}zafN^nFWr00{QrpFFP3F8D zI&am8J#2WI6;XM;3OZK&!@X&6Tw8869RJ!4*ce@hhASLUQfCFMT5z*~kcGkm1xv>p zS$j--abDV6FT|(k8VCjxY``70=uskl7{bCDh9vl{VoTdGH6;yo(5d1d9-LNOgNXynInSoAsVTdIxn*X#M}4C$|PaP8=fwIEhNbfj`m+&PzMea zDakIrpXsfP15;J4Kd~s41nM~n17gS)nMRuGN)b%7lV7IF#ExGnd+*Kgt_nzeR9YEJ zSXiK#abyLr$%UG%Big#<8(N=zgq8uC;ALqzCex{?Nsj7Ur*~kd(uac3Cd=OPzrA&- zhMDmJkdyj(&Ma$VP=^Z9J)Kl2H#Q(`>^s_qx{Y_*t#+;P5Y(P|+? zMH6A(xNKyiL^^5^3Dr5av_$@ji@Rz3U8j0O=J|?4HWY(5phDV~l_gD=#BxV8A^?^l zLP)wqm^KgeBylo`cjDp8C%xXr#>d{%o;;7fgc5KV6=S56QKeCZj-aqNDaid7*bDj^km$tfj9s??2X6R7&Hs{S2Y^z9~|IsX&7XI?`ay6Pw62=78<=mA}WspZu zaMAvkPl;@`0#2Gz07~3>op?Z8(=VV__p9nhz+xy4SQC$h)#4Znf!X&F1h6izm*sjF zA@vAY|BXP7gmG711_0%2dFBjd>VdFs0nsjyb6tI#udk|QzzAt%-WF@m7Mp`$xvIXe z@8-81nZYvmmRPqe)7UJ#LR9M#g|SKm;{$Jub;~$Vm$`DezP*pCyJdMBjD4MfF;U)! z9t3LuY0*V3nrMptgM?yGL_0yUPC>U4FU?(pvov=6P04ZWXu}>%xQ7Oi;E64YL#U!J zrAM7{Ry6$7Bt&C$Y0kF7pzgtjAk^ihg(^rYun-t$aG-n>95zGVdEOPC z#iAUQJN9YfNJyHAN+uT!#6s3lVr1(fa|Ey^$O~AaL+4Em8To}9-~OWakVQ(|o43G6 zv5vGeUx{W&X&?Chwqc6@RucbP%2i zSOAd5pl0$MV1LzrzE}_llo@08m^WOs_VHjhkdXP~V+d?J5v$xLOwW+-p0MlNLN+3M zj{$wP<9kyI-z3{b!W%UU4iWIdQI47|p38nwUL!v10z3fmW4!>`;ztoNv3gnH#wezc zxrc{Ptey^T)C(3WQe_a}Pj4FAKn?7HVvm`G@DKB}2wf6@anrN429oa%Ng&(k90-C& zAPiqLU=-K=(Ztz>0Y;}3B{U5WP1Zb=LRR3Clf)(}|1-kzh_4;KK0o_x`Hp^8F@i7E4%uz&)q@xW%GC&%rbYimsFIb6G suw$sRtAWA9gKiTquu2#i7#SN_8kp>6U|?Wm3}D~_(m=p8S)Nf00O=7J^Z)<= delta 132 zcmdnYw3UfdI@-Y6#K79vd?K@#0T&mLo2#H89c^rus~X~C2of+hM-nlTjy43z7=cwz ztTo`|k_vVVb#^r{n0U}-;stg+BLhQA10zGzeGCi?jEn&cTtFHKggu>n6~f#dAv`z< E0MuU^A^-pY diff --git a/art/themes/luciano_blocktronics/FDLMGR.ANS b/art/themes/luciano_blocktronics/FDLMGR.ANS index a85ffcbe85030509131b4e8fbc2a70b1499f4768..a5c1cedf08dba7592e3aef98a006f4d9355b0b4b 100644 GIT binary patch literal 3398 zcmcIm%We}v5Ol;X;sX%A%!P9{Ys(h+w8U0GiW5jgIQV3Nkt}&YgvWueit;HDa#~84ECTW=U3g{KMEMg?OzWHyMY~_eLOumE5>G8oEFEEbMTXm zRI4{^l9J*~A$V?yY1He%mMTO0Ww}~>o!iBB6u_DNvHY_Tw}|z>si*Mo*r(aCAy9gW z4t@sq#pU!6KsHizM~o=GE!uXBMgRJAOO)LP(V~a?q!_l^w-eaPRcieBu64?UceQ>T z+S4d;LZul$Z0~p?`jAVx<0wAJx)~aS?s%m7#%%|!%J{~=ndU?`9QE=3bJw~y?#(E@ z4IFt(s+>m`>KU=D0m zVFD^sIW~q{?E5(fGI#-fePIO-WlUm=(U}Wl(4|ZW7Lg27=^T+;b*mLm6I#rhNZ_ZnZO#<9j#0M(`qrlq6P^_ZcDKwfF>p~ zKt-vJldzsX75YPZXhO#b^`ze5B9H{JHnSFNHu9_#uJ_*7pk&}XjdO) z0i>Z&j*!U(C}A|_zNxnvQm`PngHdzIL5hZ2$n56Eqho?08!f4~3pDvgf}Zfvw8gWk zDIMy7VVbcOnD^V{l#)3#fhbTQ(H_{*}HBQsBO4~6#uBB8h4{$A`u)z$&A+roEjlUBASkTDq r^NZrc(Im^Dva6M6c`tjJ^{c0y&fea;&a)2Jlee#@=JL4EUHJS5Z{1ng literal 2337 zcmb_eJ#W-N5WRHhS}M3^o7Az_7aO?hNKOGMmp~$*xGI7}igXJid=&huC>_7WmiC_@ z-kX_S`;yQgTsYp@nc4T=JUcg86|-qEtBT+zt1@(Lf5k3#lT{HAFAs2I5@LMVUl*GXNqSCv4XAKyDs_Iy#EPL*E*agG0hnsAdfgLY-qJ@ z(s&FBfFUMPfCT!To|&+hIt&``i78T>F8my3kZ`qaqKwnnBRIxk=ErsR&Sz zNtQQ_l8aE3EyYIa4waJK4FO4P%g_%a;Yot3G)@c(3p63BKk&J7ukUlim+zO~avZM( zPuem?MghU)gDskEy~&)?P>$>Cq}?6rX#+~+W&?GSV9-=3(`z&XzisIqPaYby8gvjv znIbZ3KWU}!B%6t|OjCepLSMw6KeO_%qLCx%%T2?S zl>de34~8heMB@1I`TWhnq9{=Lzb;>tP2o%b>%nNWv-4{7Xe8Iem(Q2(?a^FU`Thsn Cv*c_5 diff --git a/art/themes/luciano_blocktronics/FWDLMGR.ANS b/art/themes/luciano_blocktronics/FWDLMGR.ANS index b0e7fffc2dc2b2135b582710406cce810fe22ed9..a50122639983eea801a341f90b87e1e304996afe 100644 GIT binary patch literal 3532 zcmdT`O;1xn6fJRQ;@;TJY+O5iZQ5v81sXJ=pn|Yq1z4m>MzXHR>rC^c<%&G5vM7rttR^kE^x+Cia>KV$T#b=W z{cBR7521-cG(GidljpS*DcK)=^SBDTS{8JlxqAk7ojD$EvLY{U?;r2&?hm%jXs|cf z8GZyywy*x}UX_}9we>;*!>p{|ZX=d1J$G|8U5x|yyNk(m{Pon0mqm!rkIAoKuUEnC z`$we9D3GnLdwDc!f#wGZs}s0XUfk2%tS*gT&9EfPGTv7Mo%5Q_GG~5_;=hL0-HhkA z{5!PQv!q+=F~p}>zXhy5_LBQ7I1e}&hr2Diu9FecExuu6zO|jihw~*G9``L|kr9X_ z7J0f`-i|W*^!gnTN@?cNS}{E_GIu!G#I1$f`c1g%&o952i^+KUnfsJVSi?~IoOp5C zEqQ>eY0plt&o5DX=wEl$Hv`wMD+=7OYR@1TijX^*lUD|8Af_W+_-hy<9)L`Ef-h}? z+6R_g)-su5cM40r5N&`QEb$;hA@GXMsO{k{Wx87T3N>cV$crg$c@tDuWB2VR9wH>D+nl))VcN)9bb3T#p5 z3t)7dFSV0BHpH=%+|mi6(e4&L=Qj6zIzGLk2kO~&qt zhxRa-UPnKffEhP(AcP5vx*)*It5gt)SfnBso)Qu^9f0P9ff{pTo3=cpFv$1!~ zNu*OesI1-0iI7s4cf=@5558bgqU5`~P+isNhXUMa7m=ngNC-+;DiBWClmY_)+o&?3 z`~=)8r^=4uj3T1vN}eW;#fL>>@%?6Ut@@B1ZTs4G&Ym?I8yoK%&l_A%-ffP|(au1n`1u<-`FIxq literal 2410 zcmb_eO;Zy=6a;T_^`yD%#k2bnvT9BNQfL(c6@)`hh(S`7(GtOfzl!4TWUJ<%Sa$cD zncVGGr#G!i_glpWE;|`-=^~tW4o>#>4n{lK zWVAop9e-fd(EO_!u**8;LlxZxmVz;?Dsc|n5pjLFV0zRPJa;}{%)XwwnHkHR+1!u$ zFByofU;?PpC9z74qNwt~JwKil@FuW9BFf09vI?*fOiH)SvV%YK0S0?fq4I-X!KeBM zpMur8<*P1AOI#;KJ-QhXRVfgVFeN2bk&Le*etCzMR#;jKS#qPAbYlPno7pY7f_BDx2LA=Xp`F|;l9!WAmoxY6 zC-wl;4KH) zW@4{6G#i^06d43v_+CvSAvv6oNGe)d9MFScvV*yCOF0%x>Xh_hu>5uRpwOW|!bDBb zD9Ka0@gc-eG?d95ri5}1f^;ccTk`MM^Q&aXX0X!A zP$U!(+};{t{X4YaqeTyL+}uR%IzEw~VTTeaSw|h?3s<#5Gu&_(_+~>{8R87Z8h_DO zGFm=UPdmwEnyjEH7YLhUB?|rqb=aFVyzV^P;3ICL!MxCT$JE%+-LZPMqz%{H387R- zKO6R+hu6O}e&gBU=;QV{&k^~*o-!}$ye!H`kJr}L*Wax@UDNaA?baka-W}N~ef|OA Cy7z?u diff --git a/art/themes/luciano_blocktronics/MSGLIST.ANS b/art/themes/luciano_blocktronics/MSGLIST.ANS index b67b31a6746fb981bbc768d3b07c89fb036c5cbb..44d5163dd855b97195fd0a0c2f494eef24f19769 100644 GIT binary patch literal 3425 zcmdT{O>fgc5KYAm@dFBxz?a+|Crt!7g{VSEL_!oQP)-F!e28rYA@H}V{)YYwTk_B7 zmG@?5*K0dD1o^@qlHHxzH*emI*GYesy8ddEx}?7vx+1SeS(HT|)}$J6nZXs7$_=xU zu1UgA{Z6Wbc0^2aNKE%_JIV7#h$`4W%?wvzqbSI3l(~za>kCQt8P^jxSk4cO0=6>% zxy@&bBuJSXynQuHqg3|s5EtPxc>f{8WE$&xAeqR0Up&q8a*G;+_(ZDA1a2)6eA}+u zY(IW$dfnazM@%svI(~=YQ6iW>U#{9HkslHKvcmH_HK6rn8%aZB-%?3kqt@s^0~?$# zhyB$FI(9Zjg=AH0=SaT;rn{wP<99Wh8FhsVoCb7<$p0y{-f`ikC_7Z73Eg3bBqg7K zz&h^`y1}~9FuLqeBzv0bZ-pZ7FhT=bl+)J%F71;}0$CC!ok7aYS`;je*fWQ@EV0Ig zL@CD;2YO@PN_N#@iFa%^qlGsaY)pW6H?Nr7>`q~2U)3stg{>hR040ZazGB*(m2eav z(Wjt^p*%>38?wTaqD!+ewH-OwktkUp7=XEBsVR#^Qw3DmGXf%2xWCmdn#fxe9pm|{ zk2x&fV4FL9Q3E@3oAvkgr(beNqqJTjp%^hU(Sd0QL9Bq;1p2V1M0+sBrI<1R@Oc*l`9&9r_{x4R(NR{gD}YmgL61vXxp#HEW&^n zwZ~9J;<_jw71yhjNXH`T)Rl;3+K`1iJzL0z0H!V|@?-ne8YL(q9S|!LGJ;g$*PLqZ z`GGvVq^QI}GS}B$$jAp4X&Y0x1{aB?=?jc0u%o&ZGnQqK-Xg2%S!1Fcyv9J1M!>o@ zOs}>k@UjF;7OF&euZ>8<-R53V(6zN)vTij5K=U@NAbHHF=>LpT{>Q*0b&t;G?-r+N lN}rBKmS&^$X*#}p(CZx?z3v_NWZZlCe3_iTnCmKh{sq+hey9Kd literal 2264 zcmb_e%We}v5Oi+HS1trguovHF*Y>W!Cu2nj2}_7T1o9~$i-(v52!Y><@(uorU1@%W zs_vfIvEv);VLj82ny%`eO-5@spStL#5{aq& z_|41G8R#x1jfy*d_r5}U1EBiJZjc^yaSazls6~W14%*6Ie$DEyu0MR;kJ@fiAeLB{ zp1Kc6q}qGWMIh}#}7T6Tao7k82LXxNR4^HdnUF@*8isvNCn^J&F)>W&K6 zsbPIQ%*`a%D-_m`U32lT=77;SfGuXJoRy@J37D898bC0B(Ss!`gQph8|(K6BRavY_XqKkQ+aUz#Bc_iJU8J%lWjnaPje? z(8YVxil0~lt0^r@>5@kakdg>TdX3B$|`A)orun@`AFnI#g>v$ zizy;0SpWe98xq7)i2*9vtN>9$I-`|WLSOU-UDcM{l#Ix`d<`=#yzv08{MF{$=Ho9( zk|W?{=ablZEyA3IOG)CP%*seuOCCBFl1M@ND}?=VAnX)N37r4lYIc{#O5E&P3QJN0xYX%lCHhU!(T11EicQofM zr1p9N6I6yEE{2GViYHL149$v)013o+Kv~C+0WO1@8l@W8fq*)MKWB-b9T@ja9lnr^ z+zVtk`gEScbPGyu~bN|J& MRdM!wp}X|{3sIZw6aWAK diff --git a/art/themes/luciano_blocktronics/MSRCHLST.ANS b/art/themes/luciano_blocktronics/MSRCHLST.ANS index 4a9982ffe23a8023a02320f661ecde3a790b627c..73a62a2a73d607d46d64ff6dc63464ca0186cc5b 100644 GIT binary patch literal 3328 zcmdT{&2AGx3{J%j@c@NLu$SJqn=}#RRH6zYQ3+A#B{xtIAf^$tfj8kfsy;*CVpp11 z;rndQ&u;b`&Orc3;c=9wY z3V!N$ksQrMRN^G6hqhhRbtgm$w%3#4Dr^=7)lFvZYKvOS1)f;#Vp6$#2`|FTU2i{r z>+0`&R%YXFHiQOHSUKS5pBqL>YVoWr`po_Qvc5|838ZCKx}9pw2e?O<=f~sK3A(bF z2C3Duy;xLsdIIl<*5}o!iE}g5`iIa%r3{=-)&nB{r_g%(#CO;a$VeA@z~L)AU(T3y zJs@-^>(0QaI3P)Ol(x_7rXDat2U?iZtB#X#N;v@PTX<}&}OotmH;dN2bbS$l>26M@Z1%d&XIYcd4G+HWi7aCFm zl3Tobj0SQdy};Ng;h}mnSiZwHyI0id5h#7Jj6Y!WeEml?LQ3N+l^X(8RJw85djk*+XSEprv{sb)%x z0!WxNBkjH@OWLx)QXvxykGb<~Bi{-elCz7YY*^KikssTyHYkx1nSh)TU}!?1DxL|- zc~&E=q^ZO~F}Jtog+#Q5$U{(|VHsRz6!-&7$bYxH?7j|)nAbqdAVftIiE4bdEYvG7 z1SA;*$gL$VJ+BXq0xi5&eO8Q6tg#c(wbmmSsOGW<%c=?+Fi_$&0 qIQ_6ZD@)o8w5qb2l+VlQpGTw7!NJ?n;Yikl*DueD%U7o=#m~P8A7G3C literal 2219 zcmb_e&2G~`7));{S1y!D;0t$qlh}fsN>m{vDj^EJJVJ`zoE8 zZ+Gpc5ki7JB;N0DXXg9X$z)Y7X60g9`eL%GeAo6XbfKH9N)LOr#0P_5>jUr<7*rJe zwC^IO%u|Lu%IU^M+gicr=B;@s515rOOdYq=h6lQxJ^cdEwyeUq+MjO`3hXKauk$x7 zMEB&px*c)B^t2v;z;eHXBGr(EG9nivT&1@KK zM8`$P4vSSzg0~BMtkO{gDCPS%b37wVV>FLr1hb2#IC-4paXf;fR{O5Q93xS4glBEB zpE)!PUx?tGda>kqVOuR`H9Lz~`8fM@@hY_P)2XtugBDhoJqAE+W;qgedD5xJAa!sW z&T0S(%TDFtG-#(ba2tIj5@G4wh&ZMUsHGH%OctmBf(;4c(TJf`wnYF^LcOy7I? diff --git a/art/themes/luciano_blocktronics/MYMSGLST.ANS b/art/themes/luciano_blocktronics/MYMSGLST.ANS index a56197bcc6fce15564c05499a6a4ac1d26e5aacc..7c49c1feb136b4bbe0fefe48e37eaa3370f7b467 100644 GIT binary patch literal 3267 zcmdT{!EVz)5KYAm@d1TM;0t#*38^5b5><#pB}7Fflp81r5Zek$;J2!NL;u2-{42co zW_G=HN)M5R#2#$#&g|PaZ^q+fyeh+ZH7!FiULAzGYDZHy^%&No9dKE|6_(ZwPYqp* zf>*m2?MB}slQzk8-K)M@w$qd28fhoTIe9_s;-|5Iq|D(T&922`XEJz((_4PVa0x*8C=$GTTAHXTqT zZ$8~VTvr30(1RW@!!DI`RsXGPro!7fo;AfBZIjZ?<^gnO?491)F=gvt&{ET}q=&u= z>{gZAgTZRu)Txt2eVQZyrOo+A(#bg|el1lw=8jK~qv(8`eh8Wv#)EXYpc!j=bSrq)fQZJyibU@Fh@529GW3O9Pj1vw|=zJFhXW zD2&$SF1Zs7_A#w$5K6uav;Xk%6G@YV2^YWCCJP0C{HZ#8rU0Ezqv4JnR#ArQYYU_w zl>k5|mbuI2gySsVi)T~SWHA68)7D5gFQ$^EEUHwfVzJ{eG)yDk3fJQJbg2c8Gb!?Y z^Ti7#DWVE!J8dfoUnD?dL2KPtiP=+9iGyISuKIklvT=nwaG6+9Kfpx(+u3CiS)nAf z3_>O=Q0VP?b~0kS6p0jL-;rVpFJ4@)ZB4Y%aM@oQoD#Lc6Jo_`f32?Ry0zReZyf|g zO^6nf+nkF1l5g}+fuV&*r$_IW$7M;MfyShqOv~rx?EQn$Xm9V$Xn&+}@Ab=*;_TIt H&C>M`8v_ z?!8rAi9rOdMR(VIpL1_j&(_s)UM<_oyV<(-VHj5oG0fJLhrC|lK_kdU1AIjqImf5I zow+QMhiJqnOx-YOz7U|h@P=hA#fR3O2`^5 zK)TCt#MxA-sidKBEwUk3kD{Key^knW#(`C!bEoGR90+7v`Aox??MIskO_paO@xZ@_ zo@zV71uU{4N%+zEo14U4VFQf}z4f&SRJ@5a2O?YrKWB;84upH6fUA<0dxq@B=*}#3H>0O1 zss34`{IcWp;rYp%)oE2R-hWz6RWItQu72K|OpcCTO^zqB?!SC~<}O~G=q^8h0Z?wp AJ^%m! diff --git a/art/themes/luciano_blocktronics/NEWMSGS.ANS b/art/themes/luciano_blocktronics/NEWMSGS.ANS index 904399929a667f16171632ce890b9ca08f9ed634..6345db4a2df04a80dab46320ced6a4dd82e6b82c 100644 GIT binary patch literal 3480 zcmdT{O>fgc5KYAmiF+Xu_>wC)PDn&^3Q>iSsDvm~pq$bY@s(`_A;8b7`WyN$Y{`Fx z_hx3-8z%u3`NFDlygRdR-@KXKb=%X_wWqz*CGBa~6?xUlqAc35CRKyW2(GYHZg?x{ znk0PcZ&FRPDPodIV!Ca^NuJl1s22ODH^WufXca`)%iQeSd?vvjus?8}qwx(_0oxIP z-1391BuJU-ynfM5qfmD7h+J;C@;3Kft7vrRD`XaQ2a;RTzBc;!wNbZRoqn!+U0(-B zyyCs<_#2u>iC}(yyx2sE{D|PY6`mhi1Dc<2BI(i?w@^}7%P{KBz&a;K-S+e`>U7jc zUZl5H#M^}Y``C7=S?*1>dPGg(0;dMuAo70-ttVSJAIb(5sY5qdAxX&{5Lo98Lf2T= z3P!sPie$TK{Vpi-23M#-i*kAibl$$}HL{QeVbU3-oUBE`)QCNEc$Y5vIFKl1f8ao` z&r`{cI&^WfW+Pg7lEKCRcy{xM$<6K*R>oDWB3M`&!U0e+*lP!ml6X)_p1=B-!~Wg-4`4`L5W!vin9CHOu#KxFBq?SlIxq|&Xcoz;4@mHk zPgEXd!gFAu^6SWkKrR^I6i`_k>coi*LEKoytckotzfwe9{v@|$NjPDCq1!>q#gN=D z%nx;NU>$rjd|iFA8X*ZR%I`m#!#Pw5RBAIvlrv+p04#*7E6+AI8h6mrsDf-Z-9$7j zAb3S-PTAdOQ9dfNtym;dxmb1RO289KR3Z<@@26N33_$}x;!|?5NboiJUTPfgc5KV6=S1y!D;7iWfPMQdEDpiG$sDvm~pq$zg@zrfrN`aqM^~|yVB9{DD zc<;^Z+D=P3fDg{j?Cje&Z)VpS%=6hepN;a64dz9tmd#UFbv2mh0sdkOF9yNa1YlG% zD9iY^-^`b6#1)#+nyQ~Imj*Z;$LZygUhF+8!~WOBJ_dPsLVFU1JDV7gz?g7|$imqN zXQG%g3}3$}atG~V{&}ZKI6em`vYsgG8IZ4J>({;E?EK*KYSh(L3d9iOBJejo5d||5 z=EujA>nN=_B1E&ni=Gb9;`lm}Z4JMtk_SqPVmQKZZ>Jc{H)i9K^)ri-PEv)Mc(|vd zwu*J;1?al7e|6XBg&VNt7IQL5JyN4Zk~i^Vuys#AtJp!zs#%2Ds=mQ1rIY}wK79Lb zgfYTK(~c$pcR)7YBvci;9AP*FC5%ia>~RUX@q-AwQ3LMCzJgiI#uE?M98U(Pcu%YiWYyVRb|%(dSDuA_7qO7Uu0##SW4F!84UIp7g4!Z3})2$UfUK}yZ~4) z9ejZRN-Z4AnCQngihE#L3&A=}2nkP6cBG?^cZfCsCnOg2D8u$H)62sn>2lgk+2lysp zrUe!t@VOmAUBQS4OmKoboa$Mnkzfnp%Nk$=*Ii-35}V>QL$G|duysVvwGr_}@X;QN zzb#*xLug`bn~3#JXv6`G;^7;AE&~wgwSbHbCUllqT6ojk^fn7@G8kAOC{cA&PpGkA z{vrjksIWl%1cF3Wh^z%HOfQhsbPxvUNnaXj!FhzJT(t9`u<8=uxeB1NlJg6OJ&WCJ_4HY=9R@&R@-Dy`JWT(}Y} zM)~UYe-dvm5>SI?)RnKr5*UL)^p({7-wKSuR5`YBTRkts?bU_wQCE$G(R!lCIPpXUC)@5qv5Wql8}-av)j;a=0wbYokFW)A^@5Tb-cLYUO}zakTt z3LK}XByp<+@%McUS78elMCHTD&FXYt0`Y&1B^P&0mKOb5D5lF%2+CXrEC;HKw0|zk zfOG83^h%^(LaE~e=;Yg~5?S!`auIZ8v$c?1EUIvMb%BZG!#W6o6@KrH z_x=D%g->_h-I;ka@6GPsVqKrE>eHioSgeoQo}X?Q(_+0mT`?FJ>s39BbC!>>tvWg8 zaLQxG4|BrYbPB~)PgPa&9f$^;n1*$hz$8;AfN9l8n%0AZ3W5-u-cUJ_CxHprz~oof zaH&GZl=7IE;}{Y0#WiAh^QksYa>i|W(le5eVKYvPb=UI}5^Ep=BTsRr;#Ra=A8F0S zQ;}?jBoXkKNR$AxZ8y}V;$$Lsm6!yUVIxOk43%P8td(BvpcHoosl`r8xTu{RWbd%@ zxDKi91<$OQrjv~%&tl*fgi1&*?jUGmh!#UvA=_qcDxk<=U8&eKpvN1N8ASWcOdIK6 z2~08YgMFEfPSwtwP3HNVVuV+|*R3fy$=&)i#~ zrylROfbt_kXIL$B6FD=m>-to=!%-XZx4pOW%7;K=hB(3O@v+G87mH$`TJ3tY34~I$ zselsaCpcMM3_1fl@jJ26ddCtHMH*xuU1!kHAjQU|e^r`8lG`IC-a98yHwM>+vTNwU z=*Gv`_m3Ug-bO=njg5fms+w~ZF~Tvj&OD-)1Wl>iN=*sR6r ziw)h?4{kITN7C+l@4#tjRuH42%7iV=&FyVU21-8LsbU(99)2OnpzW`16Ncz01Px3 diff --git a/art/themes/luciano_blocktronics/PRVMSGLIST.ANS b/art/themes/luciano_blocktronics/PRVMSGLIST.ANS index 3969d72f9dbe35c22e07e76d0d0112303513722e..60a0107b9b0c0b606ce7f403c5352db52e9a4787 100644 GIT binary patch literal 3429 zcmdT{!HN?>5Y6IE{D9Sf&Lw9jlbGP<6th7D1LESMs7pg+Wm z?^RXzbS6P?83g-~bahp|s(Mw^lXRE4>n;bm%eu?HtIB%$%2!=zvwFc~0#j&eGweJ~ zvy7kmoz;%!A}Vnb)m=Nz%CZrn4tA@Z;VNtr1=S4-clLdCCdD369=YCPdaEdjlfdnS z`*%f+-1!;}%qJ*^Eu5gtjmYwCr|xq7{!7zpvx$b-V&8ZCjw_%*6JUORy4XcY?1&J= z8ZVq|0j>AyRlL7dFPtE6crqQ3M6#q_Gnl=`F;DnD2X^5uS6^2juEa^B?7Tu^ zGt$h22bLiTnnt=83X(>nZ>bUgi%Hq_>mSJdrI>DKc2r7ULNDKaK|*t-H`~`3r`=x)71(`=gr-r1PrK$fly!@A8;qJl7^v!IZ=d@{Q h6?rkppXS3~_d1<}gIAryj;uQ`o-MM|=Tnv9=Wm*ffG+?5 literal 2280 zcmb_e%Wl*_5Zv5Qu3QK!fiF2To@{Kvo-~ zU!khIXFT476Zl}y^rNP$y6xTR!p&!HzT-kQUDToPhAZ~5pDtX0z23)-L9h)0SVaa^ z74Q12EM+%kh(~hz&8q7Zu$?7$*U^fzcYHYgu{_1Xg=gG1Vf$zg3l=aV93p6MSx`I9 z|2t|E&aRLEhK(?s17#(9d73p`Tz&Yu9<^HKKrFGY1E2XyDDWhhU!Tu!qZDyONZSD~ zSw=w1v)f2|H0(yj15lR>xf??~%z)dSyw9o10YWn3=X!@??}vvNTM_ zqRhowl_d+S07JKS_Rt%fpmEoF{Ww5@Hbl0P7@lB%-DyDCSDiFlQ z5D`%E1ZsQ+zY=l)Y67uRo5N$A1cSKsClfF}e82i)Z%?TZL-EB_O(L5VQLqRlKdmSO z#x+xqk18YA0@<)3y)jG+daC?g(BJ(ie<}AM)w{K;-S2yo$;QU( U$<{=!`!Am#RVOd@beHdc07dif@&Et; diff --git a/art/themes/luciano_blocktronics/STATUS.ANS b/art/themes/luciano_blocktronics/STATUS.ANS index e16186216f19073d439b6c46cf759b65ebac5d3c..7784fdd8c03eb0d177ad3e048119b6d1d59f0b93 100644 GIT binary patch delta 16 Xcmcbuep`LR24NOs151O+TZGjCIFkj* delta 16 Xcmcbuep`LR24NN>15=~PTZGjCIDG}i diff --git a/art/themes/luciano_blocktronics/SYSSTAT.ANS b/art/themes/luciano_blocktronics/SYSSTAT.ANS index a76e3bd654c45d46566905990ca88b74c0b5e868..eaad1e7cb18786acea3b27cca7641ef32e39acad 100644 GIT binary patch literal 3490 zcmb7G!EVz)6fEL~#2wMgUUIjSkN`P_QXvivm0~KPo}x4omFfny0f}$oRDQ<>{|RDd z-do#=165r$Ua#N2nKy5Clf&~Q5C6Rm&jT-};`qA@4`U^<-)M)~~H zJUc!K^K6>U56_bc5{5tR1h%}w8vOe$gtFwY3{}-acdX+Xa_5(x?cK?gk3VAaZ>yWz z%k{M&8a`q(&U zkhX`0E z53wJtxO8`JQ4zBeR{5z}TVuU0IBplcPK)hiSnFrkxC-2L=+7NlaLKjR(Vq zk5!%TBcBXi9mTYe>1t<1!@z-@t0_mu$ktMHFKY?u`k|*0AIYq*UHvNCg1!?$zX1jZ zNmZF9_GX+{p#lu&#?-(R;8<>oLP3(ED%==o3X`=D7wako&9_K#-Y!XGgn(JfY+0ANo?~eOwBQWfuc?e*i38aEEAr%0@lVr9c-$M7)hF7_e!c3Ls1=b z>>h{$7R+%6iU|c!+c8$o2x^t|6I>~UB|6w?4L_6o=TF>pfKX_pai(0w4r(gLQN|qd z0x%E>-Pdv9(54vlpkQ*fMn)sFmewOPf<|*ez;P zD?sm|2i*(7^(K~zEL4N-L0=GH+PJmY1vrWj@ryrN$vsDtVz&n*NOo$uYeJh*6wzBo zQ|%$;))?i#ocnJeU@Z2(H5Z#lrc#RsE98+%4PGTI`pnJ_vt2dYVZVgA-sE*;lSJO|@l!DtA0R2JLwNGS~Rxu{Ac&iLcg%!)MH#e*6 zjTpz|F5m3!%ZA?;iS36-35Tt|AvA5J4xqBf-DzTSGQrazF2&B6l9=q zp_gT8YUfQnQ;@<%S==l??-cW4nkF5LtqJSEdb79+g6#kvz4{m4^2^sInk4ex{Ajq9 zz55`%FYDV)U7&WVC-N#!v$WqvZ9ASO+o^JPmfi!~s?xA`GGwQzI^#4Nm-<8zG}SHV zp)(P{cQu#$RD~b1y!b2Vp;_^bU+O0ezIoV(=kw{uqvPbB);|cPpY#XGt7Q1{>A}IH WN2dqR4s<f&q6m+icv8Ps-z39#*Wy+~eiedykSTP{gK;e^M3#b9p3T!1n|3?2tPtM;V z8~&3ZGxOdqRW--bFu!*9&AfT@mKxm@vq>?lrp@T4Di%1EP1oVV7ia$LkFWjlG~oCe zMmKR*)y?Yn)%xNxtk(1OYJ_MA5Wf0~sjuj<0RMgoq3d|tg}zTvwap9{ON4FiJ$ARqu%kosu z2uodJg9sQSj>EiYW|pb%TE?lQUz|;F)3&YV@G>bHo~Ihd16bfhG$HY6HT7R|sFw(Xeb6zS>lzZ?!ndlU^b z3`?*H9_ea;40`+-RuhZ^@Dc@SGD$2T1eVD)tPVBqI%fo&(hY?5a-`ej*r6L6WNeKxIm(2?za~4MZ^sK_VLAR)%w5Wrx6ge3h9d zqKJGT-*?HHY9R z+P<~&)3XeAut^wX5~9px#1Rsy*Vz=N-e3{jc|}Aa!MR^B1g{tzyN0tF~WuT@9#uds-ZDs*f%ojXxYbge@ z_RiU+Dsbsx9NVZc`#@nuAJCw9ZbyD?01eGx3_q~DVMb_!C58dZDOT2~+)#~9<;W;J z%RI|6b2m^L!vx2H_Db5FV@Uykd0Pi@qjD9@A`;AMjJSy7P6cUpVQ8K1i(KyCoWpOA zK1MXJ6@%FVO43SsC*gIjn}3|^7sSTBCVo+VsVwk@slu&|Hb8J{hC4CLvc5Pwa1%S0 z^KP@>IzspbONwUvc7297?0+l9_cgNG(veOIV&ayy;446@Qaw9NahR_;SEHm?H=Eo2 z{ikhs+}&-TeO{t5Urue~)#?}DB=za8oBe%rOnb4e5rMXF4<%kCkXcerwUX@*1AWuZ zmQn^+ux@TYK0R$8_u>fBn&C<<-=1?9V1L;{Y-QNgPUQgx@h?Z+>~eM?<@bJ7VXeM5 z0NFe|Jcs@6Zu6(d!aUI!uh%gGMF3v7A@1hs_Kzb{@8_{VVEq<^P`mx+At-!~kpeGX zAI7CCgs8&Ye)u@d*Zc8mF&W~954-1mW{hfM4(ge?8277nERD11TM-Xlv;n`tsI?Z; z1vvn2;Kk*2JOH(14Ebo{`YKioV>mFn#m%qKJ$!@BFjtGsdNixYFE1Yagqs@N{!)4I zrRwyd#V&jL^J@Ov;-V;+&Hr?iMLdtOJp1d1lap7ku1H}2evKOTGP{}a})N&#Xsv?0JDWn%pQA;aSZ5lyx=;QPaqP&hR z?VD8n=4aPygNaM&9x%Hz^Ue3ojBRMo6WgA56KmS@6Pstna=FXfu$p4QWe8VT3O9Un z5OM7NAY!AR9)6a;&x;%n`*M`m4qw$b8)>=P*dB8 za@I1VM!U{*+yw}VPS>Z)*9f$!(?7FUfLH!zU4LKRn&nq>f3v<{E!1jW$HMeb9#-Lo zcd<)T`aAq;vS88=wwQ7dkQL9+zsSIY);XQ^nD1cN>s#6F7=%jYHlCdSr;`3XAkXLg zz;6M}4+B@S9C#|qL!oWr7UVfi2HR7M@4Usnms+YX+5%=hY6_}5#Cr%^5KgIK@MRlu zClftRX&T6G1y(}vPBTFEme4005Z<h*QYiQS(r0gx zp#dFU3WGQrpPI>5$(38YD1ehi2i5Fe?&G6p!-4{PX_$`-W$|MIKVllk;=8y}r&Kt` zsggUc|FBd;sfOVR1lxgi)UNmkD!>$OOVdM2bPK`ki?j00M}6S?l5jxx;lX!kL#a2Q z^bwqtk#+hC0R~`Xi2I}`eo!K`2txGx!U>>a(QOvS$IC{^`NkG;#V04*Ruc{sTxx}j z#BgaGPOE2mPOclrjyh9908@H?MfHJ$QjvcIj{k9x4EyqOboG9mBm{k+l_qI7d7Jcp ZJ#V#+jxJg+TD+c}pH9uE45gg5Oq!kUwdkG*^8k)1f-QLIrYg=ObIwN5T_TNLhBY&l!iDt^k0Si9SQcI zl)g8!D=D#$)j|6;^Jd+8$am&KVmTdo)9t1Fnn{g{KTC+k%b z(=V!QTzW6eXC5=EvKh9O0ugaG4e=Oo4*c(%-M9Pg-NW|xZHW7cLDUgeAs4ZJxcRvY zTQEadrcbtvGr3qNIQ63hOsD%m^<=rWVke{6C7Lvq%?`Q1{G_K?Xjs_h`|xD-XLEDE zmuIiXkQTCCrkXX!K{osLU@W0g)};KP654wAYkOz5Kg{Fp?(u#T!hVdZ8CnGDpv+U9 zd7Yvv&w4T^r9%ghxKxYjPfphvak6}#7JjAOh+Re1wi%n2U4$mXOarmWih}VlQXK-e zEkY}6i-nOT)|su@h8ZmIMyDtzS!#GOmor!h7OTy4(HJ-sSdGzO4&-pc-iMwAp`||| zE%g|91dhN#hyuCb(O^uD8?tiDi%WmT`~$N?7%)>t!Nmo0Ab?lF)G<{)IP3O&0znT- zsND@7;0Hdc4V48SR-w~uh%HQ*y@Zexsx@FCen=Bl^UQM3kJm;=79n8-08v9>v5=2i zwsfIpz|wf++j9!`TBbvSd7ULEG6WF%Oeku}I$$RcIlsmagr1*6yqEc@*nM3!3L8USNff&el{=J_v?G z1)iRQ1OuCprltTw#O@FRwD?QXYyr~dRg9Zh-7$3j17A^tCL)0*DIh+-;N|sTe=_}^ z-Qe?gRLvnW?jcNN(ze{xxuZs6ke4{@Zd(0yIr;m!@%yXAb-9dVy8Wle#z_&|#2&vH YjgF2kNAE`Rygfg?Fke3}bk)880h4Hf$^ZZW diff --git a/art/themes/luciano_blocktronics/USERLST.ANS b/art/themes/luciano_blocktronics/USERLST.ANS index 8c67ea58e8305ba470bf187c5a1421597450a665..e1563dc489f540da3224446e4e5abae768885347 100644 GIT binary patch literal 3164 zcmcgu!EVz)5KYCc{6HZR_`(_2sTx5}rHW7`DiuO|$tkK@DN>dQlJZ?uf5(>gANT;o zn>VwYwQ;Hjk@#R|cV^zqdoy0AJI>vHR=>LA-m$By3cKC$;h{Vu~g!i%N9)@P^H{ z(psQY!5O^(0!Wu2xMFRj(O$?Db9r78&`cRPK0JgH$Rd`ktqE~a3#-PI5$=&Leyf{u zw%#^#s|W!%6^<5^ZxMaR_OZKJmG)QJK!A*cpo!2JOa@qySp8)Z$=L~kMv?dTL7-4a zWbF-5 zh5JpIW0zfyhF`KzXQQv=UbqaFsQ)7vP)E+RMs}&T@9q{iKkx(S=|$7z_I5g3NK|U# z;JMlSda|6(zcsBW)y*c0Wp+K8%@U(2(N+Z8_~z>T@F`^Km8@H}XYYhmxrZ#Q-xl&o zP0o(wFs+6D^TN_-7CmP1hha;^c9O-8n!shdujOvD@N0$-8a^vJ7mc>FnT0!e@#;0s z)ZD#Cc{pVY=jK0e^!y%hx1m3V_9%%;1s#FoGL?s}!o2;U$l_JGNkd$BHH>&>5Sn{7# zoO7=|<4GD;jH=1_`o7M&$L?^RPe%Eqs%yd>HY4rccC}J8S2V#tYUzj2Q2Fx;NnXEJ5C_?l4(0{jLg!u3fJLm>Ye;ta%i4Fr5 zQ3^ePy1-i*ON6YwrnNiH!~9#`lmR0ugGy^F)05E}7l#{^0Psd6plxC(@K=HNj}OU~ z84wftyT6az>_LkgK-wll=MjA*1WANWN(Qd&DGOo_EGkUwCmCdm!xWk{pQP&7;6Y{_ zRjzUuv>8b7P|@X2!l7};DKA+FN3y-BW*byG9qPun&4{)&GZEk+y1AzjUG`^>wUEJO-R~sd^ z7>Q}MzFusX>mR{bs&TQ|n(M`CrPfXuO(-G+zqz_7(mv3!)~7M;%R@tQ)ksObBs;Wq z&${pH!OQ_`NZX#!cx3CgJcBuyetD09<1gCVc$dkUSBc=>iwh4ev|hl7EHJQfXftzj_VwbNc}eU`D02>)$sbc{`n9B-nb3 zcWJ-&-G1IJx3KV>t1dVslt48t=(Crz)627Io>No*=_&K#q{xeRf1V8nM@L@<#{+qu PpMShCSD#LG)xQ4%WXzk* diff --git a/art/themes/luciano_blocktronics/WHOSON.ANS b/art/themes/luciano_blocktronics/WHOSON.ANS index 53575482178fba0aa4d84c25e46d730044adb013..1dd7f6778821eac8a13479b2455a43fecfdfa2a7 100644 GIT binary patch literal 2363 zcmcguO;5r=5H0ay`~}8ddNE!XN+5<48lohECPX~+L=+;43kOO3ot}5&{uASy+3i9r z#fA@;r0vYkyfj(FRz6z;!c( zbp<09nBW9=IJM%MjRY!yH(LNBaI0k&h)}Xqj9_VPU|SMJkx__GfsgDVd>MMA9Hdst zXa%_x8sPxO;^B^8Nx{GZL2*@4Pq)WGYKj!Kqw4V! z3sysWUYU7|}5Hr1uVKXJ6y$?FVioq|(|QK6MQUAoyD zHCleBX+mnqr`!9BL3H20>-IYwATy}&!%c*(UP{0Fy{IXNX+5F(V<$HV`_2q6iam<6r29=QCCTNY zSC8P`n^eH^Ps4neV<2~k;v>fk-~5Qrz-_9Qb{zj3@SS5sZp7K3{dnCGVjIi?pPHz} c;!@NJPsD+r8@?b@&|KT#nWJY9O!p{S9;N By?X!v diff --git a/art/themes/luciano_blocktronics/theme.hjson b/art/themes/luciano_blocktronics/theme.hjson index 582432ec..db01b74b 100644 --- a/art/themes/luciano_blocktronics/theme.hjson +++ b/art/themes/luciano_blocktronics/theme.hjson @@ -187,7 +187,7 @@ } mci: { VM1: { - height: 15, + height: 14 width: 50 itemFormat: "|00|11{userName:<17.17}|03{affils:<21.21}|11{location:<19.19}|03{lastLoginTs}" focusItemFormat: "|00|19|15{userName:<17.17}{affils:<21.21}{location:<19.19}{lastLoginTs}" @@ -416,7 +416,7 @@ } mci: { VM1: { - height: 14 + height: 12 width: 70 itemFormat: "|00|15{msgNum:>4} |03{subject:<28.27} |11{fromUserName:<20.20} |03{ts} |15{newIndicator}" focusItemFormat: "|00|19|15{msgNum:>4} {subject:<28.27} {fromUserName:<20.20} {ts} {newIndicator}" @@ -618,7 +618,7 @@ } mci: { VM1: { - height: 16 + height: 12 width: 71 itemFormat: "|00|15 {msgNum:<4.4} |03{subject:<34.33} {fromUserName:<19.18} |03{ts:<12.12}" focusItemFormat: "|00|19> |15{msgNum:<4.4} {subject:<34.33} {fromUserName:<19.18} {ts:<12.12}" @@ -783,7 +783,7 @@ } mci: { VM1: { - height: 14 + height: 12 width: 70 itemFormat: "|00|15 {msgNum:<5.5}|03{subject:<28.27} |15{fromUserName:<20.20} {ts}" focusItemFormat: "|00|19> |15{msgNum:<5.5}{subject:<28.27} {fromUserName:<20.20} {ts}" @@ -1214,7 +1214,7 @@ 2: { mci: { MT1: { - height: 14 + height: 13 width: 45 } diff --git a/art/themes/luciano_blocktronics/wfc.ans b/art/themes/luciano_blocktronics/wfc.ans index 9bf19ca21893a2f8ab6ede54d203ee743f2109c8..823e0d4a3abb1d628487ad33a64b4aa5f39acc46 100644 GIT binary patch delta 232 zcmX>ku}flu7xU!X%r2AD7)2&0FtSdb%WOBfjm2fMB1`t<1B@no($R+2#zwiSVSdul z2Dy_rvWQRiXA++Lfr*Ec3oK`lt1x*gtHb0BM#0H3td^7Y*#akDVHM&9DOUgikgCaV zS)C{QbFxnEXJ?(n9yGa&t!(mjcGt-bY+RFr*sCV{aBEDyz`;6Mk|UHwH6qevaw4Y| z&<=K<`wI8r22IZ8kOQh>-+Y(Didoy(z|z3v0yhH#BVz!A1Opf_dph|lgt?%yzmx8+QcCD4purM&W$<4sP$QZyN$p8jSo=(0BVeXC)9-IUKh7CN5 diff --git a/art/themes/luciano_blocktronics/wfchelp.ans b/art/themes/luciano_blocktronics/wfchelp.ans index 24ab3bb90b62434268e6de7e1679fda6d3a398fc..5f261f87a1fa0efd7a5ae3294577ef33a0ed4f52 100644 GIT binary patch delta 55 vcmcb|a)D*TdB(|i8N;-V4J-{zZZa}3Ffs-(a5I1bv!|1a*t)hc}6}i6fpTbW0&#MXQ diff --git a/art/themes/luciano_blocktronics/wfckicknodeprompt.ans b/art/themes/luciano_blocktronics/wfckicknodeprompt.ans index a11d90eb3882c3a767424962034046dd07e0948b..50f1c8ebed78cb3302bf7894828479971d71d611 100644 GIT binary patch literal 193 zcmb1+HprEZHncW2$hEUmkd8L6Ha5%6&P>i$$jeVjh053i#dCp@Kq=J_UqhfMls3qf u3U&;2b~P|ipdK(XFfulEx>r=I#jL!ASr+kRVY2 delta 7 OcmX@e=s3ZFkqZC`r2*dn From 06c3d100d7354cf56775472352472f77c609c001 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Tue, 5 Sep 2023 20:41:40 +0000 Subject: [PATCH 24/37] Updated length for message list --- art/themes/luciano_blocktronics/theme.hjson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/art/themes/luciano_blocktronics/theme.hjson b/art/themes/luciano_blocktronics/theme.hjson index db01b74b..fde3659c 100644 --- a/art/themes/luciano_blocktronics/theme.hjson +++ b/art/themes/luciano_blocktronics/theme.hjson @@ -343,7 +343,7 @@ } mci: { VM1: { - height: 14 + height: 13 width: 70 itemFormat: "|00|15{msgNum:>4} |03{subject:<28.27} |11{fromUserName:<20.20} |03{ts:<15.16} |15{newIndicator}" focusItemFormat: "|00|19|15{msgNum:>4} {subject:<28.27} {fromUserName:<20.20} {ts:<15.16} {newIndicator}" From 6748b8966e113c62d627c37f8c336eef6cf71104 Mon Sep 17 00:00:00 2001 From: anthony Date: Tue, 19 Sep 2023 13:14:24 -0500 Subject: [PATCH 25/37] fixed incorrect reporting of cursor position --- core/fse.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/fse.js b/core/fse.js index 6d883ba8..e6e7a9d1 100644 --- a/core/fse.js +++ b/core/fse.js @@ -1050,7 +1050,7 @@ exports.FullScreenEditorModule = posView.setText( _.padStart(String(pos.row + 1), 2, '0') + ',' + - _.padEnd(String(pos.col + 1), 2, '0') + _.padStart(String(pos.col + 1), 2, '0') ); this.client.term.rawWrite(ansi.restorePos()); } From d3cf82b5635554b6a7e678c7ecd7ab1d10899a57 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 17:24:32 +0000 Subject: [PATCH 26/37] Bump systeminformation from 5.12.3 to 5.21.7 Bumps [systeminformation](https://github.com/sebhildebrandt/systeminformation) from 5.12.3 to 5.21.7. - [Changelog](https://github.com/sebhildebrandt/systeminformation/blob/master/CHANGELOG.md) - [Commits](https://github.com/sebhildebrandt/systeminformation/compare/v5.12.3...v5.21.7) --- updated-dependencies: - dependency-name: systeminformation dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4cf93bc2..fbf0a977 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "sqlite3": "5.1.6", "sqlite3-trans": "1.3.0", "ssh2": "1.11.0", - "systeminformation": "5.12.3", + "systeminformation": "5.21.7", "telnet-socket": "0.2.4", "temptmp": "^1.1.0", "uuid": "8.3.2", diff --git a/yarn.lock b/yarn.lock index 94ed993e..5a208495 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2178,10 +2178,10 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -systeminformation@5.12.3: - version "5.12.3" - resolved "https://registry.npmjs.org/systeminformation/-/systeminformation-5.12.3.tgz" - integrity sha512-aPyTDzK/VjEheGEODprxFTMahIWTHGyWXxTsh9EOHjeekVltrIWrle4dOZouOlOYgtKM1pDoHkrR+IssgYCK/A== +systeminformation@5.21.7: + version "5.21.7" + resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.21.7.tgz#53ef75daaf5d756d015f4bb02e059126ccac74f2" + integrity sha512-K3LjnajrazTLTD61+87DFg8IXFk5ljx6nSBqB8pQLtC1UPivAjDtTYGPZ8jaBFxcesPaCOkvLRtBq+RFscrsLw== tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: version "6.1.11" From 5180447e87f5da53191f74f109036890f66a88d8 Mon Sep 17 00:00:00 2001 From: anthony Date: Fri, 22 Sep 2023 10:33:42 -0500 Subject: [PATCH 27/37] Added code to clear the text --- core/text_view.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/text_view.js b/core/text_view.js index 74b622ba..772621db 100644 --- a/core/text_view.js +++ b/core/text_view.js @@ -179,6 +179,10 @@ TextView.prototype.setText = function (text, redraw) { }; TextView.prototype.clearText = function () { + if (this.text) { + this.setText(' '.repeat(this.text.length)); + } + this.setText(''); }; From 75fa2026c07173deadd03f5c825693594de1d0b0 Mon Sep 17 00:00:00 2001 From: anthony Date: Fri, 22 Sep 2023 10:33:42 -0500 Subject: [PATCH 28/37] Added code to clear the text --- core/text_view.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/text_view.js b/core/text_view.js index 74b622ba..2cb19040 100644 --- a/core/text_view.js +++ b/core/text_view.js @@ -179,6 +179,10 @@ TextView.prototype.setText = function (text, redraw) { }; TextView.prototype.clearText = function () { + if (this.text) { + this.setText(this.fillChar.repeat(this.text.length)); + } + this.setText(''); }; From a6196c38ec9ebc23f86b92ae670bda1f94e3ec89 Mon Sep 17 00:00:00 2001 From: anthony Date: Mon, 25 Sep 2023 20:25:01 -0500 Subject: [PATCH 29/37] Disallow posting empty message --- core/fse.js | 7 +++++ core/message.js | 5 ++++ core/msg_area_post_fse.js | 59 ++++++++++++++++++++++++++++++++------- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/core/fse.js b/core/fse.js index e6e7a9d1..be3be90b 100644 --- a/core/fse.js +++ b/core/fse.js @@ -183,6 +183,13 @@ exports.FullScreenEditorModule = return cb(null); }, editModeEscPressed: function (formData, extraArgs, cb) { + const errMsgView = self.viewControllers.header.getView( + MciViewIds.header.errorMsg + ); + if (errMsgView) { + errMsgView.clearText(); + } + self.footerMode = 'editor' === self.footerMode ? 'editorMenu' : 'editor'; diff --git a/core/message.js b/core/message.js index 6a063802..b9f84abd 100644 --- a/core/message.js +++ b/core/message.js @@ -763,6 +763,11 @@ module.exports = class Message { } persist(cb) { + const containsNonWhitespaceCharacterRegEx = /\S/; + if (!containsNonWhitespaceCharacterRegEx.test(this.message)) { + return cb(Errors.Invalid('Empty message')); + } + if (!this.isValid()) { return cb(Errors.Invalid('Cannot persist invalid message!')); } diff --git a/core/msg_area_post_fse.js b/core/msg_area_post_fse.js index 9eacd1f5..91e8f6d3 100644 --- a/core/msg_area_post_fse.js +++ b/core/msg_area_post_fse.js @@ -14,6 +14,39 @@ exports.moduleInfo = { author: 'NuSkooler', }; +const MciViewIds = { + header: { + from: 1, + to: 2, + subject: 3, + errorMsg: 4, + modTimestamp: 5, + msgNum: 6, + msgTotal: 7, + + customRangeStart: 10, // 10+ = customs + }, + + body: { + message: 1, + }, + + // :TODO: quote builder MCIs - remove all magic #'s + + // :TODO: consolidate all footer MCI's - remove all magic #'s + ViewModeFooter: { + MsgNum: 6, + MsgTotal: 7, + // :TODO: Just use custom ranges + }, + + quoteBuilder: { + quotedMsg: 1, + // 2 NYI + quoteLines: 3, + }, +}; + exports.getModule = class AreaPostFSEModule extends FullScreenEditorModule { constructor(options) { super(options); @@ -42,19 +75,25 @@ exports.getModule = class AreaPostFSEModule extends FullScreenEditorModule { ], function complete(err) { if (err) { - // :TODO:... sooooo now what? - } else { - // note: not logging 'from' here as it's part of client.log.xxxx() - self.client.log.info( - { - to: msg.toUserName, - subject: msg.subject, - uuid: msg.messageUuid, - }, - `User "${self.client.user.username}" posted message to "${msg.toUserName}" (${msg.areaTag})` + const errMsgView = self.viewControllers.header.getView( + MciViewIds.header.errorMsg ); + if (errMsgView) { + errMsgView.setText(err.message); + } + return cb(err); } + // note: not logging 'from' here as it's part of client.log.xxxx() + self.client.log.info( + { + to: msg.toUserName, + subject: msg.subject, + uuid: msg.messageUuid, + }, + `User "${self.client.user.username}" posted message to "${msg.toUserName}" (${msg.areaTag})` + ); + return self.nextMenu(cb); } ); From 0e09ce491cd4f2585a1c06fb6524802999bd5324 Mon Sep 17 00:00:00 2001 From: anthony Date: Tue, 26 Sep 2023 08:43:23 -0500 Subject: [PATCH 30/37] Removed extraneous space from config template --- misc/menu_templates/private_mail.in.hjson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/menu_templates/private_mail.in.hjson b/misc/menu_templates/private_mail.in.hjson index e27314dc..2914a11a 100644 --- a/misc/menu_templates/private_mail.in.hjson +++ b/misc/menu_templates/private_mail.in.hjson @@ -69,7 +69,7 @@ } ] } - actionKeys: @reference: common.escToPrev + actionKeys: @reference:common.escToPrev } 1: { mci: { From 1d31b268aaf0c1f97d5055c074edcfe484c02fbd Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Tue, 26 Sep 2023 14:00:05 +0000 Subject: [PATCH 31/37] Fixed door logic per issue #506 --- core/door.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/door.js b/core/door.js index 313adf74..68f0ad9a 100644 --- a/core/door.js +++ b/core/door.js @@ -57,8 +57,10 @@ module.exports = class Door { run(exeInfo, cb) { this.encoding = (exeInfo.encoding || 'cp437').toLowerCase(); - if ('socket' === this.io && !this.sockServer) { - return cb(Errors.UnexpectedState('Socket server is not running')); + if ('socket' === this.io) { + if(!this.sockServer) { + return cb(Errors.UnexpectedState('Socket server is not running')); + } } else if ('stdio' !== this.io) { return cb(Errors.Invalid(`"${this.io}" is not a valid io type!`)); } From 2b6494cfc9f69e89d41eb3549e62ec5d903dbb9e Mon Sep 17 00:00:00 2001 From: anthony Date: Tue, 26 Sep 2023 16:14:10 -0500 Subject: [PATCH 32/37] Added checks for undefined --- core/ftn_address.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ftn_address.js b/core/ftn_address.js index 36ed3400..ec383c7e 100644 --- a/core/ftn_address.js +++ b/core/ftn_address.js @@ -135,7 +135,7 @@ module.exports = class Address { static fromString(addrStr) { const m = FTN_ADDRESS_REGEXP.exec(addrStr); - if (m) { + if (m && m[2] && m[3]) { // start with a 2D let addr = { net: parseInt(m[2]), From d12b0789aa0ba2b3fea7467d9a7d9bb754f2c503 Mon Sep 17 00:00:00 2001 From: anthony Date: Tue, 26 Sep 2023 16:14:10 -0500 Subject: [PATCH 33/37] Added checks for undefined --- core/ftn_address.js | 2 +- core/system_view_validate.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ftn_address.js b/core/ftn_address.js index 36ed3400..ec383c7e 100644 --- a/core/ftn_address.js +++ b/core/ftn_address.js @@ -135,7 +135,7 @@ module.exports = class Address { static fromString(addrStr) { const m = FTN_ADDRESS_REGEXP.exec(addrStr); - if (m) { + if (m && m[2] && m[3]) { // start with a 2D let addr = { net: parseInt(m[2]), diff --git a/core/system_view_validate.js b/core/system_view_validate.js index 61c52a52..4c5521d1 100644 --- a/core/system_view_validate.js +++ b/core/system_view_validate.js @@ -91,7 +91,7 @@ function validateGeneralMailAddressedTo(data, cb) { // :TODO: remove hard-coded FTN check here. We need a decent way to register global supported flavors with modules. const addressedToInfo = getAddressedToInfo(data); - if (Message.AddressFlavor.FTN === addressedToInfo.flavor) { + if (Message.AddressFlavor.Local !== addressedToInfo.flavor) { return cb(null); } From 0161c22401812d712ecfbae725b06022c54e2057 Mon Sep 17 00:00:00 2001 From: anthony Date: Thu, 28 Sep 2023 11:05:10 -0500 Subject: [PATCH 34/37] clear prior message; msg tweak for empty field --- core/fse.js | 1 + core/system_view_validate.js | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/core/fse.js b/core/fse.js index e6e7a9d1..b956f964 100644 --- a/core/fse.js +++ b/core/fse.js @@ -167,6 +167,7 @@ exports.FullScreenEditorModule = var newFocusViewId; if (errMsgView) { if (err) { + errMsgView.clearText(); errMsgView.setText(err.message); if (MciViewIds.header.subject === err.view.getId()) { diff --git a/core/system_view_validate.js b/core/system_view_validate.js index 4c5521d1..8b4115af 100644 --- a/core/system_view_validate.js +++ b/core/system_view_validate.js @@ -21,8 +21,10 @@ exports.validateEmailAvail = validateEmailAvail; exports.validateBirthdate = validateBirthdate; exports.validatePasswordSpec = validatePasswordSpec; +const emptyFieldError = () => new Error('Field cannot be empty'); + function validateNonEmpty(data, cb) { - return cb(data && data.length > 0 ? null : new Error('Field cannot be empty')); + return cb(data && data.length > 0 ? null : emptyFieldError); } function validateMessageSubject(data, cb) { @@ -91,6 +93,10 @@ function validateGeneralMailAddressedTo(data, cb) { // :TODO: remove hard-coded FTN check here. We need a decent way to register global supported flavors with modules. const addressedToInfo = getAddressedToInfo(data); + if (addressedToInfo.name.length === 0) { + return cb(emptyFieldError()); + } + if (Message.AddressFlavor.Local !== addressedToInfo.flavor) { return cb(null); } From 88a1b0ea694d855030b22cdd1d1192869a926c04 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Tue, 10 Oct 2023 20:42:15 +0000 Subject: [PATCH 35/37] locked python version to fix startup issue --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 57d83312..7c1a9245 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -7,7 +7,7 @@ "features": { "ghcr.io/devcontainers/features/python:1": { "installTools": true, - "version": "latest" + "version": "3.11" }, "ghcr.io/devcontainers-contrib/features/curl-apt-get:1": {}, "ghcr.io/jungaretti/features/ripgrep:1": {}, From f5b0a8bb602cbce48b1efa093cb51055dc9fb2a3 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Wed, 11 Oct 2023 00:19:43 +0000 Subject: [PATCH 36/37] Updated the SSH version, config, and documentation --- .gitignore | 4 +- UPGRADE.md | 4 + core/config_default.js | 28 +- docs/Gemfile.lock | 3 + docs/_config.yml | 1 + docs/_docs/servers/loginservers/ssh.md | 81 +++- .../troubleshooting/ssh-troubleshooting.md | 41 ++ package.json | 2 +- yarn.lock | 407 +++++++----------- 9 files changed, 277 insertions(+), 294 deletions(-) create mode 100644 docs/_docs/troubleshooting/ssh-troubleshooting.md diff --git a/.gitignore b/.gitignore index 2d3facac..7479afc1 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ logs/ mail/ node_modules/ docs/_site/ -docs/.sass-cache/ \ No newline at end of file +docs/.sass-cache/ + +docs/.jekyll-cache/ diff --git a/UPGRADE.md b/UPGRADE.md index 5f2458be..3a4f8c2c 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -35,6 +35,10 @@ npm install # or simply 'yarn' ## 0.0.13-beta to 0.0.14-beta +* Due to changes to supported algorithms in newer versions of openssl, the default list of supported algorithms for the ssh login server has changed. There are both removed ciphers as well as optional new kex algorithms available now. ***NOTE:*** Changes to supported algorithms are only needed to support keys generated with new versions of openssl, if you already have a ssl key in use you should not have to make any changes to your config. + * Removed ciphers: 'blowfish-cbc', 'arcfour256', 'arcfour128', and 'cast128-cbc' + * Added kex: 'curve25519-sha256', 'curve25519-sha256@libssh.org', 'curve25519-sha256', 'curve25519-sha256@libssh.org', 'ecdh-sha2-nistp256', 'ecdh-sha2-nistp384', 'ecdh-sha2-nistp521' + ## 0.0.12-beta to 0.0.13-beta * To enable the new Waiting for Caller (WFC) support, please see [WFC](docs/modding/wfc.md). * :exclamation: The SSH server's `ssh2` module has gone through a major upgrade. Existing users will need to comment out two SSH KEX algorithms from their `config.hjson` if present else clients such as NetRunner will not be able to connect over SSH. Comment out `diffie-hellman-group-exchange-sha256` and `diffie-hellman-group-exchange-sha1` diff --git a/core/config_default.js b/core/config_default.js index 6be17ec9..7421afc7 100644 --- a/core/config_default.js +++ b/core/config_default.js @@ -188,22 +188,15 @@ module.exports = () => { // // 1 - Generate a Private Key (PK): // Currently ENiGMA 1/2 requires a PKCS#1 PEM formatted PK. - // To generate a secure PK, issue the following command: - // - // > openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 \ - // -pkeyopt rsa_keygen_pubexp:65537 | openssl rsa \ - // -out ./config/security/ssh_private_key.pem -aes128 - // - // (The above is a more modern equivalent of the following): - // > openssl genrsa -aes128 -out ./config/security/ssh_private_key.pem 2048 + // For information on generating a key, see: + // https://nuskooler.github.io/enigma-bbs/servers/loginservers/ssh.html#generate-a-ssh-private-key // // 2 - Set 'privateKeyPass' to the password you used in step #1 // // 3 - Finally, set 'enabled' to 'true' // // Additional reading: - // - https://blog.sleeplessbeastie.eu/2017/12/28/how-to-generate-private-key/ - // - https://gist.github.com/briansmith/2ee42439923d8e65a266994d0f70180b + // - https://nuskooler.github.io/enigma-bbs/servers/loginservers/ssh.html // privateKeyPem: paths.join( __dirname, @@ -222,14 +215,18 @@ module.exports = () => { // algorithms: { kex: [ + 'curve25519-sha256', + 'curve25519-sha256@libssh.org', 'ecdh-sha2-nistp256', 'ecdh-sha2-nistp384', 'ecdh-sha2-nistp521', 'diffie-hellman-group14-sha1', 'diffie-hellman-group1-sha1', - // Group exchange not currnetly supported - // 'diffie-hellman-group-exchange-sha256', - // 'diffie-hellman-group-exchange-sha1', + 'curve25519-sha256', + 'curve25519-sha256@libssh.org', + 'ecdh-sha2-nistp256', + 'ecdh-sha2-nistp384', + 'ecdh-sha2-nistp521', ], cipher: [ 'aes128-ctr', @@ -242,12 +239,7 @@ module.exports = () => { 'aes256-cbc', 'aes192-cbc', 'aes128-cbc', - 'blowfish-cbc', '3des-cbc', - 'arcfour256', - 'arcfour128', - 'cast128-cbc', - 'arcfour', ], hmac: [ 'hmac-sha2-256', diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index 8eb98aeb..8176ae45 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -77,6 +77,8 @@ GEM rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.4.0) minitest (5.19.0) + nokogiri (1.15.4-aarch64-linux) + racc (~> 1.4) nokogiri (1.15.4-x86_64-linux) racc (~> 1.4) pathutil (0.16.2) @@ -101,6 +103,7 @@ GEM webrick (1.8.1) PLATFORMS + aarch64-linux x86_64-linux DEPENDENCIES diff --git a/docs/_config.yml b/docs/_config.yml index 34a77aa3..7d70ca43 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -131,4 +131,5 @@ collections: - admin/oputil.md - admin/updating.md - troubleshooting/monitoring-logs.md + - troubleshooting/ssh-troubleshooting.md diff --git a/docs/_docs/servers/loginservers/ssh.md b/docs/_docs/servers/loginservers/ssh.md index 1d55299d..cee33a3d 100644 --- a/docs/_docs/servers/loginservers/ssh.md +++ b/docs/_docs/servers/loginservers/ssh.md @@ -3,9 +3,13 @@ layout: page title: SSH Server --- ## SSH Login Server + The ENiGMA½ SSH *login server* allows secure user logins over SSH (ssh://). +*Note:* If you run into any troubles during SSH setup, please see [Troubleshooting SSH](../../troubleshooting/ssh-troubleshooting.md) + ## Configuration + Entries available under `config.loginServers.ssh`: | Item | Required | Description | @@ -20,10 +24,8 @@ Entries available under `config.loginServers.ssh`: | `algorithms` | :-1: | Configuration block for SSH algorithms. Includes keys of `kex`, `cipher`, `hmac`, and `compress`. See the algorithms section in the [ssh2-streams](https://github.com/mscdex/ssh2-streams#ssh2stream-methods) documentation for details. For defaults set by ENiGMA½, see `core/config_default.js`. | `traceConnections` | :-1: | Set to `true` to enable full trace-level information on SSH connections. - * *IMPORTANT* With the `privateKeyPass` option set, make sure that you verify that the config file is not readable by other users! - ### Example Configuration ```hjson @@ -40,43 +42,94 @@ Entries available under `config.loginServers.ssh`: ``` ## Generate a SSH Private Key + To utilize the SSH server, an SSH Private Key (PK) will need generated. OpenSSH or (with some versions) OpenSSL can be used for this task: -### OpenSSH +### OpenSSH (Preferred) -```bash -ssh-keygen -m PEM -h -f config/ssh_private_key.pem +#### OpenSSH Install - Linux / Mac + +If it is not already available, install OpenSSH using the package manager of your choice (should be pre-installed on most distributions.) + +#### Running OpenSSH - Linux / Mac + +From the root directory of the Enigma BBS, run the following: + +```shell +mkdir -p config/security +ssh-keygen -t rsa -m PEM -h -f config/security/ssh_private_key.pem ``` +#### Windows Install - OpenSSH + +OpenSSH may already be installed, try running `ssh-keygen.exe`. If not, see this page: [Install OpenSSH for Windows](https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse?tabs=gui) + +#### Running OpenSSH - Windows + +After installation, go to the root directory of your enigma project and run: + +```powershell +mkdir .\config\security -ErrorAction SilentlyContinue +ssh-keygen.exe -t rsa -m PEM -h -f .\config\security\ssh_private_key.pem +``` + +#### ssh-keygen options + Option descriptions: | Option | Description | |------|-------------| +| `-t rsa` | Use the RSA algorithm needed for the `ssh2` library | | `-m PEM` | Set the output format to `PEM`, compatible with the `ssh2` library | | `-h` | Generate a host key | | `-f config/ssh_private_key.pem` | Filename for the private key. Used in the `privateKeyPem` option in the configuration | When you execute the `ssh-keygen` command it will ask for a passphrase (and a confirmation.) This should then be used as the value for `privateKeyPass` in the configuration. - ### OpenSSL -If you do not have OpenSSH installed or if you have trouble with the above OpenSSH commands, using some versions for OpenSSL (before version 3) the following commands may work as well: +#### Open SSL Install - Linux / Mac +If not already installed, install via the `openssl` package on most package managers. -```bash -openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537 | openssl rsa -out ./config/ssh_private_key.pem -aes128 +#### Open SSL Install - Windows + +```powershell +winget install -e --id ShiningLight.OpenSSL ``` -Or for even older OpenSSL versions: +#### Running OpenSSL -```bash +*Note:* Using `ssh-keygen` from OpenSSL is recommended where possible. If you have trouble with the above OpenSSH commands, using some versions for OpenSSL (before version 3) the following commands may work as well: + +#### Running OpenSSL - Linux / Mac + +Run the following from the root directory of Enigma + +```shell +mkdir -p config/security +openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537 | openssl rsa -out ./config/security/ssh_private_key.pem -aes128 +``` + +#### Running OpenSSL - Windows + +Run the following from the root directory of Enigma (note: you may need to specify the full path to openssl.exe if it isn't in your system path, on my system it was `C:\Program Files\OpenSSL-Win64\bin\openssl.exe`): + +```powershell +mkdir .\config\security -ErrorAction SilentlyContinue +openssl.exe genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537 | openssl.exe rsa -out ./config/security/ssh_private_key.pem -aes128 +``` + +#### Running Older OpenSSL + +For older OpenSSL versions, the following command has been known to work: + +```shell openssl genrsa -aes128 -out ./config/ssh_private_key.pem 2048 ``` -Note that you may need `-3des` for very old implementations or SSH clients! - +*Note:* that you may need `-3des` for very old implementations or SSH clients! ## Prompt -The keyboard interactive prompt can be customized using a `SSHPMPT.ASC` art file. See [art](../../art/general.md) for more information on configuring. This prompt includes a `newUserNames` variable to show the list of allowed new user names (see `firstMenuNewUser` above.) See [mci](../../art/mci.md) for information about formatting this string. Note: Regardless of the content of the `SSHPMPT.ASC` file, the prompt is surrounded by "Access denied", a newline, the prompt, another newline, and then the string "\[username]'s password: ". This normally occurs after the first password prompt (no art is shown before the first password attempt is made.) +The keyboard interactive prompt can be customized using a `SSHPMPT.ASC` art file. See [art](../../art/general.md) for more information on configuring. This prompt includes a `newUserNames` variable to show the list of allowed new user names (see `firstMenuNewUser` above.) See [mci](../../art/mci.md) for information about formatting this string. Note: Regardless of the content of the `SSHPMPT.ASC` file, the prompt is surrounded by "Access denied", a newline, the prompt, another newline, and then the string "\[username]'s password: ". This normally occurs after the first password prompt (no art is shown before the first password attempt is made.) \ No newline at end of file diff --git a/docs/_docs/troubleshooting/ssh-troubleshooting.md b/docs/_docs/troubleshooting/ssh-troubleshooting.md new file mode 100644 index 00000000..66beda9c --- /dev/null +++ b/docs/_docs/troubleshooting/ssh-troubleshooting.md @@ -0,0 +1,41 @@ +--- +layout: page +title: Troubleshooting SSH +--- + +Stuck with errors trying to get your SSH setup configured? See below for some common problems. Or as always, reach out to us by creating an [Issue](https://github.com/NuSkooler/enigma-bbs/issues) or start a [Discussion](https://github.com/NuSkooler/enigma-bbs/discussions) + +## No Such File or Directory + +***Symptom:*** +BBS not starting with an error similar to the following: + +```shell +Error initializing: Error: ENOENT: no such file or directory, open '/config/security/ssh_private_key.pem' +``` + +***Solution:*** +Several things can cause this: + +1. `ssh_private_key.pem` was installed to the wrong location. Make sure that it is in the `config/security` directory and has the name matching the error message. You can also change your `config.hjson` if you prefer to point to the location of the key file. +2. `ssh_private_key.pem` has the wrong file permissions. Verify that the file will be readable by the user that the BBS is running as. Because it is a cryptographic key however, we do recommend that access is restricted only to that user. + +## Error With Netrunner + +***Symptom:*** +Some ssh clients connect, but Netrunner (and other older clients) get a connection failed message and the following is in the log: + +```shell +"level":40,"error":"Handshake failed","code":2,"msg":"SSH connection error" +``` + +***Solution:*** + +The key was most likely not generated with the `-t rsa` option, and is using a newer algorithm that is not supported by Netrunner and similar clients. Regenerate the certificate with the `-t rsa` option. + +***Symptom:*** +Some ssh clients connect, but Netrunner (and other older clients) get a connection failed message and the following is in the log: + +```shell +"level":40,"error":"Group exchange not implemented for server","msg":"SSH connection error" +``` diff --git a/package.json b/package.json index fbf0a977..d8ff1515 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "sanitize-filename": "^1.6.3", "sqlite3": "5.1.6", "sqlite3-trans": "1.3.0", - "ssh2": "1.11.0", + "ssh2": "1.14.0", "systeminformation": "5.21.7", "telnet-socket": "0.2.4", "temptmp": "^1.1.0", diff --git a/yarn.lock b/yarn.lock index 5a208495..20a5083c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -77,7 +77,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -126,12 +126,12 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.8.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.8.0: version "8.8.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== -agent-base@6, agent-base@^6.0.2: +agent-base@^6.0.2, agent-base@6: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== @@ -172,12 +172,7 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.5.2" -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.0, ansi-regex@^5.0.1: +ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -227,7 +222,7 @@ argparse@^2.0.1: array-union@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== dependencies: array-uniq "^1.0.1" @@ -239,9 +234,9 @@ array-union@^2.1.0: array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== -asn1@^0.2.4: +asn1@^0.2.6: version "0.2.6" resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== @@ -256,7 +251,7 @@ async@3.2.4: balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg== base64-js@^1.3.1: version "1.5.1" @@ -266,7 +261,7 @@ base64-js@^1.3.1: bcrypt-pbkdf@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" @@ -304,7 +299,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.1, braces@^3.0.2: +braces@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -321,7 +316,7 @@ bser@2.1.1: buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== buffer@^5.5.0: version "5.7.1" @@ -333,12 +328,13 @@ buffer@^5.5.0: "buffers@github:NuSkooler/node-buffers": version "0.1.1" - resolved "git+ssh://git@github.com/NuSkooler/node-buffers.git#cd0855598f7048b02f0a51c90e22573973e9e2c2" + resolved "git+ssh://git@github.com/NuSkooler/node-buffers.git" + integrity sha512-UH53hA0xhBZCtWRo4pm4SZgpPC6VFZgCdYPnk2Mk0AK8SwE9qaJTGMFG1Oz1i/8MUsC7BS2PeUgFHrGSD2yhuA== -buildcheck@0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz" - integrity sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA== +buildcheck@~0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz" + integrity sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A== bunyan@1.8.15: version "1.8.15" @@ -386,15 +382,7 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.1: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -437,7 +425,7 @@ cli-width@^3.0.0: clone@^1.0.2: version "1.0.4" resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== coffee-script@^1.12.4: version "1.12.7" @@ -464,20 +452,20 @@ color-support@^1.1.2, color-support@^1.1.3: concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -cpu-features@~0.0.4: - version "0.0.4" - resolved "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz" - integrity sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A== +cpu-features@~0.0.8: + version "0.0.9" + resolved "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.9.tgz" + integrity sha512-AKjgn2rP2yJyfbepsmLfiYcmtNn/2eUvocUyM/09yB0YDiz39HteK/5/T4Onf0pmdYDMgkBoGvRLvEguzyL7wQ== dependencies: - buildcheck "0.0.3" - nan "^2.15.0" + buildcheck "~0.0.6" + nan "^2.17.0" cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" @@ -488,20 +476,13 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -debug@4, debug@^4.1.0, debug@^4.3.2, debug@^4.3.3: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^4.1.1: - version "4.2.0" - resolved "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== - dependencies: - ms "2.1.2" - deep-extend@^0.5.1: version "0.5.1" resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz" @@ -510,7 +491,7 @@ deep-extend@^0.5.1: deep-is@^0.1.3: version "0.1.3" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= sha512-GtxAN4HvBachZzm4OnWqc45ESpUCMwkYcsjnsPs23FwJbsO+k4t0k9bQCgOmzIlpHO28+WPK/KRbRk0DDHuuDw== deepdash@^5.3.9: version "5.3.9" @@ -523,14 +504,14 @@ deepdash@^5.3.9: defaults@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA== dependencies: clone "^1.0.2" del@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/del/-/del-3.0.0.tgz" - integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= sha512-7yjqSoVSlJzA4t/VUwazuEagGeANEKB3f/aNI//06pfKgwoCb7f6Q1gETN1sZzYaj6chTQ0AhIwDiPdfOjko4A== dependencies: globby "^6.1.0" is-path-cwd "^1.0.0" @@ -542,7 +523,7 @@ del@^3.0.0: delegates@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== denque@^2.0.1: version "2.1.0" @@ -576,7 +557,7 @@ doctrine@^3.0.0: dtrace-provider@~0.8: version "0.8.7" resolved "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz" - integrity sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ= + integrity sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ= sha512-V+HIGbAdxCIxddHNDwzXi6cx8Cz5RRlQOVcsryHfsyVVebpBEnDwHSgqxpgKzqeU/6/0DWqRLAGUwkbg2ecN1Q== dependencies: nan "^2.10.0" @@ -594,7 +575,7 @@ emoji-regex@^8.0.0: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -encoding@^0.1.12: +encoding@^0.1.0, encoding@^0.1.12: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -621,7 +602,7 @@ err-code@^2.0.2: escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" @@ -658,7 +639,7 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@8.21.0: +eslint@>=5, eslint@>=7.0.0, eslint@8.21.0: version "8.21.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz" integrity sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA== @@ -726,12 +707,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz" - integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== - -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -741,12 +717,7 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -exec-sh@^0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz" - integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== - -exec-sh@^0.3.4: +exec-sh@^0.3.2, exec-sh@^0.3.4: version "0.3.6" resolved "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz" integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== @@ -769,7 +740,7 @@ execa@^4.0.0: exiftool@^0.0.3: version "0.0.3" resolved "https://registry.npmjs.org/exiftool/-/exiftool-0.0.3.tgz" - integrity sha1-9YqSvXcnCtxU8xUc7WGko6tp1wc= + integrity sha1-9YqSvXcnCtxU8xUc7WGko6tp1wc= sha512-7xq/yI+ESuZEApWOTxp7bJ12XRjt+3LDqkCBLBkfrYDF3hQE65Lid/U2xYf7iCZ2LUBRWqsix1fXEfGvn9oTGw== external-editor@^3.0.3: version "3.0.3" @@ -804,7 +775,7 @@ fast-json-stable-stringify@^2.0.0: fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.13.0" @@ -881,12 +852,12 @@ fs-minipass@^2.0.0: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== gauge@^3.0.0: version "3.0.2" @@ -938,21 +909,10 @@ glob-parent@^6.0.1: dependencies: is-glob "^4.0.3" -glob@8.0.3: - version "8.0.3" - resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - glob@^6.0.1: version "6.0.4" resolved "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" - integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= + integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== dependencies: inflight "^1.0.4" inherits "2" @@ -996,6 +956,17 @@ glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +glob@8.0.3: + version "8.0.3" + resolved "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + globals@^13.15.0: version "13.17.0" resolved "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz" @@ -1018,7 +989,7 @@ globby@^11.1.0: globby@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -1026,17 +997,7 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.6: - version "4.1.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= - -graceful-fs@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz" - integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== - -graceful-fs@^4.2.10, graceful-fs@^4.2.6: +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.6: version "4.2.10" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -1068,7 +1029,7 @@ hjson@3.2.2: http-cache-semantics@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-proxy-agent@^4.0.1: @@ -1100,13 +1061,6 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.6.3, iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" @@ -1114,6 +1068,13 @@ iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2, iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.13: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" @@ -1124,7 +1085,7 @@ ignore@^5.2.0: resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -import-fresh@^3.0.0: +import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz" integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== @@ -1132,18 +1093,10 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" -import-fresh@^3.2.1: - version "3.2.2" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz" - integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" @@ -1158,17 +1111,12 @@ infer-owner@^1.0.4: inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -inherits@^2.0.4: +inherits@^2.0.3, inherits@^2.0.4, inherits@2: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1210,21 +1158,14 @@ ip@^2.0.0: is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-glob@^4.0.1, is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -1249,7 +1190,7 @@ is-number@^7.0.0: is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw== is-path-in-cwd@^1.0.0: version "1.0.1" @@ -1261,7 +1202,7 @@ is-path-in-cwd@^1.0.0: is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g== dependencies: path-is-inside "^1.0.1" @@ -1278,7 +1219,7 @@ is-unicode-supported@^0.1.0: isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== js-yaml@^4.1.0: version "4.1.0" @@ -1295,7 +1236,7 @@ json-schema-traverse@^0.4.1: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== jsonfile@^6.0.1: version "6.0.1" @@ -1331,7 +1272,7 @@ lodash.merge@^4.6.2: resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.21: +lodash@^4.17.15, lodash@^4.17.21, lodash@4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -1344,11 +1285,6 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -lru-cache@7.13.2: - version "7.13.2" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.2.tgz" - integrity sha512-VJL3nIpA79TodY/ctmZEfhASgqekbT574/c4j3jn4bKXbSCnTTCH/KltZyvL2GlV+tGSMtsWyem8DCX7qKTMBA== - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" @@ -1356,6 +1292,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@7.13.2: + version "7.13.2" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.2.tgz" + integrity sha512-VJL3nIpA79TodY/ctmZEfhASgqekbT574/c4j3jn4bKXbSCnTTCH/KltZyvL2GlV+tGSMtsWyem8DCX7qKTMBA== + make-dir@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" @@ -1388,7 +1329,7 @@ make-fetch-happen@^9.1.0: makeerror@1.0.x: version "1.0.11" resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= sha512-M/XvMZ6oK4edXjvg/ZYyzByg8kjpVrF/m0x3wbhOlzJfsQgFkqP1rJnLnJExOcslmLSSeLiN6NmF+cBoKJHGTg== dependencies: tmpl "1.0.x" @@ -1402,15 +1343,7 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromatch@^4.0.2: - version "4.0.4" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -1435,7 +1368,7 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2, "minimatch@2 || 3": version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -1508,7 +1441,12 @@ minizlib@^2.0.0, minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" -mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -1520,26 +1458,16 @@ mkdirp@~0.5.1: dependencies: minimist "^1.2.6" -moment@2.29.4: +moment@^2.19.3, moment@2.29.4: version "2.29.4" resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== -moment@^2.19.3: - version "2.29.1" - resolved "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - -ms@2.1.2: +ms@^2.0.0, ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.0.0: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - mute-stream@0.0.8: version "0.0.8" resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" @@ -1548,41 +1476,26 @@ mute-stream@0.0.8: mv@~2: version "2.1.1" resolved "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz" - integrity sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI= + integrity sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI= sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg== dependencies: mkdirp "~0.5.1" ncp "~2.0.0" rimraf "~2.4.0" -nan@^2.10.0: - version "2.11.1" - resolved "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz" - integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== - -nan@^2.14.0: - version "2.14.0" - resolved "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nan@^2.15.0: - version "2.15.0" - resolved "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== - -nan@^2.16.0: - version "2.16.0" - resolved "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz" - integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== +nan@^2.10.0, nan@^2.14.0, nan@^2.17.0: + version "2.18.0" + resolved "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== ncp@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz" - integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= + integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== negotiator@^0.6.2: version "0.6.3" @@ -1630,7 +1543,7 @@ node-gyp@8.x: node-int64@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-pty@0.10.1: version "0.10.1" @@ -1686,12 +1599,12 @@ npmlog@^6.0.0: object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" @@ -1732,7 +1645,7 @@ ora@^5.4.1: os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== otplib@11.0.1: version "11.0.1" @@ -1782,12 +1695,12 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" @@ -1799,7 +1712,7 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -1807,24 +1720,24 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: pify@^2.0.0: version "2.3.0" resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== prelude-ls@^1.2.1: version "1.2.1" @@ -1909,7 +1822,14 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^2.2.8, rimraf@^2.6.1: +rimraf@^2.2.8: + version "2.6.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== + dependencies: + glob "^7.0.5" + +rimraf@^2.6.1: version "2.6.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== @@ -1926,14 +1846,14 @@ rimraf@^3.0.2: rimraf@~2.4.0: version "2.4.5" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz" - integrity sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto= + integrity sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto= sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ== dependencies: glob "^6.0.1" rlogin@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/rlogin/-/rlogin-1.0.0.tgz" - integrity sha1-2wcyKzEhkSZiXZ0KqYctfr6KxAM= + integrity sha1-2wcyKzEhkSZiXZ0KqYctfr6KxAM= sha512-WixxTud2iapeJBNqhZl3jQfXYqKolBjgQiQAwUzF6Uvc4s3Is26PjPxHOh/vHkEfvwdC15szq4mbMcHRT+C5Yg== rsvp@^4.8.4: version "4.8.5" @@ -2032,12 +1952,7 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -signal-exit@^3.0.7: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -2092,16 +2007,16 @@ sqlite3@5.1.6: optionalDependencies: node-gyp "8.x" -ssh2@1.11.0: - version "1.11.0" - resolved "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz" - integrity sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw== +ssh2@1.14.0: + version "1.14.0" + resolved "https://registry.npmjs.org/ssh2/-/ssh2-1.14.0.tgz" + integrity sha512-AqzD1UCqit8tbOKoj6ztDDi1ffJZ2rV2SwlgrVVrHPkV5vWqGJOVp5pmtj18PunkPJAuKQsnInyKV+/Nb2bUnA== dependencies: - asn1 "^0.2.4" + asn1 "^0.2.6" bcrypt-pbkdf "^1.0.2" optionalDependencies: - cpu-features "~0.0.4" - nan "^2.16.0" + cpu-features "~0.0.8" + nan "^2.17.0" ssri@^8.0.0, ssri@^8.0.1: version "8.0.1" @@ -2110,7 +2025,14 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: +string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -2119,37 +2041,7 @@ ssri@^8.0.0, ssri@^8.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz" - integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^5.2.0" - -string_decoder@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz" - integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -2161,12 +2053,7 @@ strip-final-newline@^2.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz" - integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== - -strip-json-comments@^3.1.1: +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -2180,7 +2067,7 @@ supports-color@^7.1.0: systeminformation@5.21.7: version "5.21.7" - resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.21.7.tgz#53ef75daaf5d756d015f4bb02e059126ccac74f2" + resolved "https://registry.npmjs.org/systeminformation/-/systeminformation-5.21.7.tgz" integrity sha512-K3LjnajrazTLTD61+87DFg8IXFk5ljx6nSBqB8pQLtC1UPivAjDtTYGPZ8jaBFxcesPaCOkvLRtBq+RFscrsLw== tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: @@ -2213,17 +2100,17 @@ temptmp@^1.1.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thirty-two@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz" - integrity sha1-TKL//AKlEpDSdEueP1V2k8prYno= + integrity sha1-TKL//AKlEpDSdEueP1V2k8prYno= sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA== through@^2.3.6: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tmp@^0.0.33: version "0.0.33" @@ -2252,7 +2139,7 @@ tr46@~0.0.3: truncate-utf8-bytes@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz" - integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= + integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== dependencies: utf8-byte-length "^1.0.1" @@ -2264,7 +2151,7 @@ tslib@^2.1.0: tweetnacl@^0.14.3: version "0.14.5" resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -2317,12 +2204,12 @@ uri-js@^4.2.2: utf8-byte-length@^1.0.1: version "1.0.4" resolved "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz" - integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= + integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid-parse@1.1.0: version "1.1.0" @@ -2342,14 +2229,14 @@ v8-compile-cache@^2.0.3: walker@~1.0.5: version "1.0.7" resolved "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= sha512-cF4je9Fgt6sj1PKfuFt9jpQPeHosM+Ryma/hfY9U7uXGKM7pJCsF0v2r55o+Il54+i77SyYWetB4tD1dEygRkw== dependencies: makeerror "1.0.x" wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" @@ -2388,7 +2275,7 @@ word-wrap@^1.2.3: wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== ws@7.4.3: version "7.4.3" From 270c09eb809e386916b3256064753ce46e2c3fa3 Mon Sep 17 00:00:00 2001 From: Nathan Byrd Date: Wed, 11 Oct 2023 00:28:13 +0000 Subject: [PATCH 37/37] Added a sentence --- docs/_docs/troubleshooting/ssh-troubleshooting.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/_docs/troubleshooting/ssh-troubleshooting.md b/docs/_docs/troubleshooting/ssh-troubleshooting.md index 66beda9c..4b59b4f5 100644 --- a/docs/_docs/troubleshooting/ssh-troubleshooting.md +++ b/docs/_docs/troubleshooting/ssh-troubleshooting.md @@ -39,3 +39,7 @@ Some ssh clients connect, but Netrunner (and other older clients) get a connecti ```shell "level":40,"error":"Group exchange not implemented for server","msg":"SSH connection error" ``` + +***Solution:*** + +Remove the following encryption protocols from your `config.hjson`: `diffie-hellman-group-exchange-sha256` and `diffie-hellman-group-exchange-sha1` \ No newline at end of file