diff --git a/lib/plugins/aws/utils/credentials.js b/lib/plugins/aws/utils/credentials.js index 13909e46b..2321e42a6 100644 --- a/lib/plugins/aws/utils/credentials.js +++ b/lib/plugins/aws/utils/credentials.js @@ -1,12 +1,13 @@ 'use strict'; const { join } = require('path'); -const { constants, readFile, writeFile } = require('fs'); +const { constants, readFile, writeFile, mkdir } = require('fs'); const os = require('os'); const BbPromise = require('bluebird'); const homedir = os.homedir(); -const credentialsFilePath = homedir ? join(homedir, '.aws/credentials') : null; +const awsConfigDirPath = join(homedir, '.aws'); +const credentialsFilePath = homedir ? join(awsConfigDirPath, 'credentials') : null; const profileNameRe = /^\[([^\]]+)]\s*$/; const settingRe = /^([a-zA-Z0-9_]+)\s*=\s*([^\s]+)\s*$/; @@ -38,6 +39,33 @@ const parseFileProfiles = content => { return profiles; }; +const writeCredentialsContent = content => + new BbPromise((resolve, reject) => + writeFile( + credentialsFilePath, + content, + { mode: constants.S_IRUSR | constants.S_IWUSR }, + writeFileError => { + if (writeFileError) { + if (writeFileError.code === 'ENOENT') { + mkdir( + awsConfigDirPath, + { mode: constants.S_IRUSR | constants.S_IWUSR | constants.S_IXUSR }, + mkdirError => { + if (mkdirError) reject(mkdirError); + else resolve(writeCredentialsContent(content)); + } + ); + } else { + reject(writeFileError); + } + } else { + resolve(); + } + } + ) + ); + module.exports = { resolveFileProfiles() { return new BbPromise((resolve, reject) => { @@ -68,23 +96,18 @@ module.exports = { }, saveFileProfiles(profiles) { - return new BbPromise((resolve, reject) => { + return new BbPromise(resolve => { if (!credentialsFilePath) throw new Error('Could not resolve path to user credentials file'); - const content = `${Array.from(profiles) - .map( - ([name, data]) => - `[${name}]\naws_access_key_id=${data.accessKeyId}\n` + - `aws_secret_access_key=${data.secretAccessKey}\n` + resolve( + writeCredentialsContent( + `${Array.from(profiles) + .map( + ([name, data]) => + `[${name}]\naws_access_key_id=${data.accessKeyId}\n` + + `aws_secret_access_key=${data.secretAccessKey}\n` + ) + .join('\n')}` ) - .join('\n')}`; - writeFile( - credentialsFilePath, - content, - { mode: constants.S_IRUSR | constants.S_IWUSR }, - error => { - if (error) reject(error); - else resolve(); - } ); }); },