From ca487a47acef8d8b15ecfc2152c10ae7527026fe Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Fri, 2 Mar 2018 17:47:22 -0300 Subject: [PATCH] [FIX] Delete user without username was removing direct rooms of all users --- packages/rocketchat-cors/cors.js | 7 +++ packages/rocketchat-cors/package.js | 3 +- .../server/functions/deleteUser.js | 43 ++++++++++--------- 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/packages/rocketchat-cors/cors.js b/packages/rocketchat-cors/cors.js index a41a833d1598..5e45911acc9b 100644 --- a/packages/rocketchat-cors/cors.js +++ b/packages/rocketchat-cors/cors.js @@ -3,11 +3,18 @@ import _ from 'underscore'; import url from 'url'; +import { Mongo } from 'meteor/mongo'; import tls from 'tls'; // FIX For TLS error see more here https://github.com/RocketChat/Rocket.Chat/issues/9316 // TODO: Remove after NodeJS fix it, more information https://github.com/nodejs/node/issues/16196 https://github.com/nodejs/node/pull/16853 tls.DEFAULT_ECDH_CURVE = 'auto'; +// Revert change from Meteor 1.6.1 who set ignoreUndefined: true +// more information https://github.com/meteor/meteor/pull/9444 +Mongo.setConnectionOptions({ + ignoreUndefined: false +}); + WebApp.rawConnectHandlers.use(Meteor.bindEnvironment(function(req, res, next) { if (req._body) { return next(); diff --git a/packages/rocketchat-cors/package.js b/packages/rocketchat-cors/package.js index 9959f7e15394..3863a9acd73f 100644 --- a/packages/rocketchat-cors/package.js +++ b/packages/rocketchat-cors/package.js @@ -8,7 +8,8 @@ Package.describe({ Package.onUse(function(api) { api.use([ 'ecmascript', - 'webapp' + 'webapp', + 'mongo' ]); api.addFiles('cors.js', 'server'); diff --git a/packages/rocketchat-lib/server/functions/deleteUser.js b/packages/rocketchat-lib/server/functions/deleteUser.js index 035e40ef944a..d54743f93e03 100644 --- a/packages/rocketchat-lib/server/functions/deleteUser.js +++ b/packages/rocketchat-lib/server/functions/deleteUser.js @@ -1,30 +1,33 @@ RocketChat.deleteUser = function(userId) { const user = RocketChat.models.Users.findOneById(userId); - RocketChat.models.Messages.removeByUserId(userId); // Remove user messages - RocketChat.models.Subscriptions.db.findByUserId(userId).forEach((subscription) => { - const room = RocketChat.models.Rooms.findOneById(subscription.rid); - if (room) { - if (room.t !== 'c' && room.usernames.length === 1) { - RocketChat.models.Rooms.removeById(subscription.rid); // Remove non-channel rooms with only 1 user (the one being deleted) + // Users without username can't do anything, so there is nothing to remove + if (user.username != null) { + RocketChat.models.Messages.removeByUserId(userId); // Remove user messages + RocketChat.models.Subscriptions.db.findByUserId(userId).forEach((subscription) => { + const room = RocketChat.models.Rooms.findOneById(subscription.rid); + if (room) { + if (room.t !== 'c' && room.usernames.length === 1) { + RocketChat.models.Rooms.removeById(subscription.rid); // Remove non-channel rooms with only 1 user (the one being deleted) + } + if (room.t === 'd') { + RocketChat.models.Subscriptions.removeByRoomId(subscription.rid); + RocketChat.models.Messages.removeByRoomId(subscription.rid); + } } - if (room.t === 'd') { - RocketChat.models.Subscriptions.removeByRoomId(subscription.rid); - RocketChat.models.Messages.removeByRoomId(subscription.rid); - } - } - }); + }); - RocketChat.models.Subscriptions.removeByUserId(userId); // Remove user subscriptions - RocketChat.models.Rooms.removeByTypeContainingUsername('d', user.username); // Remove direct rooms with the user - RocketChat.models.Rooms.removeUsernameFromAll(user.username); // Remove user from all other rooms + RocketChat.models.Subscriptions.removeByUserId(userId); // Remove user subscriptions + RocketChat.models.Rooms.removeByTypeContainingUsername('d', user.username); // Remove direct rooms with the user + RocketChat.models.Rooms.removeUsernameFromAll(user.username); // Remove user from all other rooms - // removes user's avatar - if (user.avatarOrigin === 'upload' || user.avatarOrigin === 'url') { - FileUpload.getStore('Avatars').deleteByName(user.username); - } + // removes user's avatar + if (user.avatarOrigin === 'upload' || user.avatarOrigin === 'url') { + FileUpload.getStore('Avatars').deleteByName(user.username); + } - RocketChat.models.Integrations.disableByUserId(userId); // Disables all the integrations which rely on the user being deleted. + RocketChat.models.Integrations.disableByUserId(userId); // Disables all the integrations which rely on the user being deleted. + } RocketChat.models.Users.removeById(userId); // Remove user from users database };