From c4706737e69fcc71533b0a5aafc755fafdf675bf Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Fri, 29 Mar 2019 12:34:24 -0300 Subject: [PATCH] Small improvements to federation callbacks/hooks (#13946) * Improve federation hooks * Verify if user joined is federated --- app/federation/server/PeerClient.js | 37 ++++++++++++++++--- .../federatedResources/FederatedRoom.js | 6 +-- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/app/federation/server/PeerClient.js b/app/federation/server/PeerClient.js index 6639d2d3a3b7..7e479aa90a09 100644 --- a/app/federation/server/PeerClient.js +++ b/app/federation/server/PeerClient.js @@ -115,11 +115,11 @@ export class PeerClient { FederationEvents.on('createEvent', this.wrapEnabled(this.onCreateEvent.bind(this))); callbacks.add('afterCreateDirectRoom', this.wrapEnabled(this.afterCreateDirectRoom.bind(this)), callbacks.priority.LOW, 'federation-create-direct-room'); - callbacks.add('afterCreateRoom', this.wrapEnabled(this.afterCreateRoom.bind(this)), callbacks.priority.LOW, 'federation-join-room'); + callbacks.add('afterCreateRoom', this.wrapEnabled(this.afterCreateRoom.bind(this)), callbacks.priority.LOW, 'federation-create-room'); callbacks.add('afterSaveRoomSettings', this.wrapEnabled(this.afterSaveRoomSettings.bind(this)), callbacks.priority.LOW, 'federation-after-save-room-settings'); - callbacks.add('afterAddedToRoom', this.wrapEnabled(this.afterAddedToRoom.bind(this)), callbacks.priority.LOW, 'federation-join-room'); + callbacks.add('afterAddedToRoom', this.wrapEnabled(this.afterAddedToRoom.bind(this)), callbacks.priority.LOW, 'federation-added-to-room'); callbacks.add('beforeLeaveRoom', this.wrapEnabled(this.beforeLeaveRoom.bind(this)), callbacks.priority.LOW, 'federation-leave-room'); - callbacks.add('beforeRemoveFromRoom', this.wrapEnabled(this.beforeRemoveFromRoom.bind(this)), callbacks.priority.LOW, 'federation-leave-room'); + callbacks.add('beforeRemoveFromRoom', this.wrapEnabled(this.beforeRemoveFromRoom.bind(this)), callbacks.priority.LOW, 'federation-remove-from-room'); callbacks.add('afterSaveMessage', this.wrapEnabled(this.afterSaveMessage.bind(this)), callbacks.priority.LOW, 'federation-save-message'); callbacks.add('afterDeleteMessage', this.wrapEnabled(this.afterDeleteMessage.bind(this)), callbacks.priority.LOW, 'federation-delete-message'); callbacks.add('afterReadMessages', this.wrapEnabled(this.afterReadMessages.bind(this)), callbacks.priority.LOW, 'federation-read-messages'); @@ -317,6 +317,8 @@ export class PeerClient { federatedRoom.refreshFederation(); FederationEvents.directRoomCreated(federatedRoom, { skipPeers: [localPeerDomain] }); + + return room; } afterCreateRoom(roomOwner, room) { @@ -343,6 +345,8 @@ export class PeerClient { federatedRoom.refreshFederation(); FederationEvents.roomCreated(federatedRoom, { skipPeers: [localPeerDomain] }); + + return roomOwner; } afterSaveRoomSettings(/* room */) { @@ -359,8 +363,11 @@ export class PeerClient { const { peer: { domain: localPeerDomain } } = this; - // Check if room is federated - if (!FederatedRoom.isFederated(localPeerDomain, room, { checkUsingUsers: true })) { return users; } + // Check if room or user who joined are federated + if ((!userWhoJoined.federation || userWhoJoined.federation.peer === localPeerDomain) && + !FederatedRoom.isFederated(localPeerDomain, room)) { + return users; + } const extras = {}; @@ -408,6 +415,8 @@ export class PeerClient { } else { FederationEvents.userJoined(federatedRoom, federatedUserWhoJoined, { skipPeers: [localPeerDomain] }); } + + return users; } beforeLeaveRoom(userWhoLeft, room) { @@ -433,6 +442,8 @@ export class PeerClient { // Refresh room's federation federatedRoom.refreshFederation(); + + return userWhoLeft; } beforeRemoveFromRoom(users, room) { @@ -461,6 +472,8 @@ export class PeerClient { // Refresh room's federation federatedRoom.refreshFederation(); + + return users; } afterSaveMessage(message, room) { @@ -488,6 +501,8 @@ export class PeerClient { } else { FederationEvents.messageCreated(federatedRoom, federatedMessage, { skipPeers: [localPeerDomain] }); } + + return message; } afterDeleteMessage(message) { @@ -508,6 +523,8 @@ export class PeerClient { const federatedMessage = new FederatedMessage(localPeerDomain, message); FederationEvents.messageDeleted(federatedRoom, federatedMessage, { skipPeers: [localPeerDomain] }); + + return message; } afterReadMessages(roomId, { userId }) { @@ -531,6 +548,8 @@ export class PeerClient { const federatedUser = FederatedUser.loadByFederationId(localPeerDomain, user.federation._id); FederationEvents.messagesRead(federatedRoom, federatedUser, { skipPeers: [localPeerDomain] }); + + return roomId; } afterSetReaction(message, { user, reaction, shouldReact }) { @@ -550,6 +569,8 @@ export class PeerClient { const federatedRoom = FederatedRoom.loadByFederationId(localPeerDomain, room.federation._id); FederationEvents.messagesSetReaction(federatedRoom, federatedMessage, federatedUser, reaction, shouldReact, { skipPeers: [localPeerDomain] }); + + return message; } afterUnsetReaction(message, { user, reaction, shouldReact }) { @@ -569,6 +590,8 @@ export class PeerClient { const federatedRoom = FederatedRoom.loadByFederationId(localPeerDomain, room.federation._id); FederationEvents.messagesUnsetReaction(federatedRoom, federatedMessage, federatedUser, reaction, shouldReact, { skipPeers: [localPeerDomain] }); + + return message; } afterMuteUser(users, room) { @@ -588,6 +611,8 @@ export class PeerClient { const federatedUserWhoMuted = FederatedUser.loadByFederationId(localPeerDomain, fromUser.federation._id); FederationEvents.userMuted(federatedRoom, federatedMutedUser, federatedUserWhoMuted, { skipPeers: [localPeerDomain] }); + + return users; } afterUnmuteUser(users, room) { @@ -607,5 +632,7 @@ export class PeerClient { const federatedUserWhoUnmuted = FederatedUser.loadByFederationId(localPeerDomain, fromUser.federation._id); FederationEvents.userUnmuted(federatedRoom, federatedUnmutedUser, federatedUserWhoUnmuted, { skipPeers: [localPeerDomain] }); + + return users; } } diff --git a/app/federation/server/federatedResources/FederatedRoom.js b/app/federation/server/federatedResources/FederatedRoom.js index 06e5a0a3a855..e329ffe2f052 100644 --- a/app/federation/server/federatedResources/FederatedRoom.js +++ b/app/federation/server/federatedResources/FederatedRoom.js @@ -228,7 +228,7 @@ export class FederatedRoom extends FederatedResource { } } -FederatedRoom.loadByFederationId = function loadByFederationId(localPeerIdentifier, federationId) { +FederatedRoom.loadByFederationId = function _loadByFederationId(localPeerIdentifier, federationId) { const localRoom = Rooms.findOne({ 'federation._id': federationId }); if (!localRoom) { return; } @@ -236,13 +236,13 @@ FederatedRoom.loadByFederationId = function loadByFederationId(localPeerIdentifi return new FederatedRoom(localPeerIdentifier, localRoom); }; -FederatedRoom.loadRoomUsers = function loadRoomUsers(room) { +FederatedRoom.loadRoomUsers = function _loadRoomUsers(room) { const subscriptions = Subscriptions.findByRoomIdWhenUsernameExists(room._id, { fields: { 'u._id': 1 } }).fetch(); const userIds = subscriptions.map((s) => s.u._id); return Users.findUsersWithUsernameByIds(userIds).fetch(); }; -FederatedRoom.isFederated = function isFederated(localPeerIdentifier, room, options = {}) { +FederatedRoom.isFederated = function _isFederated(localPeerIdentifier, room, options = {}) { this.log('federated-room', `${ room._id } - isFederated?`); let isFederated = false;