fix: parent's permissions were overwriting masks' permissions with maskOnly, but only while listing

Massimo Melina committed Oct 2, 2024 at 23:03 UTC 13a42653af0f4d2fe241ed2401176ceeb3003da9
2 files changed +5 -4
src/vfs.ts
+4 -4
@@ -272,7 +272,7 @@ export async function* walkNode(parent: VfsNode, {
272 const name = prefixPath + nodeName
273 took?.add(normalizeFilename(name))
274 const item = { ...child, name }
275 - if (!canSee(item)) continue
275 + if (!await canSee(item)) continue
276 if (item.source) // real items must be accessible
277 try { await fs.access(item.source) }
278 catch { continue }
@@ -313,7 +313,7 @@ export async function* walkNode(parent: VfsNode, {
313 }
314 if (isFolder) // store it even if we can't see it (masks), as its children can be produced by dirStream
315 parentsCache.set(name, item)
316 - if (canSee(item))
316 + if (await canSee(item))
317 yield item
318 }
319 }
@@ -322,9 +322,9 @@ export async function* walkNode(parent: VfsNode, {
322 }
323
324 // item will be changed, so be sure to pass a temp node
325 - function canSee(item: VfsNode) {
325 + async function canSee(item: VfsNode) {
326 // we basename for depth>0 where we already have the rest of the path in the parent's url, and would be duplicated
327 - maskApplier(item, basename(getNodeName(item)))
327 + await maskApplier(item, basename(getNodeName(item)))
328 inheritFromParent(parent, item)
329 if (ctx && !hasPermission(item, 'can_see', ctx)) return
330 item.isTemp = true
tests/config.yaml
+1
@@ -119,6 +119,7 @@ vfs:
119 can_see: false
120 masks:
121 "*":
122 + maskOnly: folders
123 can_see: true
124 children:
125 - name: hi