Skip to content

Commit 10233f7

Browse files
committed
Fix union query for objects without read permission
1 parent 1f27508 commit 10233f7

File tree

4 files changed

+20
-2
lines changed

4 files changed

+20
-2
lines changed

src/wcmf/lib/model/ObjectQueryUnionQueryProvider.php

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
use wcmf\lib\core\IllegalArgumentException;
1414
use wcmf\lib\core\ObjectFactory;
15+
use wcmf\lib\persistence\PersistenceAction;
1516
use wcmf\lib\persistence\UnionQueryProvider;
1617

1718
/**
@@ -52,7 +53,11 @@ public function execute($queryId, $buildDepth, $orderby, $pagingInfo) {
5253
if (!$query) {
5354
throw new IllegalArgumentException('Query id '.$queryId.' is unknown');
5455
}
55-
return $query->execute($buildDepth, $orderby, $pagingInfo);
56+
$permissionManager = ObjectFactory::getInstance('permissionManager');
57+
$tmpPerm = $permissionManager->addTempPermission($query->getQueryType(), '', PersistenceAction::READ);
58+
$result = $query->execute($buildDepth, $orderby, $pagingInfo);
59+
$permissionManager->removeTempPermission($tmpPerm);
60+
return $result;
5661
}
5762

5863
/**

src/wcmf/lib/persistence/UnionQuery.php

+7
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,13 @@ public static function execute(UnionQueryProvider $queryProvider, $buildDepth=Bu
105105
}
106106
$cacheKey = self::getCacheKey($queryIds, $buildDepth, $orderby, $pagingInfo);
107107
$cache->put($cacheSection, $cacheKey, $offsets);
108+
109+
// remove objects for which the user is not authorized
110+
$permissionManager = ObjectFactory::getInstance('permissionManager');
111+
$result = array_filter($result, function($object) use ($permissionManager) {
112+
return $permissionManager->authorize($object->getOID(), '', PersistenceAction::READ);
113+
});
114+
108115
return $result;
109116
}
110117

src/wcmf/lib/persistence/UnionQueryProvider.php

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public function getIds();
2525

2626
/**
2727
* Execute a single query
28+
* NOTE Queries must load all objects regardless of set permissions. Authorization will be done in UnionQuery
2829
* @param $queryId
2930
* @param $buildDepth
3031
* @param $orderby

src/wcmf/lib/persistence/impl/DefaultUnionQueryProvider.php

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
use wcmf\lib\core\IllegalArgumentException;
1414
use wcmf\lib\core\ObjectFactory;
15+
use wcmf\lib\persistence\PersistenceAction;
1516
use wcmf\lib\persistence\UnionQueryProvider;
1617

1718
/**
@@ -71,9 +72,13 @@ public function execute($queryId, $buildDepth, $orderby, $pagingInfo) {
7172
throw new IllegalArgumentException('Query id '.$queryId.' is unknown');
7273
}
7374
$persistenceFacade = ObjectFactory::getInstance('persistenceFacade');
75+
$permissionManager = ObjectFactory::getInstance('permissionManager');
7476
$type = $queryDef['type'];
7577
$criteria = $queryDef['criteria'];
76-
return $persistenceFacade->loadObjects($type, $buildDepth, $criteria, $orderby, $pagingInfo);
78+
$tmpPerm = $permissionManager->addTempPermission($type, '', PersistenceAction::READ);
79+
$result = $persistenceFacade->loadObjects($type, $buildDepth, $criteria, $orderby, $pagingInfo);
80+
$permissionManager->removeTempPermission($tmpPerm);
81+
return $result;
7782
}
7883
}
7984
?>

0 commit comments

Comments
 (0)