From 35d67ad33e7753d5c8f292ffd817c5094ee35571 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 13:48:59 -0500 Subject: [PATCH 01/14] fix(deps): update dependency autoprefixer to v10.4.13 (#11020) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index e5962ed205..c04b35e27f 100644 --- a/install/package.json +++ b/install/package.json @@ -33,7 +33,7 @@ "ace-builds": "1.12.3", "archiver": "5.3.1", "async": "3.2.4", - "autoprefixer": "10.4.12", + "autoprefixer": "10.4.13", "bcryptjs": "2.4.3", "benchpressjs": "2.4.3", "body-parser": "1.20.1", From 9ca2482a555dd45391a062a0275a6584adf56e72 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 13:49:28 -0500 Subject: [PATCH 02/14] fix(deps): update dependency mongodb to v4.11.0 (#10994) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(deps): update dependency mongodb to v4.11.0 * up composer Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Barış Soner Uşaklı --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c04b35e27f..2dba6ddb19 100644 --- a/install/package.json +++ b/install/package.json @@ -83,7 +83,7 @@ "material-design-lite": "1.3.0", "mime": "3.0.0", "mkdirp": "1.0.4", - "mongodb": "4.10.0", + "mongodb": "4.11.0", "morgan": "1.10.0", "mousetrap": "1.6.5", "multiparty": "4.2.3", From de507f72eade8b8d828c027a7f598dc8a37ce5d6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 13:49:37 -0500 Subject: [PATCH 03/14] fix(deps): update dependency ace-builds to v1.12.5 (#11019) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 2dba6ddb19..e43693df7c 100644 --- a/install/package.json +++ b/install/package.json @@ -30,7 +30,7 @@ "dependencies": { "@adactive/bootstrap-tagsinput": "0.8.2", "@isaacs/ttlcache": "1.2.1", - "ace-builds": "1.12.3", + "ace-builds": "1.12.5", "archiver": "5.3.1", "async": "3.2.4", "autoprefixer": "10.4.13", From e144debb7f3fa247b364a8d63c105fb8600c8374 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 16:01:03 -0500 Subject: [PATCH 04/14] fix(deps): update dependency ioredis to v5.2.4 (#11022) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index e43693df7c..38bc7ff113 100644 --- a/install/package.json +++ b/install/package.json @@ -114,7 +114,7 @@ "postcss-clean": "1.2.0", "progress-webpack-plugin": "1.0.16", "prompt": "1.3.0", - "ioredis": "5.2.3", + "ioredis": "5.2.4", "request": "2.88.2", "request-promise-native": "1.0.9", "rimraf": "3.0.2", From c4a1905b83f32576f909d33913c56dd089ac5728 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 16:01:14 -0500 Subject: [PATCH 05/14] fix(deps): update dependency esbuild to v0.15.13 (#11021) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 38bc7ff113..06626bbe9c 100644 --- a/install/package.json +++ b/install/package.json @@ -58,7 +58,7 @@ "csurf": "1.11.0", "daemon": "1.1.0", "diff": "5.1.0", - "esbuild": "0.15.12", + "esbuild": "0.15.13", "express": "4.18.2", "express-session": "1.17.3", "express-useragent": "1.0.15", From 4b3978beda58714621cf1dcf9098d07bbd906625 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 16:01:26 -0500 Subject: [PATCH 06/14] chore(deps): update dependency husky to v8.0.2 (#11018) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 06626bbe9c..cdb09db43d 100644 --- a/install/package.json +++ b/install/package.json @@ -157,7 +157,7 @@ "eslint-plugin-import": "2.26.0", "grunt": "1.5.3", "grunt-contrib-watch": "1.1.0", - "husky": "8.0.1", + "husky": "8.0.2", "jsdom": "20.0.2", "lint-staged": "13.0.3", "mocha": "10.1.0", From 51919f7abffa69ef059e6faa9a6c7a3746c1ebde Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 18:08:56 -0500 Subject: [PATCH 07/14] fix(deps): update dependency sharp to v0.31.2 (#11024) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index cdb09db43d..82c0fcaf8d 100644 --- a/install/package.json +++ b/install/package.json @@ -122,7 +122,7 @@ "sanitize-html": "2.7.3", "semver": "7.3.8", "serve-favicon": "2.5.0", - "sharp": "0.31.1", + "sharp": "0.31.2", "sitemap": "7.1.1", "slideout": "1.0.1", "socket.io": "4.5.3", From 1ea2a32b0ffa1c57eb752798a9d9c95ebfb45f34 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 18:09:25 -0500 Subject: [PATCH 08/14] fix(deps): update dependency lru-cache to v7.14.1 (#11023) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 82c0fcaf8d..ac5e960b75 100644 --- a/install/package.json +++ b/install/package.json @@ -79,7 +79,7 @@ "less": "4.1.3", "lodash": "4.17.21", "logrotate-stream": "0.2.8", - "lru-cache": "7.14.0", + "lru-cache": "7.14.1", "material-design-lite": "1.3.0", "mime": "3.0.0", "mkdirp": "1.0.4", From 8d3907b53a9bc34508cb0c896f56bf5f660b1890 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 18:41:49 -0500 Subject: [PATCH 09/14] fix(deps): update dependency yargs to v17.6.2 (#11025) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index ac5e960b75..fcfde34109 100644 --- a/install/package.json +++ b/install/package.json @@ -144,7 +144,7 @@ "winston": "3.8.2", "xml": "1.0.1", "xregexp": "5.1.1", - "yargs": "17.6.0", + "yargs": "17.6.2", "zxcvbn": "4.4.2" }, "devDependencies": { From 26be289e80e73880f4bbe16241edbf7adeaa2931 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 18:42:04 -0500 Subject: [PATCH 10/14] chore(deps): update commitlint monorepo to v17.2.0 (#11026) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index fcfde34109..fb4de09e44 100644 --- a/install/package.json +++ b/install/package.json @@ -149,8 +149,8 @@ }, "devDependencies": { "@apidevtools/swagger-parser": "10.0.3", - "@commitlint/cli": "17.1.2", - "@commitlint/config-angular": "17.1.0", + "@commitlint/cli": "17.2.0", + "@commitlint/config-angular": "17.2.0", "coveralls": "3.1.1", "eslint": "8.27.0", "eslint-config-nodebb": "0.1.1", From 40c9cc053e202c8ef8891194a8dd1d75ce803a99 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 18:42:14 -0500 Subject: [PATCH 11/14] fix(deps): update dependency webpack to v5.75.0 (#11027) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index fb4de09e44..0640c16ad1 100644 --- a/install/package.json +++ b/install/package.json @@ -139,7 +139,7 @@ "toobusy-js": "0.5.1", "uglify-es": "3.3.9", "validator": "13.7.0", - "webpack": "5.74.0", + "webpack": "5.75.0", "webpack-merge": "5.8.0", "winston": "3.8.2", "xml": "1.0.1", From 313d0c3270edaf4ad879aed9cb9bb32c3640cf74 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 11 Nov 2022 09:40:10 -0500 Subject: [PATCH 12/14] fix(deps): update dependency ace-builds to v1.13.0 (#11031) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 0640c16ad1..3251f1d543 100644 --- a/install/package.json +++ b/install/package.json @@ -30,7 +30,7 @@ "dependencies": { "@adactive/bootstrap-tagsinput": "0.8.2", "@isaacs/ttlcache": "1.2.1", - "ace-builds": "1.12.5", + "ace-builds": "1.13.0", "archiver": "5.3.1", "async": "3.2.4", "autoprefixer": "10.4.13", From b94bb1bf93390e5204551bfc647049c6f8c5a60d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 11 Nov 2022 09:40:22 -0500 Subject: [PATCH 13/14] fix(deps): update dependency postcss to v8.4.19 (#11028) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 3251f1d543..84e8cfd868 100644 --- a/install/package.json +++ b/install/package.json @@ -110,7 +110,7 @@ "passport-local": "1.0.0", "pg": "8.8.0", "pg-cursor": "2.7.4", - "postcss": "8.4.18", + "postcss": "8.4.19", "postcss-clean": "1.2.0", "progress-webpack-plugin": "1.0.16", "prompt": "1.3.0", From 3c85b944e30a0ba8b3ec9e1f441c74f383625a15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 11 Nov 2022 16:23:00 -0500 Subject: [PATCH 14/14] feat: allow groups to be exempt from maintenance mode closes #11030 --- install/data/defaults.json | 1 + public/language/en-GB/admin/settings/advanced.json | 1 + src/controllers/admin/settings.js | 7 +++++++ src/groups/update.js | 10 +++++++++- src/middleware/maintenance.js | 9 +++++++-- src/routes/admin.js | 1 + src/views/admin/settings/advanced.tpl | 8 ++++++++ test/controllers.js | 12 ++++++++++++ 8 files changed, 46 insertions(+), 3 deletions(-) diff --git a/install/data/defaults.json b/install/data/defaults.json index 130e72fd5a..e7bf3f65f4 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -25,6 +25,7 @@ "postQueue": 0, "postQueueReputationThreshold": 0, "groupsExemptFromPostQueue": ["administrators", "Global Moderators"], + "groupsExemptFromMaintenanceMode": ["administrators", "Global Moderators"], "minimumPostLength": 8, "maximumPostLength": 32767, "systemTags": "", diff --git a/public/language/en-GB/admin/settings/advanced.json b/public/language/en-GB/admin/settings/advanced.json index e372d48d70..1bf35d7370 100644 --- a/public/language/en-GB/admin/settings/advanced.json +++ b/public/language/en-GB/admin/settings/advanced.json @@ -3,6 +3,7 @@ "maintenance-mode.help": "When the forum is in maintenance mode, all requests will be redirected to a static holding page. Administrators are exempt from this redirection, and are able to access the site normally.", "maintenance-mode.status": "Maintenance Mode Status Code", "maintenance-mode.message": "Maintenance Message", + "maintenance-mode.groups-exempt-from-maintenance-mode": "Select groups that should be exempt from maintenance mode", "headers": "Headers", "headers.allow-from": "Set ALLOW-FROM to Place NodeBB in an iFrame", "headers.csp-frame-ancestors": "Set Content-Security-Policy frame-ancestors header to Place NodeBB in an iFrame", diff --git a/src/controllers/admin/settings.js b/src/controllers/admin/settings.js index 719f6e206a..ca0765cc02 100644 --- a/src/controllers/admin/settings.js +++ b/src/controllers/admin/settings.js @@ -48,6 +48,13 @@ settingsController.post = async (req, res) => { }); }; +settingsController.advanced = async (req, res) => { + const groupData = await groups.getNonPrivilegeGroups('groups:createtime', 0, -1); + res.render('admin/settings/advanced', { + groupsExemptFromMaintenanceMode: groupData, + }); +}; + settingsController.languages = async function (req, res) { const languageData = await languages.list(); languageData.forEach((language) => { diff --git a/src/groups/update.js b/src/groups/update.js index 24f4b53797..56b541df27 100644 --- a/src/groups/update.js +++ b/src/groups/update.js @@ -274,8 +274,16 @@ module.exports = function (Groups) { async function updateConfig(oldName, newName) { if (meta.config.groupsExemptFromPostQueue.includes(oldName)) { - meta.config.groupsExemptFromPostQueue.splice(meta.config.groupsExemptFromPostQueue.indexOf(oldName), 1, newName); + meta.config.groupsExemptFromPostQueue.splice( + meta.config.groupsExemptFromPostQueue.indexOf(oldName), 1, newName + ); await meta.configs.set('groupsExemptFromPostQueue', meta.config.groupsExemptFromPostQueue); } + if (meta.config.groupsExemptFromMaintenanceMode.includes(oldName)) { + meta.config.groupsExemptFromMaintenanceMode.splice( + meta.config.groupsExemptFromMaintenanceMode.indexOf(oldName), 1, newName + ); + await meta.configs.set('groupsExemptFromMaintenanceMode', meta.config.groupsExemptFromMaintenanceMode); + } } }; diff --git a/src/middleware/maintenance.js b/src/middleware/maintenance.js index 46fb05dcae..2e56fff8b6 100644 --- a/src/middleware/maintenance.js +++ b/src/middleware/maintenance.js @@ -4,6 +4,7 @@ const util = require('util'); const nconf = require('nconf'); const meta = require('../meta'); const user = require('../user'); +const groups = require('../groups'); const helpers = require('./helpers'); module.exports = function (middleware) { @@ -20,8 +21,12 @@ module.exports = function (middleware) { return next(); } - const isAdmin = await user.isAdministrator(req.uid); - if (isAdmin) { + const [isAdmin, isMemberOfExempt] = await Promise.all([ + user.isAdministrator(req.uid), + groups.isMemberOfAny(req.uid, meta.config.groupsExemptFromMaintenanceMode), + ]); + + if (isAdmin || isMemberOfExempt) { return next(); } diff --git a/src/routes/admin.js b/src/routes/admin.js index 3134e8d9ae..aac0e5dfb0 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -34,6 +34,7 @@ module.exports = function (app, name, middleware, controllers) { helpers.setupAdminPageRoute(app, `/${name}/settings/email`, middlewares, controllers.admin.settings.email); helpers.setupAdminPageRoute(app, `/${name}/settings/user`, middlewares, controllers.admin.settings.user); helpers.setupAdminPageRoute(app, `/${name}/settings/post`, middlewares, controllers.admin.settings.post); + helpers.setupAdminPageRoute(app, `/${name}/settings/advanced`, middlewares, controllers.admin.settings.advanced); helpers.setupAdminPageRoute(app, `/${name}/settings/languages`, middlewares, controllers.admin.settings.languages); helpers.setupAdminPageRoute(app, `/${name}/settings/navigation`, middlewares, controllers.admin.settings.navigation); helpers.setupAdminPageRoute(app, `/${name}/settings/homepage`, middlewares, controllers.admin.settings.homepage); diff --git a/src/views/admin/settings/advanced.tpl b/src/views/admin/settings/advanced.tpl index ae8f6e5c4d..83d010ad63 100644 --- a/src/views/admin/settings/advanced.tpl +++ b/src/views/admin/settings/advanced.tpl @@ -21,6 +21,14 @@ +
+ + +
diff --git a/test/controllers.js b/test/controllers.js index f255380446..cf557a30d2 100644 --- a/test/controllers.js +++ b/test/controllers.js @@ -1233,6 +1233,18 @@ describe('Controllers', () => { done(); }); }); + + it('should return 200 if guests are allowed', (done) => { + const oldValue = meta.config.groupsExemptFromMaintenanceMode; + meta.config.groupsExemptFromMaintenanceMode.push('guests'); + request(`${nconf.get('url')}/api/recent`, { json: true }, (err, res, body) => { + assert.ifError(err); + assert.strictEqual(res.statusCode, 200); + assert(body); + meta.config.groupsExemptFromMaintenanceMode = oldValue; + done(); + }); + }); }); describe('account pages', () => {