diff --git a/.changeset/tall-hornets-live.md b/.changeset/tall-hornets-live.md new file mode 100644 index 0000000000000..522c6bdc00d1f --- /dev/null +++ b/.changeset/tall-hornets-live.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes an issue where a federated user's display name would be overwritten by its username diff --git a/apps/meteor/server/services/federation/domain/FederatedUser.ts b/apps/meteor/server/services/federation/domain/FederatedUser.ts index 02f08708d9db1..7d5818aa3cedb 100644 --- a/apps/meteor/server/services/federation/domain/FederatedUser.ts +++ b/apps/meteor/server/services/federation/domain/FederatedUser.ts @@ -115,7 +115,23 @@ export class FederatedUser { } public shouldUpdateDisplayName(displayName: string): boolean { - return this.internalReference.name !== displayName; + // If there is no change, then we don't need to update + if (this.internalReference.name === displayName) { + return false; + } + + // If we don't have a name yet, then use whatever we're receiving + if (!this.internalReference.name) { + return true; + } + + // If the displayName received is based on the username, then ignore it and keep the existing name instead + if (this.internalReference.username?.includes(displayName) || this.externalId.includes(displayName)) { + return false; + } + + // It's a new value and an actual display name + return true; } public getInternalId(): string { diff --git a/apps/meteor/tests/unit/server/federation/application/user/sender/UserServiceSender.spec.ts b/apps/meteor/tests/unit/server/federation/application/user/sender/UserServiceSender.spec.ts index 1c5213c91acb9..c94758214992a 100644 --- a/apps/meteor/tests/unit/server/federation/application/user/sender/UserServiceSender.spec.ts +++ b/apps/meteor/tests/unit/server/federation/application/user/sender/UserServiceSender.spec.ts @@ -238,7 +238,7 @@ describe('Federation - Application - FederationUserServiceSender', () => { existsOnlyOnProxyServer: false, }), ); - bridge.getUserProfileInformation.resolves({ displayname: 'normalizedInviterId' }); + bridge.getUserProfileInformation.resolves({ displayName: 'normalizedInviterId' }); await service.afterUserRealNameChanged('id', 'name'); expect(bridge.setUserDisplayName.called).to.be.false; @@ -252,7 +252,7 @@ describe('Federation - Application - FederationUserServiceSender', () => { _id: '_id', }), ); - bridge.getUserProfileInformation.resolves({ displayname: 'different' }); + bridge.getUserProfileInformation.resolves({ displayName: 'different' }); await service.afterUserRealNameChanged('id', 'name'); expect(bridge.setUserDisplayName.calledWith('externalInviterId', 'name')).to.be.true;