From 3b325e7526d8d14e5ba114593603170170bd9718 Mon Sep 17 00:00:00 2001 From: Hudell Date: Wed, 28 Feb 2018 16:47:50 -0300 Subject: [PATCH 1/3] Right to be forgotten --- packages/rocketchat-i18n/i18n/en.i18n.json | 8 ++++++++ .../server/functions/deleteUser.js | 13 ++++++++++++- .../rocketchat-lib/server/models/Messages.js | 14 ++++++++++++++ .../rocketchat-lib/server/startup/settings.js | 17 +++++++++++++++++ .../client/tabs/userActions.js | 5 ++++- 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 706fefe310ede..edb255e078ed9 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -510,6 +510,9 @@ "Delete_my_account": "Delete my account", "Delete_Room_Warning": "Deleting a room will delete all messages posted within the room. This cannot be undone.", "Delete_User_Warning": "Deleting a user will delete all messages from that user as well. This cannot be undone.", + "Delete_User_Warning_Keep": "The user will be deleted, but their messages will remain visible. This cannot be undone.", + "Delete_User_Warning_Delete": "Deleting a user will delete all messages from that user as well. This cannot be undone.", + "Delete_User_Warning_Unlink": "Deleting a user will remove the user name from all their messages. This cannot be undone.", "Deleted": "Deleted!", "Department": "Department", "Department_removed": "Department removed", @@ -1271,6 +1274,11 @@ "Message_DateFormat_Description": "See also: Moment.js", "Message_deleting_blocked": "This message cannot be deleted anymore", "Message_editing": "Message editing", + "Message_ErasureType" : "Message Erasure Type", + "Message_ErasureType_Description" : "Determine what to do with messages of users who remove their account.", + "Message_ErasureType_Keep" : "Keep Messages and User Name", + "Message_ErasureType_Delete" : "Delete All Messages", + "Message_ErasureType_Unlink" : "Remove Link Between User and Messages", "Message_GlobalSearch": "Global Search", "Message_GroupingPeriod": "Grouping Period (in seconds)", "Message_GroupingPeriodDescription": "Messages will be grouped with previous message if both are from the same user and the elapsed time was less than the informed time in seconds.", diff --git a/packages/rocketchat-lib/server/functions/deleteUser.js b/packages/rocketchat-lib/server/functions/deleteUser.js index 035e40ef944a6..d6cab56d7ed89 100644 --- a/packages/rocketchat-lib/server/functions/deleteUser.js +++ b/packages/rocketchat-lib/server/functions/deleteUser.js @@ -1,7 +1,18 @@ RocketChat.deleteUser = function(userId) { const user = RocketChat.models.Users.findOneById(userId); + const messageErasureType = RocketChat.settings.get('Message_ErasureType'); + + switch (messageErasureType) { + case 'Delete' : + RocketChat.models.Messages.removeByUserId(userId); + break; + case 'Unlink' : + const rocketCat = RocketChat.models.Users.findById('rocket.cat').fetch()[0]; + RocketChat.models.Messages.unlinkUserId(userId, rocketCat._id, rocketCat.username); + break; + } + - 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) { diff --git a/packages/rocketchat-lib/server/models/Messages.js b/packages/rocketchat-lib/server/models/Messages.js index a52fcdaa1843e..4e68fbe855dc1 100644 --- a/packages/rocketchat-lib/server/models/Messages.js +++ b/packages/rocketchat-lib/server/models/Messages.js @@ -500,6 +500,20 @@ RocketChat.models.Messages = new class extends RocketChat.models._Base { return this.update(query, update); } + unlinkUserId(userId, newUserId, newUsername) { + const query = { + 'u._id': userId + }; + + const update = { + $set: { + 'u._id': newUserId, + 'u.username' : newUsername + } + }; + + return this.update(query, update, { multi: true }); + } // INSERT createWithTypeRoomIdMessageAndUser(type, roomId, message, user, extraData) { diff --git a/packages/rocketchat-lib/server/startup/settings.js b/packages/rocketchat-lib/server/startup/settings.js index 771d298bc0b39..fb1245113582a 100644 --- a/packages/rocketchat-lib/server/startup/settings.js +++ b/packages/rocketchat-lib/server/startup/settings.js @@ -1339,6 +1339,23 @@ RocketChat.settings.addGroup('Message', function() { 'public': true, alert: 'This feature is currently in beta and could decrease the application performance! Please report bugs to github.com/RocketChat/Rocket.Chat/issues' }); + + this.add('Message_ErasureType', 'Keep', { + type: 'select', + 'public': true, + values: [ + { + key: 'Keep', + i18nLabel: 'Message_ErasureType_Keep' + }, { + key: 'Delete', + i18nLabel: 'Message_ErasureType_Delete' + }, { + key: 'Unlink', + i18nLabel: 'Message_ErasureType_Unlink' + } + ] + }); }); RocketChat.settings.addGroup('Meta', function() { diff --git a/packages/rocketchat-ui-flextab/client/tabs/userActions.js b/packages/rocketchat-ui-flextab/client/tabs/userActions.js index e5a3abb2e8658..6f79c1c68d102 100644 --- a/packages/rocketchat-ui-flextab/client/tabs/userActions.js +++ b/packages/rocketchat-ui-flextab/client/tabs/userActions.js @@ -402,9 +402,12 @@ export const getActions = function({ user, directActions, hideAdminControls }) { icon : 'trash', name: 'Delete', action: prevent(getUser, ({_id}) => { + const erasureType = RocketChat.settings.get('Message_ErasureType'); + const warningKey = `Delete_User_Warning_${ erasureType }`; + modal.open({ title: t('Are_you_sure'), - text: t('Delete_User_Warning'), + text: t(warningKey), type: 'warning', showCancelButton: true, confirmButtonColor: '#DD6B55', From b3f08c4f2b61b0c366b3284e5c0af78ad7118bed Mon Sep 17 00:00:00 2001 From: Hudell Date: Wed, 28 Feb 2018 16:53:12 -0300 Subject: [PATCH 2/3] Changed default action to Delete --- packages/rocketchat-lib/server/startup/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rocketchat-lib/server/startup/settings.js b/packages/rocketchat-lib/server/startup/settings.js index fb1245113582a..e5872a6d86ab3 100644 --- a/packages/rocketchat-lib/server/startup/settings.js +++ b/packages/rocketchat-lib/server/startup/settings.js @@ -1340,7 +1340,7 @@ RocketChat.settings.addGroup('Message', function() { alert: 'This feature is currently in beta and could decrease the application performance! Please report bugs to github.com/RocketChat/Rocket.Chat/issues' }); - this.add('Message_ErasureType', 'Keep', { + this.add('Message_ErasureType', 'Delete', { type: 'select', 'public': true, values: [ From 738181453fd26dfd973a3e5e54043a1c8b3312cd Mon Sep 17 00:00:00 2001 From: Hudell Date: Mon, 5 Mar 2018 18:07:00 -0300 Subject: [PATCH 3/3] Changed 'Unlink' option to add an alias to the username of the unlinked messages --- packages/rocketchat-i18n/i18n/en.i18n.json | 1 + .../server/functions/deleteUser.js | 26 +++++++++---------- .../rocketchat-lib/server/models/Messages.js | 6 +++-- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index edb255e078ed9..092484752a1b1 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -1596,6 +1596,7 @@ "Remove_last_admin": "Removing last admin", "Remove_someone_from_room": "Remove someone from the room", "Removed": "Removed", + "Removed_User": "Removed User", "Reply": "Reply", "Report_Abuse": "Report Abuse", "Report_exclamation_mark": "Report!", diff --git a/packages/rocketchat-lib/server/functions/deleteUser.js b/packages/rocketchat-lib/server/functions/deleteUser.js index 6fafafeceab78..362dc83a5014b 100644 --- a/packages/rocketchat-lib/server/functions/deleteUser.js +++ b/packages/rocketchat-lib/server/functions/deleteUser.js @@ -1,21 +1,21 @@ RocketChat.deleteUser = function(userId) { const user = RocketChat.models.Users.findOneById(userId); - const messageErasureType = RocketChat.settings.get('Message_ErasureType'); - - switch (messageErasureType) { - case 'Delete' : - RocketChat.models.Messages.removeByUserId(userId); - break; - case 'Unlink' : - const rocketCat = RocketChat.models.Users.findById('rocket.cat').fetch()[0]; - RocketChat.models.Messages.unlinkUserId(userId, rocketCat._id, rocketCat.username); - break; - } - // 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 + const messageErasureType = RocketChat.settings.get('Message_ErasureType'); + + switch (messageErasureType) { + case 'Delete' : + RocketChat.models.Messages.removeByUserId(userId); + break; + case 'Unlink' : + const rocketCat = RocketChat.models.Users.findById('rocket.cat').fetch()[0]; + const nameAlias = TAPi18n.__('Removed_User'); + RocketChat.models.Messages.unlinkUserId(userId, rocketCat._id, rocketCat.username, nameAlias); + break; + } + RocketChat.models.Subscriptions.db.findByUserId(userId).forEach((subscription) => { const room = RocketChat.models.Rooms.findOneById(subscription.rid); if (room) { diff --git a/packages/rocketchat-lib/server/models/Messages.js b/packages/rocketchat-lib/server/models/Messages.js index 4e68fbe855dc1..2bb631520ddb4 100644 --- a/packages/rocketchat-lib/server/models/Messages.js +++ b/packages/rocketchat-lib/server/models/Messages.js @@ -500,15 +500,17 @@ RocketChat.models.Messages = new class extends RocketChat.models._Base { return this.update(query, update); } - unlinkUserId(userId, newUserId, newUsername) { + unlinkUserId(userId, newUserId, newUsername, newNameAlias) { const query = { 'u._id': userId }; const update = { $set: { + 'alias': newNameAlias, 'u._id': newUserId, - 'u.username' : newUsername + 'u.username' : newUsername, + 'u.name' : undefined } };