From f5a59991fcc02b31f737c63d07e9a8972c08ba27 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Thu, 9 Mar 2023 14:58:28 +0000 Subject: [PATCH 01/11] chore: incrementing version number - v2.8.8 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index f2788e81ea..6199aa636f 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.7", + "version": "2.8.8", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From c03d5db71e8ec923d28148d7088f81c3ebefcee2 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Thu, 9 Mar 2023 14:58:28 +0000 Subject: [PATCH 02/11] chore: update changelog for v2.8.8 --- CHANGELOG.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f43dc36832..f08bfe346a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,45 @@ +#### v2.8.8 (2023-03-09) + +##### Chores + +* incrementing version number - v2.8.7 (3f8248d6) +* update changelog for v2.8.7 (2ca38e7b) +* incrementing version number - v2.8.6 (af6ce447) +* incrementing version number - v2.8.5 (bff5ce2d) +* incrementing version number - v2.8.4 (a46b2bbc) +* incrementing version number - v2.8.3 (c20b20a7) +* incrementing version number - v2.8.2 (050e43f8) +* incrementing version number - v2.8.1 (727f879e) +* 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 + +* stop topic navigation hotkeys from firing if in a mousetrap-enabled form element (22fc8fe3) +* stop topic navigation hotkeys from firing if in a mousetrap-enabled form element (17d0b40e) +* tag filtering when changing filter to watched topics (1545223e) +* get cid from pid instead of passing in (f054a4f4) +* closes #11331, allow 0 length content if set to 0 in acp (8c762d32) + #### v2.8.7 (2023-03-01) ##### Chores From 56427e4f9d24fd2d3934fed1dba79167a573db3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 10 Mar 2023 11:40:02 -0500 Subject: [PATCH 03/11] fix: closes #11343, don't crash if tags array is empty --- src/database/mongo/sorted/union.js | 2 +- src/database/postgres/sorted/union.js | 3 +++ src/topics/tags.js | 2 +- test/database/sorted.js | 5 +++++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/database/mongo/sorted/union.js b/src/database/mongo/sorted/union.js index ea4ad4d8e1..f518fab79f 100644 --- a/src/database/mongo/sorted/union.js +++ b/src/database/mongo/sorted/union.js @@ -26,7 +26,7 @@ module.exports = function (module) { async function getSortedSetUnion(params) { if (!Array.isArray(params.sets) || !params.sets.length) { - return; + return []; } let limit = params.stop - params.start + 1; if (limit <= 0) { diff --git a/src/database/postgres/sorted/union.js b/src/database/postgres/sorted/union.js index a8fcbd0d0d..9d671ceb0f 100644 --- a/src/database/postgres/sorted/union.js +++ b/src/database/postgres/sorted/union.js @@ -32,6 +32,9 @@ SELECT COUNT(DISTINCT z."value") c async function getSortedSetUnion(params) { const { sets } = params; + if (!sets || !sets.length) { + return []; + } const start = params.hasOwnProperty('start') ? params.start : 0; const stop = params.hasOwnProperty('stop') ? params.stop : -1; let weights = params.weights || []; diff --git a/src/topics/tags.js b/src/topics/tags.js index 655c18345f..314b5cfd84 100644 --- a/src/topics/tags.js +++ b/src/topics/tags.js @@ -287,7 +287,7 @@ module.exports = function (Topics) { } Topics.getTagData = async function (tags) { - if (!tags.length) { + if (!tags || !tags.length) { return []; } tags.forEach((tag) => { diff --git a/test/database/sorted.js b/test/database/sorted.js index 842b91b146..a5262a5394 100644 --- a/test/database/sorted.js +++ b/test/database/sorted.js @@ -996,6 +996,11 @@ describe('Sorted Set methods', () => { done(); }); }); + + it('should return empty array if sets is empty', async () => { + const result = await db.getSortedSetRevUnion({ sets: [], start: 0, stop: -1 }); + assert.deepStrictEqual(result, []); + }); }); describe('sortedSetIncrBy()', () => { From cfd5027245b3c4feff96a72bf839811fffc7c2ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 11 Mar 2023 16:07:02 -0500 Subject: [PATCH 04/11] fix: closes #11352, try/catch rss feeds --- src/routes/feeds.js | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/routes/feeds.js b/src/routes/feeds.js index e82b344d67..c4a1c2d9f2 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -9,11 +9,12 @@ const topics = require('../topics'); const user = require('../user'); const categories = require('../categories'); const meta = require('../meta'); -const helpers = require('../controllers/helpers'); +const controllerHelpers = require('../controllers/helpers'); const privileges = require('../privileges'); const db = require('../database'); const utils = require('../utils'); const controllers404 = require('../controllers/404'); +const routeHelpers = require('./helpers'); const terms = { daily: 'day', @@ -23,18 +24,18 @@ const terms = { }; module.exports = function (app, middleware) { - app.get('/topic/:topic_id.rss', middleware.maintenanceMode, generateForTopic); - app.get('/category/:category_id.rss', middleware.maintenanceMode, generateForCategory); - app.get('/topics.rss', middleware.maintenanceMode, generateForTopics); - app.get('/recent.rss', middleware.maintenanceMode, generateForRecent); - app.get('/top.rss', middleware.maintenanceMode, generateForTop); - app.get('/top/:term.rss', middleware.maintenanceMode, generateForTop); - app.get('/popular.rss', middleware.maintenanceMode, generateForPopular); - app.get('/popular/:term.rss', middleware.maintenanceMode, generateForPopular); - app.get('/recentposts.rss', middleware.maintenanceMode, generateForRecentPosts); - app.get('/category/:category_id/recentposts.rss', middleware.maintenanceMode, generateForCategoryRecentPosts); - app.get('/user/:userslug/topics.rss', middleware.maintenanceMode, generateForUserTopics); - app.get('/tags/:tag.rss', middleware.maintenanceMode, generateForTag); + app.get('/topic/:topic_id.rss', middleware.maintenanceMode, routeHelpers.tryRoute(generateForTopic)); + app.get('/category/:category_id.rss', middleware.maintenanceMode, routeHelpers.tryRoute(generateForCategory)); + app.get('/topics.rss', middleware.maintenanceMode, routeHelpers.tryRoute(generateForTopics)); + app.get('/recent.rss', middleware.maintenanceMode, routeHelpers.tryRoute(generateForRecent)); + app.get('/top.rss', middleware.maintenanceMode, routeHelpers.tryRoute(generateForTop)); + app.get('/top/:term.rss', middleware.maintenanceMode, routeHelpers.tryRoute(generateForTop)); + app.get('/popular.rss', middleware.maintenanceMode, routeHelpers.tryRoute(generateForPopular)); + app.get('/popular/:term.rss', middleware.maintenanceMode, routeHelpers.tryRoute(generateForPopular)); + app.get('/recentposts.rss', middleware.maintenanceMode, routeHelpers.tryRoute(generateForRecentPosts)); + app.get('/category/:category_id/recentposts.rss', middleware.maintenanceMode, routeHelpers.tryRoute(generateForCategoryRecentPosts)); + app.get('/user/:userslug/topics.rss', middleware.maintenanceMode, routeHelpers.tryRoute(generateForUserTopics)); + app.get('/tags/:tag.rss', middleware.maintenanceMode, routeHelpers.tryRoute(generateForTag)); }; async function validateTokenIfRequiresLogin(requiresLogin, cid, req, res) { @@ -46,16 +47,16 @@ async function validateTokenIfRequiresLogin(requiresLogin, cid, req, res) { } if (uid <= 0 || !token) { - return helpers.notAllowed(req, res); + return controllerHelpers.notAllowed(req, res); } const userToken = await db.getObjectField(`user:${uid}`, 'rss_token'); if (userToken !== token) { await user.auth.logAttempt(uid, req.ip); - return helpers.notAllowed(req, res); + return controllerHelpers.notAllowed(req, res); } const userPrivileges = await privileges.categories.get(cid, uid); if (!userPrivileges.read) { - return helpers.notAllowed(req, res); + return controllerHelpers.notAllowed(req, res); } return true; } @@ -230,7 +231,7 @@ async function generateSorted(options, req, res, next) { const { cid } = req.query; if (cid) { if (!await privileges.categories.can('topics:read', cid, uid)) { - return helpers.notAllowed(req, res); + return controllerHelpers.notAllowed(req, res); } params.cids = [cid]; } From a3a38e4ba3b14354d9168f1dfef16191fd7c900b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 14 Mar 2023 14:30:46 -0400 Subject: [PATCH 05/11] fix: #11357 clear cache on thumb remove --- src/topics/thumbs.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/topics/thumbs.js b/src/topics/thumbs.js index f2bacf74d3..f6f6a88400 100644 --- a/src/topics/thumbs.js +++ b/src/topics/thumbs.js @@ -151,6 +151,9 @@ Thumbs.delete = async function (id, relativePaths) { Promise.all(toRemove.map(async relativePath => posts.uploads.dissociate(mainPid, relativePath.slice(1)))), ]); } + if (toRemove.length) { + cache.del(set); + } }; Thumbs.deleteAll = async (id) => { From 767c1d1faf0dfd8204c0701cc6823678b1774678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 14 Mar 2023 15:09:12 -0400 Subject: [PATCH 06/11] fix: thumb remove on windows, closes #11357 --- src/topics/thumbs.js | 1 + src/views/modals/topic-thumbs.tpl | 2 +- test/topics/thumbs.js | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/topics/thumbs.js b/src/topics/thumbs.js index f6f6a88400..60db184339 100644 --- a/src/topics/thumbs.js +++ b/src/topics/thumbs.js @@ -52,6 +52,7 @@ Thumbs.get = async function (tids) { const name = path.basename(thumb); return hasTimestampPrefix.test(name) ? name.slice(14) : name; })(), + path: thumb, url: thumb.startsWith('http') ? thumb : path.posix.join(upload_url, thumb), }))); diff --git a/src/views/modals/topic-thumbs.tpl b/src/views/modals/topic-thumbs.tpl index e7ecd24e13..1329cf7c95 100644 --- a/src/views/modals/topic-thumbs.tpl +++ b/src/views/modals/topic-thumbs.tpl @@ -3,7 +3,7 @@
[[modules:thumbs.modal.no-thumbs]]
{{{ end }}} {{{ each thumbs }}} -
+
diff --git a/test/topics/thumbs.js b/test/topics/thumbs.js index 8486947b76..272d5cac32 100644 --- a/test/topics/thumbs.js +++ b/test/topics/thumbs.js @@ -82,6 +82,7 @@ describe('Topic thumbs', () => { assert.deepStrictEqual(thumbs, [{ id: topicObj.topicData.tid, name: 'test.png', + path: `${relativeThumbPaths[0]}`, url: `${nconf.get('relative_path')}${nconf.get('upload_url')}${relativeThumbPaths[0]}`, }]); }); @@ -92,6 +93,7 @@ describe('Topic thumbs', () => { [{ id: topicObj.topicData.tid, name: 'test.png', + path: `${relativeThumbPaths[0]}`, url: `${nconf.get('relative_path')}${nconf.get('upload_url')}${relativeThumbPaths[0]}`, }], [], @@ -200,16 +202,19 @@ describe('Topic thumbs', () => { { id: tid, name: 'test.png', + path: relativeThumbPaths[0], url: `${nconf.get('relative_path')}${nconf.get('upload_url')}${relativeThumbPaths[0]}`, }, { id: tid, name: 'example.org', + path: 'https://example.org', url: 'https://example.org', }, { id: tid, name: 'test2.png', + path: relativeThumbPaths[1], url: `${nconf.get('relative_path')}${nconf.get('upload_url')}${relativeThumbPaths[1]}`, }, ]); From 9e685e657a4147925fd0034e74f3f2f1e556f9af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 15 Mar 2023 15:18:05 -0400 Subject: [PATCH 07/11] test: openapi for thumbs --- public/openapi/components/schemas/TopicObject.yaml | 3 +++ public/openapi/write/topics/tid/thumbs.yaml | 4 ++++ public/openapi/write/topics/tid/thumbs/order.yaml | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/public/openapi/components/schemas/TopicObject.yaml b/public/openapi/components/schemas/TopicObject.yaml index 64de19aeb8..ad337379f7 100644 --- a/public/openapi/components/schemas/TopicObject.yaml +++ b/public/openapi/components/schemas/TopicObject.yaml @@ -265,6 +265,9 @@ TopicObjectSlim: name: type: string description: The topic thumbnail filename + path: + type: string + description: Path to topic thumbnail without upload_url prefix url: type: string description: Relative path to the topic thumbnail diff --git a/public/openapi/write/topics/tid/thumbs.yaml b/public/openapi/write/topics/tid/thumbs.yaml index a51858aeb3..075bc29ed2 100644 --- a/public/openapi/write/topics/tid/thumbs.yaml +++ b/public/openapi/write/topics/tid/thumbs.yaml @@ -31,6 +31,8 @@ get: type: string name: type: string + path: + type: string url: type: string description: Path to a topic thumbnail @@ -155,6 +157,8 @@ delete: type: string name: type: string + path: + type: string url: type: string description: Path to a topic thumbnail \ No newline at end of file diff --git a/public/openapi/write/topics/tid/thumbs/order.yaml b/public/openapi/write/topics/tid/thumbs/order.yaml index 8e9a12fef1..2fac638a23 100644 --- a/public/openapi/write/topics/tid/thumbs/order.yaml +++ b/public/openapi/write/topics/tid/thumbs/order.yaml @@ -38,4 +38,4 @@ put: $ref: ../../../../components/schemas/Status.yaml#/Status response: type: object - properties: {} \ No newline at end of file + properties: {} From 4b94c033c446eeecb9f2e9989269fd691d9c726e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=E1=BA=A1m=20T=E1=BA=A5n=20Minh=20Ti=E1=BA=BFn?= Date: Sun, 12 Mar 2023 16:41:11 +0700 Subject: [PATCH 08/11] wrap quotes to prevent stripping leading 0 --- src/user/admin.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/user/admin.js b/src/user/admin.js index c92035fc47..17dcd318e5 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -70,7 +70,12 @@ module.exports = function (User) { let line = ''; usersData.forEach((user, index) => { - line += `${fields.map(field => user[field]).join(',')}`; + line += `${fields.map(field => { + if ( /^\d+$/.test(user[field])) { + return `'${user[field]}'`; + } + return user[field] + }).join(',')}`; if (showIps) { userIPs = ips[index] ? ips[index].join(',') : ''; line += `,"${userIPs}"\n`; From 9ed6961af83fa02a7de18bf8061a87dde33dd4fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=E1=BA=A1m=20T=E1=BA=A5n=20Minh=20Ti=E1=BA=BFn?= Date: Tue, 14 Mar 2023 03:56:15 +0700 Subject: [PATCH 09/11] fix lint --- src/user/admin.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/user/admin.js b/src/user/admin.js index 17dcd318e5..a4377f4d65 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -70,12 +70,11 @@ module.exports = function (User) { let line = ''; usersData.forEach((user, index) => { - line += `${fields.map(field => { - if ( /^\d+$/.test(user[field])) { - return `'${user[field]}'`; - } - return user[field] - }).join(',')}`; + line += `${fields + .map((field) => + isFinite(user[field]) ? `'${user[field]}'` : user[field] + ) + .join(",")}`; if (showIps) { userIPs = ips[index] ? ips[index].join(',') : ''; line += `,"${userIPs}"\n`; From 93aa43f7172439c04426b638beff307b7e7f53b5 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 17 Mar 2023 15:32:23 -0400 Subject: [PATCH 10/11] style: more fixes --- src/user/admin.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/user/admin.js b/src/user/admin.js index a4377f4d65..b29adcf86f 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -71,10 +71,8 @@ module.exports = function (User) { let line = ''; usersData.forEach((user, index) => { line += `${fields - .map((field) => - isFinite(user[field]) ? `'${user[field]}'` : user[field] - ) - .join(",")}`; + .map(field => (isFinite(user[field]) ? `'${user[field]}'` : user[field])) + .join(',')}`; if (showIps) { userIPs = ips[index] ? ips[index].join(',') : ''; line += `,"${userIPs}"\n`; From 73a50d17180dcd6cb42ef9cf305a480f92b4af05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 19 Mar 2023 12:21:06 -0400 Subject: [PATCH 11/11] chore: up cron --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index 6199aa636f..416bd6e08a 100644 --- a/install/package.json +++ b/install/package.json @@ -53,7 +53,7 @@ "connect-pg-simple": "8.0.0", "connect-redis": "6.1.3", "cookie-parser": "1.4.6", - "cron": "2.1.0", + "cron": "2.3.0", "cropperjs": "1.5.13", "csurf": "1.11.0", "daemon": "1.1.0", @@ -192,4 +192,4 @@ "url": "https://github.com/barisusakli" } ] -} \ No newline at end of file +}