From b377d91155b70c087846c2a88298bbed8ee5eda6 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Sun, 15 Nov 2020 15:06:49 -0700 Subject: [PATCH 01/16] Enigma crashes trying to write to a node when that node disconnected #324 * Don't attempt to write to non-writable socket! --- core/client_term.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/client_term.js b/core/client_term.js index f537c359..e961394e 100644 --- a/core/client_term.js +++ b/core/client_term.js @@ -160,7 +160,7 @@ ClientTerminal.prototype.write = function(s, convertLineFeeds, cb) { }; ClientTerminal.prototype.rawWrite = function(s, cb) { - if(this.output) { + if(this.output && this.output.writable) { this.output.write(s, err => { if(cb) { return cb(err); From 8b2be6769cace8fd64d1a42d5545e1a63eb3f004 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Tue, 17 Nov 2020 19:06:54 -0700 Subject: [PATCH 02/16] * TZUTC/TZUTCINFO handling should work properly * Don't bork message timestamp when we write to the DB * Fix read byte len which could prevent message imports! --- core/ftn_mail_packet.js | 25 +++++++++++++++++++++---- core/message.js | 7 +++---- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/core/ftn_mail_packet.js b/core/ftn_mail_packet.js index 781ed929..973954c8 100644 --- a/core/ftn_mail_packet.js +++ b/core/ftn_mail_packet.js @@ -678,11 +678,28 @@ function Packet(options) { } // - // If we have a UTC offset kludge (e.g. TZUTC) then update - // modDateTime with it + // Attempt to handle FTN time zone kludges of 'TZUTC' and + // 'TZUTCINFO'. // - if(_.isString(msg.meta.FtnKludge.TZUTC) && msg.meta.FtnKludge.TZUTC.length > 0) { - msg.modDateTime = msg.modTimestamp.utcOffset(msg.meta.FtnKludge.TZUTC); + // See http://ftsc.org/docs/frl-1004.002 + // + const tzKludge = msg.meta.FtnKludge.TZUTC || msg.meta.FtnKludge.TZUTCINFO; + const tzMatch = /([+-]?)([0-9]{2})([0-9]{2})/.exec(tzKludge); + if (tzMatch) { + // + // - Both kludges should provide a offset in hhmm format + // - Negative offsets must proceed with '-' + // - Positive offsets must not (to spec) proceed with '+', but + // we'll allow it. + // + const [, sign, hours, minutes ] = tzMatch; + + // convert to a [+|-]hh:mm format. + // example: 1300 -> +13:00 + const utcOffset = `${sign||'+'}${hours}:${minutes}`; + + // finally, update our modTimestamp + msg.modTimestamp = msg.modTimestamp.utcOffset(utcOffset); } // :TODO: Parser should give is this info: diff --git a/core/message.js b/core/message.js index 9b7a980e..73ebe761 100644 --- a/core/message.js +++ b/core/message.js @@ -134,7 +134,7 @@ module.exports = class Message { modTimestamp = moment(modTimestamp); } - this.modTimestamp = modTimestamp; + this.modTimestamp = modTimestamp || moment(); this.meta = {}; _.defaultsDeep(this.meta, { System : {} }, meta); @@ -695,11 +695,10 @@ module.exports = class Message { }, function storeMessage(trans, callback) { // generate a UUID for this message if required (general case) - const msgTimestamp = moment(); if(!self.messageUuid) { self.messageUuid = Message.createMessageUUID( self.areaTag, - msgTimestamp, + self.modTimestamp, self.subject, self.message ); @@ -710,7 +709,7 @@ module.exports = class Message { VALUES (?, ?, ?, ?, ?, ?, ?, ?);`, [ self.areaTag, self.messageUuid, self.replyToMsgId, self.toUserName, - self.fromUserName, self.subject, self.message, getISOTimestampString(msgTimestamp) + self.fromUserName, self.subject, self.message, getISOTimestampString(self.modTimestamp) ], function inserted(err) { // use non-arrow function for 'this' scope if(!err) { From 792acb0550b2be9a0841f4ecedbf3301647545f6 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Wed, 18 Nov 2020 13:22:22 -0700 Subject: [PATCH 03/16] Add theme information to oputil user info * Add theme ID * Allow lookup by user ID --- core/oputil/oputil_user.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/oputil/oputil_user.js b/core/oputil/oputil_user.js index e3501d13..403c5076 100644 --- a/core/oputil/oputil_user.js +++ b/core/oputil/oputil_user.js @@ -30,6 +30,10 @@ function initAndGetUser(userName, cb) { const User = require('../../core/user.js'); User.getUserIdAndName(userName, (err, userId) => { if(err) { + // try user ID if number was supplied + if (_.isNumber(userName)) { + return User.getUser(parseInt(userName), callback); + } return callback(err); } return User.getUser(userId, callback); @@ -329,12 +333,17 @@ function showUserInfo(user) { return user.properties[p] || 'N/A'; }; + const currentTheme = () => { + return user.properties[UserProps.ThemeId]; + }; + const stdInfo = `User information: Username : ${user.username}${user.isRoot() ? ' (root/SysOp)' : ''} Real name : ${propOrNA(UserProps.RealName)} ID : ${user.userId} Status : ${statusDesc()} Groups : ${user.groups.join(', ')} +Theme ID : ${currentTheme()} Created : ${created()} Last login : ${lastLogin()} Login count : ${propOrNA(UserProps.LoginCount)} From c13bd557a6caa41d2b395a8d94573bcfc7535f41 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Wed, 18 Nov 2020 13:51:12 -0700 Subject: [PATCH 04/16] Dependency patch level updates --- package.json | 10 +++++----- yarn.lock | 47 ++++++++++++++++++++++++++--------------------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 038cce91..7b93e9a9 100644 --- a/package.json +++ b/package.json @@ -25,26 +25,26 @@ "async": "3.2.0", "binary-parser": "^1.6.2", "buffers": "github:NuSkooler/node-buffers", - "bunyan": "^1.8.12", + "bunyan": "1.8.14", "deepdash": "^5.1.1", "exiftool": "^0.0.3", "fs-extra": "9.0.1", "glob": "7.1.6", "graceful-fs": "^4.2.4", - "hashids": "2.2.1", - "hjson": "^3.2.1", + "hashids": "2.2.2", + "hjson": "3.2.2", "iconv-lite": "0.5.1", "ini-config-parser": "^1.0.4", "inquirer": "^7.1.0", "later": "1.2.0", - "lodash": "^4.17.15", + "lodash": "4.17.20", "lru-cache": "^5.1.1", "mime-types": "2.1.27", "minimist": "1.2.5", "moment": "2.26.0", "nntp-server": "^1.0.3", "node-pty": "^0.9.0", - "nodemailer": "6.4.8", + "nodemailer": "6.4.16", "otplib": "11.0.1", "qrcode-generator": "^1.4.4", "rlogin": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index 85cd031a..7c7b6c03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -265,13 +265,13 @@ buffer-crc32@~0.2.3: version "0.1.1" resolved "https://codeload.github.com/NuSkooler/node-buffers/tar.gz/cd0855598f7048b02f0a51c90e22573973e9e2c2" -bunyan@^1.8.12: - version "1.8.12" - resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797" - integrity sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c= +bunyan@1.8.14: + version "1.8.14" + resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.14.tgz#3d8c1afea7de158a5238c7cb8a66ab6b38dd45b4" + integrity sha512-LlahJUxXzZLuw/hetUQJmRgZ1LF6+cr5TPpRj6jf327AsiIq2jhYEH4oqUUkVKTor+9w2BT3oxVwhzE5lw9tcg== optionalDependencies: dtrace-provider "~0.8" - moment "^2.10.6" + moment "^2.19.3" mv "~2" safe-json-stringify "~1" @@ -1018,15 +1018,15 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -hashids@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/hashids/-/hashids-2.2.1.tgz#ad0c600f0083aa0df7451dfd184e53db34f71289" - integrity sha512-+hQeKWwpSDiWFeu/3jKUvwboE4Z035gR6FnpscbHPOEEjCbgv2px9/Mlb3O0nOTRyZOw4MMFRYfVL3zctOV6OQ== +hashids@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/hashids/-/hashids-2.2.2.tgz#5381257b34f0d0aca2063967b14a30a9312f650d" + integrity sha512-nqH06JLFeBBCg31jYSArbOs/XddTdnHSul/hb6XbrWg/UlUWFQc9KR21sVLoGKQGKPW1D3zgTgTew0oY7nhrhQ== -hjson@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/hjson/-/hjson-3.2.1.tgz#20de41dc87fc9a10d1557d0230b0e02afb1b09ac" - integrity sha512-OhhrFMeC7dVuA1xvxuXGTv/yTdhTvbe8hz+3LgVNsfi9+vgz0sF/RrkuX8eegpKaMc9cwYwydImBH6iePoJtdQ== +hjson@3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/hjson/-/hjson-3.2.2.tgz#a5a81138f4c0bb427e4b2ac917fafd4b454436cf" + integrity sha512-MkUeB0cTIlppeSsndgESkfFD21T2nXPRaBStLtf3cAYA2bVEFdXlodZB0TukwZiobPD1Ksax5DK4RTZeaXCI3Q== iconv-lite@0.5.1: version "0.5.1" @@ -1344,6 +1344,11 @@ lodash-es@^4.17.15: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== +lodash@4.17.20: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + lodash@^4.17.14, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" @@ -1468,10 +1473,10 @@ moment@2.26.0: resolved "https://registry.yarnpkg.com/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a" integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw== -moment@^2.10.6: - version "2.22.2" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" - integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= +moment@^2.19.3: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== ms@2.0.0: version "2.0.0" @@ -1592,10 +1597,10 @@ node-pty@^0.9.0: dependencies: nan "^2.14.0" -nodemailer@6.4.8: - version "6.4.8" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.8.tgz#aca52886e4e56f71f6b8a65f5ca6b767ca751fc7" - integrity sha512-UbJD0+g5e2H20bWv7Rpj3B+N3TMMJ0MLoLwaGVJ0k3Vo8upq0UltwHJ5BJfrpST1vFa91JQ8cf7cICK5DSIo1Q== +nodemailer@6.4.16: + version "6.4.16" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.16.tgz#5cb6391b1d79ab7eff32d6f9f48366b5a7117293" + integrity sha512-68K0LgZ6hmZ7PVmwL78gzNdjpj5viqBdFqKrTtr9bZbJYj6BRj5W6WGkxXrEnUl3Co3CBXi3CZBUlpV/foGnOQ== nopt@^4.0.1: version "4.0.1" From f5a6afb579c6bdb4a331b133c97778dc54f8b877 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Wed, 18 Nov 2020 14:01:58 -0700 Subject: [PATCH 05/16] Minor dep version updates --- package.json | 14 +-- yarn.lock | 235 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 160 insertions(+), 89 deletions(-) diff --git a/package.json b/package.json index 7b93e9a9..c1ad8af8 100644 --- a/package.json +++ b/package.json @@ -23,10 +23,10 @@ ], "dependencies": { "async": "3.2.0", - "binary-parser": "^1.6.2", + "binary-parser": "1.7.0", "buffers": "github:NuSkooler/node-buffers", "bunyan": "1.8.14", - "deepdash": "^5.1.1", + "deepdash": "5.3.2", "exiftool": "^0.0.3", "fs-extra": "9.0.1", "glob": "7.1.6", @@ -35,13 +35,13 @@ "hjson": "3.2.2", "iconv-lite": "0.5.1", "ini-config-parser": "^1.0.4", - "inquirer": "^7.1.0", + "inquirer": "7.3.3", "later": "1.2.0", "lodash": "4.17.20", "lru-cache": "^5.1.1", "mime-types": "2.1.27", "minimist": "1.2.5", - "moment": "2.26.0", + "moment": "2.29.1", "nntp-server": "^1.0.3", "node-pty": "^0.9.0", "nodemailer": "6.4.16", @@ -55,14 +55,14 @@ "ssh2": "0.8.9", "telnet-socket": "^0.2.3", "temptmp": "^1.1.0", - "uuid": "8.1.0", + "uuid": "8.3.1", "uuid-parse": "1.1.0", - "ws": "^7.3.0", + "ws": "7.4.0", "xxhash": "^0.3.0", "yazl": "^2.5.1" }, "devDependencies": { - "eslint": "^7.2.0" + "eslint": "7.13.0" }, "engines": { "node": ">=12" diff --git a/yarn.lock b/yarn.lock index 7c7b6c03..55960415 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,6 +31,22 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@eslint/eslintrc@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c" + integrity sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -46,10 +62,10 @@ acorn-jsx@^5.2.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== -acorn@^7.2.0: - version "7.3.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" - integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== ajv@^6.10.0, ajv@^6.10.2: version "6.12.2" @@ -61,6 +77,21 @@ ajv@^6.10.0, ajv@^6.10.2: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-escapes@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" @@ -220,11 +251,16 @@ bcrypt-pbkdf@^1.0.2: dependencies: tweetnacl "^0.14.3" -binary-parser@1.6.2, binary-parser@^1.6.2: +binary-parser@1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/binary-parser/-/binary-parser-1.6.2.tgz#8410a82ffd9403271ec182bd91e63a09cee88cbe" integrity sha512-cYAhKB51A9T/uylDvMK7uAYaPLWLwlferNOpnQ0E0fuO73yPi7kWaWiOm22BvuKxCbggmkiFN0VkuLg6gc+KQQ== +binary-parser@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/binary-parser/-/binary-parser-1.7.0.tgz#117dbfb071dde44a4910ea072a8d32e1549e8e12" + integrity sha512-lIWQLmiEJtx2ZAUPbZWLA/0bgxYdWkySU9pZq5dNRcyzliZCBIwbgLeyydu57GFskGcZDbirMjPSgVcUgZpbdg== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -311,15 +347,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== @@ -354,10 +382,10 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== code-point-at@^1.0.0: version "1.1.0" @@ -467,6 +495,13 @@ debug@^4.0.1: dependencies: ms "^2.1.1" +debug@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -487,12 +522,12 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deepdash@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/deepdash/-/deepdash-5.1.1.tgz#dcf68b9e15085b5df18bdb4011723790e0c40430" - integrity sha512-esz3pjQJaeYO4z74seqCMrOYUsAAdrhO3KJuEnGEaxTGbSy8VGOWn7jTU2J3nR5WDyNpS5/hse3m/hdM1/8ZWA== +deepdash@5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/deepdash/-/deepdash-5.3.2.tgz#7ae24fbfa94420b6365ec3384a54d52327481019" + integrity sha512-Qm2IUr6GsPJQJNATj2g93VvC6n5raH+WtBQw78LNkgxYmlFLV94/l1NcqlsmuPhJV5+GndIsWcPJ6E69kiFIAg== dependencies: - lodash "^4.17.15" + lodash "^4.17.20" lodash-es "^4.17.15" define-property@^0.2.5: @@ -580,46 +615,65 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.0: dependencies: once "^1.4.0" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-scope@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" - integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.2.0: +eslint-visitor-keys@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz#74415ac884874495f78ec2a97349525344c981fa" integrity sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ== -eslint@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.2.0.tgz#d41b2e47804b30dbabb093a967fb283d560082e6" - integrity sha512-B3BtEyaDKC5MlfDa2Ha8/D6DsS4fju95zs0hjS3HdGazw+LNayai38A25qMppK37wWGWNYSPOR6oYzlz5MHsRQ== +eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@7.13.0: + version "7.13.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.13.0.tgz#7f180126c0dcdef327bfb54b211d7802decc08da" + integrity sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ== dependencies: "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.2.1" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^5.1.0" - eslint-utils "^2.0.0" - eslint-visitor-keys "^1.2.0" - espree "^7.1.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.0" esquery "^1.2.0" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -629,12 +683,11 @@ eslint@^7.2.0: ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.14" + lodash "^4.17.19" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -647,14 +700,14 @@ eslint@^7.2.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c" - integrity sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw== +espree@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" + integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== dependencies: - acorn "^7.2.0" + acorn "^7.4.0" acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.2.0" + eslint-visitor-keys "^1.3.0" esprima@^4.0.0: version "4.0.1" @@ -668,14 +721,14 @@ esquery@^1.2.0: dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -685,6 +738,11 @@ estraverse@^5.1.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -1062,6 +1120,14 @@ 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.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" + 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.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -1094,21 +1160,21 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^7.0.0, inquirer@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" - integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== +inquirer@7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== dependencies: ansi-escapes "^4.2.1" - chalk "^3.0.0" + chalk "^4.1.0" cli-cursor "^3.1.0" - cli-width "^2.0.0" + cli-width "^3.0.0" external-editor "^3.0.3" figures "^3.0.0" - lodash "^4.17.15" + lodash "^4.17.19" mute-stream "0.0.8" run-async "^2.4.0" - rxjs "^6.5.3" + rxjs "^6.6.0" string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" @@ -1344,7 +1410,7 @@ lodash-es@^4.17.15: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== -lodash@4.17.20: +lodash@4.17.20, lodash@^4.17.19, lodash@^4.17.20: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -1468,12 +1534,7 @@ mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: dependencies: minimist "0.0.8" -moment@2.26.0: - version "2.26.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a" - integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw== - -moment@^2.19.3: +moment@2.29.1, moment@^2.19.3: version "2.29.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== @@ -1483,6 +1544,11 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" @@ -1952,10 +2018,10 @@ run-async@^2.4.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== -rxjs@^6.5.3: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== +rxjs@^6.6.0: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== dependencies: tslib "^1.9.0" @@ -2292,6 +2358,11 @@ strip-json-comments@^3.1.0: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -2498,10 +2569,10 @@ uuid-parse@1.1.0: resolved "https://registry.yarnpkg.com/uuid-parse/-/uuid-parse-1.1.0.tgz#7061c5a1384ae0e1f943c538094597e1b5f3a65b" integrity sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A== -uuid@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" - integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== +uuid@8.3.1: + version "8.3.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" + integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== v8-compile-cache@^2.0.3: version "2.1.1" @@ -2553,10 +2624,10 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" - integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== +ws@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.0.tgz#a5dd76a24197940d4a8bb9e0e152bb4503764da7" + integrity sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ== xtend@~4.0.1: version "4.0.1" From b59567ef771192f37f1308fbd893bde5b0f4a0f4 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Wed, 18 Nov 2020 21:57:08 -0700 Subject: [PATCH 06/16] iconv-lite small bump --- package.json | 2 +- yarn.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index c1ad8af8..52fe8641 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "graceful-fs": "^4.2.4", "hashids": "2.2.2", "hjson": "3.2.2", - "iconv-lite": "0.5.1", + "iconv-lite": "^0.6.2", "ini-config-parser": "^1.0.4", "inquirer": "7.3.3", "later": "1.2.0", diff --git a/yarn.lock b/yarn.lock index 55960415..60f67a5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1086,13 +1086,6 @@ hjson@3.2.2: resolved "https://registry.yarnpkg.com/hjson/-/hjson-3.2.2.tgz#a5a81138f4c0bb427e4b2ac917fafd4b454436cf" integrity sha512-MkUeB0cTIlppeSsndgESkfFD21T2nXPRaBStLtf3cAYA2bVEFdXlodZB0TukwZiobPD1Ksax5DK4RTZeaXCI3Q== -iconv-lite@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.1.tgz#b2425d3c7b18f7219f2ca663d103bddb91718d64" - integrity sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q== - dependencies: - safer-buffer ">= 2.1.2 < 3" - iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1100,6 +1093,13 @@ iconv-lite@^0.4.24, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" @@ -2042,7 +2042,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== From 35a52adb75a065007142cd1124dbcecd5957b031 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Fri, 20 Nov 2020 18:50:12 -0700 Subject: [PATCH 07/16] Some docs --- docs/configuration/hjson.md | 2 + docs/configuration/menu-hjson.md | 72 +++++++++++++++++++++++++++++++- docs/modding/menu-modules.md | 2 +- 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/docs/configuration/hjson.md b/docs/configuration/hjson.md index e812479f..7bfb8ddf 100644 --- a/docs/configuration/hjson.md +++ b/docs/configuration/hjson.md @@ -40,6 +40,8 @@ See https://hjson.org/users.html for more more editors & plugins. ### Hot-Reload A.K.A. Live Editing ENiGMA½'s configuration, menu, and theme files can edited while your BBS is running. When a file is saved, it is hot-reloaded into the running system. If users are currently connected and you change a menu for example, the next reload of that menu will show the changes. +:information_source: See also [Configuration Files](/docs/configuration/config-files.md) + ### CaSe SeNsiTiVE Configuration keys are **case sensitive**. That means if a configuration key is `boardName` for example, `boardname`, or `BOARDNAME` **will not work**. diff --git a/docs/configuration/menu-hjson.md b/docs/configuration/menu-hjson.md index 886fba7f..b23c0ef4 100644 --- a/docs/configuration/menu-hjson.md +++ b/docs/configuration/menu-hjson.md @@ -3,7 +3,7 @@ layout: page title: Menu HSJON --- ## Menu HJSON -The core of a ENiGMA½ based BBS is `menu.hjson`. Note that when `menu.hjson` is referenced, we're actually talking about `config/menus/yourboardname-*.hjson`. These files determines the menus (or screens) a user can see, the order they come in and how they interact with each other, ACS configuration, etc. Like all configuration within ENiGMA½, menu configuration is done in [HJSON](https://hjson.org/) format. See [HJSON General Information](hjson.md) for more information. +The core of a ENiGMA½ based BBS is `menu.hjson`. Note that when `menu.hjson` is referenced, we're actually talking about `config/menus/yourboardname-*.hjson`. These files determines the menus (or screens) a user can see, the order they come in, how they interact with each other, ACS configuration, and so on. Like all configuration within ENiGMA½, menu configuration is done in [HJSON](https://hjson.org/) format. See [HJSON General Information](hjson.md) for more information. Entries in `menu.hjson` are often referred to as *blocks* or *sections*. Each entry defines a menu. A menu in this sense is something the user can see or visit. Examples include but are not limited to: @@ -22,7 +22,7 @@ Below is a table of **common** menu entry members. These members apply to most e |--------|--------------| | `desc` | A friendly description that can be found in places such as "Who's Online" or wherever the `%MD` MCI code is used. | | `art` | An art file *spec*. See [General Art Information](/docs/art/general.md). | -| `next` | Specifies the next menu entry to go to next. Can be explicit or an array of possibilities dependent on ACS. See **Flow Control** in the **ACS Checks** section below. If `next` is not supplied, the next menu is this menus parent. | +| `next` | Specifies the next menu entry to go to next. Can be explicit or an array of possibilities dependent on ACS. See **Flow Control** in the **ACS Checks** section below. If `next` is not supplied, the next menu is this menus parent. Note that special built in methods such as `@systemMethod:logoff` can also be utilized here. | | `prompt` | Specifies a prompt, by name, to use along with this menu. Prompts are configured in the `prompts` section. See **Prompts** for more information. | | `submit` | Defines a submit handler when using `prompt`. | `form` | An object defining one or more *forms* available on this menu. | @@ -257,3 +257,71 @@ someMenu: { ] } ``` + +### Case Study: Adding a New User Password (NUP) +You've got a super 31337 board and want to prevent lamerz! Let's run through adding a NUP to your application flow. + +Given the default menu system, two "pre" new user application menus exist due to the way Telnet vs SSH logins occur. We'll focus only on Telnet here. This menu is `newUserApplicationPre`. Let's say you want to display this preamble, but then ask for the NUP. If the user gets the password wrong, show them a `LAMER.ANS` and boot 'em. + +First, let's create a new menu for the NUP: +```hjson +newUserPassword: { + art: nup.ans + next: newUserApplication + desc: NUP! + + form: { + 0: { + mci: { + ET1: { + // here we create an argument/variable of "nup" + argName: nup + focus: true + submit: true + } + } + submit: { + *: [ + { + // if the user submits "nup" with the correct + // value of "nolamerz" action will send + // them to the next menu defined above -- + // in our case: newUserApplication + value: { nup: "nolamerz" } + action: @systemMethod:nextMenu + } + { + // anything else will result in going to the badNewUserPassword menu + value: { nup: null } + action: @systemMethod:badNewUserPassword + } + ] + } + } + } +} +``` + +Looks like we'll need a `badNewUserPassword` menu as well! Let's create a very basic menu to show art then disconnect the user. + +```hjson +badNewUserPassword: { + art: badnup.ans + // here we use a built in system method to boot them. + next: @systemMethod:logoff + config: { + // wait 2s after showing the art before kicking them + nextTimeout: 2000 + } +} +``` + +Great, we have a couple new menus. Now let's just point to them. Remember the existing `newUserApplicationPre` menu? All that is left to do is point it's `next` to our `newUserPassword` menu: + +```hjson +newUserApplicationPre: { + // easy! Just tell the system where to go next + next: newUserPassword + // note that the rest of this menu is omitted for clarity +} +``` \ No newline at end of file diff --git a/docs/modding/menu-modules.md b/docs/modding/menu-modules.md index ea3ea4a7..1a2a9133 100644 --- a/docs/modding/menu-modules.md +++ b/docs/modding/menu-modules.md @@ -3,7 +3,7 @@ layout: page title: Local Doors --- ## Menu Modules -Menu entries found within `menu.hjson` are backed by *menu modules*. +Menu entries found within `menu.hjson` are backed by *menu modules*. ## Creating a New Module TODO From 6ffc460dbdad730aa14c20fae1950016cb63f854 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Fri, 20 Nov 2020 18:51:43 -0700 Subject: [PATCH 08/16] Fix --- docs/configuration/menu-hjson.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/menu-hjson.md b/docs/configuration/menu-hjson.md index b23c0ef4..db4e740b 100644 --- a/docs/configuration/menu-hjson.md +++ b/docs/configuration/menu-hjson.md @@ -258,7 +258,7 @@ someMenu: { } ``` -### Case Study: Adding a New User Password (NUP) +## Case Study: Adding a New User Password (NUP) You've got a super 31337 board and want to prevent lamerz! Let's run through adding a NUP to your application flow. Given the default menu system, two "pre" new user application menus exist due to the way Telnet vs SSH logins occur. We'll focus only on Telnet here. This menu is `newUserApplicationPre`. Let's say you want to display this preamble, but then ask for the NUP. If the user gets the password wrong, show them a `LAMER.ANS` and boot 'em. From 633e4498e0501f2600ba139e481f6a5fe89b8ea2 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Fri, 20 Nov 2020 18:54:55 -0700 Subject: [PATCH 09/16] Minor doc fixes --- docs/configuration/menu-hjson.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/configuration/menu-hjson.md b/docs/configuration/menu-hjson.md index db4e740b..c27038cb 100644 --- a/docs/configuration/menu-hjson.md +++ b/docs/configuration/menu-hjson.md @@ -266,7 +266,7 @@ Given the default menu system, two "pre" new user application menus exist due to First, let's create a new menu for the NUP: ```hjson newUserPassword: { - art: nup.ans + art: NUP.ANS next: newUserApplication desc: NUP! @@ -306,7 +306,7 @@ Looks like we'll need a `badNewUserPassword` menu as well! Let's create a very b ```hjson badNewUserPassword: { - art: badnup.ans + art: LAMER.ANS // here we use a built in system method to boot them. next: @systemMethod:logoff config: { From 1d30a879dbe41bb887d4920dbaa2735ccac828ac Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Fri, 20 Nov 2020 19:05:43 -0700 Subject: [PATCH 10/16] More linking --- docs/configuration/config-hjson.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/configuration/config-hjson.md b/docs/configuration/config-hjson.md index 6f426a68..65c6c4e9 100644 --- a/docs/configuration/config-hjson.md +++ b/docs/configuration/config-hjson.md @@ -3,9 +3,11 @@ layout: page title: System Configuration --- ## System Configuration -The main system configuration file, `config.hjson` both overrides defaults and provides additional configuration such as message areas. The default path is `/enigma-bbs-install-path/config/config.hjson` though you can override the `config.hjson` location with the `--config` parameter when invoking `main.js`. Values found in `core/config_default.js` may be overridden by simply providing the object members you wish replace. +The main system configuration file, `config.hjson` both overrides defaults and provides additional configuration such as message areas. Defaults lived in `core/config_default.js`. -See also [HJSON General Information](hjson.md) for more information on the HJSON format. +The default path is `/enigma-bbs/config/config.hjson` though this can be overridden using the `--config` parameter when invoking `main.js`. + +:information_source: See also [Configuration Files](config-files.md). Additionally [HJSON General Information](hjson.md) may be helpful for more information on the HJSON format. ### Creating a Configuration Your initial configuration skeleton should be created using the `oputil.js` command line utility. From your enigma-bbs root directory: From 17757b238186264055a3c98aa96a46a4276571b8 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Fri, 20 Nov 2020 20:09:04 -0700 Subject: [PATCH 11/16] Durp --- docs/configuration/menu-hjson.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/menu-hjson.md b/docs/configuration/menu-hjson.md index c27038cb..0e3f9aec 100644 --- a/docs/configuration/menu-hjson.md +++ b/docs/configuration/menu-hjson.md @@ -293,7 +293,7 @@ newUserPassword: { { // anything else will result in going to the badNewUserPassword menu value: { nup: null } - action: @systemMethod:badNewUserPassword + action: @menu:badNewUserPassword } ] } From d9b8f83c2d7504d2a1e3f8c98244e65dece47570 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Fri, 20 Nov 2020 22:05:57 -0700 Subject: [PATCH 12/16] Super simple menu example --- docs/configuration/menu-hjson.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/configuration/menu-hjson.md b/docs/configuration/menu-hjson.md index 0e3f9aec..b3eb14ca 100644 --- a/docs/configuration/menu-hjson.md +++ b/docs/configuration/menu-hjson.md @@ -13,6 +13,15 @@ Entries in `menu.hjson` are often referred to as *blocks* or *sections*. Each en Menu entries live under the `menus` section of `menu.hjson`. The *key* for a menu is it's name that can be referenced by other menus and areas of the system. +Below is a very basic menu entry called `showSomeArt` that displays some art then returns to the previous menu after the user hits a key: +```hjson +showSomeArt: { + art: someart.ans + config: { pause: true } +} +``` +As you can see a menu can be very simple. + :information_source: Remember that the top level menu may include additional files using the `includes` directive. See [Configuration Files](config-files.md) for more information on this. ## Common Menu Entry Members @@ -324,4 +333,4 @@ newUserApplicationPre: { next: newUserPassword // note that the rest of this menu is omitted for clarity } -``` \ No newline at end of file +``` From 6dcedbab5e18d7824f4082b7f083759414621cf7 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Sat, 21 Nov 2020 12:04:37 -0700 Subject: [PATCH 13/16] Table fix --- docs/configuration/config-files.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/configuration/config-files.md b/docs/configuration/config-files.md index e889452d..f76091ec 100644 --- a/docs/configuration/config-files.md +++ b/docs/configuration/config-files.md @@ -75,6 +75,7 @@ Consider `actionKeys` in a menu. Often times you may show a screen and the user Especially in a container environment such as [Docker](/docs/installation/docker.md), environment variable access in configuration files can become very handy. ENiGMA½ provides a flexible way to access variables using the `@environment` directive. The most basic form of `@environment:VAR_NAME` produces a string value. Additionally a `:type` suffix can be supplied to coerece the value to a particular type. Variables pointing to a comma separated list can be turned to arrays using an additional `:array` suffix. Below is a table of the various forms: + | Form | Variable Value | Produces | |------|----------------|----------| | `@environment:SOME_VAR` | "Foo" | `"Foo"` (without quotes) | From 5e52b3191803e1dabd1d47ed7e51bf2531aa8526 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Sat, 21 Nov 2020 12:19:18 -0700 Subject: [PATCH 14/16] Better icons --- docs/admin/updating.md | 2 +- docs/art/themes.md | 2 +- docs/configuration/config-files.md | 6 ++++-- docs/configuration/event-scheduler.md | 6 +++--- docs/configuration/security.md | 2 +- docs/filebase/first-file-area.md | 4 ++-- docs/installation/docker.md | 4 ++-- docs/installation/install-script.md | 2 +- docs/installation/manual.md | 2 +- docs/messageareas/configuring-a-message-area.md | 2 +- docs/messageareas/ftn.md | 2 +- 11 files changed, 18 insertions(+), 16 deletions(-) diff --git a/docs/admin/updating.md b/docs/admin/updating.md index 3cf93768..59ab3111 100644 --- a/docs/admin/updating.md +++ b/docs/admin/updating.md @@ -25,7 +25,7 @@ npm install # or 'yarn' :information_source: Visual diff tools such as [DiffMerge](https://www.sourcegear.com/diffmerge/downloads.php) (free, works on all major platforms) can be very helpful for the tasks outlined above! -:information_source: It is recommended to tail the logs and poke around a bit after an update. +:bulb: It is recommended to [monitor logs](/docs/troubleshooting/monitoring-logs.md) and poke around a bit after an update! diff --git a/docs/art/themes.md b/docs/art/themes.md index 9bf1419a..ec3e3684 100644 --- a/docs/art/themes.md +++ b/docs/art/themes.md @@ -11,7 +11,7 @@ Themes live in `art/themes/`. Each theme (and thus it's *theme ID*) is a directo ## Art For information on art files, see [General Art Information](general.md). TL;DR: In general, to theme a piece of art, create a version of it in your themes directory. -:information_source: Remember that by default, the system will allow for randomly selecting art (in one of the directories mentioned above) by numbering it: `FOO1.ANS`, `FOO2.ANS`, etc.! +:note: Remember that by default, the system will allow for randomly selecting art (in one of the directories mentioned above) by numbering it: `FOO1.ANS`, `FOO2.ANS`, etc.! ## Theme Sections Themes are some important sections to be aware of: diff --git a/docs/configuration/config-files.md b/docs/configuration/config-files.md index f76091ec..565b9b10 100644 --- a/docs/configuration/config-files.md +++ b/docs/configuration/config-files.md @@ -8,6 +8,8 @@ ENiGMA½ configuration files such as the [system config](config-hjson.md), [menu ## Hot-Reload Nearly all of ENiGMA½'s configuration can be hot-reloaded. That is, a live system can have it's configuration modified and it will be loaded in place. +:bulb: [Monitoring live logs](/docs/troubleshooting/monitoring-logs.md) is useful when making live changes. The system will complain if something is wrong! + ## Common Directives ### Includes Most configuration files offer an `includes` directive that allows users to break up large configuration files into smaller and organized parts. For example, consider a system with many menus/screens. Instead of a single `menu.hjson`, the SysOp may break this into `message-base.hjson`, `file-base.hjson`, etc. @@ -95,9 +97,9 @@ Below is a table of the various forms: | `@environment:SOME_VAR:timestamp` | "2020-01-05" | A [moment](https://momentjs.com/) object representing 2020-01-05 | | `@environment:SOME_VAR:timestamp:array` | "2020-01-05,2016-05-16T01:15:37'" | An array of [moment](https://momentjs.com/) objects representing 2020-01-05 and 2016-05-16T01:15:37 | -:information_source: `bool` may be used as an alias to `boolean`. +:bulb: `bool` may be used as an alias to `boolean`. -:information_source: `timestamp` values can be in any form that [moment can parse](https://momentjs.com/docs/#/parsing/). +:bulb: `timestamp` values can be in any form that [moment can parse](https://momentjs.com/docs/#/parsing/). :information_source: An unresolved or invalid `@environment` will be left intact. diff --git a/docs/configuration/event-scheduler.md b/docs/configuration/event-scheduler.md index 77b56f15..544e082a 100644 --- a/docs/configuration/event-scheduler.md +++ b/docs/configuration/event-scheduler.md @@ -6,7 +6,7 @@ title: Event Scheduler The ENiGMA½ scheduler allows system operators to configure arbitrary events that can can fire based on date and/or time, or by watching for changes in a file. Events can kick off internal handlers, custom modules, or binaries & scripts. ## Scheduling Events -To create a scheduled event, create a new configuration block in `config.hjson` under `eventScheduler.events`. +To create a scheduled event, create a new configuration block in `config.hjson` under `eventScheduler.events`. Events can have the following members: @@ -17,7 +17,7 @@ Events can have the following members: | `args` | :-1: | An array of arguments to pass along to the method or binary specified in `action`. | ### Schedules -As mentioned above, `schedule` may contain a [Later style](https://bunkat.github.io/later/parsers.html#text) parsable schedule string and/or an `@watch` clause. +As mentioned above, `schedule` may contain a [Later style](https://bunkat.github.io/later/parsers.html#text) parsable schedule string and/or an `@watch` clause. `schedule` examples: * `every 2 hours` @@ -26,7 +26,7 @@ As mentioned above, `schedule` may contain a [Later style](https://bunkat.github An `@watch` clause monitors a specified file for changes and takes the following form: `@watch:` where `` is a fully qualified path. -:information_source: If you would like to have a schedule **and** watch a file for changes, place the `@watch` clause second and seperated with the word `or`. For example: `every 24 hours or @watch:/path/to/somefile.txt`. +:bulb: If you would like to have a schedule **and** watch a file for changes, place the `@watch` clause second and separated with the word `or`. For example: `every 24 hours or @watch:/path/to/somefile.txt`. ### Actions Events can kick off actions by calling a method (function) provided by the system or custom module in addition to executing arbritary binaries or scripts. diff --git a/docs/configuration/security.md b/docs/configuration/security.md index afc583aa..dc2a122d 100644 --- a/docs/configuration/security.md +++ b/docs/configuration/security.md @@ -26,7 +26,7 @@ Due to the nature of 2FA/OTP, even if enabled on your system, users must opt-in :warning: Serving 2FA/OTP registration links over insecure (HTTP) can expose secrets intended for the user and is **highly** discouraged! -:information_source: +ops can also manually enable or disable 2FA/OTP for a user using [oputil](/docs/admin/oputil.md), but this is generally discouraged. +:note: +ops can also manually enable or disable 2FA/OTP for a user using [oputil](/docs/admin/oputil.md), but this is generally discouraged. #### Recovery In the situation that a user loses their 2FA/OTP device (such as a lost phone with Google Auth), there are some options: diff --git a/docs/filebase/first-file-area.md b/docs/filebase/first-file-area.md index e61e5a25..a30e40f3 100644 --- a/docs/filebase/first-file-area.md +++ b/docs/filebase/first-file-area.md @@ -23,9 +23,9 @@ storageTags: { } ``` -:information_source: On their own, storage tags don't do anything — they are simply pointers to storage locations on your system. +:note: On their own, storage tags don't do anything — they are simply pointers to storage locations on your system. -:information_source: Remember that paths are case sensitive on most non-Windows systems! +:warning: Remember that paths are case sensitive on most non-Windows systems! ### Areas File base *Areas* are configured using the `fileBase.areas` configuration block in `config.hjson`. Each entry's block starts with an *area tag*. Valid members for an area are as follows: diff --git a/docs/installation/docker.md b/docs/installation/docker.md index 4071a018..c9473e2b 100644 --- a/docs/installation/docker.md +++ b/docs/installation/docker.md @@ -12,9 +12,9 @@ Download and run the ENiGMA½ BBS image: -p 8888:8888 \ davestephens/enigma-bbs:latest -:information_source: This is a **very basic** example! As no config has been supplied the container will use a basic one so that it starts successfully. Note that as no persistence directory has been supplied, once the container stops any changes made will be lost! +:warning: This is a **very basic** example! As no config has been supplied the container will use a basic one so that it starts successfully. Note that as no persistence directory has been supplied, once the container stops any changes made will be lost! -:information_source: [Volumes](https://docs.docker.com/storage/volumes/) may be used for things such as your configuration and database path. +:bulb: [Volumes](https://docs.docker.com/storage/volumes/) may be used for things such as your configuration and database path. ## Customized Docker Setup TBC using Docker Compose diff --git a/docs/installation/install-script.md b/docs/installation/install-script.md index 56da80cf..e6a3a445 100644 --- a/docs/installation/install-script.md +++ b/docs/installation/install-script.md @@ -9,7 +9,7 @@ Under most Linux/UNIX like environments (Linux, BSD, OS X, ...) new users can s curl -o- https://raw.githubusercontent.com/NuSkooler/enigma-bbs/master/misc/install.sh | bash ``` -:information_source: You may wish to review the [installation script](https://raw.githubusercontent.com/NuSkooler/enigma-bbs/master/misc/install.sh) +:heavy_check_mark: You may wish to review the [installation script](https://raw.githubusercontent.com/NuSkooler/enigma-bbs/master/misc/install.sh) on GitHub before running it! The script will install `nvm`, Node.js and grab the latest ENiGMA BBS from GitHub. It will also guide you through creating a basic configuration file, and recommend some packages to install. diff --git a/docs/installation/manual.md b/docs/installation/manual.md index 46fc301d..2dcbfca7 100644 --- a/docs/installation/manual.md +++ b/docs/installation/manual.md @@ -7,7 +7,7 @@ do things manually, read on... ## Prerequisites * [Node.js](https://nodejs.org/) version **v12.x LTS or higher** (Other versions may work but are not supported). - * :information_source: It is **highly** recommended to use [Node Version Manager (NVM)](https://github.com/creationix/nvm) to manage your Node.js installation if you're on a Linux/Unix environment. + * :bulb: It is **highly** recommended to use [Node Version Manager (NVM)](https://github.com/creationix/nvm) to manage your Node.js installation if you're on a Linux/Unix environment. * [Python](https://www.python.org/downloads/) for compiling Node.js packages with native extensions via `node-gyp`. diff --git a/docs/messageareas/configuring-a-message-area.md b/docs/messageareas/configuring-a-message-area.md index 394b3aa6..74c7dcb5 100644 --- a/docs/messageareas/configuring-a-message-area.md +++ b/docs/messageareas/configuring-a-message-area.md @@ -10,7 +10,7 @@ Message Conferences are the top level container for *1:n* Message *Areas* via th Each conference is represented by a entry under `messageConferences`. Each entries top level key is it's *conference tag*. -:information_source: It is **highly** recommended to use snake_case style message *conference tags* and *area tags*! +:bulb: It is **highly** recommended to use snake_case style message *conference tags* and *area tags*! | Config Item | Required | Description | |-------------|----------|-------------| diff --git a/docs/messageareas/ftn.md b/docs/messageareas/ftn.md index 54face6b..276d28de 100644 --- a/docs/messageareas/ftn.md +++ b/docs/messageareas/ftn.md @@ -70,7 +70,7 @@ Example: } ``` -:information_source: You can import `AREAS.BBS` or FTN style `.NA` files using [oputil](/docs/admin/oputil.md)! +:note: You can import `AREAS.BBS` or FTN style `.NA` files using [oputil](/docs/admin/oputil.md)! #### A More Complete Example Below is a more complete *example* illustrating some of the concepts above: From 939c07f466e1dbd04f0efbf35cd4f950f0cf1e69 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Sat, 21 Nov 2020 12:35:46 -0700 Subject: [PATCH 15/16] More doc cleanup --- docs/art/themes.md | 60 +++++++++++------------ docs/configuration/directory-structure.md | 6 +-- docs/configuration/security.md | 2 +- docs/filebase/first-file-area.md | 2 +- docs/filebase/uploads.md | 2 +- docs/messageareas/ftn.md | 2 +- docs/servers/nntp.md | 1 + 7 files changed, 38 insertions(+), 37 deletions(-) diff --git a/docs/art/themes.md b/docs/art/themes.md index ec3e3684..9c9087e1 100644 --- a/docs/art/themes.md +++ b/docs/art/themes.md @@ -11,7 +11,7 @@ Themes live in `art/themes/`. Each theme (and thus it's *theme ID*) is a directo ## Art For information on art files, see [General Art Information](general.md). TL;DR: In general, to theme a piece of art, create a version of it in your themes directory. -:note: Remember that by default, the system will allow for randomly selecting art (in one of the directories mentioned above) by numbering it: `FOO1.ANS`, `FOO2.ANS`, etc.! +:memo: Remember that by default, the system will allow for randomly selecting art (in one of the directories mentioned above) by numbering it: `FOO1.ANS`, `FOO2.ANS`, etc.! ## Theme Sections Themes are some important sections to be aware of: @@ -53,9 +53,9 @@ Override system defaults. Example: ```hjson defaults: { - dateTimeFormat: { - short: MMM Do h:mm a - } + dateTimeFormat: { + short: MMM Do h:mm a + } } ``` @@ -73,30 +73,30 @@ Two formats for `mci` blocks are allowed: Example: Verbose `mci` with form IDs: ```hjson newUserFeedbackToSysOp: { - 0: { - mci: { - TL1: { width: 19, textOverflow: "..." } - ET2: { width: 19, textOverflow: "..." } - ET3: { width: 19, textOverflow: "..." } + 0: { + mci: { + TL1: { width: 19, textOverflow: "..." } + ET2: { width: 19, textOverflow: "..." } + ET3: { width: 19, textOverflow: "..." } + } } - } - 1: { - mci: { - MT1: { height: 14 } + 1: { + mci: { + MT1: { height: 14 } + } } - } } ``` Example: Shorthand `mci` format: ```hjson matrix: { - mci: { - VM1: { - itemFormat: "|03{text}" - focusItemFormat: "|11{text!styleFirstLower}" + mci: { + VM1: { + itemFormat: "|03{text}" + focusItemFormat: "|11{text!styleFirstLower}" + } } - } } ``` @@ -105,9 +105,9 @@ Many modules support "custom range" MCI items. These are MCI codes that are left ```hjson messageAreaChangeCurrentArea: { - config: { - areaListInfoFormat10: "|15{name}|07: |03{desc}" - } + config: { + areaListInfoFormat10: "|15{name}|07: |03{desc}" + } } ``` @@ -117,18 +117,18 @@ messageAreaChangeCurrentArea: { 1. Copy `/art/themes/luciano_blocktronics` to `art/themes/your_board_theme` 2. Update the `info` block at the top of the theme.hjson file: ``` hjson - info: { - name: Awesome Theme - author: Cool Artist - group: Sick Group - enabled: true // default - } +info: { + name: Awesome Theme + author: Cool Artist + group: Sick Group + enabled: true // default +} ``` 3. If desired, you may make this the default system theme in `config.hjson` via `theme.default`. `theme.preLogin` may be set if you want this theme used for pre-authenticated users. Both of these values also accept `*` if you want the system to radomly pick. ``` hjson - theme: { +theme: { default: your_board_theme preLogin: * - } +} ``` diff --git a/docs/configuration/directory-structure.md b/docs/configuration/directory-structure.md index e139be80..4060991c 100644 --- a/docs/configuration/directory-structure.md +++ b/docs/configuration/directory-structure.md @@ -9,9 +9,9 @@ All paths mentioned here are relative to the ENiGMA½ checkout directory. | `/art/general` | Non-theme art - welcome ANSI, logoff ANSI, etc. See [General Art]({{ site.baseurl }}{% link art/general.md %}). | `/art/themes` | Theme art. Themes should be in their own subdirectory and contain a theme.hjson. See [Themes]({{ site.baseurl }}{% link art/themes.md %}). | `/config` | [config.hjson](config-hjson.md) system configuration. -| `/config/menus` | [menu.hjson](menu-hjson.md)storage. -| `/config/security` | D path for SSL certs and public/private keys. -| `/db` | All ENiGMA½ databases in Sqlite3 format. +| `/config/menus` | [menu.hjson](menu-hjson.md) storage. +| `/config/security` | SSL certificates and public/private keys. +| `/db` | All ENiGMA½ databases in SQLite3 format. | `/docs` | These docs ;-) | `/dropfiles` | Dropfiles created for [local doors]({{ site.baseurl }}{% link modding/local-doors.md %}) | `/logs` | Logs. See [Monitoring Logs]({{ site.baseurl }}{% link troubleshooting/monitoring-logs.md %}) diff --git a/docs/configuration/security.md b/docs/configuration/security.md index dc2a122d..8461a381 100644 --- a/docs/configuration/security.md +++ b/docs/configuration/security.md @@ -26,7 +26,7 @@ Due to the nature of 2FA/OTP, even if enabled on your system, users must opt-in :warning: Serving 2FA/OTP registration links over insecure (HTTP) can expose secrets intended for the user and is **highly** discouraged! -:note: +ops can also manually enable or disable 2FA/OTP for a user using [oputil](/docs/admin/oputil.md), but this is generally discouraged. +:memo: +ops can also manually enable or disable 2FA/OTP for a user using [oputil](/docs/admin/oputil.md), but this is generally discouraged. #### Recovery In the situation that a user loses their 2FA/OTP device (such as a lost phone with Google Auth), there are some options: diff --git a/docs/filebase/first-file-area.md b/docs/filebase/first-file-area.md index a30e40f3..c561b055 100644 --- a/docs/filebase/first-file-area.md +++ b/docs/filebase/first-file-area.md @@ -23,7 +23,7 @@ storageTags: { } ``` -:note: On their own, storage tags don't do anything — they are simply pointers to storage locations on your system. +:memo: On their own, storage tags don't do anything — they are simply pointers to storage locations on your system. :warning: Remember that paths are case sensitive on most non-Windows systems! diff --git a/docs/filebase/uploads.md b/docs/filebase/uploads.md index b6bceef2..3d994440 100644 --- a/docs/filebase/uploads.md +++ b/docs/filebase/uploads.md @@ -21,4 +21,4 @@ uploads: { :information_source: Remember that uploads in a particular area are stored **using the first storage tag defined in that area.** -:information_source: Any ACS checks are allowed. See [ACS](../configuration/acs.md) +:bulb: Any ACS checks are allowed. See [ACS](../configuration/acs.md) diff --git a/docs/messageareas/ftn.md b/docs/messageareas/ftn.md index 276d28de..f3d1237a 100644 --- a/docs/messageareas/ftn.md +++ b/docs/messageareas/ftn.md @@ -70,7 +70,7 @@ Example: } ``` -:note: You can import `AREAS.BBS` or FTN style `.NA` files using [oputil](/docs/admin/oputil.md)! +:bulb: You can import `AREAS.BBS` or FTN style `.NA` files using [oputil](/docs/admin/oputil.md)! #### A More Complete Example Below is a more complete *example* illustrating some of the concepts above: diff --git a/docs/servers/nntp.md b/docs/servers/nntp.md index c6ceaf2e..6d15fa17 100644 --- a/docs/servers/nntp.md +++ b/docs/servers/nntp.md @@ -6,6 +6,7 @@ title: NNTP Server The NNTP *content server* provides access to publicly exposed message conferences and areas over either **secure** NNTPS (NNTP over TLS or nttps://) and/or non-secure NNTP (nntp://). ## Configuration + | Item | Required | Description | |------|----------|-------------| | `nntp` | :-1: | Configuration block for non-secure NNTP. See Non-Secure NNTP Configuration below. | From 8aa878a3ee1fa85cf509a276ad390150570865c6 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Sat, 21 Nov 2020 14:56:03 -0700 Subject: [PATCH 16/16] Fix TIC replace bug --- core/scanner_tossers/ftn_bso.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/scanner_tossers/ftn_bso.js b/core/scanner_tossers/ftn_bso.js index 99a537ec..2bb2df46 100644 --- a/core/scanner_tossers/ftn_bso.js +++ b/core/scanner_tossers/ftn_bso.js @@ -1879,6 +1879,8 @@ function FTNMessageScanTossModule() { localInfo.fileEntry.fileName = paths.basename(finalPath); } + localInfo.newPath = dst; + localInfo.fileEntry.persist(isUpdate, err => { return callback(err, localInfo); }); @@ -1893,6 +1895,12 @@ function FTNMessageScanTossModule() { const oldStorageDir = getAreaStorageDirectoryByTag(localInfo.oldStorageTag); const oldPath = paths.join(oldStorageDir, localInfo.oldFileName); + // if we updated a file in place, don't delete it! + if (localInfo.newPath === oldPath) { + Log.trace({path : oldPath}, 'TIC file replaced in place. Nothing to remove.'); + return callback(null, localInfo); + } + fs.unlink(oldPath, err => { if(err) { Log.warn( { error : err.message, oldPath : oldPath }, 'Failed removing old physical file during TIC replacement');