proxy-lib
Version:
Proxy library used in NativeScript tooling. This library gives you methods to get, set and clear proxy settings respected by NativeScript tooling.
126 lines (101 loc) • 3.71 kB
JavaScript
const path = require("path");
const childProcess = require("child_process");
const util = require("util");
const { encodings, credentialsManagerExitCodes, operations, setCredentialsErrors, getCredentialsErrors, clearCredentialsErrors, credentialsManagerErrorFormat, credentialsManagerExecutable, dirNames, dataTypes, electronDirs } = require("./constants");
const { decrypt, encrypt } = require("./encryption");
const utils = require("./utils");
const getPathToCredentialsManagerExecutable = (platform, arch) => {
return path.join(__dirname, dirNames.dotDot, dirNames.bin, platform, arch, credentialsManagerExecutable)
.replace(electronDirs.appAsar, electronDirs.appAsarUnpacked);
};
const credentialsManagerAction = (operation, { credentialsKey, username, password }) => {
return new Promise((resolve, reject) => {
if (!utils.isWindows()) {
return resolve(null);
}
const params = [credentialsKey];
if (username) {
params.push(username);
}
if (password) {
params.push(encrypt(password));
}
const pathToExe = getPathToCredentialsManagerExecutable(process.platform, process.arch);
const credentialsManagerProcess = childProcess.spawn(pathToExe, [operation, ...params]);
let isRejected = false;
credentialsManagerProcess.on("error", (err) => {
isRejected = true;
reject(err);
});
credentialsManagerProcess.stdout.setEncoding(encodings.utf16le);
let stdoutData = "";
let stderrData = "";
credentialsManagerProcess.stdout.on("data", (data) => {
stdoutData += data;
});
credentialsManagerProcess.stderr.on("data", (data) => {
stderrData += data;
});
credentialsManagerProcess.on("close", (code, signal) => {
if (isRejected) {
return;
}
if (code === credentialsManagerExitCodes.noSuchKey) {
return resolve(null);
} else if (code !== credentialsManagerExitCodes.success) {
const errorMessage = util.format(credentialsManagerErrorFormat, credentialsKey, code, signal, stderrData.toString());
return reject(new Error(errorMessage));
}
if (operation === operations.get) {
const [username, password] = stdoutData.trim().split(/\r?\n/);
const decryptedPassword = decrypt(password.trim());
resolve({ credentialsKey, username: username.trim(), password: decryptedPassword });
} else {
resolve();
}
});
});
};
const getCredentials = (params) => {
return new Promise((resolve, reject) => {
if (typeof (params) === dataTypes.string) {
params = { credentialsKey: params };
}
if (!params || !params.credentialsKey) {
return reject(new Error(getCredentialsErrors.missingCredentialsKey));
}
return credentialsManagerAction(operations.get, params)
.then(resolve, reject);
});
};
const setCredentials = (params) => {
return new Promise((resolve, reject) => {
if (!params || !params.credentialsKey) {
return reject(new Error(setCredentialsErrors.missingCredentialsKey));
}
if (!params.username) {
return reject(new Error(setCredentialsErrors.missingUsername));
}
if (!params.password) {
return reject(new Error(setCredentialsErrors.missingPassword));
}
return credentialsManagerAction(operations.set, params).then(resolve, reject);
});
};
const clearCredentials = (params) => {
return new Promise((resolve, reject) => {
if (typeof (params) === dataTypes.string) {
params = { credentialsKey: params };
}
if (!params || !params.credentialsKey) {
return reject(new Error(clearCredentialsErrors.missingCredentialsKey));
}
return credentialsManagerAction(operations.clear, params).then(resolve, reject);
});
};
module.exports = {
getCredentials,
clearCredentials,
setCredentials,
getPathToCredentialsManagerExecutable
};