Browse Source

breadcrumbs now xacml compliant

Changed itql to sparql and added xacml filters to query to check if
current user has access to parent collection
pull/574/head
DiegoPino 10 years ago
parent
commit
a8e67e2dcf
  1. 61
      includes/breadcrumb.inc

61
includes/breadcrumb.inc

@ -77,35 +77,56 @@ function islandora_get_breadcrumbs_recursive($pid, FedoraRepository $repository,
); );
} }
else { else {
$query_string = 'select $parentObject $title $content from <#ri>
where (
<info:fedora/' . $pid . '> <fedora-model:label> $title $query= <<<EOQ
and $parentObject <fedora-model:hasModel> $content PREFIX islandora-rels-ext: <http://islandora.ca/ontology/relsext#>
and ( PREFIX fedora-rels-ext: <info:fedora/fedora-system:def/relations-external#>
<info:fedora/' . $pid . '> <fedora-rels-ext:isMemberOfCollection> $parentObject SELECT DISTINCT ?object ?label
or <info:fedora/' . $pid . '> <fedora-rels-ext:isMemberOf> $parentObject FROM <#ri>
or <info:fedora/' . $pid . '> <fedora-rels-ext:isPartOf> $parentObject WHERE {
) <info:fedora/!pid> ?collection_predicate ?object;
and $parentObject <fedora-model:state> <info:fedora/fedora-system:def/model#Active> <fedora-model:label> ?label .
) ?object <fedora-model:state> <fedora-model:Active>
minus $content <mulgara:is> <info:fedora/fedora-system:FedoraObject-3.0> .
minus $parentObject <mulgara:is> <info:fedora/' . $pid . '> !optionals
order by $title desc'; !filters
$results = $repository->ri->itqlQuery($query_string); }
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, <fedora-rels-ext:isMemberOfCollection>) || sameTerm(?collection_predicate, <fedora-rels-ext:isMemberOf>)";
$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) { if (count($results) > 0 && $context['level'] > 0) {
$parent = $results[0]['parentObject']['value']; $parent = $results[0]['object']['value'];
$this_title = $results[0]['title']['value']; $this_label = $results[0]['label']['value'];
if (empty($this_title)) { if (empty($this_label)) {
$this_title = t('-'); $this_label = t('-');
} }
$context['level']--; $context['level']--;
return array_merge( return array_merge(
islandora_get_breadcrumbs_recursive($parent, $repository, $context), islandora_get_breadcrumbs_recursive($parent, $repository, $context),
array( array(
l($this_title, "islandora/object/$pid"), l($this_label, "islandora/object/$pid"),
) )
); );
} }

Loading…
Cancel
Save