exports.id = 974; exports.ids = [974]; exports.modules = { /***/ 62148: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var readline = __webpack_require__(51058); var defaultSpinnerString = 0; var defaultSpinnerDelay = 60; function defaultOnTick(msg) { this.clearLine(this.stream); this.stream.write(msg); }; var Spinner = function(options){ if(!(this instanceof Spinner)) return new Spinner(options) if(typeof options === "string"){ options = { text: options }; } else if(!options){ options = {}; } this.text = options.text || ''; this.setSpinnerString(defaultSpinnerString); this.setSpinnerDelay(defaultSpinnerDelay); this.onTick = options.onTick || defaultOnTick; this.stream = options.stream || process.stdout; }; Spinner.spinners = __webpack_require__(18138); Spinner.setDefaultSpinnerString = function(value) { defaultSpinnerString = value; return this; }; Spinner.setDefaultSpinnerDelay = function(value) { defaultSpinnerDelay = value; return this; }; Spinner.prototype.start = function() { if(this.stream === process.stdout && this.stream.isTTY !== true) { return this; } var current = 0; var self = this; var iteration = function() { var msg = self.text.indexOf('%s') > -1 ? self.text.replace('%s', self.chars[current]) : self.chars[current] + ' ' + self.text; self.onTick(msg); current = ++current % self.chars.length; }; iteration(); this.id = setInterval(iteration, this.delay); return this; }; Spinner.prototype.isSpinning = function() { return this.id !== undefined; } Spinner.prototype.setSpinnerDelay = function(n) { this.delay = n; return this; }; Spinner.prototype.setSpinnerString = function(str) { const map = mapToSpinner(str, this.spinners); this.chars = Array.isArray(map) ? map : map.split(''); return this; }; Spinner.prototype.setSpinnerTitle = function(str) { this.text = str; return this; } Spinner.prototype.stop = function(clear) { if(this.isSpinning === false) { return this; } clearInterval(this.id); this.id = undefined; if (clear) { this.clearLine(this.stream); } return this; }; Spinner.prototype.clearLine = function(stream) { readline.clearLine(stream, 0); readline.cursorTo(stream, 0); return this; } // Helpers function isInt(value) { return (typeof value==='number' && (value%1)===0); } function mapToSpinner(value, spinners) { // Not an integer, return as strng if (!isInt(value)) { return value + ''; } var length = Spinner.spinners.length; // Check if index is within bounds value = (value >= length) ? 0 : value; // If negative, count from the end value = (value < 0) ? length + value : value; return Spinner.spinners[value]; } exports.Spinner = Spinner; /***/ }), /***/ 41595: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const fs = __webpack_require__(35747); let isDocker; function hasDockerEnv() { try { fs.statSync('/.dockerenv'); return true; } catch (_) { return false; } } function hasDockerCGroup() { try { return fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker'); } catch (_) { return false; } } module.exports = () => { if (isDocker === undefined) { isDocker = hasDockerEnv() || hasDockerCGroup(); } return isDocker; }; /***/ }), /***/ 82818: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const os = __webpack_require__(12087); const fs = __webpack_require__(35747); const isDocker = __webpack_require__(41595); const isWsl = () => { if (process.platform !== 'linux') { return false; } if (os.release().toLowerCase().includes('microsoft')) { if (isDocker()) { return false; } return true; } try { return fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft') ? !isDocker() : false; } catch (_) { return false; } }; if (process.env.__IS_WSL_TEST__) { module.exports = isWsl; } else { module.exports = isWsl(); } /***/ }), /***/ 78318: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; const {promisify} = __webpack_require__(31669); const path = __webpack_require__(85622); const childProcess = __webpack_require__(63129); const fs = __webpack_require__(35747); const isWsl = __webpack_require__(82818); const isDocker = __webpack_require__(41595); const pAccess = promisify(fs.access); const pReadFile = promisify(fs.readFile); // Path to included `xdg-open`. const localXdgOpenPath = path.join(__dirname, 'xdg-open'); /** Get the mount point for fixed drives in WSL. @inner @returns {string} The mount point. */ const getWslDrivesMountPoint = (() => { // Default value for "root" param // according to https://docs.microsoft.com/en-us/windows/wsl/wsl-config const defaultMountPoint = '/mnt/'; let mountPoint; return async function () { if (mountPoint) { // Return memoized mount point value return mountPoint; } const configFilePath = '/etc/wsl.conf'; let isConfigFileExists = false; try { await pAccess(configFilePath, fs.constants.F_OK); isConfigFileExists = true; } catch (_) {} if (!isConfigFileExists) { return defaultMountPoint; } const configContent = await pReadFile(configFilePath, {encoding: 'utf8'}); const configMountPoint = /root\s*=\s*(.*)/g.exec(configContent); if (!configMountPoint) { return defaultMountPoint; } mountPoint = configMountPoint[1].trim(); mountPoint = mountPoint.endsWith('/') ? mountPoint : mountPoint + '/'; return mountPoint; }; })(); module.exports = async (target, options) => { if (typeof target !== 'string') { throw new TypeError('Expected a `target`'); } options = { wait: false, background: false, allowNonzeroExitCode: false, ...options }; let command; let {app} = options; let appArguments = []; const cliArguments = []; const childProcessOptions = {}; if (Array.isArray(app)) { appArguments = app.slice(1); app = app[0]; } if (process.platform === 'darwin') { command = 'open'; if (options.wait) { cliArguments.push('--wait-apps'); } if (options.background) { cliArguments.push('--background'); } if (app) { cliArguments.push('-a', app); } } else if (process.platform === 'win32' || (isWsl && !isDocker())) { const mountPoint = await getWslDrivesMountPoint(); command = isWsl ? `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe` : `${process.env.SYSTEMROOT}\\System32\\WindowsPowerShell\\v1.0\\powershell`; cliArguments.push( '-NoProfile', '-NonInteractive', '–ExecutionPolicy', 'Bypass', '-EncodedCommand' ); if (!isWsl) { childProcessOptions.windowsVerbatimArguments = true; } const encodedArguments = ['Start']; if (options.wait) { encodedArguments.push('-Wait'); } if (app) { // Double quote with double quotes to ensure the inner quotes are passed through. // Inner quotes are delimited for PowerShell interpretation with backticks. encodedArguments.push(`"\`"${app}\`""`, '-ArgumentList'); appArguments.unshift(target); } else { encodedArguments.push(`"${target}"`); } if (appArguments.length > 0) { appArguments = appArguments.map(arg => `"\`"${arg}\`""`); encodedArguments.push(appArguments.join(',')); } // Using Base64-encoded command, accepted by PowerShell, to allow special characters. target = Buffer.from(encodedArguments.join(' '), 'utf16le').toString('base64'); } else { if (app) { command = app; } else { // When bundled by Webpack, there's no actual package file path and no local `xdg-open`. const isBundled = !__dirname || __dirname === '/'; // Check if local `xdg-open` exists and is executable. let exeLocalXdgOpen = false; try { await pAccess(localXdgOpenPath, fs.constants.X_OK); exeLocalXdgOpen = true; } catch (_) {} const useSystemXdgOpen = process.versions.electron || process.platform === 'android' || isBundled || !exeLocalXdgOpen; command = useSystemXdgOpen ? 'xdg-open' : localXdgOpenPath; } if (appArguments.length > 0) { cliArguments.push(...appArguments); } if (!options.wait) { // `xdg-open` will block the process unless stdio is ignored // and it's detached from the parent even if it's unref'd. childProcessOptions.stdio = 'ignore'; childProcessOptions.detached = true; } } cliArguments.push(target); if (process.platform === 'darwin' && appArguments.length > 0) { cliArguments.push('--args', ...appArguments); } const subprocess = childProcess.spawn(command, cliArguments, childProcessOptions); if (options.wait) { return new Promise((resolve, reject) => { subprocess.once('error', reject); subprocess.once('close', exitCode => { if (options.allowNonzeroExitCode && exitCode > 0) { reject(new Error(`Exited with code ${exitCode}`)); return; } resolve(subprocess); }); }); } subprocess.unref(); return subprocess; }; /***/ }), /***/ 27974: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); const open = __webpack_require__(78318); const uuid_1 = __webpack_require__(42277); const Debug = __webpack_require__(15158); const cli_spinner_1 = __webpack_require__(62148); const snyk = __webpack_require__(9146); const is_authed_1 = __webpack_require__(71771); const is_ci_1 = __webpack_require__(10090); const is_docker_1 = __webpack_require__(14953); const args_1 = __webpack_require__(94765); const config_1 = __webpack_require__(25425); const request_1 = __webpack_require__(52050); const errors_1 = __webpack_require__(55191); const errors_2 = __webpack_require__(55191); const token_expired_error_1 = __webpack_require__(79578); const misconfigured_auth_in_ci_error_1 = __webpack_require__(27747); const query_strings_1 = __webpack_require__(36479); const apiUrl = new URL(config_1.default.API); // Ensure user gets redirected to the login page if (apiUrl.host.startsWith('api.')) { apiUrl.host = apiUrl.host.replace(/^api\./, 'app.'); } const debug = Debug('snyk-auth'); let attemptsLeft = 0; function resetAttempts() { attemptsLeft = is_docker_1.isDocker() ? 60 : 3 * 60; } async function webAuth() { const token = uuid_1.v4(); // generate a random key apiUrl.pathname = '/login'; apiUrl.searchParams.append('token', token); let urlStr = apiUrl.toString(); // It's not optimal, but I have to parse args again here. Alternative is reworking everything about how we parse args const args = [args_1.args(process.argv).options]; const utmParams = query_strings_1.getQueryParamsAsString(args); if (utmParams) { urlStr += '&' + utmParams; } // suppress this message in CI if (!is_ci_1.isCI()) { console.log(browserAuthPrompt(is_docker_1.isDocker(), urlStr)); } else { return Promise.reject(misconfigured_auth_in_ci_error_1.MisconfiguredAuthInCI()); } const spinner = new cli_spinner_1.Spinner('Waiting...'); spinner.setSpinnerString('|/-\\'); const ipFamily = await getIpFamily(); try { spinner.start(); if (!is_docker_1.isDocker()) { await setTimeout(() => { open(urlStr); }, 0); } return await testAuthComplete(token, ipFamily); } finally { spinner.stop(true); } } async function testAuthComplete(token, ipFamily) { const payload = { body: { token, }, url: config_1.default.API + '/verify/callback', json: true, method: 'post', }; if (ipFamily) { payload.family = ipFamily; } return new Promise((resolve, reject) => { debug(payload); request_1.makeRequest(payload, (error, res, body) => { debug(error, (res || {}).statusCode, body); if (error) { return reject(error); } if (res.statusCode !== 200) { return reject(errorForFailedAuthAttempt(res, body)); } // we have success if (body.api) { return resolve({ res, body, }); } // we need to wait and poll again in a moment setTimeout(() => { attemptsLeft--; if (attemptsLeft > 0) { return resolve(testAuthComplete(token, ipFamily)); } reject(token_expired_error_1.TokenExpiredError()); }, 1000); }); }); } async function auth(apiToken) { let promise; resetAttempts(); if (apiToken) { // user is manually setting the API token on the CLI - let's trust them promise = is_authed_1.verifyAPI(apiToken); } else { promise = webAuth(); } return promise.then((data) => { const res = data.res; const body = res.body; debug(body); if (res.statusCode === 200 || res.statusCode === 201) { snyk.config.set('api', body.api); return ('\nYour account has been authenticated. Snyk is now ready to ' + 'be used.\n'); } throw errorForFailedAuthAttempt(res, body); }); } exports.default = auth; /** * Resolve an appropriate error for a failed attempt to authenticate * * @param res The response from the API * @param body The body of the failed authentication request */ function errorForFailedAuthAttempt(res, body) { if (res.statusCode === 401 || res.statusCode === 403) { return errors_2.AuthFailedError(body.userMessage, res.statusCode); } else { const userMessage = body && body.userMessage; const error = new errors_1.CustomError(userMessage || 'Auth request failed'); if (userMessage) { error.userMessage = userMessage; } error.code = res.statusCode; return error; } } async function getIpFamily() { const family = 6; try { // Dispatch a FORCED IPv6 request to test client's ISP and network capability await request_1.makeRequest({ url: config_1.default.API + '/verify/callback', family, method: 'post', }); return family; } catch (e) { return undefined; } } function browserAuthPrompt(isDocker, urlStr) { if (isDocker) { return ('\nTo authenticate your account, open the below URL in your browser.\n' + 'After your authentication is complete, return to this prompt to ' + 'start using Snyk.\n\n' + urlStr + '\n'); } else { return ('\nNow redirecting you to our auth page, go ahead and log in,\n' + "and once the auth is complete, return to this prompt and you'll\n" + "be ready to start using snyk.\n\nIf you can't wait use this url:\n" + urlStr + '\n'); } } /***/ }), /***/ 71771: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.verifyAPI = exports.isAuthed = void 0; const snyk = __webpack_require__(9146); const config_1 = __webpack_require__(25425); const request_1 = __webpack_require__(52050); function isAuthed() { const token = snyk.config.get('api'); return verifyAPI(token).then((res) => { return res.body.ok; }); } exports.isAuthed = isAuthed; function verifyAPI(api) { const payload = { body: { api, }, method: 'POST', url: config_1.default.API + '/verify/token', json: true, }; return new Promise((resolve, reject) => { request_1.makeRequest(payload, (error, res, body) => { if (error) { return reject(error); } resolve({ res, body, }); }); }); } exports.verifyAPI = verifyAPI; /***/ }), /***/ 27747: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.MisconfiguredAuthInCI = void 0; const custom_error_1 = __webpack_require__(17188); function MisconfiguredAuthInCI() { const errorMsg = 'Snyk is missing auth token in order to run inside CI. You must include ' + 'your API token as an environment value: `SNYK_TOKEN=12345678`'; const error = new custom_error_1.CustomError(errorMsg); error.code = 401; error.strCode = 'noAuthInCI'; error.userMessage = errorMsg; return error; } exports.MisconfiguredAuthInCI = MisconfiguredAuthInCI; /***/ }), /***/ 79578: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.TokenExpiredError = void 0; const custom_error_1 = __webpack_require__(17188); function TokenExpiredError() { const errorMsg = 'Sorry, but your authentication token has now' + ' expired.\nPlease try to authenticate again.'; const error = new custom_error_1.CustomError(errorMsg); error.code = 401; error.strCode = 'AUTH_TIMEOUT'; error.userMessage = errorMsg; return error; } exports.TokenExpiredError = TokenExpiredError; /***/ }), /***/ 14953: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isDocker = void 0; const fs = __webpack_require__(35747); function isDocker() { return hasDockerEnv() || hasDockerCGroup(); } exports.isDocker = isDocker; function hasDockerEnv() { try { fs.statSync('/.dockerenv'); return true; } catch (_) { return false; } } function hasDockerCGroup() { try { return fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker'); } catch (_) { return false; } } /***/ }), /***/ 36479: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getQueryParamsAsString = void 0; const url = __webpack_require__(78835); const os = __webpack_require__(12087); const is_docker_1 = __webpack_require__(14953); const sources_1 = __webpack_require__(71653); function getQueryParamsAsString(args) { var _a; const utm_source = process.env.SNYK_UTM_SOURCE || 'cli'; const utm_medium = process.env.SNYK_UTM_MEDIUM || 'cli'; const utm_campaign = process.env.SNYK_UTM_CAMPAIGN || sources_1.getIntegrationName(args) || 'cli'; const utm_campaign_content = process.env.SNYK_UTM_CAMPAIGN_CONTENT || sources_1.getIntegrationVersion(args); const osType = (_a = os.type()) === null || _a === void 0 ? void 0 : _a.toLowerCase(); const docker = is_docker_1.isDocker().toString(); const queryParams = new url.URLSearchParams({ utm_medium, utm_source, utm_campaign, utm_campaign_content, os: osType, docker, }); // It may not be set and URLSearchParams won't filter out undefined values if (!utm_campaign_content) { queryParams.delete('utm_campaign_content'); } return queryParams.toString(); } exports.getQueryParamsAsString = getQueryParamsAsString; /***/ }), /***/ 18138: /***/ ((module) => { "use strict"; module.exports = JSON.parse('["|/-\\\\","⠂-–—–-","◐◓◑◒","◴◷◶◵","◰◳◲◱","▖▘▝▗","■□▪▫","▌▀▐▄","▉▊▋▌▍▎▏▎▍▌▋▊▉","▁▃▄▅▆▇█▇▆▅▄▃","←↖↑↗→↘↓↙","┤┘┴└├┌┬┐","◢◣◤◥",".oO°Oo.",".oO@*",["🌍","🌎","🌏"],"◡◡ ⊙⊙ ◠◠","☱☲☴","⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏","⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓","⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆","⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋","⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁","⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈","⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈","⢄⢂⢁⡁⡈⡐⡠","⢹⢺⢼⣸⣇⡧⡗⡏","⣾⣽⣻⢿⡿⣟⣯⣷","⠁⠂⠄⡀⢀⠠⠐⠈",["🌑","🌒","🌓","🌔","🌕","🌝","🌖","🌗","🌘","🌚"],["🕛","🕐","🕑","🕒","🕓","🕔","🕕","🕖","🕗","🕘","🕙","🕚"]]'); /***/ }) }; ; //# sourceMappingURL=974.index.js.map