UNPKG

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
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 };