/** * handler for begin of element * * @param resource $a_xml_parser xml parser * @param string $a_name element name * @param array $a_attribs element attributes array */ function handlerBeginTag($a_xml_parser, $a_name, $a_attribs) { global $objDefinition, $ilAccess, $tree; switch ($a_name) { case 'Settings': $this->options = array(); $this->source_id = (int) $a_attribs["source_id"]; if (ilObject::_isInTrash($this->source_id)) { throw new ilSaxParserException("Source id " . $this->source_id . " is in trash"); } $this->target_id = (int) $a_attribs["target_id"]; if (ilObject::_isInTrash($this->target_id)) { throw new ilSaxParserException("target id" . $this->target_id . " is in trash"); } $this->default_action = ilCopyWizardSettingsXMLParser::getActionForString($a_attribs["default_action"]); break; case 'Option': $id = (int) $a_attribs["id"]; if (ilObject::_isInTrash($id)) { throw new ilSaxParserException("Id {$id} is in trash"); } if (!$tree->isInTree($id)) { throw new ilSaxParserException("Id {$id} does not exist"); } $action = ilCopyWizardSettingsXMLParser::getActionForString($a_attribs["action"]); $type = ilObjectFactory::getTypeByRefId($id); switch ($action) { case ilCopyWizardOptions::COPY_WIZARD_COPY: $perm_copy = $ilAccess->checkAccess('copy', '', $id); $copy = $objDefinition->allowCopy($type); if ($perm_copy && $copy) { $this->options[$id] = array("type" => $action); } elseif ($copy && !$perm_copy) { throw new ilSaxParserException("Missing copy permission for object " . $id); } elseif (!$copy) { throw new ilSaxParserException("Copy for object " . $id . " of type " . $type . " is not supported"); } break; case ilCopyWizardOptions::COPY_WIZARD_LINK: $perm_link = $ilAccess->checkAccess('write', '', $id); $link = $objDefinition->allowLink($type); if ($perm_link && $link) { $this->options[$id] = array("type" => $action); } elseif ($copy && !$perm_link) { throw new ilSaxParserException("Missing write permission for object " . $id); } elseif (!$link) { throw new ilSaxParserException("Link for object " . $id . " of type " . $type . " is not supported"); } break; } } }
/** * copy object in repository * $sid session id * $settings_xml contains copy wizard settings following ilias_copy_wizard_settings.dtd */ function copyObject($sid, $copy_settings_xml) { $this->initAuth($sid); $this->initIlias(); if (!$this->__checkSession($sid)) { return $this->__raiseError($this->__getMessage(), $this->__getMessageCode()); } include_once './webservice/soap/classes/class.ilSoapUtils.php'; global $rbacreview, $objDefinition, $rbacsystem, $lng, $ilUser; include_once './webservice/soap/classes/class.ilCopyWizardSettingsXMLParser.php'; $xml_parser = new ilCopyWizardSettingsXMLParser($copy_settings_xml); try { $xml_parser->startParsing(); } catch (ilSaxParserException $se) { return $this->__raiseError($se->getMessage(), "Client"); } // checking copy permissions, objects and create permissions if (!$rbacsystem->checkAccess('copy', $xml_parser->getSourceId())) { return $this->__raiseError("Missing copy permissions for object with reference id " . $xml_parser->getSourceId(), 'Client'); } // checking copy permissions, objects and create permissions $source_id = $xml_parser->getSourceId(); $target_id = $xml_parser->getTargetId(); // does source object exist if (!($source_object_type = ilObjectFactory::getTypeByRefId($source_id, false))) { return $this->__raiseError('No valid source given.', 'Client'); } // does target object exist if (!($target_object_type = ilObjectFactory::getTypeByRefId($xml_parser->getTargetId(), false))) { return $this->__raiseError('No valid target given.', 'Client'); } $canAddType = $this->canAddType($source_object_type, $target_object_type, $target_id); if ($this->isFault($canAddType)) { return $canAddType; } // if is container object than clone with sub items $options = $xml_parser->getOptions(); // print_r($options); $source_object = ilObjectFactory::getInstanceByRefId($source_id); if ($source_object instanceof ilContainer) { // get client id from sid $clientid = substr($sid, strpos($sid, "::") + 2); $sessionid = str_replace("::" . $clientid, "", $sid); // call container clone return $source_object->cloneAllObject($sessionid, $clientid, $source_object_type, $target_id, $source_id, $options, true); } else { // create copy wizard settings $copy_id = ilCopyWizardOptions::_allocateCopyId(); $wizard_options = ilCopyWizardOptions::_getInstance($copy_id); $wizard_options->saveOwner($ilUser->getId()); $wizard_options->saveRoot($source_id); foreach ($options as $source_id => $option) { $wizard_options->addEntry($source_id, $option); } $wizard_options->read(); // call object clone $newObject = $source_object->cloneObject($xml_parser->getTargetId(), $copy_id); return is_object($newObject) ? $newObject->getRefId() : -1; } }
function updateGroup($sid, $ref_id, $grp_xml) { $this->initAuth($sid); $this->initIlias(); if (!$this->__checkSession($sid)) { return $this->__raiseError($this->__getMessage(), $this->__getMessageCode()); } if (!is_numeric($ref_id)) { return $this->__raiseError('No valid target id given. Please choose an existing reference id of an ILIAS category or group', 'Client'); } global $rbacsystem; if (!$rbacsystem->checkAccess('write', $ref_id, 'grp')) { return $this->__raiseError('Check access failed. No permission to edit groups', 'Server'); } // Start import include_once "./Modules/Group/classes/class.ilObjGroup.php"; if (!($grp = ilObjectFactory::getInstanceByRefId($ref_id, false))) { return $this->__raiseError('Cannot create group instance!', 'CLIENT_OBJECT_NOT_FOUND'); } if (ilObject::_isInTrash($ref_id)) { return $this->__raiseError("Object with ID {$ref_id} has been deleted.", 'CLIENT_OBJECT_DELETED'); } if (ilObjectFactory::getTypeByRefId($ref_id, false) != "grp") { return $this->__raiseError('Reference id does not point to a group!', 'CLIENT_WRONG_TYPE'); } include_once 'Modules/Group/classes/class.ilGroupXMLParser.php'; $xml_parser = new ilGroupXMLParser($grp_xml, -1); $xml_parser->setMode(ilGroupXMLParser::$UPDATE); $xml_parser->setGroup($grp); $new_ref_id = $xml_parser->startParsing(); return $new_ref_id ? $new_ref_id : "0"; }
/** * check access for ref id: expected type, permission, return object instance if returnobject is true * * @param int $ref_id * @param string or array $expected_type * @param string $permission * @param boolean $returnObject * @return Object or type */ public function checkObjectAccess($ref_id, $expected_type, $permission, $returnObject = false) { global $rbacsystem; if (!is_numeric($ref_id)) { return $this->__raiseError('No valid id given.', 'Client'); } if (!ilObject::_exists($ref_id, true)) { return $this->__raiseError('No object for id.', 'CLIENT_OBJECT_NOT_FOUND'); } if (ilObject::_isInTrash($ref_id)) { return $this->__raiseError('Object is already trashed.', 'CLIENT_OBJECT_DELETED'); } $type = ilObjectFactory::getTypeByRefId($ref_id); if (is_array($expected_type) && !in_array($type, $expected_type) || !is_array($expected_type) && $type != $expected_type) { return $this->__raiseError("Wrong type {$type} for id. Expected: " . (is_array($expected_type) ? join(",", $expected_type) : $expected_type), 'CLIENT_OBJECT_WRONG_TYPE'); } if (!$rbacsystem->checkAccess($permission, $ref_id, $type)) { return $this->__raiseError('Missing permission $permission for type $type.', 'CLIENT_OBJECT_WRONG_PERMISSION'); } if ($returnObject) { return ilObjectFactory::getInstanceByRefId($ref_id); } return $type; }