77 }
catch (\RuntimeException $e) {
78 dol_syslog(
'DescriptorRightsSyncService::sync '.$e->getMessage(), LOG_WARNING);
79 return new SyncReport(0, 0, array($e->getMessage()));
82 $conflicts = array_merge(
83 $block->detectTextConflicts(),
84 $block->detectRightsShapeConflicts($cmd->permissions)
86 if (!empty($conflicts)) {
88 'DescriptorRightsSyncService::sync refused to rewrite '.$cmd->descriptorFile.
': '
89 .implode(
'; ', array_slice($conflicts, 0, 3)),
95 $warnings = $block->detectRightsShapeWarnings($cmd->permissions);
99 }
catch (\InvalidArgumentException $e) {
100 dol_syslog(
'DescriptorRightsSyncService::sync '.$e->getMessage(), LOG_WARNING);
101 return new SyncReport(0, 0, array($e->getMessage()), $warnings);
103 if ($permissions ===
null) {
104 return new SyncReport(0, 1, array(), $warnings);
109 $producedConflicts = $block->detectRightsShapeConflicts($permissions);
110 if (!empty($producedConflicts)) {
112 'DescriptorRightsSyncService::sync refused to write an unusable right into '.$cmd->descriptorFile.
': '
113 .implode(
'; ', array_slice($producedConflicts, 0, 3)),
116 return new SyncReport(0, 0, $producedConflicts, $warnings);
119 $newBlock = $block->render($permissions);
120 if ($block->write($newBlock) < 0) {
121 return new SyncReport(0, 0, array(
'Failed to write the permissions section of '.$cmd->descriptorFile), $warnings);
124 return new SyncReport(substr_count($newBlock,
"\n"), 0, array(), $warnings);
136 $permissions = array_values($cmd->permissions);
138 if ($cmd->scope === RightsSyncCommand::SCOPE_OBJECT) {
139 if ($cmd->actionType === RightsSyncCommand::ACTION_ADD) {
140 return $this->
addObjectRights($permissions, $cmd->module, $cmd->objectName);
145 if ($cmd->actionType === RightsSyncCommand::ACTION_ADD) {
146 return $this->
addRight($permissions, $cmd->objectName, (
string) $cmd->rightLabel, (
string) $cmd->rightCrud);
149 $key = (int) $cmd->rightKey;
150 if (!array_key_exists($key, $permissions)) {
151 throw new \InvalidArgumentException(
'No permission found at index '.$key.
' of the descriptor rights array');
154 if ($cmd->actionType === RightsSyncCommand::ACTION_UPDATE) {
156 $permissions[$key] = array(
157 self::INDEX_LABEL => (
string) $cmd->rightLabel,
158 self::INDEX_OBJECT => strtolower($cmd->objectName),
159 self::INDEX_CRUD => (
string) $cmd->rightCrud,
164 unset($permissions[$key]);
165 return array_values($permissions);
176 private function addObjectRights(array $permissions,
string $module,
string $objectName): ?array
178 $target = strtolower($objectName);
179 foreach ($permissions as $right) {
180 if (isset($right[self::INDEX_OBJECT]) && strtolower((
string) $right[self::INDEX_OBJECT]) === $target) {
185 foreach (self::CRUD_LABELS as $crud => $template) {
186 $permissions[] = array(
187 self::INDEX_LABEL => sprintf($template, $objectName, ucfirst($module)),
188 self::INDEX_OBJECT => $target,
189 self::INDEX_CRUD => $crud,
231 private function addRight(array $permissions,
string $objectName,
string $label,
string $crud): array
233 $target = strtolower($objectName);
234 foreach ($permissions as $right) {
235 if (isset($right[self::INDEX_OBJECT], $right[self::INDEX_CRUD])
236 && strtolower((
string) $right[self::INDEX_OBJECT]) === $target
237 && (
string) $right[self::INDEX_CRUD] === $crud) {
238 throw new \InvalidArgumentException(
'Permission "'.$crud.
'" is already declared for object "'.$objectName.
'"');
242 $permissions[] = array(
243 self::INDEX_LABEL => $label,
244 self::INDEX_OBJECT => $target,
245 self::INDEX_CRUD => $crud,