'use strict' const BB = require('bluebird') const chownr = BB.promisify(require('chownr')) const mkdirp = BB.promisify(require('mkdirp')) const inflight = require('promise-inflight') module.exports.chownr = fixOwner function fixOwner (filepath, uid, gid) { if (!process.getuid) { // This platform doesn't need ownership fixing return BB.resolve() } if (typeof uid !== 'number' && typeof gid !== 'number') { // There's no permissions override. Nothing to do here. return BB.resolve() } if ((typeof uid === 'number' && process.getuid() === uid) && (typeof gid === 'number' && process.getgid() === gid)) { // No need to override if it's already what we used. return BB.resolve() } return inflight( 'fixOwner: fixing ownership on ' + filepath, () => chownr( filepath, typeof uid === 'number' ? uid : process.getuid(), typeof gid === 'number' ? gid : process.getgid() ).catch({ code: 'ENOENT' }, () => null) ) } module.exports.chownr.sync = fixOwnerSync function fixOwnerSync (filepath, uid, gid) { if (!process.getuid) { // This platform doesn't need ownership fixing return } if (typeof uid !== 'number' && typeof gid !== 'number') { // There's no permissions override. Nothing to do here. return } if ((typeof uid === 'number' && process.getuid() === uid) && (typeof gid === 'number' && process.getgid() === gid)) { // No need to override if it's already what we used. return } try { chownr.sync( filepath, typeof uid === 'number' ? uid : process.getuid(), typeof gid === 'number' ? gid : process.getgid() ) } catch (err) { if (err.code === 'ENOENT') { return null } } } module.exports.mkdirfix = mkdirfix function mkdirfix (p, uid, gid, cb) { return mkdirp(p).then(made => { if (made) { return fixOwner(made, uid, gid).then(() => made) } }).catch({ code: 'EEXIST' }, () => { // There's a race in mkdirp! return fixOwner(p, uid, gid).then(() => null) }) } module.exports.mkdirfix.sync = mkdirfixSync function mkdirfixSync (p, uid, gid) { try { const made = mkdirp.sync(p) if (made) { fixOwnerSync(made, uid, gid) return made } } catch (err) { if (err.code === 'EEXIST') { fixOwnerSync(p, uid, gid) return null } else { throw err } } }