99namespace OCA \GroupFolders \ACL ;
1010
1111use OC \Files \Cache \Wrapper \CacheWrapper ;
12+ use OC \Files \Search \SearchBinaryOperator ;
13+ use OC \Files \Search \SearchComparison ;
1214use OCP \Constants ;
1315use OCP \Files \Cache \ICache ;
1416use OCP \Files \Cache \ICacheEntry ;
17+ use OCP \Files \Search \ISearchBinaryOperator ;
18+ use OCP \Files \Search \ISearchComparison ;
19+ use OCP \Files \Search \ISearchOperator ;
1520use OCP \Files \Search \ISearchQuery ;
1621
1722class ACLCacheWrapper extends CacheWrapper {
@@ -75,23 +80,23 @@ public function getFolderContentsById($fileId, ?string $mimeTypeFilter = null):
7580
7681 #[\Override]
7782 public function search ($ pattern ): array {
78- $ results = $ this -> getCache ()-> search ($ pattern );
83+ $ results = parent :: search ($ pattern );
7984 $ this ->preloadEntries ($ results );
8085
8186 return array_filter (array_map ($ this ->formatCacheEntry (...), $ results ));
8287 }
8388
8489 #[\Override]
8590 public function searchByMime ($ mimetype ): array {
86- $ results = $ this -> getCache ()-> searchByMime ($ mimetype );
91+ $ results = parent :: searchByMime ($ mimetype );
8792 $ this ->preloadEntries ($ results );
8893
8994 return array_filter (array_map ($ this ->formatCacheEntry (...), $ results ));
9095 }
9196
9297 #[\Override]
9398 public function searchQuery (ISearchQuery $ query ): array {
94- $ results = $ this -> getCache ()-> searchQuery ($ query );
99+ $ results = parent :: searchQuery ($ query );
95100 $ this ->preloadEntries ($ results );
96101
97102 return array_filter (array_map ($ this ->formatCacheEntry (...), $ results ));
@@ -106,4 +111,32 @@ private function preloadEntries(array $entries): array {
106111
107112 return $ this ->aclManager ->getRelevantRulesForPath ($ this ->getNumericStorageId (), $ paths , false );
108113 }
114+
115+ /**
116+ * Construct a search operator that filters out any paths that the current user doesn't have read permissions for
117+ */
118+ private function getSearchFilter (): ISearchOperator {
119+ $ forbiddenPaths = $ this ->aclManager ->getForbiddenPaths ($ this ->getNumericStorageId (), '' );
120+
121+ $ filters = array_map (fn (string $ path ) => new SearchBinaryOperator (ISearchBinaryOperator::OPERATOR_NOT , [
122+ new SearchComparison (ISearchComparison::COMPARE_LIKE_CASE_SENSITIVE , 'path ' , SearchComparison::escapeLikeParameter ($ path ) . '/% ' )
123+ ]), $ forbiddenPaths );
124+ $ filters [] = new SearchBinaryOperator (ISearchBinaryOperator::OPERATOR_NOT , [
125+ new SearchComparison (ISearchComparison::COMPARE_IN , 'path ' , $ forbiddenPaths )
126+ ]);
127+ return new SearchBinaryOperator (ISearchBinaryOperator::OPERATOR_AND , $ filters );
128+ }
129+
130+ #[\Override]
131+ public function getQueryFilterForStorage (): ISearchOperator {
132+ $ storageFilter = parent ::getQueryFilterForStorage ();
133+
134+ return new SearchBinaryOperator (
135+ ISearchBinaryOperator::OPERATOR_AND ,
136+ [
137+ $ storageFilter ,
138+ $ this ->getSearchFilter (),
139+ ]
140+ );
141+ }
109142}
0 commit comments