From 1d5eff236502bfa2e9b772a3a7f2d6a15b49aad7 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Fri, 13 Jan 2023 18:38:12 +0000 Subject: [PATCH 01/14] chore: incrementing version number - v2.8.2 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index e99a25ec6a..1af9a00cf6 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "2.8.1", + "version": "2.8.2", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From 66aa31698fdb6b085a8e73a5e26a2e69b2afa736 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Fri, 13 Jan 2023 18:38:13 +0000 Subject: [PATCH 02/14] chore: update changelog for v2.8.2 --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89a9b5fe38..c355cf905b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,35 @@ +#### v2.8.2 (2023-01-13) + +##### Chores + +* incrementing version number - v2.8.1 (727f879e) +* update changelog for v2.8.1 (d17d4ec0) +* incrementing version number - v2.8.0 (8e77673d) +* incrementing version number - v2.7.0 (96cc0617) +* incrementing version number - v2.6.1 (7e52a7a5) +* incrementing version number - v2.6.0 (e7fcf482) +* incrementing version number - v2.5.8 (dec0e7de) +* incrementing version number - v2.5.7 (5836bf4a) +* incrementing version number - v2.5.6 (c7bd7dbf) +* incrementing version number - v2.5.5 (3509ed94) +* incrementing version number - v2.5.4 (e83260ca) +* incrementing version number - v2.5.3 (7e922936) +* incrementing version number - v2.5.2 (babcd17e) +* incrementing version number - v2.5.1 (ce3aa950) +* incrementing version number - v2.5.0 (01d276cb) +* incrementing version number - v2.4.5 (dd3e1a28) +* incrementing version number - v2.4.4 (d5525c87) +* incrementing version number - v2.4.3 (9c647c6c) +* incrementing version number - v2.4.2 (3aa7b855) +* incrementing version number - v2.4.1 (60cbd148) +* incrementing version number - v2.4.0 (4834cde3) +* incrementing version number - v2.3.1 (d2425942) +* incrementing version number - v2.3.0 (046ea120) + +##### Bug Fixes + +* move call to `filter:middleware.buildHeader` out of parallel so that req can be overridden by plugins prior to loading config (25ae58e8) + #### v2.8.1 (2022-12-30) ##### Chores From 48c9f4470fd6335b0e20b20a218cdbc7258bc2f5 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 13 Jan 2023 13:38:45 -0500 Subject: [PATCH 03/14] chore: remove extraneous lines from changelog --- CHANGELOG.md | 41 ----------------------------------------- 1 file changed, 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c355cf905b..db0d025621 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,27 +4,6 @@ * incrementing version number - v2.8.1 (727f879e) * update changelog for v2.8.1 (d17d4ec0) -* incrementing version number - v2.8.0 (8e77673d) -* incrementing version number - v2.7.0 (96cc0617) -* incrementing version number - v2.6.1 (7e52a7a5) -* incrementing version number - v2.6.0 (e7fcf482) -* incrementing version number - v2.5.8 (dec0e7de) -* incrementing version number - v2.5.7 (5836bf4a) -* incrementing version number - v2.5.6 (c7bd7dbf) -* incrementing version number - v2.5.5 (3509ed94) -* incrementing version number - v2.5.4 (e83260ca) -* incrementing version number - v2.5.3 (7e922936) -* incrementing version number - v2.5.2 (babcd17e) -* incrementing version number - v2.5.1 (ce3aa950) -* incrementing version number - v2.5.0 (01d276cb) -* incrementing version number - v2.4.5 (dd3e1a28) -* incrementing version number - v2.4.4 (d5525c87) -* incrementing version number - v2.4.3 (9c647c6c) -* incrementing version number - v2.4.2 (3aa7b855) -* incrementing version number - v2.4.1 (60cbd148) -* incrementing version number - v2.4.0 (4834cde3) -* incrementing version number - v2.3.1 (d2425942) -* incrementing version number - v2.3.0 (046ea120) ##### Bug Fixes @@ -38,26 +17,6 @@ * remove extraneous lines from changelog (bbaf26ce) * incrementing version number - v2.8.0 (8e77673d) * update changelog for v2.8.0 (a5c2edb9) -* incrementing version number - v2.7.0 (96cc0617) -* incrementing version number - v2.6.1 (7e52a7a5) -* incrementing version number - v2.6.0 (e7fcf482) -* incrementing version number - v2.5.8 (dec0e7de) -* incrementing version number - v2.5.7 (5836bf4a) -* incrementing version number - v2.5.6 (c7bd7dbf) -* incrementing version number - v2.5.5 (3509ed94) -* incrementing version number - v2.5.4 (e83260ca) -* incrementing version number - v2.5.3 (7e922936) -* incrementing version number - v2.5.2 (babcd17e) -* incrementing version number - v2.5.1 (ce3aa950) -* incrementing version number - v2.5.0 (01d276cb) -* incrementing version number - v2.4.5 (dd3e1a28) -* incrementing version number - v2.4.4 (d5525c87) -* incrementing version number - v2.4.3 (9c647c6c) -* incrementing version number - v2.4.2 (3aa7b855) -* incrementing version number - v2.4.1 (60cbd148) -* incrementing version number - v2.4.0 (4834cde3) -* incrementing version number - v2.3.1 (d2425942) -* incrementing version number - v2.3.0 (046ea120) ##### Bug Fixes From 747cb1f0a196920bed0d4a0f87ced7d87a065c62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 18 Jan 2023 09:40:00 -0500 Subject: [PATCH 04/14] fix: closes #11173, clear require cache if wrong dependency is installed --- src/cli/index.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/cli/index.js b/src/cli/index.js index 938f588701..5eb9f4924c 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -32,6 +32,12 @@ try { if (!semver.satisfies(version, defaultPackage.dependencies[packageName])) { const e = new TypeError(`Incorrect dependency version: ${packageName}`); e.code = 'DEP_WRONG_VERSION'; + // delete the module from require cache so it doesn't break rest of the upgrade + // https://github.com/NodeBB/NodeBB/issues/11173 + const resolvedModule = require.resolve(packageName); + if (require.cache[resolvedModule]) { + delete require.cache[resolvedModule]; + } throw e; } }; From 39e009c05af9be6be7d2c77ad9f1edce77e3a38e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 18 Jan 2023 14:47:10 -0500 Subject: [PATCH 05/14] fix: #11136, only show mods of active categories when getModeratorUids is called --- src/categories/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/categories/index.js b/src/categories/index.js index 5789c25e37..45ad28704a 100644 --- a/src/categories/index.js +++ b/src/categories/index.js @@ -99,6 +99,10 @@ Categories.getModerators = async function (cid) { }; Categories.getModeratorUids = async function (cids) { + // Only check active categories + const disabled = (await Categories.getCategoriesFields(cids, ['disabled'])).map(obj => obj.disabled); + cids = cids.filter((_, idx) => !disabled[idx]); + const groupNames = cids.reduce((memo, cid) => { memo.push(`cid:${cid}:privileges:moderate`); memo.push(`cid:${cid}:privileges:groups:moderate`); From 459bc52338ddf6ebb1448f60e155db470e13a64e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 18 Jan 2023 15:08:35 -0500 Subject: [PATCH 06/14] fix: #11136, tests, and returning the proper number of arrays --- src/categories/index.js | 13 +++++++++---- src/categories/update.js | 1 + test/categories.js | 31 ++++++++++++++++++++----------- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/categories/index.js b/src/categories/index.js index 45ad28704a..a95d862e77 100644 --- a/src/categories/index.js +++ b/src/categories/index.js @@ -101,7 +101,7 @@ Categories.getModerators = async function (cid) { Categories.getModeratorUids = async function (cids) { // Only check active categories const disabled = (await Categories.getCategoriesFields(cids, ['disabled'])).map(obj => obj.disabled); - cids = cids.filter((_, idx) => !disabled[idx]); + // cids = cids.filter((_, idx) => !disabled[idx]); const groupNames = cids.reduce((memo, cid) => { memo.push(`cid:${cid}:privileges:moderate`); @@ -124,9 +124,14 @@ Categories.getModeratorUids = async function (cids) { const uniqGroups = _.uniq(_.flatten(sets.groupNames)); const groupUids = await groups.getMembersOfGroups(uniqGroups); const map = _.zipObject(uniqGroups, groupUids); - const moderatorUids = cids.map( - (cid, index) => _.uniq(sets.uids[index].concat(_.flatten(sets.groupNames[index].map(g => map[g])))) - ); + const moderatorUids = cids.map((cid, index) => { + if (disabled[index]) { + return []; + } + + return _.uniq(sets.uids[index].concat(_.flatten(sets.groupNames[index].map(g => map[g])))); + }); + console.log('what', moderatorUids); return moderatorUids; }; diff --git a/src/categories/update.js b/src/categories/update.js index d4be83edb8..ec1c2edb1e 100644 --- a/src/categories/update.js +++ b/src/categories/update.js @@ -11,6 +11,7 @@ const cache = require('../cache'); module.exports = function (Categories) { Categories.update = async function (modified) { const cids = Object.keys(modified); + console.log('updating', cids); await Promise.all(cids.map(cid => updateCategory(cid, modified[cid]))); return cids; }; diff --git a/test/categories.js b/test/categories.js index cd28ee33ef..284d0a0696 100644 --- a/test/categories.js +++ b/test/categories.js @@ -826,17 +826,18 @@ describe('Categories', () => { }); }); - describe('Categories.getModeratorUids', () => { - before((done) => { - async.series([ - async.apply(groups.create, { name: 'testGroup' }), - async.apply(groups.join, 'cid:1:privileges:groups:moderate', 'testGroup'), - async.apply(groups.join, 'testGroup', 1), - ], done); + describe.only('Categories.getModeratorUids', () => { + let cid; + + before(async () => { + ({ cid } = await Categories.create({ name: 'foobar' })); + await groups.create({ name: 'testGroup' }); + await groups.join(`cid:${cid}:privileges:groups:moderate`, 'testGroup'); + await groups.join('testGroup', 1); }); it('should retrieve all users with moderator bit in category privilege', (done) => { - Categories.getModeratorUids([1, 2], (err, uids) => { + Categories.getModeratorUids([cid, 2], (err, uids) => { assert.ifError(err); assert.strictEqual(uids.length, 2); assert(uids[0].includes('1')); @@ -851,7 +852,7 @@ describe('Categories', () => { async.apply(groups.join, 'cid:1:privileges:groups:moderate', 'testGroup2'), async.apply(groups.join, 'testGroup2', 1), function (next) { - Categories.getModeratorUids([1, 2], (err, uids) => { + Categories.getModeratorUids([cid, 2], (err, uids) => { assert.ifError(err); assert(uids[0].includes('1')); next(); @@ -860,10 +861,18 @@ describe('Categories', () => { ], done); }); + it('should not return moderators of disabled categories', async () => { + const payload = {}; + payload[cid] = { disabled: 1 }; + await Categories.update(payload); + const uids = await Categories.getModeratorUids([1, 2]); + assert(!uids[0].includes('1')); + }); + after((done) => { async.series([ - async.apply(groups.leave, 'cid:1:privileges:groups:moderate', 'testGroup'), - async.apply(groups.leave, 'cid:1:privileges:groups:moderate', 'testGroup2'), + async.apply(groups.leave, `cid:${cid}:privileges:groups:moderate`, 'testGroup'), + async.apply(groups.leave, `cid:${cid}:privileges:groups:moderate`, 'testGroup2'), async.apply(groups.destroy, 'testGroup'), async.apply(groups.destroy, 'testGroup2'), ], done); From f295174e0772b5b18d052b4c0403694d61c98123 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sat, 21 Jan 2023 14:34:01 -0500 Subject: [PATCH 07/14] test: fix broken test --- src/categories/index.js | 1 - src/categories/update.js | 1 - test/categories.js | 4 ++-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/categories/index.js b/src/categories/index.js index a95d862e77..619f756642 100644 --- a/src/categories/index.js +++ b/src/categories/index.js @@ -131,7 +131,6 @@ Categories.getModeratorUids = async function (cids) { return _.uniq(sets.uids[index].concat(_.flatten(sets.groupNames[index].map(g => map[g])))); }); - console.log('what', moderatorUids); return moderatorUids; }; diff --git a/src/categories/update.js b/src/categories/update.js index ec1c2edb1e..d4be83edb8 100644 --- a/src/categories/update.js +++ b/src/categories/update.js @@ -11,7 +11,6 @@ const cache = require('../cache'); module.exports = function (Categories) { Categories.update = async function (modified) { const cids = Object.keys(modified); - console.log('updating', cids); await Promise.all(cids.map(cid => updateCategory(cid, modified[cid]))); return cids; }; diff --git a/test/categories.js b/test/categories.js index 284d0a0696..4a92929864 100644 --- a/test/categories.js +++ b/test/categories.js @@ -826,7 +826,7 @@ describe('Categories', () => { }); }); - describe.only('Categories.getModeratorUids', () => { + describe('Categories.getModeratorUids', () => { let cid; before(async () => { @@ -865,7 +865,7 @@ describe('Categories', () => { const payload = {}; payload[cid] = { disabled: 1 }; await Categories.update(payload); - const uids = await Categories.getModeratorUids([1, 2]); + const uids = await Categories.getModeratorUids([cid, 2]); assert(!uids[0].includes('1')); }); From 7d04e95226bf22f8db415be24ebf8f9352bd29c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 23 Jan 2023 11:09:19 -0500 Subject: [PATCH 08/14] fix: #11194, allow access to sub dashboard pages --- src/privileges/admin.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/privileges/admin.js b/src/privileges/admin.js index 5a733d30f4..166236ac76 100644 --- a/src/privileges/admin.js +++ b/src/privileges/admin.js @@ -66,6 +66,7 @@ privsAdmin.routeMap = { uploadDefaultAvatar: 'admin:settings', }; privsAdmin.routePrefixMap = { + 'dashboard/': 'admin:dashboard', 'manage/categories/': 'admin:categories', 'manage/privileges/': 'admin:privileges', 'manage/groups/': 'admin:groups', From 9c250b78b05ca2abf31a79971ed0c60ca07664ec Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 23 Jan 2023 11:27:57 -0500 Subject: [PATCH 09/14] fix(deps): pinning sub dependency json-schema-ref-parser to 9.0.9 ref: https://github.com/APIDevTools/json-schema-ref-parser/issues/298 --- install/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 1af9a00cf6..7dc6237452 100644 --- a/install/package.json +++ b/install/package.json @@ -167,7 +167,8 @@ "smtp-server": "3.11.0" }, "resolutions": { - "*/jquery": "3.6.3" + "*/jquery": "3.6.3", + "@apidevtools/json-schema-ref-parser": "9.0.9" }, "bugs": { "url": "https://github.com/NodeBB/NodeBB/issues" From 0bffd3d93cd8a6f286d3a796ec0448c38d57b526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 23 Jan 2023 11:40:17 -0500 Subject: [PATCH 10/14] fix: #11195, allow users with admin:users privilege to delete users in acp --- src/api/users.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/api/users.js b/src/api/users.js index c23f2c04d6..e0382c95cd 100644 --- a/src/api/users.js +++ b/src/api/users.js @@ -307,18 +307,17 @@ async function isPrivilegedOrSelfAndPasswordMatch(caller, data) { async function processDeletion({ uid, method, password, caller }) { const isTargetAdmin = await user.isAdministrator(uid); const isSelf = parseInt(uid, 10) === parseInt(caller.uid, 10); - const isAdmin = await user.isAdministrator(caller.uid); + const hasAdminPrivilege = await privileges.admin.can('admin:users', caller.uid); if (isSelf && meta.config.allowAccountDelete !== 1) { throw new Error('[[error:account-deletion-disabled]]'); - } else if (!isSelf && !isAdmin) { + } else if (!isSelf && !hasAdminPrivilege) { throw new Error('[[error:no-privileges]]'); } else if (isTargetAdmin) { throw new Error('[[error:cant-delete-admin]'); } // Privilege checks -- only deleteAccount is available for non-admins - const hasAdminPrivilege = await privileges.admin.can('admin:users', caller.uid); if (!hasAdminPrivilege && ['delete', 'deleteContent'].includes(method)) { throw new Error('[[error:no-privileges]]'); } From a788bd1344825ad4759e39d6e98d8bf3695bd639 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 23 Jan 2023 12:31:43 -0500 Subject: [PATCH 11/14] revert: 9c250b78b05ca2abf31a79971ed0c60ca07664ec, fix: comment out broken test for now --- install/package.json | 3 +-- test/api.js | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/install/package.json b/install/package.json index 7dc6237452..1af9a00cf6 100644 --- a/install/package.json +++ b/install/package.json @@ -167,8 +167,7 @@ "smtp-server": "3.11.0" }, "resolutions": { - "*/jquery": "3.6.3", - "@apidevtools/json-schema-ref-parser": "9.0.9" + "*/jquery": "3.6.3" }, "bugs": { "url": "https://github.com/NodeBB/NodeBB/issues" diff --git a/test/api.js b/test/api.js index cc13650770..53774304cf 100644 --- a/test/api.js +++ b/test/api.js @@ -228,14 +228,15 @@ describe('API', async () => { setup = true; } - it('should pass OpenAPI v3 validation', async () => { + // Test failing due to https://github.com/APIDevTools/json-schema-ref-parser/issues/298 + /* it('should pass OpenAPI v3 validation', async () => { try { await SwaggerParser.validate(readApiPath); await SwaggerParser.validate(writeApiPath); } catch (e) { assert.ifError(e); } - }); + }); */ readApi = await SwaggerParser.dereference(readApiPath); writeApi = await SwaggerParser.dereference(writeApiPath); From 00e48803a6f0f589621a37b228b139b7e3cec498 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 23 Jan 2023 15:11:08 -0500 Subject: [PATCH 12/14] fix(deps): downgrade swagger-parser to v9 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 1af9a00cf6..c2c63ced4b 100644 --- a/install/package.json +++ b/install/package.json @@ -148,7 +148,7 @@ "zxcvbn": "4.4.2" }, "devDependencies": { - "@apidevtools/swagger-parser": "10.0.3", + "@apidevtools/swagger-parser": "9.0.0", "@commitlint/cli": "17.3.0", "@commitlint/config-angular": "17.3.0", "coveralls": "3.1.1", From fecd84d1a01bf1d448128725c8980ce190d127eb Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 23 Jan 2023 15:19:24 -0500 Subject: [PATCH 13/14] revert: a788bd1344825ad4759e39d6e98d8bf3695bd639 --- test/api.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/api.js b/test/api.js index 53774304cf..cc13650770 100644 --- a/test/api.js +++ b/test/api.js @@ -228,15 +228,14 @@ describe('API', async () => { setup = true; } - // Test failing due to https://github.com/APIDevTools/json-schema-ref-parser/issues/298 - /* it('should pass OpenAPI v3 validation', async () => { + it('should pass OpenAPI v3 validation', async () => { try { await SwaggerParser.validate(readApiPath); await SwaggerParser.validate(writeApiPath); } catch (e) { assert.ifError(e); } - }); */ + }); readApi = await SwaggerParser.dereference(readApiPath); writeApi = await SwaggerParser.dereference(writeApiPath); From 89e059a0841f4265d16b28a99ebf847dd10fa055 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Tue, 24 Jan 2023 17:59:06 -0700 Subject: [PATCH 14/14] fix: import resolution within plugin modules (#11200) --- src/meta/js.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/meta/js.js b/src/meta/js.js index 454b682cc3..e7aab11509 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -40,14 +40,24 @@ async function linkModules() { await Promise.all(Object.keys(modules).map(async (relPath) => { const srcPath = path.join(__dirname, '../../', modules[relPath]); const destPath = path.join(__dirname, '../../build/public/src/modules', relPath); + const destDir = path.dirname(destPath); + const [stats] = await Promise.all([ fs.promises.stat(srcPath), - mkdirp(path.dirname(destPath)), + mkdirp(destDir), ]); + if (stats.isDirectory()) { await file.linkDirs(srcPath, destPath, true); } else { - await fs.promises.copyFile(srcPath, destPath); + // Get the relative path to the destination directory + const relPath = path.relative(destDir, srcPath) + // and convert to a posix path + .split(path.sep).join(path.posix.sep); + + // Instead of copying file, create a new file re-exporting it + // This way, imports in modules are resolved correctly + await fs.promises.writeFile(destPath, `export * from '${relPath}'`); } })); }