From 9f8d50706ec859cc6fc1ae2012cc11fe11a2e625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 17 Dec 2025 12:34:54 -0500 Subject: [PATCH 1/8] test: add back logs for failing test --- test/activitypub/feps.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/activitypub/feps.js b/test/activitypub/feps.js index 1c97a282e8..9f5d0c6a60 100644 --- a/test/activitypub/feps.js +++ b/test/activitypub/feps.js @@ -164,8 +164,9 @@ describe('FEPs', () => { }); pid = id; ({ activity } = await helpers.mocks.create(note)); + console.log('before inbox create', activitypub._sent); await activitypub.inbox.create({ body: activity }); - + console.log('after inbox create', activitypub._sent); const activities = Array.from(activitypub._sent); const test1 = activities.some((activity) => { @@ -174,14 +175,13 @@ describe('FEPs', () => { activity.object && activity.object.type === 'Create' && activity.object.object && activity.object.object.type === 'Note'; }); - + assert(test1); const test2 = activities.some((activity) => { [, activity] = activity; return activity.type === 'Announce' && activity.object && activity.object.type === 'Note'; }); - - assert(test1 && test2); + assert(test2); }); it('should federate out an Announce(Create(Note)) on reply', async () => { From d505301fa0d73555060a72e2120d3bb249ba9a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 17 Dec 2025 13:02:43 -0500 Subject: [PATCH 2/8] chore: up mentions --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 532c35e209..01502e79f7 100644 --- a/install/package.json +++ b/install/package.json @@ -103,7 +103,7 @@ "nodebb-plugin-emoji-android": "4.1.1", "nodebb-plugin-link-preview": "2.1.5", "nodebb-plugin-markdown": "13.2.2", - "nodebb-plugin-mentions": "4.8.3", + "nodebb-plugin-mentions": "4.8.4", "nodebb-plugin-spam-be-gone": "2.3.2", "nodebb-plugin-web-push": "0.7.6", "nodebb-rewards-essentials": "1.0.2", From 1305faa8385b13e445976a626a96e516201fd63e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 17 Dec 2025 14:35:35 -0500 Subject: [PATCH 3/8] test: add await to check tests --- src/activitypub/notes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/activitypub/notes.js b/src/activitypub/notes.js index 21aebb4c63..b0e10d6641 100644 --- a/src/activitypub/notes.js +++ b/src/activitypub/notes.js @@ -267,7 +267,7 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { if (!hasTid && options.cid) { // New topic, have category announce it - activitypub.out.announce.topic(tid); + await activitypub.out.announce.topic(tid); } return { tid, count }; From 550411fb58b07ad9741b810fd82eeefe6ce4448a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20U=C5=9Fakl=C4=B1?= Date: Wed, 17 Dec 2025 16:56:07 -0500 Subject: [PATCH 4/8] test: change redis connection (#13844) --- src/database/redis/connection.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/database/redis/connection.js b/src/database/redis/connection.js index 41a9243355..b97f75a4a4 100644 --- a/src/database/redis/connection.js +++ b/src/database/redis/connection.js @@ -58,13 +58,12 @@ connection.connect = async function (options) { winston.error(err.stack); reject(err); }); - cxn.on('ready', () => { + + cxn.connect().then(() => { // back-compat with node_redis cxn.batch = cxn.multi; - resolve(cxn); - }); - cxn.connect().then(() => { winston.info('Connected to Redis successfully'); + resolve(cxn); }).catch((err) => { winston.error('Error connecting to Redis:', err); }); From da79582148a57540cc39b116e49b27873b35c5e7 Mon Sep 17 00:00:00 2001 From: b2cc Date: Wed, 17 Dec 2025 23:00:43 +0100 Subject: [PATCH 5/8] * Docker: add function to entrypoint to auto-install plugins on reboot (fixes #13735) (#13749) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * * Docker: add function to entrypoint to auto-install plugins on reboot (fixes #13735) Added a function to install additional NodeBB plugins if specified. This fixes #13735 * fix: case on --------- Co-authored-by: Jakub Bliźniuk --- install/docker/entrypoint.sh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/install/docker/entrypoint.sh b/install/docker/entrypoint.sh index db2a637ee0..a38aa4196f 100755 --- a/install/docker/entrypoint.sh +++ b/install/docker/entrypoint.sh @@ -12,6 +12,7 @@ set_defaults() { export SETUP="${SETUP:-}" export PACKAGE_MANAGER="${PACKAGE_MANAGER:-npm}" export OVERRIDE_UPDATE_LOCK="${OVERRIDE_UPDATE_LOCK:-false}" + export NODEBB_ADDITIONAL_PLUGINS="${NODEBB_ADDITIONAL_PLUGINS:-}" } # Function to check if a directory exists and is writable @@ -172,6 +173,33 @@ debug_log() { echo "DEBUG: $message" } +install_additional_plugins() { + if [[ ! -z ${NODEBB_ADDITIONAL_PLUGINS} ]]; then + export START_BUILD="true" + for plugin in "${NODEBB_ADDITIONAL_PLUGINS[@]}"; do + echo "Installing additional plugin ${plugin}..." + case "$PACKAGE_MANAGER" in + yarn) yarn install || { + echo "Failed to install plugin ${plugin} with yarn" + exit 1 + } ;; + npm) npm install || { + echo "Failed to install plugin ${plugin} with npm" + exit 1 + } ;; + pnpm) pnpm install || { + echo "Failed to install plugin ${plugin} with pnpm" + exit 1 + } ;; + *) + echo "Unknown package manager: $PACKAGE_MANAGER" + exit 1 + ;; + esac + done + fi +} + # Main function main() { set_defaults @@ -182,12 +210,14 @@ main() { debug_log "PACKAGE_MANAGER: $PACKAGE_MANAGER" debug_log "CONFIG location: $CONFIG" debug_log "START_BUILD: $START_BUILD" + debug_log "NODEBB_ADDITIONAL_PLUGINS: ${NODEBB_ADDITIONAL_PLUGINS}" if [ -n "$SETUP" ]; then start_setup_session "$CONFIG" fi if [ -f "$CONFIG" ]; then + install_additional_plugins start_forum "$CONFIG" "$START_BUILD" else start_installation_session "$NODEBB_INIT_VERB" "$CONFIG" From d03137128c1be08b6ca11eb833bf240f89a7a3a1 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 18 Dec 2025 11:39:31 -0500 Subject: [PATCH 6/8] fix: bump 2factor --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index 01502e79f7..c460a3e8eb 100644 --- a/install/package.json +++ b/install/package.json @@ -96,7 +96,7 @@ "mousetrap": "1.6.5", "multer": "2.0.2", "nconf": "0.13.0", - "nodebb-plugin-2factor": "7.6.0", + "nodebb-plugin-2factor": "7.6.1", "nodebb-plugin-composer-default": "10.3.1", "nodebb-plugin-dbsearch": "6.3.4", "nodebb-plugin-emoji": "6.0.5", @@ -203,4 +203,4 @@ "url": "https://github.com/barisusakli" } ] -} \ No newline at end of file +} From 59dd1ca6072b238cfd60f7d872b190cc5afbebf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 19 Dec 2025 17:38:19 -0500 Subject: [PATCH 7/8] chore: up body-parser --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c460a3e8eb..b29e9c8d32 100644 --- a/install/package.json +++ b/install/package.json @@ -45,7 +45,7 @@ "autoprefixer": "10.4.22", "bcryptjs": "3.0.3", "benchpressjs": "2.5.5", - "body-parser": "2.2.0", + "body-parser": "2.2.1", "bootbox": "6.0.4", "bootstrap": "5.3.8", "bootswatch": "5.3.8", From 1f9f2dff2fd1a00b425d3aba405dd17afbbcf82d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 23 Dec 2025 14:29:28 -0500 Subject: [PATCH 8/8] fix: update data-isowner when changing is ownership fixes multiple ownership toggles --- public/src/client/groups/details.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index 8dde2e3eab..9ed57cd6ed 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -81,6 +81,7 @@ define('forum/groups/details', [ case 'toggleOwnership': api[isOwner ? 'del' : 'put'](`/groups/${ajaxify.data.group.slug}/ownership/${uid}`, {}).then(() => { ownerFlagEl.toggleClass('invisible'); + userRow.attr('data-isowner', isOwner ? '0' : '1'); }).catch(alerts.error); break;