diff --git a/docs/conversation.md b/docs/conversation.md
index d5ad7c95b8..d06ae94955 100644
--- a/docs/conversation.md
+++ b/docs/conversation.md
@@ -43,7 +43,10 @@
`attendeePin` | string | v3 | | Unique dial-in authentication code for this user, when the conversation has SIP enabled (see `sipEnabled` attribute)
`actorType` | string | v3 | | Currently known `users|guests|emails|groups|circles`
`actorId` | string | v3 | | The unique identifier for the given actor type
- `permissions` | int | v4 | | Publishing permissions for the current participant (see [constants list](constants.md#attendee-permissions))
+ `permissions` | int | v4 | | Combined final permissions for the current participant, permissions are picked in order of attendee then call then default and the first which is `Custom` will apply (see [constants list](constants.md#attendee-permissions))
+ `attendeePermissions` | int | v4 | | Dedicated permissions for the current participant, if not `Custom` this are not the resulting permissions (see [constants list](constants.md#attendee-permissions))
+ `callPermissions` | int | v4 | | Call permissions, if not `Custom` this are not the resulting permissions, if set they will reset after the end of the call (see [constants list](constants.md#attendee-permissions))
+ `defaultPermissions` | int | v4 | | Default permissions for new participants (see [constants list](constants.md#attendee-permissions))
`participantInCall` | bool | v1 | v2 | **Removed:** use `participantFlags` instead
`participantFlags` | int | v1 | | "In call" flags of the user's session making the request (only available with `in-call-flags` capability)
`readOnly` | int | v1 | | Read-only state for the current user (only available with `read-only-rooms` capability)
diff --git a/docs/participant.md b/docs/participant.md
index 544a47fe27..df1ab012c2 100644
--- a/docs/participant.md
+++ b/docs/participant.md
@@ -34,7 +34,8 @@
`participantType` | int | v1 | | Permissions level of the participant (see [constants list](constants.md#participant-types))
`lastPing` | int | v1 | | Timestamp of the last ping of the user (should be used for sorting)
`inCall` | int | v1 | | Call flags the user joined with (see [constants list](constants.md#participant-in-call-flag))
- `permissions` | int | v4 | | Publishing permissions for the participant (see [constants list](constants.md#attendee-permissions))
+ `permissions` | int | v4 | | Combined final permissions for the participant, permissions are picked in order of attendee then call then default and the first which is `Custom` will apply (see [constants list](constants.md#attendee-permissions))
+ `attendeePermissions` | int | v4 | | Dedicated permissions for the current participant, if not `Custom` this are not the resulting permissions (see [constants list](constants.md#attendee-permissions))
`sessionId` | string | v1 | v4 | `'0'` if not connected, otherwise a 512 character long string
`sessionIds` | array | v4 | | array of session ids, each are 512 character long strings, or empty if no session
`status` | string | v2 | | Optional: Only available with `includeStatus=true`, for users with a set status and when there are less than 100 participants in the conversation
diff --git a/lib/Controller/RoomController.php b/lib/Controller/RoomController.php
index 0c1af08ab3..c78e7a516c 100644
--- a/lib/Controller/RoomController.php
+++ b/lib/Controller/RoomController.php
@@ -407,6 +407,9 @@ class RoomController extends AEnvironmentAwareController {
'actorId' => '',
'attendeeId' => 0,
'permissions' => Attendee::PERMISSIONS_CUSTOM,
+ 'attendeePermissions' => Attendee::PERMISSIONS_CUSTOM,
+ 'callPermissions' => Attendee::PERMISSIONS_CUSTOM,
+ 'defaultPermissions' => Attendee::PERMISSIONS_CUSTOM,
'canEnableSIP' => false,
'attendeePin' => '',
'description' => '',
@@ -473,6 +476,9 @@ class RoomController extends AEnvironmentAwareController {
'actorId' => $attendee->getActorId(),
'attendeeId' => $attendee->getId(),
'permissions' => $currentParticipant->getPermissions(),
+ 'attendeePermissions' => $attendee->getPermissions(),
+ 'callPermissions' => $room->getCallPermissions(),
+ 'defaultPermissions' => $room->getDefaultPermissions(),
'description' => $room->getDescription(),
'listable' => $room->getListable(),
]);
@@ -957,6 +963,7 @@ class RoomController extends AEnvironmentAwareController {
'actorType' => $participant->getAttendee()->getActorType(),
'displayName' => $participant->getAttendee()->getActorId(),
'permissions' => $participant->getPermissions(),
+ 'attendeePermissions' => $participant->getAttendee()->getPermissions(),
'attendeePin' => '',
];
if ($this->talkConfig->isSIPConfigured()
diff --git a/src/components/RightSidebar/Participants/ParticipantsList/Participant/Participant.vue b/src/components/RightSidebar/Participants/ParticipantsList/Participant/Participant.vue
index 999ba92c37..f0bee548bf 100644
--- a/src/components/RightSidebar/Participants/ParticipantsList/Participant/Participant.vue
+++ b/src/components/RightSidebar/Participants/ParticipantsList/Participant/Participant.vue
@@ -111,6 +111,21 @@
:aria-label="participantSettingsAriaLabel"
:force-menu="true"
class="participant-row__actions">
+
+
+
+
+