45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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.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)
 | |
|   })
 | |
| }
 |