Skip to content

Commit afbf2c0

Browse files
RafaelGSStargos
authored andcommitted
lib,permission: support Buffer to permission.has
PR-URL: #54104Fixes: #54100 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
1 parent 8d41bb9 commit afbf2c0

5 files changed

Lines changed: 32 additions & 4 deletions

File tree

‎lib/fs.js‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1554,7 +1554,8 @@ function lstat(path, options = { bigint: false }, callback) {
15541554
callback=makeStatsCallback(callback);
15551555
path=getValidatedPath(path);
15561556
if(permission.isEnabled()&&!permission.has('fs.read',path)){
1557-
callback(newERR_ACCESS_DENIED('Access to this API has been restricted','FileSystemRead',path));
1557+
constresource=BufferIsBuffer(path) ? BufferToString(path) : path;
1558+
callback(newERR_ACCESS_DENIED('Access to this API has been restricted','FileSystemRead',resource));
15581559
return;
15591560
}
15601561

@@ -1634,7 +1635,8 @@ function fstatSync(fd, options = { bigint: false }) {
16341635
functionlstatSync(path,options={bigint: false,throwIfNoEntry: true}){
16351636
path=getValidatedPath(path);
16361637
if(permission.isEnabled()&&!permission.has('fs.read',path)){
1637-
thrownewERR_ACCESS_DENIED('Access to this API has been restricted','FileSystemRead',path);
1638+
constresource=BufferIsBuffer(path) ? BufferToString(path) : path;
1639+
thrownewERR_ACCESS_DENIED('Access to this API has been restricted','FileSystemRead',resource);
16381640
}
16391641
conststats=binding.lstat(
16401642
pathModule.toNamespacedPath(path),

‎lib/internal/process/permission.js‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ const {
55
}=primordials;
66

77
constpermission=internalBinding('permission');
8-
const{ validateString }=require('internal/validators');
8+
const{ validateString, validateBuffer }=require('internal/validators');
9+
const{ Buffer }=require('buffer');
10+
const{ isBuffer }=Buffer;
911

1012
letexperimentalPermission;
1113

@@ -22,7 +24,11 @@ module.exports = ObjectFreeze({
2224
validateString(scope,'scope');
2325
if(reference!=null){
2426
// TODO: add support for WHATWG URLs and Uint8Arrays.
25-
validateString(reference,'reference');
27+
if(isBuffer(reference)){
28+
validateBuffer(reference,'reference');
29+
}else{
30+
validateString(reference,'reference');
31+
}
2632
}
2733

2834
returnpermission.has(scope,reference);

‎test/fixtures/permission/fs-read.js‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const fs = require('fs');
77
constpath=require('path');
88

99
constblockedFile=process.env.BLOCKEDFILE;
10+
constbufferBlockedFile=Buffer.from(process.env.BLOCKEDFILE);
1011
constblockedFileURL=newURL('file://'+process.env.BLOCKEDFILE);
1112
constblockedFolder=process.env.BLOCKEDFOLDER;
1213
constallowedFolder=process.env.ALLOWEDFOLDER;
@@ -410,6 +411,11 @@ const regularFile = __filename;
410411
},common.expectsError({
411412
code: 'ERR_ACCESS_DENIED',
412413
}));
414+
assert.throws(()=>{
415+
fs.lstatSync(bufferBlockedFile);
416+
},common.expectsError({
417+
code: 'ERR_ACCESS_DENIED',
418+
}));
413419

414420
// doesNotThrow
415421
fs.lstat(regularFile,(err)=>{

‎test/fixtures/permission/fs-traversal.js‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ const uint8ArrayTraversalPath = new TextEncoder().encode(traversalPath);
6969
}));
7070
}
7171

72+
{
73+
fs.lstat(bufferTraversalPath,common.expectsError({
74+
code: 'ERR_ACCESS_DENIED',
75+
permission: 'FileSystemRead',
76+
// lstat checks and throw on JS side.
77+
// resource is only resolved on C++ (is_granted)
78+
resource: bufferTraversalPath.toString(),
79+
}));
80+
}
81+
7282
{
7383
fs.readFile(uint8ArrayTraversalPath,common.expectsError({
7484
code: 'ERR_ACCESS_DENIED',

‎test/parallel/test-permission-has.js‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,7 @@ const assert = require('assert');
2121
message: 'The "reference" argument must be of type string. Received an instance of Object',
2222
}));
2323
}
24+
25+
{
26+
assert.ok(!process.permission.has('FileSystemWrite',Buffer.from('reference')));
27+
}

0 commit comments

Comments
 (0)