fix: Make sure locker allows reentrant lock acquisition

This commit is contained in:
Joachim Van Herwegen
2023-04-28 15:44:36 +02:00
parent 0d5d072f79
commit 5347025720
14 changed files with 558 additions and 415 deletions

View File

@@ -64,10 +64,14 @@ export class AuthorizingHttpHandler extends OperationHttpHandler {
this.logger.verbose(`Extracted credentials: ${JSON.stringify(credentials)}`);
const requestedModes = await this.modesExtractor.handleSafe(operation);
this.logger.verbose(`Retrieved required modes: ${[ ...requestedModes.entrySets() ]}`);
this.logger.verbose(`Retrieved required modes: ${
[ ...requestedModes.entrySets() ].map(([ id, set ]): string => `{ ${id.path}: ${[ ...set ]} }`)
}`);
const availablePermissions = await this.permissionReader.handleSafe({ credentials, requestedModes });
this.logger.verbose(`Available permissions are ${[ ...availablePermissions.entries() ]}`);
this.logger.verbose(`Available permissions are ${
[ ...availablePermissions.entries() ].map(([ id, map ]): string => `{ ${id.path}: ${JSON.stringify(map)} }`)
}`);
try {
await this.authorizer.handleSafe({ credentials, requestedModes, availablePermissions });

View File

@@ -71,6 +71,8 @@ export class WacAllowHttpHandler extends OperationHttpHandler {
} else {
// Need to determine public permissions
this.logger.debug('Determining public permissions');
// Note that this call can potentially create a new lock on a resource that is already locked,
// so a locker that allows multiple read locks on the same resource is required.
const permissionMap = await this.permissionReader.handleSafe({ credentials: {}, requestedModes });
everyone = permissionMap.get(operation.target) ?? {};
}