Skip to content

Commit a91b44b

Browse files
Merge pull request #11688 from nextcloud/bugfix/noid/fix-parsing-system-messages-for-federated-users
fix(federation): Fix parsing system messages for federated users
2 parents 10e6562 + ce6b67d commit a91b44b

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

Diff for: lib/Chat/Parser/SystemMessage.php

+21-7
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ protected function parseMessage(Message $chatMessage): void {
138138

139139
$participant = $chatMessage->getParticipant();
140140
if ($participant === null) {
141+
$currentActorType = null;
141142
$currentActorId = null;
142143
$currentUserIsActor = false;
143144
} elseif ($this->federationAuthenticator->isFederationRequest()) {
@@ -149,16 +150,20 @@ protected function parseMessage(Message $chatMessage): void {
149150
];
150151
}
151152

153+
$currentActorType = $participant->getAttendee()->getActorType();
154+
$currentActorId = $participant->getAttendee()->getActorId();
152155
$currentUserIsActor = isset($parsedParameters['actor']['server']) &&
153156
$parsedParameters['actor']['type'] === 'user' &&
154157
$this->currentFederatedUserDetails['user'] === $parsedParameters['actor']['id'] &&
155158
$this->currentFederatedUserDetails['server'] === $parsedParameters['actor']['server'];
156159
} elseif (!$participant->isGuest()) {
160+
$currentActorType = $participant->getAttendee()->getActorType();
157161
$currentActorId = $participant->getAttendee()->getActorId();
158162
$currentUserIsActor = $parsedParameters['actor']['type'] === 'user' &&
159163
$participant->getAttendee()->getActorType() === Attendee::ACTOR_USERS &&
160164
$currentActorId === $parsedParameters['actor']['id'];
161165
} else {
166+
$currentActorType = $participant->getAttendee()->getActorType();
162167
$currentActorId = $participant->getAttendee()->getActorId();
163168
$currentUserIsActor = $parsedParameters['actor']['type'] === 'guest' &&
164169
$participant->getAttendee()->getActorType() === 'guest' &&
@@ -227,7 +232,7 @@ protected function parseMessage(Message $chatMessage): void {
227232
$parsedMessage = $this->l->t('You left the call');
228233
}
229234
} elseif ($message === 'call_missed') {
230-
[$parsedMessage, $parsedParameters, $message] = $this->parseMissedCall($room, $parameters, $currentActorId);
235+
[$parsedMessage, $parsedParameters, $message] = $this->parseMissedCall($room, $parameters, $currentActorType === Attendee::ACTOR_FEDERATED_USERS ? null : $currentActorId);
231236
} elseif ($message === 'call_ended' || $message === 'call_ended_everyone') {
232237
[$parsedMessage, $parsedParameters] = $this->parseCall($message, $parameters, $parsedParameters);
233238
} elseif ($message === 'read_only_off') {
@@ -326,7 +331,7 @@ protected function parseMessage(Message $chatMessage): void {
326331
}
327332
} elseif ($currentUserIsActor) {
328333
$parsedMessage = $this->l->t('You added {user}');
329-
} elseif ($participant && !$participant->isGuest() && $currentActorId === $parsedParameters['user']['id']) {
334+
} elseif ($this->isCurrentParticipantChangedUser($currentActorType, $currentActorId, $parsedParameters['user'])) {
330335
$parsedMessage = $this->l->t('{actor} added you');
331336
if ($cliIsActor) {
332337
$parsedMessage = $this->l->t('An administrator added you');
@@ -346,7 +351,7 @@ protected function parseMessage(Message $chatMessage): void {
346351
$parsedMessage = $this->l->t('{actor} removed {user}');
347352
if ($currentUserIsActor) {
348353
$parsedMessage = $this->l->t('You removed {user}');
349-
} elseif ($participant && !$participant->isGuest() && $currentActorId === $parsedParameters['user']['id']) {
354+
} elseif ($this->isCurrentParticipantChangedUser($currentActorType, $currentActorId, $parsedParameters['user'])) {
350355
$parsedMessage = $this->l->t('{actor} removed you');
351356
if ($cliIsActor) {
352357
$parsedMessage = $this->l->t('An administrator removed you');
@@ -431,7 +436,7 @@ protected function parseMessage(Message $chatMessage): void {
431436
$parsedMessage = $this->l->t('{actor} promoted {user} to moderator');
432437
if ($currentUserIsActor) {
433438
$parsedMessage = $this->l->t('You promoted {user} to moderator');
434-
} elseif ($participant && !$participant->isGuest() && $currentActorId === $parsedParameters['user']['id']) {
439+
} elseif ($this->isCurrentParticipantChangedUser($currentActorType, $currentActorId, $parsedParameters['user'])) {
435440
$parsedMessage = $this->l->t('{actor} promoted you to moderator');
436441
if ($cliIsActor) {
437442
$parsedMessage = $this->l->t('An administrator promoted you to moderator');
@@ -444,7 +449,7 @@ protected function parseMessage(Message $chatMessage): void {
444449
$parsedMessage = $this->l->t('{actor} demoted {user} from moderator');
445450
if ($currentUserIsActor) {
446451
$parsedMessage = $this->l->t('You demoted {user} from moderator');
447-
} elseif ($participant && !$participant->isGuest() && $currentActorId === $parsedParameters['user']['id']) {
452+
} elseif ($this->isCurrentParticipantChangedUser($currentActorType, $currentActorId, $parsedParameters['user'])) {
448453
$parsedMessage = $this->l->t('{actor} demoted you from moderator');
449454
if ($cliIsActor) {
450455
$parsedMessage = $this->l->t('An administrator demoted you from moderator');
@@ -457,7 +462,7 @@ protected function parseMessage(Message $chatMessage): void {
457462
$parsedMessage = $this->l->t('{actor} promoted {user} to moderator');
458463
if ($currentUserIsActor) {
459464
$parsedMessage = $this->l->t('You promoted {user} to moderator');
460-
} elseif ($participant && $participant->isGuest() && $currentActorId === $parsedParameters['user']['id']) {
465+
} elseif ($this->isCurrentParticipantChangedUser($currentActorType, $currentActorId, $parsedParameters['user'])) {
461466
$parsedMessage = $this->l->t('{actor} promoted you to moderator');
462467
if ($cliIsActor) {
463468
$parsedMessage = $this->l->t('An administrator promoted you to moderator');
@@ -470,7 +475,7 @@ protected function parseMessage(Message $chatMessage): void {
470475
$parsedMessage = $this->l->t('{actor} demoted {user} from moderator');
471476
if ($currentUserIsActor) {
472477
$parsedMessage = $this->l->t('You demoted {user} from moderator');
473-
} elseif ($participant && $participant->isGuest() && $currentActorId === $parsedParameters['user']['id']) {
478+
} elseif ($this->isCurrentParticipantChangedUser($currentActorType, $currentActorId, $parsedParameters['user'])) {
474479
$parsedMessage = $this->l->t('{actor} demoted you from moderator');
475480
if ($cliIsActor) {
476481
$parsedMessage = $this->l->t('An administrator demoted you from moderator');
@@ -819,6 +824,15 @@ protected function getFileFromShare(?Participant $participant, string $shareId):
819824
return $data;
820825
}
821826

827+
protected function isCurrentParticipantChangedUser(?string $currentActorType, ?string $currentActorId, array $parameter): bool {
828+
if (isset($parameter['server']) && $currentActorType === Attendee::ACTOR_FEDERATED_USERS) {
829+
return $this->currentFederatedUserDetails['user'] === $parameter['id']
830+
&& $this->currentFederatedUserDetails['server'] === $parameter['server'];
831+
}
832+
833+
return $currentActorType === Attendee::ACTOR_USERS && $currentActorId === $parameter['id'];
834+
}
835+
822836
protected function getActorFromComment(Room $room, IComment $comment): array {
823837
return $this->getActor($room, $comment->getActorType(), $comment->getActorId());
824838
}

Diff for: lib/Federation/Proxy/TalkV1/UserConverter.php

+2
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ public function convertMessage(Room $room, array $message): array {
106106
$message = $this->convertAttendee($room, $message, 'actorType', 'actorId', 'actorDisplayName');
107107
$message = $this->convertAttendee($room, $message, 'lastEditActorType', 'lastEditActorId', 'lastEditActorDisplayName');
108108
$message = $this->convertMessageParameters($room, $message);
109+
$message['token'] = $room->getToken();
110+
109111
if (isset($message['parent'])) {
110112
$message['parent'] = $this->convertMessage($room, $message['parent']);
111113
}

0 commit comments

Comments
 (0)