20 private static array $permissionsByChatTypes;
21 private static array $permissionsByUserTypes;
22 private static array $groupDefinitions;
24 private bool $jsonFormat;
29 $this->jsonFormat = $jsonFormat;
30 $this->converter =
new Converter(Converter::KEYS | Converter::VALUES | Converter::RECURSIVE | Converter::TO_CAMEL | Converter::LC_FIRST);
35 if (!isset(self::$permissionsByChatTypes))
37 $this->loadByChatTypes();
40 if ($this->jsonFormat)
42 return $this->converter->process(self::$permissionsByChatTypes);
45 return self::$permissionsByChatTypes;
48 private function loadByChatTypes(): void
50 $this->loadByChatTypesInternal();
51 $this->loadByChatTypesExternal();
52 $default = self::$permissionsByChatTypes[self::TYPE_DEFAULT];
54 foreach (self::$permissionsByChatTypes as
$code => $value)
56 self::$permissionsByChatTypes[
$code] = array_merge($default, $value);
60 private function loadByChatTypesInternal(): void
63 $roleForPostToGeneral = Chat::ROLE_MEMBER;
64 if ($generalChat !==
null)
66 $roleForPostToGeneral = $generalChat->getManageMessages();
70 $roleForPostToGeneralChannel = Chat::ROLE_MEMBER;
71 if ($generalChannel !==
null)
73 $roleForPostToGeneralChannel = $generalChannel->getManageMessages();
76 $default = $this->getDefaultByChatTypes();
78 self::$permissionsByChatTypes[self::TYPE_DEFAULT] = $default;
80 self::$permissionsByChatTypes[ExtendedType::Private->value] = [
81 Action::ChangeAvatar->value => Chat::ROLE_NONE,
82 Action::Rename->value => Chat::ROLE_NONE,
83 Action::Mute->value => Chat::ROLE_NONE,
84 Action::Leave->value => Chat::ROLE_NONE,
85 Action::LeaveOwner->value => Chat::ROLE_NONE,
86 Action::Kick->value => Chat::ROLE_NONE,
87 Action::UserList->value => Chat::ROLE_NONE,
88 Action::ChangeMessagesAutoDeleteDelay->value => Chat::ROLE_MEMBER,
89 Action::ChangeRight->value => Chat::ROLE_NONE,
90 Action::ChangeOwner->value => Chat::ROLE_NONE,
91 Action::ChangeManagers->value => Chat::ROLE_NONE,
94 self::$permissionsByChatTypes[ExtendedType::General->value] = [
95 Action::ChangeAvatar->value => Chat::ROLE_NONE,
96 Action::Rename->value => Chat::ROLE_NONE,
97 Action::Extend->value => Chat::ROLE_NONE,
98 Action::Leave->value => Chat::ROLE_NONE,
99 Action::LeaveOwner->value => Chat::ROLE_NONE,
100 Action::Send->value => $roleForPostToGeneral,
101 Action::DeleteOthersMessage->value => Chat::ROLE_MANAGER,
104 self::$permissionsByChatTypes[ExtendedType::GeneralChannel->value] = [
105 Action::ChangeAvatar->value => Chat::ROLE_NONE,
106 Action::Rename->value => Chat::ROLE_NONE,
107 Action::Extend->value => Chat::ROLE_NONE,
108 Action::Leave->value => Chat::ROLE_NONE,
109 Action::LeaveOwner->value => Chat::ROLE_NONE,
110 Action::Send->value => $roleForPostToGeneralChannel,
111 Action::DeleteOthersMessage->value => Chat::ROLE_MANAGER,
112 Action::Call->value => Chat::ROLE_NONE,
113 Action::CreateTask->value => Chat::ROLE_NONE,
114 Action::CreateMeeting->value => Chat::ROLE_NONE,
117 self::$permissionsByChatTypes[ExtendedType::Copilot->value] = [
118 Action::Call->value => Chat::ROLE_NONE,
119 Action::Delete->value => Chat::ROLE_OWNER,
120 Action::LeaveOwner->value => Chat::ROLE_NONE,
123 self::$permissionsByChatTypes[ExtendedType::Announcement->value] = [
124 Action::LeaveOwner->value => Chat::ROLE_OWNER,
125 Action::Send->value => Chat::ROLE_MANAGER,
128 self::$permissionsByChatTypes[ExtendedType::Channel->value] = [
129 Action::Call->value => Chat::ROLE_NONE,
130 Action::CreateTask->value => Chat::ROLE_NONE,
131 Action::CreateMeeting->value => Chat::ROLE_NONE,
132 Action::DeleteOthersMessage->value => Chat::ROLE_MANAGER,
133 Action::Update->value => Chat::ROLE_OWNER,
134 Action::Delete->value => Chat::ROLE_OWNER,
137 self::$permissionsByChatTypes[ExtendedType::OpenChannel->value] = [
138 Action::Call->value => Chat::ROLE_NONE,
139 Action::CreateTask->value => Chat::ROLE_NONE,
140 Action::CreateMeeting->value => Chat::ROLE_NONE,
141 Action::DeleteOthersMessage->value => Chat::ROLE_MANAGER,
142 Action::Update->value => Chat::ROLE_OWNER,
143 Action::Delete->value => Chat::ROLE_OWNER,
146 self::$permissionsByChatTypes[ExtendedType::Comment->value] = [
147 Action::Call->value => Chat::ROLE_NONE,
148 Action::Extend->value => Chat::ROLE_NONE,
149 Action::DeleteOthersMessage->value => Chat::ROLE_MANAGER,
150 Action::Delete->value => Chat::ROLE_OWNER,
151 Action::PinChat->value => Chat::ROLE_NONE,
152 Action::HideChat->value => Chat::ROLE_NONE,
155 self::$permissionsByChatTypes[ExtendedType::Support24Notifier->value] = [
156 Action::ChangeAvatar->value => Chat::ROLE_NONE,
157 Action::Rename->value => Chat::ROLE_NONE,
158 Action::LeaveOwner->value => Chat::ROLE_NONE,
161 self::$permissionsByChatTypes[ExtendedType::Support24Question->value] = [
162 Action::ChangeAvatar->value => Chat::ROLE_NONE,
163 Action::Extend->value => Chat::ROLE_NONE,
164 Action::Call->value => Chat::ROLE_NONE,
165 Action::Mute->value => Chat::ROLE_NONE,
166 Action::Leave->value => Chat::ROLE_NONE,
167 Action::LeaveOwner->value => Chat::ROLE_NONE,
168 Action::UserList->value => Chat::ROLE_NONE,
171 self::$permissionsByChatTypes[ExtendedType::NetworkDialog->value] =
172 self::$permissionsByChatTypes[ExtendedType::Support24Question->value]
175 self::$permissionsByChatTypes[ExtendedType::Sonet->value] = [
176 Action::ChangeAvatar->value => Chat::ROLE_NONE,
177 Action::Rename->value => Chat::ROLE_NONE,
178 Action::Extend->value => Chat::ROLE_NONE,
179 Action::Leave->value => Chat::ROLE_NONE,
180 Action::LeaveOwner->value => Chat::ROLE_NONE,
181 Action::ChangeMessagesAutoDeleteDelay->value => Chat::ROLE_MANAGER,
184 self::$permissionsByChatTypes[ExtendedType::Collab->value] = [
185 Action::ChangeAvatar->value => Chat::ROLE_NONE,
186 Action::Rename->value => Chat::ROLE_NONE,
187 Action::Update->value => Chat::ROLE_OWNER,
188 Action::Delete->value => Chat::ROLE_OWNER,
189 Action::LeaveOwner->value => Chat::ROLE_NONE,
190 Action::UpdateInviteLink->value => Chat::ROLE_OWNER,
191 Action::CreateDocumentSign->value => Chat::ROLE_MEMBER,
192 Action::CreateCalendarSlots->value => Chat::ROLE_MEMBER,
193 Action::ChangeMessagesAutoDeleteDelay->value => Chat::ROLE_MANAGER,
196 self::$permissionsByChatTypes[ExtendedType::Tasks->value] = [
197 Action::ChangeMessagesAutoDeleteDelay->value => Chat::ROLE_MANAGER,
200 self::$permissionsByChatTypes[ExtendedType::Calendar->value] = [
201 Action::ChangeMessagesAutoDeleteDelay->value => Chat::ROLE_MANAGER,
204 self::$permissionsByChatTypes[ExtendedType::Crm->value] = [
205 Action::ChangeAvatar->value => Chat::ROLE_NONE,
206 Action::Rename->value => Chat::ROLE_NONE,
207 Action::LeaveOwner->value => Chat::ROLE_NONE,
210 self::$permissionsByChatTypes[ExtendedType::Call->value] = [
211 Action::Extend->value => Chat::ROLE_NONE,
212 Action::Call->value => Chat::ROLE_NONE,
213 Action::Mute->value => Chat::ROLE_NONE,
214 Action::Leave->value => Chat::ROLE_NONE,
215 Action::LeaveOwner->value => Chat::ROLE_NONE,
218 self::$permissionsByChatTypes[ExtendedType::Chat->value] = [
219 Action::Update->value => Chat::ROLE_OWNER,
220 Action::Delete->value => Chat::ROLE_OWNER,
221 Action::ChangeMessagesAutoDeleteDelay->value => Chat::ROLE_MANAGER,
224 self::$permissionsByChatTypes[ExtendedType::OpenChat->value] = [
225 Action::Update->value => Chat::ROLE_OWNER,
226 Action::Delete->value => Chat::ROLE_OWNER,
227 Action::ChangeMessagesAutoDeleteDelay->value => Chat::ROLE_MANAGER,
230 self::$permissionsByChatTypes[ExtendedType::Videoconference->value] = [
231 Action::Update->value => Chat::ROLE_OWNER,
232 Action::Delete->value => Chat::ROLE_OWNER,
235 self::$permissionsByChatTypes[ExtendedType::Lines->value] = [
236 Action::LeaveOwner->value => Chat::ROLE_NONE,
237 Action::Call->value => Chat::ROLE_NONE,
238 Action::ChangeOwner->value => Chat::ROLE_NONE,
239 Action::ChangeManagers->value => Chat::ROLE_NONE,
240 Action::Mute->value => Chat::ROLE_NONE,
241 Action::PinChat->value => Chat::ROLE_NONE,
242 Action::HideChat->value => Chat::ROLE_NONE,
246 private function getDefaultByChatTypes():
array
249 Action::ChangeAvatar->value => Chat::ROLE_MEMBER,
250 Action::Rename->value => Chat::ROLE_MEMBER,
251 Action::Extend->value => Chat::ROLE_MEMBER,
252 Action::Call->value => Chat::ROLE_MEMBER,
253 Action::Mute->value => Chat::ROLE_MEMBER,
254 Action::Leave->value => Chat::ROLE_MEMBER,
255 Action::LeaveOwner->value => Chat::ROLE_MEMBER,
256 Action::Kick->value => Chat::ROLE_GUEST,
257 Action::Send->value => Chat::ROLE_MEMBER,
258 Action::UserList->value => Chat::ROLE_MEMBER,
259 Action::CreateTask->value => Chat::ROLE_MEMBER,
260 Action::CreateMeeting->value => Chat::ROLE_MEMBER,
261 Action::DeleteOthersMessage->value => Chat::ROLE_NONE,
262 Action::Update->value => Chat::ROLE_NONE,
263 Action::Delete->value => Chat::ROLE_NONE,
264 Action::UpdateInviteLink->value => Chat::ROLE_NONE,
265 Action::CreateDocumentSign->value => Chat::ROLE_NONE,
266 Action::CreateCalendarSlots->value => Chat::ROLE_NONE,
267 Action::ChangeMessagesAutoDeleteDelay->value => Chat::ROLE_NONE,
268 Action::PinChat->value => Chat::ROLE_MEMBER,
269 Action::HideChat->value => Chat::ROLE_MEMBER,
270 Action::ChangeRight->value => Chat::ROLE_GUEST,
271 Action::ChangeOwner->value => Chat::ROLE_GUEST,
272 Action::ChangeManagers->value => Chat::ROLE_GUEST,
276 private function loadByChatTypesExternal(): void
279 foreach ($externalTypes as $externalType =>
$config)
281 if (!empty(
$config->permissions))
283 self::$permissionsByChatTypes[$externalType] =
$config->permissions;
290 if (isset(self::$permissionsByUserTypes))
292 if ($this->jsonFormat)
294 return $this->converter->process(self::$permissionsByUserTypes);
297 return self::$permissionsByUserTypes;
300 self::$permissionsByUserTypes = [
301 UserType::USER->value => [
302 GlobalAction::GetChannels->value =>
true,
303 GlobalAction::CreateChannel->value =>
true,
304 GlobalAction::CreateConference->value =>
true,
305 GlobalAction::CreateCopilot->value =>
true,
306 GlobalAction::CreateAiAssistant->value =>
true,
307 GlobalAction::CreateChat->value =>
true,
308 GlobalAction::GetMarket->value =>
true,
309 GlobalAction::GetOpenlines->value =>
true,
310 GlobalAction::CreateCollab->value =>
true,
311 GlobalAction::LeaveCollab->value =>
true,
314 UserType::EXTRANET->value => [
315 GlobalAction::GetChannels->value =>
false,
316 GlobalAction::CreateChannel->value =>
false,
317 GlobalAction::CreateConference->value =>
false,
318 GlobalAction::CreateCopilot->value =>
false,
319 GlobalAction::CreateAiAssistant->value =>
false,
320 GlobalAction::CreateChat->value =>
false,
321 GlobalAction::GetMarket->value =>
false,
322 GlobalAction::GetOpenlines->value =>
false,
323 GlobalAction::CreateCollab->value =>
false,
324 GlobalAction::LeaveCollab->value =>
false,
327 UserType::COLLABER->value => [
328 GlobalAction::GetChannels->value =>
false,
329 GlobalAction::CreateChannel->value =>
false,
330 GlobalAction::CreateConference->value =>
false,
331 GlobalAction::CreateCopilot->value =>
true,
332 GlobalAction::CreateAiAssistant->value =>
true,
333 GlobalAction::CreateChat->value =>
false,
334 GlobalAction::GetMarket->value =>
false,
335 GlobalAction::GetOpenlines->value =>
false,
336 GlobalAction::CreateCollab->value =>
false,
337 GlobalAction::LeaveCollab->value =>
false,
342 if ($this->jsonFormat)
344 return $this->converter->process(self::$permissionsByUserTypes);
347 return self::$permissionsByUserTypes;
352 $permissionService =
new static(
false);
353 $permissions = $permissionService->getByUserTypes();
355 return $permissions[
$type->value][
$action->value] ??
true;
363 return self::canDoByUserType(
$user->getType(),
$action);
368 if (
$action === GlobalAction::CreateChat && is_array($target))
370 $type = $target[
'TYPE'] ?? Chat::IM_TYPE_CHAT;
371 $entityType = $target[
'ENTITY_ID'] ??
null;
375 return GlobalAction::CreateConference;
378 if (
$type === Chat::IM_TYPE_CHANNEL ||
$type === Chat::IM_TYPE_OPEN_CHANNEL)
380 return GlobalAction::CreateChannel;
383 if (
$type === Chat::IM_TYPE_AI_ASSISTANT)
385 return GlobalAction::CreateAiAssistant;
388 if (
$type === Chat::IM_TYPE_COPILOT)
390 return GlobalAction::CreateCopilot;
393 return GlobalAction::CreateChat;
401 $permissionService =
new static(
false);
402 $permissions = $permissionService->getByChatTypes();
403 $permissionsByType = $permissions[
$type] ?? $permissions[self::TYPE_DEFAULT];
405 return $permissionsByType[
$action->value] ?? Chat::ROLE_GUEST;
410 $globalAction =
$action->getRelatedGlobalAction();
412 if (!isset($globalAction))
417 return self::canDoGlobalAction(
$userId, $globalAction, $target);
422 if (isset(self::$groupDefinitions))
424 if ($this->jsonFormat)
426 return $this->converter->process(self::$groupDefinitions);
429 return self::$groupDefinitions;
432 self::$groupDefinitions = ActionGroup::getDefinitions();
434 if ($this->jsonFormat)
436 return $this->converter->process(self::$groupDefinitions);
439 return self::$groupDefinitions;
444 $channelDefaultPermissions = ActionGroup::getDefaultPermissions();
445 $channelDefaultPermissions[ActionGroup::ManageMessages->value] = Chat::ROLE_MANAGER;
446 $channelDefaultPermissions[ActionGroup::ManageUi->value] = Chat::ROLE_MANAGER;
448 $defaultPermissionsByTypes = [
449 self::TYPE_DEFAULT => ActionGroup::getDefaultPermissions(),
450 ExtendedType::Channel->value => $channelDefaultPermissions,
451 ExtendedType::OpenChannel->value => $channelDefaultPermissions,
454 if ($this->jsonFormat)
456 return $this->converter->process($defaultPermissionsByTypes);
459 return $defaultPermissionsByTypes;
469 if (!is_int($target))
474 $currentUserId = $targetChat->getContext()->getUserId();
476 if ($target === $currentUserId)
478 if ($currentUserId === $targetChat->getAuthorId())
480 return Action::LeaveOwner;
483 return Action::Leave;
489 public static function compareRole(
string $userRole,
string $needRole): bool
491 if ($needRole === Chat::ROLE_NONE)
496 $ascendingRoles = [Chat::ROLE_GUEST, Chat::ROLE_MEMBER, Chat::ROLE_MANAGER, Chat::ROLE_OWNER];
497 $userRolePos = array_search($userRole, $ascendingRoles,
true);
498 $needRolePos = array_search($needRole, $ascendingRoles,
true);
500 if ($userRolePos ===
false || $needRolePos ===
false)
505 return $userRolePos >= $needRolePos;