diff --git a/htdocs/core/lib/modulebuilder.lib.php b/htdocs/core/lib/modulebuilder.lib.php index c1fbaaa3e17..6703bb21b3d 100644 --- a/htdocs/core/lib/modulebuilder.lib.php +++ b/htdocs/core/lib/modulebuilder.lib.php @@ -496,12 +496,14 @@ function compareFirstValue($a, $b) * Rewriting all permissions after any actions * @param string $file filename or path * @param array $permissions permissions existing in file - * @param int|null $key key for permission needed + * @param int|null $key key for permission needed * @param array|null $right $right to update or add - * @param int $action 0 for delete, 1 for add, 2 for update + * @param string|null $objectname name of object + * @param string|null $module name of module + * @param int $action 0 for delete, 1 for add, 2 for update, -1 when delete object completly, -2 for generate rights after add * @return int 1 if OK,-1 if KO */ -function reWriteAllPermissions($file, $permissions, $key, $right, $action) +function reWriteAllPermissions($file, $permissions, $key, $right, $objectname, $module, $action) { $error = 0; $rights = array(); @@ -513,6 +515,42 @@ function reWriteAllPermissions($file, $permissions, $key, $right, $action) } elseif ($action == 2 && !empty($right)) { // update right from permissions array array_splice($permissions, array_search($permissions[$key], $permissions), 1, $right); + } elseif ($action == -1 && !empty($objectname)) { + // when delete object + $key = null; + $right = null; + foreach ($permissions as $perms) { + if ($perms[4] === strtolower($objectname)) { + array_splice($permissions, array_search($perms, $permissions), 1); + } + } + } elseif ($action == -2 && !empty($objectname) && !empty($module)) { + $key= null; + $right = null; + $objectOfRights = array(); + //check if object already declared in rights file + foreach ($permissions as $right) { + $objectOfRights[]= $right[4]; + } + if (in_array(strtolower($objectname), $objectOfRights)) { + $error++; + } else { + $permsToadd = array(); + $perms = array( + 'read' => 'Read objects of '.ucfirst($module), + 'write' => 'Create/Update objects of '.ucfirst($module), + 'delete' => 'Delete objects of '.ucfirst($module) + ); + $i = 0; + foreach ($perms as $index => $value) { + $permsToadd[$i][0] = ''; + $permsToadd[$i][1] = $value; + $permsToadd[$i][4] = strtolower($objectname); + $permsToadd[$i][5] = $index; + array_push($permissions, $permsToadd[$i]); + $i++; + } + } } else { $error++; } diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 57bd4a861d2..f8b9bfc1be3 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -352,6 +352,7 @@ WarningThemeForcedTo=Warning, theme has been forced to %s by hidden const WarningPagesWillBeDeleted=Warning, this will also delete all existing pages/containers of the website. You should export your website before, so you have a backup to re-import it later. WarningAutoValNotPossibleWhenStockIsDecreasedOnInvoiceVal=Automatic validation is disabled when option to decrease stock is set on "Invoice validation". WarningModuleNeedRefrech = Module %s has been disabled. Don't forget to enable it +WarningPermissionAlreadyExist=Existing permissions for this object # Validate RequireValidValue = Value not valid diff --git a/htdocs/langs/fr_FR/errors.lang b/htdocs/langs/fr_FR/errors.lang index c009fd777ec..bfdf0de44bd 100644 --- a/htdocs/langs/fr_FR/errors.lang +++ b/htdocs/langs/fr_FR/errors.lang @@ -350,6 +350,7 @@ WarningThemeForcedTo=Attention, le choix du thème a été forcé à %s WarningPagesWillBeDeleted=Attention, cela supprimera également toutes les pages/conteneurs existants du site. Vous devriez exporter votre site Web avant, afin d'avoir une sauvegarde pour le réimporter plus tard. WarningAutoValNotPossibleWhenStockIsDecreasedOnInvoiceVal=La validation automatique est désactivée lorsque l'option de diminution du stock est définie sur "Validation de la facture". WarningModuleNeedRefrech = Le module %s a été désactivé. N'oubliez pas de le réactiver +WarningPermissionAlreadyExist=Permissions déja éxistante pour cet objet # Validate RequireValidValue = Valeur non valide diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 258dc229aeb..6a18b405ca2 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -1283,41 +1283,11 @@ if ($dirins && $action == 'initobject' && $module && $objectname) { } } $rights = $moduleobj->rights; - $obj = array(); - $existRight = 0; - foreach ($rights as $right) { - $obj[]= $right[4]; - } + $moduledescriptorfile = $destdir.'/core/modules/mod'.$module.'.class.php'; - if (in_array(strtolower($firstobjectname), $obj)) { - $rightToadd = preg_replace('/myobject/', $objectname, $rightToadd); - } - if (in_array(strtolower($objectname), $obj)) { - $existRight++; - setEventMessages($langs->trans("PermissionAlreadyExist", $langs->transnoentities($objectname)), null, 'errors'); - } - if ($objectname != $firstobjectname) { - $rightToadd = " - \$this->rights[\$r][0] = \$this->numero . sprintf('%02d', \$r + 1); - \$this->rights[\$r][1] = 'Read objects of ".$module."'; - \$this->rights[\$r][4] = '".strtolower($objectname)."'; - \$this->rights[\$r][5] = 'read'; - \$r++; - \$this->rights[\$r][0] = \$this->numero . sprintf('%02d', \$r + 1); - \$this->rights[\$r][1] = 'Create/Update objects of ".$module."'; - \$this->rights[\$r][4] = '".strtolower($objectname)."'; - \$this->rights[\$r][5] = 'write'; - \$r++; - \$this->rights[\$r][0] = \$this->numero . sprintf('%02d', \$r + 1); - \$this->rights[\$r][1] = 'Delete objects of ".$module."'; - \$this->rights[\$r][4] = '".strtolower($objectname)."'; - \$this->rights[\$r][5] = 'delete'; - \$r++; - "; - $moduledescriptorfile = $destdir.'/core/modules/mod'.$module.'.class.php'; - if (!$existRight) { - dolReplaceInFile($moduledescriptorfile, array('/* END MODULEBUILDER PERMISSIONS */' => '/*'.strtoupper($objectname).'*/'.$rightToadd."/*END ".strtoupper($objectname).'*/'."\n\t\t".'/* END MODULEBUILDER PERMISSIONS */')); - } + $generatePerms = reWriteAllPermissions($moduledescriptorfile, $rights, null, null, $objectname, $module, -2); + if ($generatePerms < 0) { + setEventMessages($langs->trans("WarningPermissionAlreadyExist", $langs->transnoentities($objectname)), null, 'warnings'); } } @@ -1923,26 +1893,12 @@ if ($dirins && $action == 'confirm_deleteobject' && $objectname) { $check = dolReplaceInFile($moduledescriptorfile, array('/*LEFTMENU '.strtoupper($objectname).'*/'."\n" => '',"\t\t".'/*END LEFTMENU '.strtoupper($objectname).'*/'."\n" => '')); // regenerate permissions and delete them - $rights = " - \$this->rights[\$r][0] = \$this->numero . sprintf('%02d', \$r + 1); - \$this->rights[\$r][1] = 'Read objects of ".$module."'; - \$this->rights[\$r][4] = '".strtolower($objectname)."'; - \$this->rights[\$r][5] = 'read'; - \$r++; - \$this->rights[\$r][0] = \$this->numero . sprintf('%02d', \$r + 1); - \$this->rights[\$r][1] = 'Create/Update objects of ".$module."'; - \$this->rights[\$r][4] = '".strtolower($objectname)."'; - \$this->rights[\$r][5] = 'write'; - \$r++; - \$this->rights[\$r][0] = \$this->numero . sprintf('%02d', \$r + 1); - \$this->rights[\$r][1] = 'Delete objects of ".$module."'; - \$this->rights[\$r][4] = '".strtolower($objectname)."'; - \$this->rights[\$r][5] = 'delete'; - \$r++; - "; - - $deleteright = dolReplaceInFile($moduledescriptorfile, array('/*'.strtoupper($objectname).'*/' => '', $rights => '', "/*END ".strtoupper($objectname).'*/'."\n\t\t" => "\n\t\t")); - + $permissions = $moduleobj->rights; + reWriteAllPermissions($moduledescriptorfile, $permissions, null, null, $objectname, '', -1); + clearstatcache(true); + if (function_exists('opcache_invalidate')) { + opcache_reset(); + } $resultko = 0; foreach ($filetodelete as $tmpfiletodelete) { $resulttmp = dol_delete_file($dir.'/'.$tmpfiletodelete, 0, 0, 1); @@ -2137,7 +2093,7 @@ if ($dirins && $action == 'addright' && !empty($module) && empty($cancel)) { $moduledescriptorfile = $dirins.'/'.strtolower($module).'/core/modules/mod'.$module.'.class.php'; //rewriting all permissions after add a right - reWriteAllPermissions($moduledescriptorfile, $permissions, $key, $rightToAdd, 1); + reWriteAllPermissions($moduledescriptorfile, $permissions, $key, $rightToAdd, '', '', 1); setEventMessages($langs->trans('PermissionAddedSuccesfuly'), null); if (isModEnabled(strtolower($module))) { @@ -2250,7 +2206,7 @@ if ($dirins && GETPOST('action') == 'update_right' && GETPOST('modifyright')&& e $moduledescriptorfile = $dirins.'/'.strtolower($module).'/core/modules/mod'.$module.'.class.php'; // rewriting all permissions after update permission needed - reWriteAllPermissions($moduledescriptorfile, $permissions, $key, $rightUpdated, 2); + reWriteAllPermissions($moduledescriptorfile, $permissions, $key, $rightUpdated, '', '', 2); setEventMessages($langs->trans('PermissionUpdatedSuccesfuly'), null); @@ -2286,7 +2242,7 @@ if ($dirins && $action == 'confirm_deleteright' && !empty($module) && GETPOST('p $moduledescriptorfile = $dirins.'/'.strtolower($module).'/core/modules/mod'.$module.'.class.php'; // rewriting all permissions - reWriteAllPermissions($moduledescriptorfile, $permissions, $key, '', 0); + reWriteAllPermissions($moduledescriptorfile, $permissions, $key, null, '', '', 0); // check if module is enabled if (isModEnabled(strtolower($module))) {