/** * Parse * @return */ public function parse() { global $rbacreview, $objDefinition; $this->initColumns(); $perms = array(); $roles = array(); if (!count($this->getVisibleRoles())) { return $this->setData(array()); } // Read operations of role $operations = array(); foreach ($this->getVisibleRoles() as $role_data) { $operations[$role_data['obj_id']] = $rbacreview->getActiveOperationsOfRole($this->getRefId(), $role_data['obj_id']); } $counter = 0; // Local policy if (ilPermissionGUI::hasContainerCommands($this->getObjType())) { $roles = array(); $local_roles = $rbacreview->getRolesOfObject($this->getRefId()); foreach ($this->getVisibleRoles() as $role_id => $role_data) { $roles[$role_data['obj_id']] = array('protected' => $role_data['protected'], 'local_policy' => in_array($role_data['obj_id'], $local_roles), 'isLocal' => $this->getRefId() == $role_data['parent'] && $role_data['assign'] == 'y'); } $perms[$counter]['roles'] = $roles; $perms[$counter]['show_local_policy_row'] = 1; $counter++; } // Protect permissions if (ilPermissionGUI::hasContainerCommands($this->getObjType())) { $roles = array(); foreach ($this->getVisibleRoles() as $role_id => $role_data) { $roles[$role_data['obj_id']] = array('protected_allowed' => $rbacreview->isAssignable($role_data['obj_id'], $this->getRefId()), 'protected_status' => $rbacreview->isProtected($role_data['parent'], $role_data['obj_id'])); } $perms[$counter]['roles'] = $roles; $perms[$counter]['show_protected_row'] = 1; $counter++; } // Block role if (ilPermissionGUI::hasContainerCommands($this->getObjType())) { $perms[$counter++]['show_block_row'] = 1; } if (ilPermissionGUI::hasContainerCommands($this->getObjType())) { $perms[$counter++]['show_start_info'] = true; } // no creation permissions $no_creation_operations = array(); foreach ($rbacreview->getOperationsByTypeAndClass($this->getObjType(), 'object') as $operation) { $this->addActiveOperation($operation); $no_creation_operations[] = $operation; $roles = array(); foreach ($this->getVisibleRoles() as $role_data) { $roles[$role_data['obj_id']] = array('protected' => $role_data['protected'], 'permission_set' => in_array($operation, (array) $operations[$role_data['obj_id']])); } $op = $rbacreview->getOperation($operation); $perms[$counter]['roles'] = $roles; $perms[$counter]['perm'] = $op; $counter++; } /* * Select all */ if ($no_creation_operations) { $perms[$counter]['show_select_all'] = 1; $perms[$counter]['ops'] = $no_creation_operations; $perms[$counter]['subtype'] = 'nocreation'; $counter++; } if ($objDefinition->isContainer($this->getObjType())) { $perms[$counter++]['show_create_info'] = true; } // Get creatable objects $objects = $objDefinition->getCreatableSubObjects($this->getObjType()); $ops_ids = ilRbacReview::lookupCreateOperationIds(array_keys($objects)); $creation_operations = array(); foreach ($objects as $type => $info) { $ops_id = $ops_ids[$type]; if (!$ops_id) { continue; } $this->addActiveOperation($ops_id); $creation_operations[] = $ops_id; $roles = array(); foreach ($this->getVisibleRoles() as $role_data) { $roles[$role_data['obj_id']] = array('protected' => $role_data['protected'], 'permission_set' => in_array($ops_id, (array) $operations[$role_data['obj_id']])); } $op = $rbacreview->getOperation($ops_id); $perms[$counter]['roles'] = $roles; $perms[$counter]['perm'] = $op; $counter++; } // Select all if (count($creation_operations)) { $perms[$counter]['show_select_all'] = 1; $perms[$counter]['ops'] = $creation_operations; $perms[$counter]['subtype'] = 'creation'; $counter++; } $this->setData($perms); }
/** * Save permissions * @return */ protected function savePermissions() { global $rbacreview, $objDefinition, $rbacadmin; include_once './Services/AccessControl/classes/class.ilObjectRolePermissionTableGUI.php'; $table = new ilObjectRolePermissionTableGUI($this, 'perm', $this->getCurrentObject()->getRefId()); $roles = $this->applyRoleFilter($rbacreview->getParentRoleIds($this->getCurrentObject()->getRefId()), $table->getFilterItemByPostVar('role')->getValue()); // Log history include_once "Services/AccessControl/classes/class.ilRbacLog.php"; $log_old = ilRbacLog::gatherFaPa($this->getCurrentObject()->getRefId(), array_keys((array) $roles)); # all possible create permissions $possible_ops_ids = $rbacreview->getOperationsByTypeAndClass($this->getCurrentObject()->getType(), 'create'); # createable (activated) create permissions $create_types = $objDefinition->getCreatableSubObjects($this->getCurrentObject()->getType()); $createable_ops_ids = ilRbacReview::lookupCreateOperationIds(array_keys((array) $create_types)); foreach ((array) $roles as $role => $role_data) { if ($role_data['protected']) { continue; } $new_ops = array_keys((array) $_POST['perm'][$role]); $old_ops = $rbacreview->getRoleOperationsOnObject($role, $this->getCurrentObject()->getRefId()); // Add operations which were enabled and are not activated. foreach ($possible_ops_ids as $create_ops_id) { if (in_array($create_ops_id, $createable_ops_ids)) { continue; } if (in_array($create_ops_id, $old_ops)) { $new_ops[] = $create_ops_id; } } $rbacadmin->revokePermission($this->getCurrentObject()->getRefId(), $role); $rbacadmin->grantPermission($role, array_unique($new_ops), $this->getCurrentObject()->getRefId()); } // Handle local policies. $rolf_id = $this->initRoleFolder(count((array) $_POST['inherit']) ? true : false); $relevant_roles = array_intersect($rbacreview->getRolesOfRoleFolder($rolf_id), array_keys($roles)); if (ilPermissionGUI::hasContainerCommands($this->getCurrentObject()->getType())) { foreach ($roles as $role) { // No action for local roles if ($role['parent'] == $rolf_id and $role['assign'] == 'y') { continue; } // Nothing for protected roles if ($role['protected']) { continue; } // Stop local policy if ($role['parent'] == $rolf_id and !isset($_POST['inherit'][$role['obj_id']])) { $role_obj = ilObjectFactory::getInstanceByObjId($role['obj_id']); $role_obj->setParent($rolf_id); $role_obj->delete(); continue; } // Add local policy if ($role['parent'] != $rolf_id and isset($_POST['inherit'][$role['obj_id']])) { $rbacadmin->copyRoleTemplatePermissions($role['obj_id'], $role['parent'], $rolf_id, $role['obj_id']); $rbacadmin->assignRoleToFolder($role['obj_id'], $rolf_id, 'n'); } } } // Protect permissions if (ilPermissionGUI::hasContainerCommands($this->getCurrentObject()->getType())) { foreach ($roles as $role) { if ($rbacreview->isAssignable($role['obj_id'], $rolf_id)) { if (isset($_POST['protect'][$role['obj_id']]) and !$rbacreview->isProtected($rolf_id, $role['obj_id'])) { $rbacadmin->setProtected($rolf_id, $role['obj_id'], 'y'); } elseif (!isset($_POST['protect'][$role['obj_id']]) and $rbacreview->isProtected($rolf_id, $role['obj_id'])) { $rbacadmin->setProtected($rolf_id, $role['obj_id'], 'n'); } } } } $log_new = ilRbacLog::gatherFaPa($this->getCurrentObject()->getRefId(), array_keys((array) $roles)); $log = ilRbacLog::diffFaPa($log_old, $log_new); ilRbacLog::add(ilRbacLog::EDIT_PERMISSIONS, $this->getCurrentObject()->getRefId(), $log); if (count((array) $_POST['block'])) { return $this->showConfirmBlockRole(array_keys($_POST['block'])); } ilUtil::sendSuccess($this->lng->txt('settings_saved'), true); #$this->ctrl->redirect($this,'perm'); $this->perm(); }