fix: chat room kicking of remote users, (un)read logic for remote users (there is none), sendNotification to only apply to local uids

re: #12834
This commit is contained in:
Julian Lam
2024-10-04 17:07:57 -04:00
parent b610b520e9
commit 52080ba269
4 changed files with 23 additions and 2 deletions

View File

@@ -102,7 +102,7 @@ define('forum/chats/manage', [
function addKickHandler(roomId, modal) {
modal.on('click', '[data-action="kick"]', function () {
const uid = parseInt(this.getAttribute('data-uid'), 10);
const uid = encodeURIComponent(this.getAttribute('data-uid'));
api.del(`/chats/${roomId}/users/${uid}`, {}).then((body) => {
refreshParticipantsList(roomId, modal, body);

View File

@@ -80,6 +80,7 @@ module.exports = function (Messaging) {
try {
await sendNotification(fromUid, roomId, messageObj);
// await federate(fromUid, roomId, messageObj);
} catch (err) {
winston.error(`[messaging/notifications] Unabled to send notification\n${err.stack}`);
}
@@ -98,7 +99,8 @@ module.exports = function (Messaging) {
const { ALLMESSAGES } = Messaging.notificationSettings;
await batch.processSortedSet(`chat:room:${roomId}:uids:online`, async (uids) => {
uids = uids.filter(
uid => (parseInt((settings && settings[uid]) || roomDefault, 10) === ALLMESSAGES) &&
uid => utils.isNumber(uid) &&
(parseInt((settings && settings[uid]) || roomDefault, 10) === ALLMESSAGES) &&
fromUid !== parseInt(uid, 10) &&
!realtimeUids.includes(parseInt(uid, 10))
);
@@ -140,4 +142,7 @@ module.exports = function (Messaging) {
await notifications.push(notification, uidsToNotify);
}
}
// async function federate(fromUid, roomId, messageObj) {
// }
};

View File

@@ -13,6 +13,7 @@ const meta = require('../meta');
const io = require('../socket.io');
const cache = require('../cache');
const cacheCreate = require('../cacheCreate');
const utils = require('../utils');
const roomUidCache = cacheCreate({
name: 'chat:room:uids',
@@ -259,6 +260,13 @@ module.exports = function (Messaging) {
Messaging.addUsersToRoom = async function (uid, uids, roomId) {
uids = _.uniq(uids);
// Public rooms must only contain local users
const isPublic = await db.getObjectField(`chat:room:${roomId}`, 'public');
if (parseInt(isPublic, 10) === 1 && uids.some(uid => !utils.isNumber(uid))) {
throw new Error('[[error:invalid-uid]]');
}
const inRoom = await Messaging.isUserInRoom(uid, roomId);
const payload = await plugins.hooks.fire('filter:messaging.addUsersToRoom', { uid, uids, roomId, inRoom });

View File

@@ -1,6 +1,7 @@
'use strict';
const db = require('../database');
const utils = require('../utils');
const io = require('../socket.io');
module.exports = function (Messaging) {
@@ -26,6 +27,10 @@ module.exports = function (Messaging) {
};
Messaging.markRead = async (uid, roomId) => {
if (!utils.isNumber(uid)) {
return;
}
await Promise.all([
db.sortedSetRemove(`uid:${uid}:chat:rooms:unread`, roomId),
db.setObjectField(`uid:${uid}:chat:rooms:read`, roomId, Date.now()),
@@ -64,6 +69,9 @@ module.exports = function (Messaging) {
};
Messaging.markUnread = async (uids, roomId) => {
// Remote users don't have (un)read states
uids = uids.filter(uid => utils.isNumber(uid));
const exists = await Messaging.roomExists(roomId);
if (!exists) {
return;