mirror of
https://github.com/nextcloud/spreed.git
synced 2025-12-18 05:20:50 +01:00
fix(federation): Allow to remove self from a federated conversation
Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
parent
56af1c1e72
commit
7d4bcb4d85
3 changed files with 65 additions and 3 deletions
|
|
@ -156,7 +156,7 @@ class FederationController extends OCSController {
|
|||
*
|
||||
* 🚧 Draft: Still work in progress
|
||||
*
|
||||
* @return DataResponse<Http::STATUS_OK, TalkFederationInvite[], array{}>
|
||||
* @return DataResponse<Http::STATUS_OK, list<TalkFederationInvite>, array{}>
|
||||
*
|
||||
* 200: Get list of received federation invites successfully
|
||||
*/
|
||||
|
|
@ -169,8 +169,8 @@ class FederationController extends OCSController {
|
|||
}
|
||||
$invitations = $this->federationManager->getRemoteRoomShares($user);
|
||||
|
||||
/** @var TalkFederationInvite[] $data */
|
||||
$data = array_filter(array_map([$this, 'enrichInvite'], $invitations));
|
||||
/** @var list<TalkFederationInvite> $data */
|
||||
$data = array_values(array_filter(array_map([$this, 'enrichInvite'], $invitations)));
|
||||
|
||||
return new DataResponse($data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ use OCA\Talk\Exceptions\ParticipantNotFoundException;
|
|||
use OCA\Talk\Exceptions\RoomNotFoundException;
|
||||
use OCA\Talk\Exceptions\UnauthorizedException;
|
||||
use OCA\Talk\Federation\Authenticator;
|
||||
use OCA\Talk\Federation\BackendNotifier;
|
||||
use OCA\Talk\GuestManager;
|
||||
use OCA\Talk\Manager;
|
||||
use OCA\Talk\MatterbridgeManager;
|
||||
|
|
@ -125,6 +126,7 @@ class RoomController extends AEnvironmentAwareController {
|
|||
protected LoggerInterface $logger,
|
||||
protected Authenticator $federationAuthenticator,
|
||||
protected Capabilities $capabilities,
|
||||
protected BackendNotifier $federationBackendNotifier,
|
||||
) {
|
||||
parent::__construct($appName, $request);
|
||||
}
|
||||
|
|
@ -1246,6 +1248,7 @@ class RoomController extends AEnvironmentAwareController {
|
|||
* 400: Removing participant is not possible
|
||||
* 404: Participant not found
|
||||
*/
|
||||
#[FederationSupported]
|
||||
#[NoAdminRequired]
|
||||
#[RequireLoggedInParticipant]
|
||||
public function removeSelfFromRoom(): DataResponse {
|
||||
|
|
@ -1256,6 +1259,14 @@ class RoomController extends AEnvironmentAwareController {
|
|||
* @return DataResponse<Http::STATUS_OK|Http::STATUS_BAD_REQUEST|Http::STATUS_NOT_FOUND, array<empty>, array{}>
|
||||
*/
|
||||
protected function removeSelfFromRoomLogic(Room $room, Participant $participant): DataResponse {
|
||||
if ($room->getRemoteServer() !== '') {
|
||||
$this->federationBackendNotifier->sendShareDeclined(
|
||||
$room->getRemoteServer(),
|
||||
(int) $participant->getAttendee()->getRemoteId(),
|
||||
$participant->getAttendee()->getAccessToken(),
|
||||
);
|
||||
}
|
||||
|
||||
if ($room->getType() !== Room::TYPE_ONE_TO_ONE && $room->getType() !== Room::TYPE_ONE_TO_ONE_FORMER) {
|
||||
if ($participant->hasModeratorPermissions(false)
|
||||
&& $this->participantService->getNumberOfUsers($room) > 1
|
||||
|
|
|
|||
|
|
@ -156,6 +156,57 @@ Feature: federation/invite
|
|||
| room | users | participant1 | federated_user_added | You invited {federated_user} | {"actor":{"type":"user","id":"participant1","name":"participant1-displayname"},"federated_user":{"type":"user","id":"participant2","name":"participant2@localhost:8180","server":"http:\/\/localhost:8180"}} |
|
||||
| room | users | participant1 | conversation_created | You created the conversation | {"actor":{"type":"user","id":"participant1","name":"participant1-displayname"}} |
|
||||
|
||||
Scenario: User leaves after accepting
|
||||
Given the following "spreed" app config is set
|
||||
| federation_enabled | yes |
|
||||
Given user "participant1" creates room "room" (v4)
|
||||
| roomType | 3 |
|
||||
| roomName | room |
|
||||
And user "participant1" adds federated_user "participant2" to room "room" with 200 (v4)
|
||||
When user "participant1" sees the following attendees in room "room" with 200 (v4)
|
||||
| actorType | actorId | participantType |
|
||||
| users | participant1 | 1 |
|
||||
| federated_users | participant2 | 3 |
|
||||
Then user "participant1" sees the following system messages in room "room" with 200
|
||||
| room | actorType | actorId | systemMessage | message | messageParameters |
|
||||
| room | users | participant1 | federated_user_added | You invited {federated_user} | {"actor":{"type":"user","id":"participant1","name":"participant1-displayname"},"federated_user":{"type":"user","id":"participant2","name":"participant2@localhost:8180","server":"http:\/\/localhost:8180"}} |
|
||||
| room | users | participant1 | conversation_created | You created the conversation | {"actor":{"type":"user","id":"participant1","name":"participant1-displayname"}} |
|
||||
And user "participant1" adds federated_user "participant2" to room "room" with 200 (v4)
|
||||
When user "participant1" sees the following attendees in room "room" with 200 (v4)
|
||||
| actorType | actorId | participantType |
|
||||
| users | participant1 | 1 |
|
||||
| federated_users | participant2 | 3 |
|
||||
Then user "participant1" sees the following system messages in room "room" with 200
|
||||
| room | actorType | actorId | systemMessage | message | messageParameters |
|
||||
| room | users | participant1 | federated_user_added | You invited {federated_user} | {"actor":{"type":"user","id":"participant1","name":"participant1-displayname"},"federated_user":{"type":"user","id":"participant2","name":"participant2@localhost:8180","server":"http:\/\/localhost:8180"}} |
|
||||
| room | users | participant1 | conversation_created | You created the conversation | {"actor":{"type":"user","id":"participant1","name":"participant1-displayname"}} |
|
||||
And force run "OCA\Talk\BackgroundJob\RemoveEmptyRooms" background jobs
|
||||
And user "participant2" has the following invitations (v1)
|
||||
| remoteServerUrl | remoteToken | state | inviterCloudId | inviterDisplayName |
|
||||
| LOCAL | room | 0 | participant1@http://localhost:8080 | participant1-displayname |
|
||||
Then user "participant2" has the following notifications
|
||||
| app | object_type | object_id | subject | message |
|
||||
| spreed | remote_talk_share | INVITE_ID(LOCAL::room) | @participant1-displayname invited you to a federated conversation | @participant1-displayname invited you to join room on http://localhost:8080 |
|
||||
And user "participant2" accepts invite to room "room" of server "LOCAL" with 200 (v1)
|
||||
| id | name | type | remoteServer | remoteToken |
|
||||
| room | room | 3 | LOCAL | room |
|
||||
And user "participant2" has the following invitations (v1)
|
||||
| remoteServerUrl | remoteToken | state | inviterCloudId | inviterDisplayName |
|
||||
| LOCAL | room | 1 | participant1@http://localhost:8080 | participant1-displayname |
|
||||
# Remote user removes themselves after they joined
|
||||
And user "participant2" removes themselves from room "LOCAL::room" with 200 (v4)
|
||||
And user "participant2" has the following invitations (v1)
|
||||
Then user "participant2" is participant of the following rooms (v4)
|
||||
When user "participant1" sees the following attendees in room "room" with 200 (v4)
|
||||
| actorType | actorId | participantType |
|
||||
| users | participant1 | 1 |
|
||||
Then user "participant1" sees the following system messages in room "room" with 200
|
||||
| room | actorType | actorId | systemMessage | message | messageParameters |
|
||||
| room | federated_users | participant2@http://localhost:8180 | federated_user_removed | {federated_user} declined the invitation | {"actor":{"type":"user","id":"participant2","name":"participant2@localhost:8180","server":"http:\/\/localhost:8180"},"federated_user":{"type":"user","id":"participant2","name":"participant2@localhost:8180","server":"http:\/\/localhost:8180"}} |
|
||||
| room | federated_users | participant2@http://localhost:8180 | federated_user_added | {federated_user} accepted the invitation | {"actor":{"type":"user","id":"participant2","name":"participant2@localhost:8180","server":"http:\/\/localhost:8180"},"federated_user":{"type":"user","id":"participant2","name":"participant2@localhost:8180","server":"http:\/\/localhost:8180"}} |
|
||||
| room | users | participant1 | federated_user_added | You invited {federated_user} | {"actor":{"type":"user","id":"participant1","name":"participant1-displayname"},"federated_user":{"type":"user","id":"participant2","name":"participant2@localhost:8180","server":"http:\/\/localhost:8180"}} |
|
||||
| room | users | participant1 | conversation_created | You created the conversation | {"actor":{"type":"user","id":"participant1","name":"participant1-displayname"}} |
|
||||
|
||||
Scenario: Federate conversation meta data
|
||||
Given the following "spreed" app config is set
|
||||
| federation_enabled | yes |
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue