86 $this->results = array();
93 $this->condition =
true;
96 $this->obj_id_cache = array();
97 $this->obj_type_cache = array();
98 $this->obj_tree_cache = array();
109 public function storeAccessResult($a_permission, $a_cmd, $a_ref_id, $a_access_granted, $a_user_id =
"", $a_info =
"")
115 if ($a_user_id ==
"") {
126 $this->results[$a_ref_id][$a_permission][$a_cmd][$a_user_id] =
127 array(
"granted" => $a_access_granted,
"info" => $a_info,
130 $this->current_result_element = array($a_access_granted,$a_ref_id,$a_permission,$a_cmd,$a_user_id);
131 $this->last_result = $this->results[$a_ref_id][$a_permission][$a_cmd][$a_user_id];
132 $this->last_info = $a_info;
144 $this->prevent_caching_last_result = $a_val;
152 return $this->prevent_caching_last_result;
164 if ($a_user_id ==
"") {
173 if (isset($this->results[$a_ref_id][$a_permission][$a_cmd][$a_user_id])) {
174 return $this->results[$a_ref_id][$a_permission][$a_cmd][$a_user_id];
185 $ilDB = $DIC[
'ilDB'];
188 $query =
"DELETE FROM acc_cache WHERE user_id = " .
$ilDB->quote(
$ilUser->getId(),
'integer');
191 $ilDB->insert(
'acc_cache', array(
192 'user_id' => array(
'integer',
$ilUser->getId()),
193 'time' => array(
'integer',time()),
194 'result' => array(
'clob',serialize($this->results))
205 $ilDB = $DIC[
'ilDB'];
208 $query =
"SELECT * FROM acc_cache WHERE user_id = " .
212 if ((time() - $rec[
"time"]) < $a_secs) {
213 $this->results = unserialize($rec[
"result"]);
232 $this->results = $a_results;
240 $this->current_info->addInfoItem(
$a_type, $a_text, $a_data);
246 public function checkAccess($a_permission, $a_cmd, $a_ref_id,
$a_type =
"", $a_obj_id =
"", $a_tree_id =
"")
267 $ilBench->start(
"AccessControl",
"0400_clear_info");
268 $this->current_info->clear();
269 $ilBench->stop(
"AccessControl",
"0400_clear_info");
273 $cached = $this->
doCacheCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id);
274 if ($cached[
"hit"]) {
276 if (!$cached[
"granted"]) {
279 if ($cached[
"prevent_db_cache"]) {
282 return $cached[
"granted"];
285 $ilBench->start(
"AccessControl",
"0500_lookup_id_and_type");
287 if ($a_obj_id ==
"") {
288 if (isset($this->obj_id_cache[$a_ref_id]) && $this->obj_id_cache[$a_ref_id] > 0) {
289 $a_obj_id = $this->obj_id_cache[$a_ref_id];
292 $this->obj_id_cache[$a_ref_id] = $a_obj_id;
296 if (isset($this->obj_type_cache[$a_ref_id]) && $this->obj_type_cache[$a_ref_id] !=
"") {
297 $a_type = $this->obj_type_cache[$a_ref_id];
300 $this->obj_type_cache[$a_ref_id] =
$a_type;
304 $ilBench->stop(
"AccessControl",
"0500_lookup_id_and_type");
308 if ($a_tree_id != 1 &&
309 !$this->
doTreeCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id)) {
339 $par_check = $this->
doPathCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id);
375 return is_object($this->last_info) ? $this->last_info->getInfoItems() : array();
383 return $this->last_result;
390 if ($a_ref_id ==
"") {
394 return $this->results[$a_ref_id];
400 public function doCacheCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id)
407 $ilBench->start(
"AccessControl",
"1000_checkAccess_get_cache_result");
410 if (is_array($stored_access)) {
411 $this->current_info = $stored_access[
"info"];
413 $ilBench->stop(
"AccessControl",
"1000_checkAccess_get_cache_result");
414 return array(
"hit" =>
true,
"granted" => $stored_access[
"granted"],
415 "prevent_db_cache" => $stored_access[
"prevent_db_cache"]);
419 $ilBench->stop(
"AccessControl",
"1000_checkAccess_get_cache_result");
420 return array(
"hit" =>
false,
"granted" =>
false,
421 "prevent_db_cache" =>
false);
427 public function doTreeCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id)
431 $tree = $DIC[
'tree'];
437 $tree_cache_key = $a_user_id .
':' . $a_ref_id;
438 if (array_key_exists($tree_cache_key, $this->obj_tree_cache)) {
440 if (!$this->obj_tree_cache[$tree_cache_key]) {
443 $this->
storeAccessResult($a_permission, $a_cmd, $a_ref_id, $this->obj_tree_cache[$tree_cache_key], $a_user_id);
445 return $this->obj_tree_cache[$tree_cache_key];
448 $ilBench->start(
"AccessControl",
"2000_checkAccess_in_tree");
450 if (!
$tree->isInTree($a_ref_id) or
$tree->isDeleted($a_ref_id)) {
455 if (count($this->obj_tree_cache) < 1000) {
456 $this->obj_tree_cache[$tree_cache_key] =
false;
460 $this->current_info->addInfoItem(
IL_DELETED,
$lng->txt(
"object_deleted"));
463 $ilBench->stop(
"AccessControl",
"2000_checkAccess_in_tree");
472 if (count($this->obj_tree_cache) < 1000) {
473 $this->obj_tree_cache[$tree_cache_key] =
true;
479 $ilBench->stop(
"AccessControl",
"2000_checkAccess_in_tree");
495 $ilBench->start(
"AccessControl",
"2500_checkAccess_rbac_check");
497 if ($a_permission ==
"") {
499 '%s::doRBACCheck(): No operations given! $a_ref_id: %s',
507 if (isset($this->stored_rbac_access[$a_user_id .
"-" . $a_permission .
"-" . $a_ref_id])) {
508 $access = $this->stored_rbac_access[$a_user_id .
"-" . $a_permission .
"-" . $a_ref_id];
510 $access = $this->rbacsystem->checkAccessOfUser($a_user_id, $a_permission, $a_ref_id,
$a_type);
511 if (!is_array($this->stored_rbac_access) || count($this->stored_rbac_access) < 1000) {
512 if ($a_permission !=
"create") {
513 $this->stored_rbac_access[$a_user_id .
"-" . $a_permission .
"-" . $a_ref_id] = $access;
522 if ($a_permission !=
"create") {
525 $ilBench->stop(
"AccessControl",
"2500_checkAccess_rbac_check");
533 public function doPathCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id, $a_all =
false)
537 $tree = $DIC[
'tree'];
540 $ilObjDataCache = $DIC[
'ilObjDataCache'];
543 $ilBench->start(
"AccessControl",
"3100_checkAccess_check_parents_get_path");
554 $ilBench->stop(
"AccessControl",
"3100_checkAccess_check_parents_get_path");
556 foreach (
$path as $id) {
557 if ($a_ref_id == $id) {
563 if ($access ==
false) {
568 if ($a_all ==
false) {
588 $objDefinition = $DIC[
'objDefinition'];
591 $cache_perm = ($a_permission ==
"visible")
596 if (isset($this->ac_cache[$cache_perm][$a_ref_id][$a_user_id])) {
597 return $this->ac_cache[$cache_perm][$a_ref_id][$a_user_id];
601 if ($a_permission ==
'write') {
606 if ($a_user_id ==
$ilUser->getId()) {
609 if ($memview->isActiveForRefId($a_ref_id) &&
610 $memview->getContainer() == $a_ref_id) {
617 $this->ac_cache[$cache_perm][$a_ref_id][$a_user_id] =
true;
623 $objDefinition->supportsOfflineHandling(
$a_type) &&
626 $this->ac_cache[$cache_perm][$a_ref_id][$a_user_id] =
false;
633 if ($item_data === null ||
635 $this->ac_cache[$cache_perm][$a_ref_id][$a_user_id] =
true;
640 if (($item_data[
'timing_start'] == 0 || time() >= $item_data[
'timing_start']) and
641 ($item_data[
'timing_end'] == 0 || time() <= $item_data[
'timing_end'])) {
642 $this->ac_cache[$cache_perm][$a_ref_id][$a_user_id] =
true;
648 $this->ac_cache[$cache_perm][$a_ref_id][$a_user_id] =
true;
649 $ilBench->stop(
"AccessControl",
"3150_checkAccess_check_course_activation");
654 if ($a_permission ==
'visible' and $item_data[
'visible']) {
655 $this->ac_cache[$cache_perm][$a_ref_id][$a_user_id] =
true;
660 if ($a_permission ==
'read_learning_progress') {
661 $this->ac_cache[$cache_perm][$a_ref_id][$a_user_id] =
true;
662 $ilBench->stop(
"AccessControl",
"3150_checkAccess_check_course_activation");
667 $this->ac_cache[$cache_perm][$a_ref_id][$a_user_id] =
false;
683 ($a_permission ==
'visible') and
686 if (ilConditionHandler::lookupEffectiveHiddenStatusByTarget($a_ref_id)) {
688 $conditions = ilConditionHandler::_getEffectiveConditionsOfTarget($a_ref_id, $a_obj_id,
$a_type);
690 $this->current_info->addInfoItem(
692 $lng->txt(
"missing_precondition") .
": " .
694 $lng->txt(
"condition_" . $condition[
"operator"]) .
" " .
701 $ilBench->stop(
"AccessControl",
"4000_checkAccess_condition_check");
706 if (($a_permission ==
"read" or $a_permission ==
'join') &&
708 $ilBench->start(
"AccessControl",
"4000_checkAccess_condition_check");
710 $conditions = ilConditionHandler::_getEffectiveConditionsOfTarget($a_ref_id, $a_obj_id,
$a_type);
712 $this->current_info->addInfoItem(
714 $lng->txt(
"missing_precondition") .
": " .
716 $lng->txt(
"condition_" . $condition[
"operator"]) .
" " .
721 $ilBench->stop(
"AccessControl",
"4000_checkAccess_condition_check");
724 $ilBench->stop(
"AccessControl",
"4000_checkAccess_condition_check");
738 $objDefinition = $DIC[
'objDefinition'];
740 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
742 $ilBench->start(
"AccessControl",
"5000_checkAccess_object_check");
745 if ($objDefinition->isPluginTypeName(
$a_type) && !$objDefinition->isPlugin(
$a_type)) {
752 $class = $objDefinition->getClassName(
$a_type);
754 $full_class =
"ilObj" . $class .
"Access";
757 if ($objDefinition->isPluginTypeName(
$a_type)) {
758 include_once(
$location .
"/class." . $full_class .
".php");
762 $this->ac_logger->error(
"Cannot find class for object type $a_type, obj id $a_obj_id, ref id $a_ref_id. Abort status check.");
766 $full_class =
new $full_class();
768 $obj_access = call_user_func(
769 array($full_class,
"_checkAccess"),
776 if (!($obj_access ===
true)) {
783 $ilBench->stop(
"AccessControl",
"5000_checkAccess_object_check");
788 $ilBench->stop(
"AccessControl",
"5000_checkAccess_object_check");
797 $this->results = array();
798 $this->last_result =
"";
800 $this->stored_rbac_access = [];
807 $this->$a_str = $a_bool;
getResultLast()
get last info object
hasCurrentUserAnyPositionAccess($ref_id)
bool
isCurrentUserBasedOnPositionsAllowedTo($permission, array $on_user_ids)
$on_user_ids List of ILIAS-User-IDsgetAvailablePositionRelatedPermissions for available permissionsbo...
filterUserIdsByPositionOfCurrentUser($pos_perm, $ref_id, array $user_ids)
$user_idsgetAvailablePositionRelatedPermissions for available permissionsint[]
filterUserIdsForUsersPositionsAndPermission(array $user_ids, $for_user_id, $permission)
$user_ids List of ILIAS-User-IDs which shall be filtered getAvailablePositionRelatedPermissions for a...
doActivationCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id, $a_obj_id, $a_type)
check for activation and centralized offline status.
filterUserIdsForCurrentUsersPositionsAndPermission(array $user_ids, $permission)
$user_ids List of ILIAS-User-IDs which shall be filteredgetAvailablePositionRelatedPermissions for av...
checkPositionAccess($pos_perm, $ref_id)
Reference-ID of the desired Object in the treegetAvailablePositionRelatedPermissions for available pe...
checkRbacOrPositionPermissionAccess($rbac_perm, $pos_perm, $ref_id)
See the list of available permissions in interface ilOrgUnitPositionAccessHandler Reference-ID of the...
isCurrentUserBasedOnPositionsAllowedTo($permission, array $on_user_ids)
$on_user_ids List of ILIAS-User-IDsgetAvailablePositionRelatedPermissions for available permissionsbo...
filterUserIdsForUsersPositionsAndPermission(array $user_ids, $for_user_id, $permission)
$user_ids List of ILIAS-User-IDs which shall be filtered getAvailablePositionRelatedPermissions for a...
checkAccessOfUser($a_user_id, $a_permission, $a_cmd, $a_ref_id, $a_type="", $a_obj_id="", $a_tree_id="")
check access for an object (provide $a_type and $a_obj_id if available for better performance)(option...
static getItem($a_ref_id)
Get item data.
setPreventCachingLastResult($a_val)
Set prevent caching last result.true if last result should not be cached
filterUserIdsByRbacOrPositionOfCurrentUser($rbac_perm, $pos_perm, $ref_id, array $user_ids)
See the list of available permissions in interface ilOrgUnitPositionAccessHandler Reference-ID of the...
const IL_NO_PARENT_ACCESS
Class ilOrgUnitPositionAccess.
static _lookupTitle($a_id)
lookup object title
addInfoItem($a_type, $a_text, $a_data="")
add an info item to current info object
getStoredAccessResult($a_permission, $a_cmd, $a_ref_id, $a_user_id="")
get stored access resultprivatepermission command string reference id user id (if no id passed...
getResultAll($a_ref_id="")
hasUserRBACorAnyPositionAccess($rbac_perm, $ref_id)
bool
Interface ilAccessHandler.
doStatusCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id, $a_obj_id, $a_type)
object type specific check
checkPositionAccess($pos_perm, $ref_id)
Reference-ID of the desired Object in the treegetAvailablePositionRelatedPermissions for available pe...
hasUserRBACorAnyPositionAccess($rbac_perm, $ref_id)
bool
hasCurrentUserAnyPositionAccess($ref_id)
bool
doConditionCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id, $a_obj_id, $a_type)
condition check (currently only implemented for read permission)bool
getPreventCachingLastResult()
Get prevent caching last result.boolean true if last result should not be cached
filterUserIdsByPositionOfCurrentUser($pos_perm, $ref_id, array $user_ids)
$user_idsgetAvailablePositionRelatedPermissions for available permissionsint[]
foreach($_POST as $key=> $value) $res
checkAccess($a_permission, $a_cmd, $a_ref_id, $a_type="", $a_obj_id="", $a_tree_id="")
check access for an object (provide $a_type and $a_obj_id if available for better performance)(option...
doCacheCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id)
look if result for current query is already in cachebool
static lookupOfflineStatus($a_obj_id)
Lookup offline status using objectDataCache.
static _lookupObjId($a_id)
doPathCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id, $a_all=false)
check read permission for all parentsbool
filterUserIdsByRbacOrPositionOfCurrentUser($rbac_perm, $pos_perm, $ref_id, array $user_ids)
See the list of available permissions in interface ilOrgUnitPositionAccessHandler Reference-ID of the...
getInfo()
get last info object
isUserBasedOnPositionsAllowedTo($which_user_id, $permission, array $on_user_ids)
Permission check for this ILIAS-User-ID $on_user_ids List of ILIAS-User-IDsgetAvailablePositionRelate...
static _checkAllConditionsOfTarget($a_target_ref_id, $a_target_id, $a_target_type="", $a_usr_id=0)
checks wether all conditions of a target object are fulfilled
doRBACCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id, $a_type)
rbac check for current object -> type should be used for create permissionbool
static _lookupType($a_id, $a_reference=false)
lookup object type
checkRbacOrPositionPermissionAccess($rbac_perm, $pos_perm, $ref_id)
See the list of available permissions in interface ilOrgUnitPositionAccessHandler Reference-ID of the...
filterUserIdsByPositionOfUser($user_id, $pos_perm, $ref_id, array $user_ids)
$user_idsgetAvailablePositionRelatedPermissions for available permissionsint[]
const IL_MISSING_PRECONDITION
isUserBasedOnPositionsAllowedTo($which_user_id, $permission, array $on_user_ids)
Permission check for this ILIAS-User-ID $on_user_ids List of ILIAS-User-IDsgetAvailablePositionRelate...
static getLogger($a_component_id)
Get component logger.
doTreeCheck($a_permission, $a_cmd, $a_ref_id, $a_user_id)
check if object is in tree and not deletedbool
filterUserIdsForCurrentUsersPositionsAndPermission(array $user_ids, $permission)
$user_ids List of ILIAS-User-IDs which shall be filteredgetAvailablePositionRelatedPermissions for av...
storeAccessResult($a_permission, $a_cmd, $a_ref_id, $a_access_granted, $a_user_id="", $a_info="")
store access resultprivatepermission command string reference id true if access is granted user id (i...
filterUserIdsByPositionOfUser($user_id, $pos_perm, $ref_id, array $user_ids)
$user_idsgetAvailablePositionRelatedPermissions for available permissionsint[]