2018-04-12 11:54:19 +02:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
const {
|
|
|
|
ERR_INVALID_ARG_TYPE,
|
|
|
|
ERR_UNKNOWN_CREDENTIAL
|
|
|
|
} = require('internal/errors').codes;
|
|
|
|
const {
|
2018-05-26 18:51:19 +08:00
|
|
|
validateMode,
|
2018-04-12 11:54:19 +02:00
|
|
|
validateUint32
|
|
|
|
} = require('internal/validators');
|
2017-09-01 17:03:41 +02:00
|
|
|
const {
|
|
|
|
isMainThread
|
|
|
|
} = require('internal/worker');
|
2018-04-12 11:54:19 +02:00
|
|
|
|
2018-05-23 15:04:23 -07:00
|
|
|
function setupProcessMethods(_chdir, _cpuUsage, _hrtime, _memoryUsage,
|
|
|
|
_rawDebug, _umask, _initgroups, _setegid,
|
|
|
|
_seteuid, _setgid, _setuid, _setgroups) {
|
2018-04-12 11:54:19 +02:00
|
|
|
// Non-POSIX platforms like Windows don't have certain methods.
|
2017-09-01 17:03:41 +02:00
|
|
|
// Workers also lack these methods since they change process-global state.
|
|
|
|
if (!isMainThread)
|
|
|
|
return;
|
|
|
|
|
2018-05-23 15:04:23 -07:00
|
|
|
if (_setgid !== undefined) {
|
|
|
|
setupPosixMethods(_initgroups, _setegid, _seteuid,
|
|
|
|
_setgid, _setuid, _setgroups);
|
2018-04-12 11:54:19 +02:00
|
|
|
}
|
|
|
|
|
2018-05-23 15:04:23 -07:00
|
|
|
process.chdir = function chdir(directory) {
|
2018-04-12 11:54:19 +02:00
|
|
|
if (typeof directory !== 'string') {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE('directory', 'string', directory);
|
|
|
|
}
|
|
|
|
return _chdir(directory);
|
2018-05-23 15:04:23 -07:00
|
|
|
};
|
2018-04-12 11:54:19 +02:00
|
|
|
|
2018-05-23 15:04:23 -07:00
|
|
|
process.umask = function umask(mask) {
|
2018-05-09 22:44:44 +08:00
|
|
|
if (mask === undefined) {
|
|
|
|
// Get the mask
|
2018-04-12 11:54:19 +02:00
|
|
|
return _umask(mask);
|
|
|
|
}
|
2018-05-26 18:51:19 +08:00
|
|
|
mask = validateMode(mask, 'mask');
|
2018-05-09 22:44:44 +08:00
|
|
|
return _umask(mask);
|
2018-05-23 15:04:23 -07:00
|
|
|
};
|
2018-04-12 11:54:19 +02:00
|
|
|
}
|
|
|
|
|
2018-05-23 15:04:23 -07:00
|
|
|
function setupPosixMethods(_initgroups, _setegid, _seteuid,
|
|
|
|
_setgid, _setuid, _setgroups) {
|
2018-04-12 11:54:19 +02:00
|
|
|
|
2018-05-23 15:04:23 -07:00
|
|
|
process.initgroups = function initgroups(user, extraGroup) {
|
2018-04-12 11:54:19 +02:00
|
|
|
validateId(user, 'user');
|
|
|
|
validateId(extraGroup, 'extraGroup');
|
|
|
|
// Result is 0 on success, 1 if user is unknown, 2 if group is unknown.
|
|
|
|
const result = _initgroups(user, extraGroup);
|
|
|
|
if (result === 1) {
|
|
|
|
throw new ERR_UNKNOWN_CREDENTIAL('User', user);
|
|
|
|
} else if (result === 2) {
|
|
|
|
throw new ERR_UNKNOWN_CREDENTIAL('Group', extraGroup);
|
|
|
|
}
|
2018-05-23 15:04:23 -07:00
|
|
|
};
|
2018-04-12 11:54:19 +02:00
|
|
|
|
2018-05-23 15:04:23 -07:00
|
|
|
process.setegid = function setegid(id) {
|
2018-04-12 11:54:19 +02:00
|
|
|
return execId(id, 'Group', _setegid);
|
2018-05-23 15:04:23 -07:00
|
|
|
};
|
2018-04-12 11:54:19 +02:00
|
|
|
|
2018-05-23 15:04:23 -07:00
|
|
|
process.seteuid = function seteuid(id) {
|
2018-04-12 11:54:19 +02:00
|
|
|
return execId(id, 'User', _seteuid);
|
2018-05-23 15:04:23 -07:00
|
|
|
};
|
2018-04-12 11:54:19 +02:00
|
|
|
|
2018-05-23 15:04:23 -07:00
|
|
|
process.setgid = function setgid(id) {
|
2018-04-12 11:54:19 +02:00
|
|
|
return execId(id, 'Group', _setgid);
|
2018-05-23 15:04:23 -07:00
|
|
|
};
|
2018-04-12 11:54:19 +02:00
|
|
|
|
2018-05-23 15:04:23 -07:00
|
|
|
process.setuid = function setuid(id) {
|
2018-04-12 11:54:19 +02:00
|
|
|
return execId(id, 'User', _setuid);
|
2018-05-23 15:04:23 -07:00
|
|
|
};
|
2018-04-12 11:54:19 +02:00
|
|
|
|
2018-05-23 15:04:23 -07:00
|
|
|
process.setgroups = function setgroups(groups) {
|
2018-04-12 11:54:19 +02:00
|
|
|
if (!Array.isArray(groups)) {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE('groups', 'Array', groups);
|
|
|
|
}
|
|
|
|
for (var i = 0; i < groups.length; i++) {
|
|
|
|
validateId(groups[i], `groups[${i}]`);
|
|
|
|
}
|
|
|
|
// Result is 0 on success. A positive integer indicates that the
|
|
|
|
// corresponding group was not found.
|
|
|
|
const result = _setgroups(groups);
|
|
|
|
if (result > 0) {
|
|
|
|
throw new ERR_UNKNOWN_CREDENTIAL('Group', groups[result - 1]);
|
|
|
|
}
|
2018-05-23 15:04:23 -07:00
|
|
|
};
|
2018-04-12 11:54:19 +02:00
|
|
|
|
|
|
|
function execId(id, type, method) {
|
|
|
|
validateId(id, 'id');
|
|
|
|
// Result is 0 on success, 1 if credential is unknown.
|
|
|
|
const result = method(id);
|
|
|
|
if (result === 1) {
|
|
|
|
throw new ERR_UNKNOWN_CREDENTIAL(type, id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function validateId(id, name) {
|
|
|
|
if (typeof id === 'number') {
|
|
|
|
validateUint32(id, name);
|
|
|
|
} else if (typeof id !== 'string') {
|
|
|
|
throw new ERR_INVALID_ARG_TYPE(name, ['number', 'string'], id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
exports.setup = setupProcessMethods;
|