Skip to content

Commit

Permalink
Replace fs.accessSync call to fs.statSync
Browse files Browse the repository at this point in the history
fs.accessSync does not exist in Node 0.10.x.
  • Loading branch information
richardlau committed Jun 17, 2016
1 parent dc89fea commit efedde8
Show file tree
Hide file tree
Showing 3 changed files with 167 additions and 12 deletions.
67 changes: 56 additions & 11 deletions lib/configure.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
module.exports = exports = configure
module.exports.test = { findPython: findPython }
module.exports.test = { findAccessibleSync: findAccessibleSync,
findPython: findPython }

/**
* Module dependencies.
Expand All @@ -20,6 +21,7 @@ var fs = require('graceful-fs')
, execFile = cp.execFile
, win = process.platform == 'win32'
, findNodeDirectory = require('./find-node-directory')
, msgFormat = require('util').format

exports.usage = 'Generates ' + (win ? 'MSVC project files' : 'a Makefile') + ' for the current module'

Expand Down Expand Up @@ -226,22 +228,21 @@ function configure (gyp, argv, callback) {
// - the out/Release directory
// - the out/Debug directory
// - the root directory
var node_exp_file = ''
var node_exp_file = undefined
if (process.platform === 'aix') {
var node_root_dir = findNodeDirectory()
var candidates = ['include/node/node.exp',
'out/Release/node.exp',
'out/Debug/node.exp',
'node.exp']
for (var next = 0; next < candidates.length; next++) {
node_exp_file = path.resolve(node_root_dir, candidates[next])
try {
fs.accessSync(node_exp_file, fs.R_OK)
// exp file found, stop looking
break
} catch (exception) {
// this candidate was not found or not readable, do nothing
}
var logprefix = 'find exports file'
node_exp_file = findAccessibleSync(logprefix, node_root_dir, candidates)
if (node_exp_file !== undefined) {
log.verbose(logprefix, 'Found exports file: %s', node_exp_file)
} else {
var msg = msgFormat('Could not find node.exp file in %s', node_root_dir)
log.error(logprefix, 'Could not find exports file')
return callback(new Error(msg))
}
}

Expand Down Expand Up @@ -310,6 +311,50 @@ function configure (gyp, argv, callback) {

}

/**
* Returns the first file or directory from an array of candidates that is
* readable by the current user, or undefined if none of the candidates are
* readable.
*/
function findAccessibleSync (logprefix, dir, candidates) {
var found = undefined
var stats, candidate
for (var next = 0; next < candidates.length; next++) {
candidate = path.resolve(dir, candidates[next])
try {
stats = fs.statSync(candidate)
} catch (exception) {
// this candidate was not found or not readable, do nothing
log.silly(logprefix, '%s does not exist', candidate)
continue
}
if (stats.uid === process.getuid()) {
if (stats.mode & 0400) {
log.silly(logprefix, '%s has owner read permission', candidate)
found = candidate
break
}
} else if (process.getgroups().some(function (group) {
return stats.gid === group
}, false)) {
if (stats.mode & 0040) {
log.silly(logprefix, '%s has group read permission', candidate)
found = candidate
break
}
} else {
if (stats.mode & 0004) {
log.silly(logprefix, '%s has others read permission', candidate)
found = candidate
break
}
}
log.silly(logprefix, '%s exists but has no read permissions', candidate)
}

return found
}

function findPython (python, callback) {
checkPython()

Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@
"devDependencies": {
"tape": "~4.2.0",
"bindings": "~1.2.1",
"nan": "^2.0.0"
"nan": "^2.0.0",
"require-inject": "~1.3.0"
},
"scripts": {
"test": "tape test/test-*"
Expand Down
109 changes: 109 additions & 0 deletions test/test-find-accessible-sync.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
'use strict'

if (process.platform === 'win32') {
return
}

var test = require('tape')
var requireInject = require('require-inject')
var configure = requireInject('../lib/configure', {
'graceful-fs': {
'statSync': function (path) {
var stats = files[path]
if (stats !== undefined) {
return stats
} else {
var error = new Error('ENOENT - not found')
throw error
}
}
}
})

var owner_uid = process.getuid()
var other_uid = owner_uid+1
var owner_groups = process.getgroups()
// One of the groups the current user is a member of
var owner_group = owner_groups[Math.floor(Math.random()*owner_groups.length)]
// A group the user is not a member of
var others_group = owner_group
do {
others_group++
} while (owner_groups.some(function (val) { return val === others_group } ))
var dir = '/testdir'
var files = {
'/testdir/owner_readable': { mode: parseInt('0400',8), uid: owner_uid,
gid: owner_group },
'/testdir/group_readable': { mode: parseInt('0640',8), uid: other_uid,
gid: owner_group },
'/testdir/others_readable': { mode: parseInt('0604',8), uid: other_uid,
gid: others_group },
'/testdir/not_in_group': { mode: parseInt('0640',8), uid: other_uid,
gid: others_group },
}

test('find accessible - empty array', function (t) {
t.plan(1)

var candidates = []
var found = configure.test.findAccessibleSync('test', dir, candidates)
t.strictEqual(found, undefined)
})

test('find accessible - single item array, file owner readable', function (t) {
t.plan(1)

var candidates = [ 'owner_readable' ]
var found = configure.test.findAccessibleSync('test', dir, candidates)
t.strictEqual(found, '/testdir/owner_readable')
})

test('find accessible - single item array, file group readable', function (t) {
t.plan(1)

var candidates = [ 'group_readable' ]
var found = configure.test.findAccessibleSync('test', dir, candidates)
t.strictEqual(found, '/testdir/group_readable')
})

test('find accessible - single item array, file others readable', function (t) {
t.plan(1)

var candidates = [ 'others_readable' ]
var found = configure.test.findAccessibleSync('test', dir, candidates)
t.strictEqual(found, '/testdir/others_readable')
})

test('find accessible - single item array, file group unreadable', function (t) {
t.plan(1)

var candidates = [ 'not_in_group' ]
var found = configure.test.findAccessibleSync('test', dir, candidates)
t.strictEqual(found, undefined)
})


test('find accessible - multi item array, no matches', function (t) {
t.plan(1)

var candidates = [ 'non_existent_file', 'not_in_group' ]
var found = configure.test.findAccessibleSync('test', dir, candidates)
t.strictEqual(found, undefined)
})


test('find accessible - multi item array, single match', function (t) {
t.plan(1)

var candidates = [ 'non_existent_file', 'owner_readable' ]
var found = configure.test.findAccessibleSync('test', dir, candidates)
t.strictEqual(found, '/testdir/owner_readable')
})

test('find accessible - multi item array, return first match', function (t) {
t.plan(1)

var candidates = [ 'non_existent_file', 'group_readable', 'owner_readable' ]
var found = configure.test.findAccessibleSync('test', dir, candidates)
t.strictEqual(found, '/testdir/group_readable')
})

0 comments on commit efedde8

Please sign in to comment.