From a8e67e2dcfb56ea449890ce2d2e37c78cdefe29a Mon Sep 17 00:00:00 2001 From: DiegoPino Date: Tue, 30 Dec 2014 01:18:52 -0300 Subject: [PATCH] breadcrumbs now xacml compliant Changed itql to sparql and added xacml filters to query to check if current user has access to parent collection --- includes/breadcrumb.inc | 61 +++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/includes/breadcrumb.inc b/includes/breadcrumb.inc index 6f975ae3..b0e7beed 100644 --- a/includes/breadcrumb.inc +++ b/includes/breadcrumb.inc @@ -77,35 +77,56 @@ function islandora_get_breadcrumbs_recursive($pid, FedoraRepository $repository, ); } else { - $query_string = 'select $parentObject $title $content from <#ri> - where ( - $title - and $parentObject $content - and ( - $parentObject - or $parentObject - or $parentObject - ) - and $parentObject - ) - minus $content - minus $parentObject - order by $title desc'; - $results = $repository->ri->itqlQuery($query_string); + + + $query= << + PREFIX fedora-rels-ext: + SELECT DISTINCT ?object ?label + FROM <#ri> + WHERE { + ?collection_predicate ?object; + ?label . + ?object + . + !optionals + !filters + } +EOQ; + + $query_optionals = (array) module_invoke('islandora_xacml_api', 'islandora_basic_collection_get_query_optionals', 'view'); + $query_filters = (array) module_invoke('islandora_xacml_api', 'islandora_basic_collection_get_query_filters'); + $filter_map = function ($filter) { + return "FILTER($filter)"; + }; + $query_filters[] = "sameTerm(?collection_predicate, ) || sameTerm(?collection_predicate, )"; + + + + $query = format_string($query, array( + '!optionals' => !empty($query_optionals) ? ('OPTIONAL {{' . implode('} UNION {', $query_optionals) . '}}') : '', + '!filters' => implode(' ', array_map($filter_map, $query_filters)), + )); + + $query = format_string($query, array( + '!pid' => $pid, + )); + + $results = $repository->ri->sparqlQuery($query,'unlimited'); if (count($results) > 0 && $context['level'] > 0) { - $parent = $results[0]['parentObject']['value']; - $this_title = $results[0]['title']['value']; + $parent = $results[0]['object']['value']; + $this_label = $results[0]['label']['value']; - if (empty($this_title)) { - $this_title = t('-'); + if (empty($this_label)) { + $this_label = t('-'); } $context['level']--; return array_merge( islandora_get_breadcrumbs_recursive($parent, $repository, $context), array( - l($this_title, "islandora/object/$pid"), + l($this_label, "islandora/object/$pid"), ) ); }