Fix FileNode/query to return all results when no query is provided

This commit is contained in:
Maurus Decimus
2026-05-16 19:50:33 +02:00
parent b556539f94
commit d5a458992b
3 changed files with 32 additions and 10 deletions

View File

@@ -61,6 +61,28 @@ impl DavResources {
}
}
pub fn shared_documents(
&self,
access_token: &AccessToken,
check_acls: impl IntoIterator<Item = Acl>,
match_any: bool,
) -> RoaringBitmap {
let shared_containers = self.shared_containers(access_token, check_acls, match_any);
let mut document_ids = shared_containers.clone();
if !shared_containers.is_empty() {
for path in &self.paths {
if let Some(parent_id) = path.parent_id
&& shared_containers.contains(parent_id)
{
document_ids.insert(self.resources[path.resource_idx].document_id);
}
}
}
document_ids
}
pub fn has_access_to_container(
&self,
access_token: &AccessToken,

View File

@@ -76,7 +76,7 @@ impl FileNodeGet for Server {
.map(|r| r.document_id)
.collect::<RoaringBitmap>()
} else {
cache.shared_containers(access_token, [Acl::Read, Acl::ReadItems], true)
cache.shared_documents(access_token, [Acl::Read, Acl::ReadItems], true)
};
let mut ids = if let Some(ids) = ids {

View File

@@ -96,15 +96,15 @@ impl FileNodeQuery for Server {
_ => None,
};
let set = match want_container {
Some(is_container) => RoaringBitmap::from_iter(
cache.resources.iter().filter_map(|r| {
Some(is_container) => {
RoaringBitmap::from_iter(cache.resources.iter().filter_map(|r| {
if r.is_container() == is_container {
Some(r.document_id)
} else {
None
}
}),
),
}))
}
// TODO: support symlink nodeType once target storage exists
None => RoaringBitmap::new(),
};
@@ -194,9 +194,9 @@ impl FileNodeQuery for Server {
let results = SearchQuery::new(SearchIndex::InMemory)
.with_filters(filters)
.with_mask(if access_token.is_shared(account_id) {
cache.shared_containers(access_token, [Acl::ReadItems], true)
cache.shared_documents(access_token, [Acl::Read, Acl::ReadItems], true)
} else {
cache.document_ids(false).collect()
cache.resources.iter().map(|r| r.document_id).collect()
})
.filter()
.into_bitmap();
@@ -246,9 +246,9 @@ impl FileNodeQuery for Server {
FileNodeComparator::Name => ra
.and_then(|r| r.container_name())
.cmp(&rb.and_then(|r| r.container_name())),
FileNodeComparator::Size => ra
.and_then(|r| r.size())
.cmp(&rb.and_then(|r| r.size())),
FileNodeComparator::Size => {
ra.and_then(|r| r.size()).cmp(&rb.and_then(|r| r.size()))
}
FileNodeComparator::NodeType => {
// Directories sort before files
let a_dir = ra.map(|r| r.is_container()).unwrap_or(false);