'use strict'; require('../common'); const assert = require('assert'); // Most of the times, the function called for async and Sync // methods are the same on node_file.cc function syncAndAsyncAPI(funcName) { return [funcName, funcName + 'Sync']; } // This tests guarantee whenever a new API under fs module is exposed // it must contain a test to the permission model. // Otherwise, a vulnerability might be exposed. If you are adding a new // fs method, please, make sure to include a test for it on test-permission-fs-* // and include to the supportedApis list. // // // This list is synced with // fixtures/permission/fs-read and // fixtures/permission/fs-write const supportedApis = [ ...syncAndAsyncAPI('appendFile'), ...syncAndAsyncAPI('access'), ...syncAndAsyncAPI('chown'), ...syncAndAsyncAPI('chmod'), ...syncAndAsyncAPI('copyFile'), ...syncAndAsyncAPI('cp'), 'createReadStream', 'createWriteStream', ...syncAndAsyncAPI('exists'), ...syncAndAsyncAPI('lchown'), ...syncAndAsyncAPI('lchmod'), ...syncAndAsyncAPI('link'), ...syncAndAsyncAPI('lutimes'), ...syncAndAsyncAPI('mkdir'), ...syncAndAsyncAPI('mkdtemp'), ...syncAndAsyncAPI('open'), 'openAsBlob', ...syncAndAsyncAPI('mkdtemp'), ...syncAndAsyncAPI('readdir'), ...syncAndAsyncAPI('readFile'), ...syncAndAsyncAPI('readlink'), ...syncAndAsyncAPI('rename'), ...syncAndAsyncAPI('rm'), ...syncAndAsyncAPI('rmdir'), ...syncAndAsyncAPI('stat'), ...syncAndAsyncAPI('statfs'), ...syncAndAsyncAPI('statfs'), ...syncAndAsyncAPI('symlink'), ...syncAndAsyncAPI('truncate'), ...syncAndAsyncAPI('unlink'), ...syncAndAsyncAPI('utimes'), 'watch', 'watchFile', ...syncAndAsyncAPI('writeFile'), ...syncAndAsyncAPI('opendir'), ]; // Non functions const ignoreList = [ 'constants', 'promises', 'X_OK', 'W_OK', 'R_OK', 'F_OK', 'Dir', 'FileReadStream', 'FileWriteStream', '_toUnixTimestamp', 'Stats', 'ReadStream', 'WriteStream', 'Dirent', // fs.watch is already blocked 'unwatchFile', ...syncAndAsyncAPI('lstat'), ...syncAndAsyncAPI('realpath'), // fd required methods ...syncAndAsyncAPI('close'), ...syncAndAsyncAPI('fchown'), ...syncAndAsyncAPI('fchmod'), ...syncAndAsyncAPI('fdatasync'), ...syncAndAsyncAPI('fstat'), ...syncAndAsyncAPI('fsync'), ...syncAndAsyncAPI('ftruncate'), ...syncAndAsyncAPI('futimes'), ...syncAndAsyncAPI('read'), ...syncAndAsyncAPI('readv'), ...syncAndAsyncAPI('write'), ...syncAndAsyncAPI('writev'), ...syncAndAsyncAPI('glob'), ]; { const fsList = Object.keys(require('fs')); for (const k of fsList) { if (!supportedApis.includes(k) && !ignoreList.includes(k)) { assert.fail(`fs.${k} was exposed but is neither on the supported list ` + 'of the permission model nor on the ignore list.'); } } }