From c9de0e519eb8b173d468fa77e0da64efa5d1cced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 25 Jul 2024 11:55:22 -0400 Subject: [PATCH 01/11] remove strong --- src/views/admin/advanced/hooks.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/admin/advanced/hooks.tpl b/src/views/admin/advanced/hooks.tpl index 44a417917b..61aaa26ebc 100644 --- a/src/views/admin/advanced/hooks.tpl +++ b/src/views/admin/advanced/hooks.tpl @@ -11,7 +11,7 @@
{{{ each hooks.methods }}}
- {hooks.methods.id} + {hooks.methods.id} Priority: {hooks.methods.priority}
- - {{{ if ./teaser }}} -
- {buildAvatar(./teaser.user, "14px", true, "align-middle")} - {./teaser.user.username}: - {./teaser.content} -
-
{{{ if ./teaser.timeagoLong }}}{./teaser.timeagoLong}{{{ else }}}{{{ end }}}
- {{{ end }}} +
@@ -52,4 +44,8 @@
{{{ if !@last }}}
+{{{ else }}} +{{{ if showBottomHr }}} +
+{{{ end }}} {{{ end }}} diff --git a/src/views/partials/chats/room-teaser.tpl b/src/views/partials/chats/room-teaser.tpl new file mode 100644 index 0000000000..ae7f53f251 --- /dev/null +++ b/src/views/partials/chats/room-teaser.tpl @@ -0,0 +1,10 @@ +
+ {{{ if ./teaser }}} +
+ {buildAvatar(./teaser.user, "14px", true, "align-middle")} + {./teaser.user.username}: + {./teaser.content} +
+
{{{ if ./teaser.timeagoLong }}}{./teaser.timeagoLong}{{{ else }}}{{{ end }}}
+ {{{ end }}} +
\ No newline at end of file From a73f269fcee87118aff655ea4503e440be7b8956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 31 Jul 2024 15:31:11 -0400 Subject: [PATCH 03/11] test: test fix maybe --- src/api/chats.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/chats.js b/src/api/chats.js index 4de434e4ef..abd5c908f2 100644 --- a/src/api/chats.js +++ b/src/api/chats.js @@ -37,7 +37,7 @@ async function rateLimitExceeded(caller, field) { } chatsAPI.list = async (caller, { uid = caller.uid, start, stop, page, perPage } = {}) => { - if (!utils.isNumber(start) && !utils.isNumber(stop) && !utils.isNumber(page)) { + if ((!utils.isNumber(start) || !utils.isNumber(stop)) && !utils.isNumber(page)) { throw new Error('[[error:invalid-data]]'); } From 6ed71b801f47b4c0af4ae41716e8da8d2c7454b9 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Thu, 1 Aug 2024 14:17:48 +0000 Subject: [PATCH 04/11] chore: incrementing version number - v3.8.4 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 9bf2e4e045..cb5eb4e4ea 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "3.8.3", + "version": "3.8.4", "homepage": "https://www.nodebb.org", "repository": { "type": "git", From 693bac5bfa6f16d57f98b07394d8055f8c4889ac Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Thu, 1 Aug 2024 14:17:49 +0000 Subject: [PATCH 05/11] chore: update changelog for v3.8.4 --- CHANGELOG.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b66481805a..731e39ccc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,81 @@ +#### v3.8.4 (2024-08-01) + +##### Chores + +* up widgets (d1663ac2) +* up widgets (cb4bf9dd) +* up persona (324610de) +* incrementing version number - v3.8.3 (97ce2c44) +* update changelog for v3.8.3 (2a239a79) +* incrementing version number - v3.8.2 (72d91251) +* incrementing version number - v3.8.1 (527326f7) +* incrementing version number - v3.8.0 (e228a6eb) +* incrementing version number - v3.7.5 (6882894d) +* incrementing version number - v3.7.4 (6678744c) +* incrementing version number - v3.7.3 (2d62b6f6) +* incrementing version number - v3.7.2 (cc257e7e) +* incrementing version number - v3.7.1 (712365a5) +* incrementing version number - v3.7.0 (9a6153d7) +* incrementing version number - v3.6.7 (86a17e38) +* incrementing version number - v3.6.6 (6604bf37) +* incrementing version number - v3.6.5 (6c653625) +* incrementing version number - v3.6.4 (83d131b4) +* incrementing version number - v3.6.3 (fc7d2bfd) +* incrementing version number - v3.6.2 (0f577a57) +* incrementing version number - v3.6.1 (f1a69468) +* incrementing version number - v3.6.0 (4cdf85f8) +* incrementing version number - v3.5.3 (ed0e8783) +* incrementing version number - v3.5.2 (52fbb2da) +* incrementing version number - v3.5.1 (4c543488) +* incrementing version number - v3.5.0 (d06fb4f0) +* incrementing version number - v3.4.3 (5c984250) +* incrementing version number - v3.4.2 (3f0dac38) +* incrementing version number - v3.4.1 (01e69574) +* incrementing version number - v3.4.0 (fd9247c5) +* incrementing version number - v3.3.9 (5805e770) +* incrementing version number - v3.3.8 (a5603565) +* incrementing version number - v3.3.7 (b26f1744) +* incrementing version number - v3.3.6 (7fb38792) +* incrementing version number - v3.3.4 (a67f84ea) +* incrementing version number - v3.3.3 (f94d239b) +* incrementing version number - v3.3.2 (ec9dac97) +* incrementing version number - v3.3.1 (151cc68f) +* incrementing version number - v3.3.0 (fc1ad70f) +* incrementing version number - v3.2.3 (b06d3e63) +* incrementing version number - v3.2.2 (758ecfcd) +* incrementing version number - v3.2.1 (20145074) +* incrementing version number - v3.2.0 (9ecac38e) +* incrementing version number - v3.1.7 (0b4e81ab) +* incrementing version number - v3.1.6 (b3a3b130) +* incrementing version number - v3.1.5 (ec19343a) +* incrementing version number - v3.1.4 (2452783c) +* incrementing version number - v3.1.3 (3b4e9d3f) +* incrementing version number - v3.1.2 (40fa3489) +* incrementing version number - v3.1.1 (40250733) +* incrementing version number - v3.1.0 (0cb386bd) +* incrementing version number - v3.0.1 (26f6ea49) +* incrementing version number - v3.0.0 (224e08cd) + +##### New Features + +* update chat teasers when a new chat starts, closes #12713 (0204f2aa) +* add downvoteVisibility setting, closes #12698 (269fc068) + +##### Bug Fixes + +* prevent category filter to go to selected cid (10c5cd4c) +* add sizes to maskable so it doesnt crash chrome application tab (ccc86825) +* post preview not working on parent post (a28dd70f) + +##### Refactors + +* hooks page design (cea18d0c) +* closes #12699, allow boolean false for log-colorize (42ac1f9d) + +##### Tests + +* test fix maybe (a73f269f) + #### v3.8.3 (2024-06-27) ##### Chores From ac644ac2866bfa48a939a94b6ec34ad9fd493f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 2 Aug 2024 10:06:28 -0400 Subject: [PATCH 06/11] refactor: #12713, update chat teasers even if chat notifications are disabled --- public/src/client/chats.js | 63 +++++++++++++------------------- public/src/client/header/chat.js | 1 + src/messaging/notifications.js | 9 +++++ 3 files changed, 36 insertions(+), 37 deletions(-) diff --git a/public/src/client/chats.js b/public/src/client/chats.js index af18c73ec2..1570872d62 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -684,31 +684,6 @@ define('forum/chats', [ }; Chats.addSocketListeners = function () { - socket.on('event:new_notification', async function (notif) { - const { type, roomId } = notif; - if (ajaxify.data.template.chats && app.user.userslug && (type === 'new-chat' || type === 'new-group-chat')) { - const inRoom = parseInt(roomId, 10) === parseInt(ajaxify.data.roomId, 10); - if (inRoom) { - return; - } - const { rooms } = await api.get(`/chats`, { start: 0, perPage: 1 }); - const room = rooms.find(r => parseInt(r.roomId, 10) === parseInt(roomId, 10)); - if (room) { - const roomEl = chatNavWrapper.find(`[data-roomid="${roomId}"]`); - if (roomEl.length) { - updateTeaser(roomId, room.teaser); - } else { - const recentEl = components.get('chat/recent'); - const html = await app.parseAndTranslate('chats', 'rooms', { - rooms: [room], - showBottomHr: true, - }); - recentEl.prepend(html); - } - } - } - }); - socket.on('event:chats.receive', function (data) { if (chatModule.isFromBlockedUser(data.fromUid)) { return; @@ -723,7 +698,7 @@ define('forum/chats', [ data.message.timestampISO = utils.toISOString(data.message.timestamp); messages.appendChatMessage($('[component="chat/message/content"]'), data.message); - updateTeaser(data.roomId, { + Chats.updateTeaser(data.roomId, { content: utils.stripHTMLTags(utils.decodeHTMLEntities(data.message.content)), user: data.message.fromUser, timestampISO: data.message.timestampISO, @@ -731,17 +706,6 @@ define('forum/chats', [ } }); - async function updateTeaser(roomId, teaser) { - const roomEl = $(`[data-roomid="${roomId}"]`); - if (roomEl.length) { - const html = await app.parseAndTranslate('partials/chats/room-teaser', { - teaser: teaser, - }); - roomEl.find('[component="chat/room/teaser"]').html(html[0].outerHTML); - roomEl.find('.timeago').timeago(); - } - } - socket.on('event:chats.public.unread', function (data) { if ( chatModule.isFromBlockedUser(data.fromUid) || @@ -796,6 +760,31 @@ define('forum/chats', [ }); }; + Chats.updateTeaser = async function (roomId, teaser) { + if (!ajaxify.data.template.chats || !app.user.userslug) { + return; + } + const roomEl = chatNavWrapper.find(`[data-roomid="${roomId}"]`); + if (roomEl.length) { + const html = await app.parseAndTranslate('partials/chats/room-teaser', { + teaser: teaser, + }); + roomEl.find('[component="chat/room/teaser"]').html(html[0].outerHTML); + roomEl.find('.timeago').timeago(); + } else { + const { rooms } = await api.get(`/chats`, { start: 0, perPage: 2 }); + const room = rooms.find(r => parseInt(r.roomId, 10) === parseInt(roomId, 10)); + if (room) { + const recentEl = components.get('chat/recent'); + const html = await app.parseAndTranslate('chats', 'rooms', { + rooms: [room], + showBottomHr: true, + }); + recentEl.prepend(html); + } + } + }; + Chats.markChatPageElUnread = function (data) { if (!ajaxify.data.template.chats) { return; diff --git a/public/src/client/header/chat.js b/public/src/client/header/chat.js index a087a45939..d52f4c6c72 100644 --- a/public/src/client/header/chat.js +++ b/public/src/client/header/chat.js @@ -42,6 +42,7 @@ define('forum/header/chat', [ return; } chatPage.markChatPageElUnread(data); + chatPage.updateTeaser(data.roomId, data.teaser); } let { count } = await api.get('/chats/unread'); diff --git a/src/messaging/notifications.js b/src/messaging/notifications.js index 503382cf01..d939bc939b 100644 --- a/src/messaging/notifications.js +++ b/src/messaging/notifications.js @@ -1,6 +1,7 @@ 'use strict'; const winston = require('winston'); +const validator = require('validator'); const batch = require('../batch'); const db = require('../database'); @@ -8,6 +9,7 @@ const notifications = require('../notifications'); const user = require('../user'); const io = require('../socket.io'); const plugins = require('../plugins'); +const utils = require('../utils'); module.exports = function (Messaging) { Messaging.setUserNotificationSetting = async (uid, roomId, value) => { @@ -66,6 +68,13 @@ module.exports = function (Messaging) { // push unread count only for private rooms if (!isPublic) { const uids = await Messaging.getAllUidsInRoomFromSet(`chat:room:${roomId}:uids:online`); + unreadData.teaser = { + content: validator.escape( + String(utils.stripHTMLTags(utils.decodeHTMLEntities(messageObj.content))) + ), + user: messageObj.fromUser, + timestampISO: messageObj.timestampISO, + }; Messaging.pushUnreadCount(uids, unreadData); } From 503a97e520e6f37f9caf03505172e66cf8481c00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 2 Aug 2024 16:09:35 -0400 Subject: [PATCH 07/11] fix: don't allow joining topic_ & category_ socket.io rooms if you don't have relevant privileges --- src/socket.io/meta.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/socket.io/meta.js b/src/socket.io/meta.js index f150102f13..0e59e93849 100644 --- a/src/socket.io/meta.js +++ b/src/socket.io/meta.js @@ -5,6 +5,7 @@ const os = require('os'); const user = require('../user'); const meta = require('../meta'); const topics = require('../topics'); +const privileges = require('../privileges'); const SocketMeta = module.exports; SocketMeta.rooms = {}; @@ -44,6 +45,20 @@ SocketMeta.rooms.enter = async function (socket, data) { throw new Error('[[error:not-allowed]]'); } + if (data.enter && data.enter.startsWith('topic_')) { + const tid = data.enter.split('_').pop(); + if (!await privileges.topics.can('topics:read', tid, socket.uid)) { + throw new Error('[[error:no-privileges]]'); + } + } + + if (data.enter && data.enter.startsWith('category_')) { + const cid = data.enter.split('_').pop(); + if (!await privileges.categories.can('read', cid, socket.uid)) { + throw new Error('[[error:no-privileges]]'); + } + } + leaveCurrentRoom(socket); if (data.enter) { From ed2f3b751882187ccbf8e2b90f9fa4ae5e091ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 2 Aug 2024 16:24:56 -0400 Subject: [PATCH 08/11] test: create topic for socket.io tests --- test/socket.io.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/socket.io.js b/test/socket.io.js index 6c0a5a2367..9f2aeebbb6 100644 --- a/test/socket.io.js +++ b/test/socket.io.js @@ -15,6 +15,7 @@ const db = require('./mocks/databasemock'); const user = require('../src/user'); const groups = require('../src/groups'); const categories = require('../src/categories'); +const topics = require('../src/topics'); const helpers = require('./helpers'); const meta = require('../src/meta'); const events = require('../src/events'); @@ -45,6 +46,12 @@ describe('socket.io', () => { await user.email.confirmByUid(regularUid); cid = data[2].cid; + await topics.post({ + uid: adminUid, + cid: cid, + title: 'Test Topic', + content: 'Test topic content', + }); }); From 6e1c64360710aa1f0cddab7a651d45c6a831bd05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 9 Aug 2024 12:48:17 -0400 Subject: [PATCH 09/11] fix: closes #12721, export all users --- src/user/admin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user/admin.js b/src/user/admin.js index 369aafee50..35598bbbd9 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -64,7 +64,7 @@ module.exports = function (User) { 'w' ); fs.promises.appendFile(fd, `${fields.map(f => `"${f}"`).join(',')}\n`); - await batch.processSortedSet('group:administrators:members', async (uids) => { + await batch.processSortedSet('users:joindate', async (uids) => { const userFieldsToLoad = fields.filter(field => field !== 'ip' && field !== 'password'); const usersData = await User.getUsersFields(uids, userFieldsToLoad); let userIps = []; From 334c8c9d31d0a235c42d6df9be7bc8c7fee0401d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 9 Aug 2024 15:25:49 -0400 Subject: [PATCH 10/11] feat: add missing event type --- src/events.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/events.js b/src/events.js index 41e1f0d29b..d7938e3b5a 100644 --- a/src/events.js +++ b/src/events.js @@ -75,6 +75,7 @@ events.types = [ 'export:uploads', 'account-locked', 'getUsersCSV', + 'getGroupCSV', 'chat-room-deleted', // To add new types from plugins, just Array.push() to this array ]; From 780db9e2ff957a28565a454e89762f6614812946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 9 Aug 2024 15:31:53 -0400 Subject: [PATCH 11/11] chore: up harmony --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index cb5eb4e4ea..6eedab394b 100644 --- a/install/package.json +++ b/install/package.json @@ -104,7 +104,7 @@ "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.2", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.2.63", + "nodebb-theme-harmony": "1.2.64", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.6", "nodebb-theme-persona": "13.3.25",