mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.9 KiB
56 lines
1.9 KiB
13 years ago
|
module.exports = uidNumber
|
||
|
|
||
|
// This module calls into bin/npm-get-uid-gid.js, which sets the
|
||
|
// uid and gid to the supplied argument, in order to find out their
|
||
|
// numeric value. This can't be done in the main node process,
|
||
|
// because otherwise npm would be running as that user.
|
||
|
|
||
|
var exec = require("./exec.js")
|
||
|
, path = require("path")
|
||
|
, log = require("./log.js")
|
||
|
, constants = require("constants")
|
||
|
, npm = require("../npm.js")
|
||
|
, uidSupport = process.getuid && process.setuid
|
||
|
, uidCache = {}
|
||
|
, gidCache = {}
|
||
|
|
||
|
function uidNumber (uid, gid, cb) {
|
||
|
if (!uidSupport || npm.config.get("unsafe-perm")) return cb()
|
||
|
if (typeof cb !== "function") cb = gid, gid = null
|
||
|
if (typeof cb !== "function") cb = uid, uid = null
|
||
|
if (gid == null) gid = process.getgid()
|
||
|
if (uid == null) uid = process.getuid()
|
||
|
if (!isNaN(gid)) gid = +gid
|
||
|
if (!isNaN(uid)) uid = +uid
|
||
|
|
||
|
if (uidCache[uid]) uid = uidCache[uid]
|
||
|
if (gidCache[gid]) gid = gidCache[gid]
|
||
|
|
||
|
if (typeof gid === "number" && typeof uid === "number") {
|
||
|
return cb(null, uid, gid)
|
||
|
}
|
||
|
|
||
|
var getter = path.join(__dirname, "..", "..", "bin", "npm-get-uid-gid.js")
|
||
|
return exec( process.execPath, [getter, uid, gid], process.env, false
|
||
|
, null, process.getuid(), process.getgid()
|
||
|
, function (er, code, out, err) {
|
||
|
if (er) return log.er(cb, "Could not get uid/gid "+err)(er)
|
||
|
log.silly(out, "output from getuid/gid")
|
||
|
out = JSON.parse(out+"")
|
||
|
if (out.error) {
|
||
|
if (!npm.config.get("unsafe-perm")) {
|
||
|
var er = new Error(out.error)
|
||
|
er.errno = out.errno
|
||
|
return cb(er)
|
||
|
} else {
|
||
|
return cb(null, +process.getuid(), +process.getgid())
|
||
|
}
|
||
|
}
|
||
|
if (isNaN(out.uid) || isNaN(out.gid)) return cb(new Error(
|
||
|
"Could not get uid/gid: "+JSON.stringify(out)))
|
||
|
uidCache[uid] = out.uid
|
||
|
uidCache[gid] = out.gid
|
||
|
cb(null, out.uid, out.gid)
|
||
|
})
|
||
|
}
|