wider support of wildcards in multi-level masks

Massimo Melina committed Mar 30, 2025 at 20:29 UTC 9b971f7911c9c78ac7743df6c8acce7977e1df28
1 file changed +8 -7
src/vfs.ts
+8 -7
@@ -4,7 +4,7 @@ import fs from 'fs/promises'
4 import { basename, dirname, join, resolve } from 'path'
5 import {
6 makeMatcher, setHidden, onlyTruthy, isValidFileName, throw_, VfsPerms, Who,
7 - isWhoObject, WHO_ANY_ACCOUNT, defaultPerms, PERM_KEYS, removeStarting, HTTP_SERVER_ERROR, try_
7 + isWhoObject, WHO_ANY_ACCOUNT, defaultPerms, PERM_KEYS, removeStarting, HTTP_SERVER_ERROR, try_, matches
8 } from './misc'
9 import Koa from 'koa'
10 import _ from 'lodash'
@@ -432,14 +432,15 @@ function inheritMasks(item: VfsNode, parent: VfsNode, virtualBasename=getNodeNam
432 const { masks } = parent
433 if (!masks) return
434 const o: Masks = {}
435 - const prefix = virtualBasename + '/'
435 for (const [k,v] of Object.entries(masks)) {
437 - if (k.startsWith('**'))
436 + if (k.startsWith('**')) {
437 o[k] = v
439 - else if (k.startsWith('*/'))
440 - o[k.slice(2)] = v
441 - else if (k.startsWith(prefix))
442 - o[k.slice(prefix.length)] = v
438 + continue
439 + }
440 + const i = k.indexOf('/')
441 + if (i < 0) continue
442 + if (!matches(virtualBasename, k.slice(0, i))) continue
443 + o[k.slice(i + 1)] = v
444 }
445 if (Object.keys(o).length)
446 item.masks = Object.assign(o, item.masks) // don't change item.masks object as it is the same object of item.original