From 9efceb5032ab27e34af923aee6902406d2ed6069 Mon Sep 17 00:00:00 2001 From: Lubos Magda Date: Mon, 31 Aug 2020 21:18:31 +1000 Subject: [PATCH] Shell script hooks --- package-lock.json | 53 ++++++++++++++++++++++++++++++++-- package.json | 2 ++ src/login.ts | 72 ++++++++++++++++++++++++++++++++-------------- src/shellScrpts.ts | 33 +++++++++++++++++++++ 4 files changed, 135 insertions(+), 25 deletions(-) create mode 100644 src/shellScrpts.ts diff --git a/package-lock.json b/package-lock.json index cf853f3..203a47f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -75,6 +75,16 @@ "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", "dev": true }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/ini": { "version": "1.3.30", "resolved": "https://registry.npmjs.org/@types/ini/-/ini-1.3.30.tgz", @@ -103,6 +113,12 @@ "integrity": "sha512-InCEXJNTv/59yO4VSfuvNrZHt7eeNtWQEgnieIA+mIC+MOWM9arOWG2eQ8Vhk6NbOre6/BidiXhkZYeDY9U35w==", "dev": true }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, "@types/mkdirp": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.1.tgz", @@ -126,6 +142,16 @@ "@types/node": "*" } }, + "@types/shelljs": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.8.tgz", + "integrity": "sha512-lD3LWdg6j8r0VRBFahJVaxoW0SIcswxKaFUrmKl33RJVeeoNYQAz4uqCJ5Z6v4oIBOsC5GozX+I5SorIKiTcQA==", + "dev": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", @@ -1524,6 +1550,11 @@ } } }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -1967,8 +1998,7 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-type": { "version": "1.1.0", @@ -2180,6 +2210,14 @@ "util-deprecate": "~1.0.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -2209,7 +2247,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.1.tgz", "integrity": "sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==", - "dev": true, "requires": { "path-parse": "^1.0.6" } @@ -2292,6 +2329,16 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", diff --git a/package.json b/package.json index dd954f1..ec7ca81 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "mkdirp": "^1.0.4", "proxy-agent": "^3.1.1", "puppeteer": "^5.2.1", + "shelljs": "^0.8.3", "uuid": "^8.3.0" }, "devDependencies": { @@ -51,6 +52,7 @@ "@types/mkdirp": "^1.0.1", "@types/node": "^14.0.27", "@types/puppeteer": "^3.0.1", + "@types/shelljs": "^0.8.8", "@types/uuid": "^8.0.0", "@typescript-eslint/eslint-plugin": "^3.8.0", "@typescript-eslint/parser": "^3.8.0", diff --git a/src/login.ts b/src/login.ts index 3ae418c..0d5a82d 100644 --- a/src/login.ts +++ b/src/login.ts @@ -16,6 +16,11 @@ import { paths } from "./paths"; import mkdirp from "mkdirp"; const debug = _debug("aws-azure-login"); +import { + getUsernameSh, + getPasswordSh, + getVerificationCodeSh, +} from "./shellScrpts"; const WIDTH = 425; const HEIGHT = 550; @@ -68,14 +73,21 @@ const states = [ debug("Not prompting user for username"); username = defaultUsername; } else { - debug("Prompting user for username"); - ({ username } = await inquirer.prompt([ - { - name: "username", - message: "Username:", - default: defaultUsername, - } as Question, - ])); + const usernameSh = getUsernameSh(); + if (usernameSh) { + debug("Username retrieved"); + username = usernameSh; + console.log(`Entering username (${username})`); + } else { + debug("Prompting user for username"); + ({ username } = await inquirer.prompt([ + { + name: "username", + message: "Username:", + default: defaultUsername, + } as Question, + ])); + } } debug("Waiting for username input to be visible"); @@ -211,14 +223,21 @@ const states = [ debug("Not prompting user for password"); password = defaultPassword; } else { - debug("Prompting user for password"); - ({ password } = await inquirer.prompt([ - { - name: "password", - message: "Password:", - type: "password", - } as Question, - ])); + const passwordSh = getPasswordSh(); + if (passwordSh) { + debug("Password retrieved"); + password = passwordSh; + console.log("Entering password"); + } else { + debug("Prompting user for password"); + ({ password } = await inquirer.prompt([ + { + name: "password", + message: "Password:", + type: "password", + } as Question, + ])); + } } debug("Focusing on password input"); @@ -297,12 +316,21 @@ const states = [ console.log(descriptionMessage); } - const { verificationCode } = await inquirer.prompt([ - { - name: "verificationCode", - message: "Verification Code:", - } as Question, - ]); + let verificationCode; + + const verificationCodeSh = getVerificationCodeSh(); + if (verificationCodeSh) { + debug("Verification code retrieved"); + verificationCode = verificationCodeSh; + console.log(`Entering verification code (${verificationCode})`); + } else { + ({ verificationCode } = await inquirer.prompt([ + { + name: "verificationCode", + message: "Verification Code:", + } as Question, + ])); + } debug("Focusing on verification code input"); await page.focus(`input[name="otc"]`); diff --git a/src/shellScrpts.ts b/src/shellScrpts.ts new file mode 100644 index 0000000..ba61576 --- /dev/null +++ b/src/shellScrpts.ts @@ -0,0 +1,33 @@ +import shell from "shelljs"; +import path from "path"; +import { paths } from "./paths"; + +import _debug from "debug"; +const debug = _debug("aws-azure-login"); + +const usernameScriptPath: string = + process.env.AWS_LOGIN_SCRIPT_USERNAME ?? + path.join(paths.awsDir, ".aws-azure-login.username.sh"); +const passwordScriptPath: string = + process.env.AWS_LOGIN_SCRIPT_PASSWORD ?? + path.join(paths.awsDir, ".aws-azure-login.password.sh"); +const staticChallengeScriptPath: string = + process.env.AWS_LOGIN_SCRIPT_MFA ?? + path.join(paths.awsDir, ".aws-azure-login.static-challenge.sh"); + +const trim = (str: string): string => (str ? str.trim() : str); +const execSh = (path: string): string | undefined => { + if (shell.test("-e", path)) { + debug(`Executing ${path}`); + return trim(shell.exec(path, { silent: true }).stdout); + } else { + debug(`Script ${path} does not exist`); + } +}; + +export const getUsernameSh = (): string | undefined => + execSh(usernameScriptPath); +export const getPasswordSh = (): string | undefined => + execSh(passwordScriptPath); +export const getVerificationCodeSh = (): string | undefined => + execSh(staticChallengeScriptPath);