Fixed error showing vault password prompts on relaunch

This commit is contained in:
mabashian 2018-04-30 10:47:34 -04:00
parent 7781667977
commit 24e363888a
7 changed files with 70 additions and 57 deletions

View File

@ -33,11 +33,12 @@ function atRelaunchCtrl (
) {
const jobPromises = [
jobObj.request('get', vm.job.id),
jobTemplate.optionsLaunch(vm.job.unified_job_template)
jobTemplate.optionsLaunch(vm.job.unified_job_template),
jobObj.getCredentials(vm.job.id)
];
$q.all(jobPromises)
.then(([jobRes, launchOptions]) => {
.then(([jobRes, launchOptions, jobCreds]) => {
const populatedJob = jobRes.data;
const jobTypeChoices = _.get(
launchOptions,
@ -68,7 +69,11 @@ function atRelaunchCtrl (
relaunchHostType: option ? (option.name).toLowerCase() : null,
prompts: {
credentials: {
value: populatedJob.summary_fields.credentials || []
value: populatedJob.summary_fields.credentials ?
_.merge(
jobCreds.data.results,
populatedJob.summary_fields.credentials
) : []
},
variables: {
value: populatedJob.extra_vars

View File

@ -48,6 +48,15 @@ function getStats () {
});
}
function getCredentials (id) {
const req = {
method: 'GET',
url: `${this.path}${id}/credentials/`
};
return $http(req);
}
function JobModel (method, resource, config) {
BaseModel.call(this, 'jobs');
@ -56,6 +65,7 @@ function JobModel (method, resource, config) {
this.postRelaunch = postRelaunch.bind(this);
this.getRelaunch = getRelaunch.bind(this);
this.getStats = getStats.bind(this);
this.getCredentials = getCredentials.bind(this);
return this.create(method, resource, config);
}

View File

@ -56,10 +56,12 @@ export default [ 'Rest', 'GetBasePath', 'ProcessErrors', 'CredentialTypeModel',
.then( (response) => {
vm.promptDataClone.prompts.credentials.credentialTypes = {};
vm.promptDataClone.prompts.credentials.credentialTypeOptions = [];
let machineCredTypeId = null;
response.data.results.forEach((credentialTypeRow => {
vm.promptDataClone.prompts.credentials.credentialTypes[credentialTypeRow.id] = credentialTypeRow.kind;
if(credentialTypeRow.kind.match(/^(cloud|net|ssh|vault)$/)) {
if(credentialTypeRow.kind === 'ssh') {
machineCredTypeId = credentialTypeRow.id;
vm.promptDataClone.prompts.credentials.credentialKind = credentialTypeRow.id.toString();
}
vm.promptDataClone.prompts.credentials.credentialTypeOptions.push({
@ -72,40 +74,33 @@ export default [ 'Rest', 'GetBasePath', 'ProcessErrors', 'CredentialTypeModel',
vm.promptDataClone.prompts.credentials.passwords = {};
if(vm.promptDataClone.launchConf.passwords_needed_to_start) {
let machineCredPassObj = null;
vm.promptDataClone.launchConf.passwords_needed_to_start.forEach((passwordNeeded) => {
if (passwordNeeded === "ssh_password") {
vm.promptDataClone.prompts.credentials.value.forEach((defaultCredential) => {
defaultCredential.passwords_needed.forEach((neededPassword) => {
if (neededPassword === "ssh_password") {
vm.promptDataClone.prompts.credentials.passwords.ssh = {
if (passwordNeeded === "ssh_password" ||
passwordNeeded === "become_password" ||
passwordNeeded === "ssh_key_unlock"
) {
if (!machineCredPassObj) {
vm.promptDataClone.prompts.credentials.value.forEach((defaultCredential) => {
if (defaultCredential.kind && defaultCredential.kind === "ssh") {
machineCredPassObj = {
id: defaultCredential.id,
name: defaultCredential.name
};
} else if (defaultCredential.passwords_needed) {
defaultCredential.passwords_needed.forEach((neededPassword) => {
if (neededPassword === passwordNeeded) {
machineCredPassObj = {
id: defaultCredential.id,
name: defaultCredential.name
};
}
});
}
});
});
} else if (passwordNeeded === "become_password") {
vm.promptDataClone.prompts.credentials.value.forEach((defaultCredential) => {
defaultCredential.passwords_needed.forEach((neededPassword) => {
if (neededPassword === "become_password") {
vm.promptDataClone.prompts.credentials.passwords.become = {
id: defaultCredential.id,
name: defaultCredential.name
};
}
});
});
} else if (passwordNeeded === "ssh_key_unlock") {
vm.promptDataClone.prompts.credentials.value.forEach((defaultCredential) => {
defaultCredential.passwords_needed.forEach((neededPassword) => {
if (neededPassword === "ssh_key_unlock") {
vm.promptDataClone.prompts.credentials.passwords.ssh_key_unlock = {
id: defaultCredential.id,
name: defaultCredential.name
};
}
});
});
}
vm.promptDataClone.prompts.credentials.passwords[passwordNeeded] = angular.copy(machineCredPassObj);
} else if (passwordNeeded.startsWith("vault_password")) {
let vault_id = null;
if (passwordNeeded.includes('.')) {
@ -119,12 +114,15 @@ export default [ 'Rest', 'GetBasePath', 'ProcessErrors', 'CredentialTypeModel',
// Loop across the default credentials to find the name of the
// credential that requires a password
vm.promptDataClone.prompts.credentials.value.forEach((defaultCredential) => {
if (defaultCredential.vault_id === vault_id) {
vm.promptDataClone.prompts.credentials.passwords.vault.push({
id: defaultCredential.id,
name: defaultCredential.name,
vault_id: defaultCredential.vault_id
});
if (vm.promptDataClone.prompts.credentials.credentialTypes[defaultCredential.credential_type] === "vault") {
let defaultCredVaultId = defaultCredential.vault_id || _.get(defaultCredential, 'inputs.vault_id') || null;
if (defaultCredVaultId === vault_id) {
vm.promptDataClone.prompts.credentials.passwords.vault.push({
id: defaultCredential.id,
name: defaultCredential.name,
vault_id: defaultCredVaultId
});
}
}
});
}

View File

@ -34,7 +34,7 @@
<button class="Prompt-actionButton"
ng-show="vm.steps.credential.tab._active"
ng-click="vm.next(vm.steps.credential.tab)"
ng-disabled="(preventCredsWithPasswords && (vm.promptDataClone.prompts.credentials.passwords.ssh || vm.promptDataClone.prompts.credentials.passwords.become || vm.promptDataClone.prompts.credentials.passwords.ssh_key_unlock || (vm.promptDataClone.prompts.credentials.passwords.vault && vm.promptDataClone.prompts.credentials.passwords.vault.length > 0))) ||
ng-disabled="(preventCredsWithPasswords && (vm.promptDataClone.prompts.credentials.passwords.ssh_password || vm.promptDataClone.prompts.credentials.passwords.become_password || vm.promptDataClone.prompts.credentials.passwords.ssh_key_unlock || (vm.promptDataClone.prompts.credentials.passwords.vault && vm.promptDataClone.prompts.credentials.passwords.vault.length > 0))) ||
!vm.forms.credentialPasswords.$valid ||
(vm.promptData.credentialTypeMissing && vm.promptData.credentialTypeMissing.length > 0)">{{:: vm.strings.get('NEXT') }}</button>
<button class="Prompt-actionButton" ng-show="vm.steps.other_prompts.tab._active" ng-click="vm.next(vm.steps.other_prompts.tab)" ng-disabled="!vm.forms.otherPrompts.$valid">{{:: vm.strings.get('NEXT') }}</button>

View File

@ -171,7 +171,7 @@ function PromptService (Empty, $filter) {
if (key === "ssh_key_unlock") {
launchData.credential_passwords.ssh_key_unlock = val.value;
} else if (key !== "vault") {
launchData.credential_passwords[`${key}_password`] = val.value;
launchData.credential_passwords[`${key}`] = val.value;
} else {
_.each(val, (vaultCred) => {
launchData.credential_passwords[vaultCred.vault_id ? `${key}_password.${vaultCred.vault_id}` : `${key}_password`] = vaultCred.value;
@ -198,7 +198,7 @@ function PromptService (Empty, $filter) {
if (key === "ssh_key_unlock") {
launchData.credential_passwords.ssh_key_unlock = val.value;
} else if (key !== "vault") {
launchData.credential_passwords[`${key}_password`] = val.value;
launchData.credential_passwords[`${key}`] = val.value;
} else {
_.each(val, (vaultCred) => {
launchData.credential_passwords[vaultCred.vault_id ? `${key}_password.${vaultCred.vault_id}` : `${key}_password`] = vaultCred.value;

View File

@ -35,9 +35,9 @@ export default
if(cred.passwords_needed) {
cred.passwords_needed.forEach((passwordNeeded => {
if(passwordNeeded === 'ssh_password') {
delete scope.promptData.prompts.credentials.passwords.ssh;
delete scope.promptData.prompts.credentials.passwords.ssh_password;
} else if(passwordNeeded === 'become_password') {
delete scope.promptData.prompts.credentials.passwords.become;
delete scope.promptData.prompts.credentials.passwords.become_password;
} else if(passwordNeeded === 'ssh_key_unlock') {
delete scope.promptData.prompts.credentials.passwords.ssh_key_unlock;
} else if(passwordNeeded.startsWith("vault_password")) {
@ -50,10 +50,10 @@ export default
}));
} else if(cred.inputs && !_.isEmpty(cred.inputs)) {
if(cred.inputs.password && cred.inputs.password === "ASK") {
delete scope.promptData.prompts.credentials.passwords.ssh;
delete scope.promptData.prompts.credentials.passwords.ssh_password;
}
if(cred.inputs.become_password && cred.inputs.become_password === "ASK") {
delete scope.promptData.prompts.credentials.passwords.become;
delete scope.promptData.prompts.credentials.passwords.become_password;
}
if(cred.inputs.ssh_key_unlock && cred.inputs.ssh_key_unlock === "ASK") {
delete scope.promptData.prompts.credentials.passwords.ssh_key_unlock;
@ -72,13 +72,13 @@ export default
let updateNeededPasswords = (cred) => {
if(cred.inputs) {
if(cred.inputs.password && cred.inputs.password === "ASK") {
scope.promptData.prompts.credentials.passwords.ssh = {
scope.promptData.prompts.credentials.passwords.ssh_password = {
id: cred.id,
name: cred.name
};
}
if(cred.inputs.become_password && cred.inputs.become_password === "ASK") {
scope.promptData.prompts.credentials.passwords.become = {
scope.promptData.prompts.credentials.passwords.become_password = {
id: cred.id,
name: cred.name
};
@ -291,10 +291,10 @@ export default
};
if(passwordNeeded === "ssh_password") {
scope.promptData.prompts.credentials.passwords.ssh = credPassObj;
scope.promptData.prompts.credentials.passwords.ssh_password = credPassObj;
}
if(passwordNeeded === "become_password") {
scope.promptData.prompts.credentials.passwords.become = credPassObj;
scope.promptData.prompts.credentials.passwords.become_password = credPassObj;
}
if(passwordNeeded === "ssh_key_unlock") {
scope.promptData.prompts.credentials.passwords.ssh_key_unlock = credPassObj;

View File

@ -45,13 +45,13 @@
</div>
</div>
<span>
<div ng-if="preventCredsWithPasswords && (promptData.prompts.credentials.passwords.ssh || promptData.prompts.credentials.passwords.become || promptData.prompts.credentials.passwords.ssh_key_unlock || (promptData.prompts.credentials.passwords.vault && promptData.prompts.credentials.passwords.vault.length > 0))">
<div ng-if="preventCredsWithPasswords && (promptData.prompts.credentials.passwords.ssh_password || promptData.prompts.credentials.passwords.become_password || promptData.prompts.credentials.passwords.ssh_key_unlock || (promptData.prompts.credentials.passwords.vault && promptData.prompts.credentials.passwords.vault.length > 0))">
<div class="Prompt-credsWarning">
<span class="fa fa-warning"></span>
<span>{{ vm.strings.get('prompt.CREDENTIAL_PASSWORD_WARNING')}}</span>
</div>
<div class="Prompt-credsWarningList">
<div ng-if="promptData.prompts.credentials.passwords.ssh || promptData.prompts.credentials.passwords.become || promptData.prompts.credentials.passwords.ssh_key_unlock">{{promptData.prompts.credentials.passwords.ssh.name || promptData.prompts.credentials.passwords.become.name || promptData.prompts.credentials.passwords.ssh_key_unlock.name}}</div>
<div ng-if="promptData.prompts.credentials.passwords.ssh_password || promptData.prompts.credentials.passwords.become_password || promptData.prompts.credentials.passwords.ssh_key_unlock">{{promptData.prompts.credentials.passwords.ssh_password.name || promptData.prompts.credentials.passwords.become_password.name || promptData.prompts.credentials.passwords.ssh_key_unlock.name}}</div>
<div ng-if="promptData.prompts.credentials.passwords.vault && promptData.prompts.credentials.passwords.vault.length > 0" ng-repeat="vaultCred in promptData.prompts.credentials.passwords.vault">{{vaultCred.name}}</div>
</div>
</div>
@ -65,10 +65,10 @@
</div>
<div id="prompt-credential"></div>
</span>
<div ng-show="!preventCredsWithPasswords && (promptData.prompts.credentials.passwords.ssh || promptData.prompts.credentials.passwords.become || promptData.prompts.credentials.passwords.ssh_key_unlock || (promptData.prompts.credentials.passwords.vault && promptData.prompts.credentials.passwords.vault.length > 0))">
<div ng-show="!preventCredsWithPasswords && (promptData.prompts.credentials.passwords.ssh_password || promptData.prompts.credentials.passwords.become_password || promptData.prompts.credentials.passwords.ssh_key_unlock || (promptData.prompts.credentials.passwords.vault && promptData.prompts.credentials.passwords.vault.length > 0))">
<div class="Prompt-instructions">{{:: vm.strings.get('prompt.PASSWORDS_REQUIRED_HELP') }}</div>
<form name="credentialPasswordsForm" autocomplete="off" novalidate>
<div class="form-group Form-formGroup Form-formGroup--singleColumn" ng-if="promptData.prompts.credentials.passwords.ssh">
<div class="form-group Form-formGroup Form-formGroup--singleColumn" ng-if="promptData.prompts.credentials.passwords.ssh_password">
<label for="ssh_password" class="Form-inputLabelContainer">
<span class="Form-requiredAsterisk">*</span>
<span class="Form-inputLabel">{{:: vm.strings.get('prompt.credential_passwords.SSH_PASSWORD') }}</span>
@ -77,7 +77,7 @@
<span class="input-group-btn">
<button type="button" class="btn btn-default show_input_button Prompt-passwordButton" id="prompt-ssh-password_show_input_button" aw-tool-tip="Toggle the display of plaintext." aw-tip-placement="top" ng-click="vm.togglePassword('#prompt-ssh-password')" data-container="job-launch-modal" data-original-title="" title="">{{:: vm.strings.get('SHOW') }}</button>
</span>
<input id="prompt-ssh-password" type="password" ng-model="promptData.prompts.credentials.passwords.ssh.value" name="ssh_password" class="password-field form-control input-sm Form-textInput" required>
<input id="prompt-ssh-password" type="password" ng-model="promptData.prompts.credentials.passwords.ssh_password.value" name="ssh_password" class="password-field form-control input-sm Form-textInput" required>
</div>
<div class="error" ng-show="credentialPasswordsForm.ssh_password.$dirty && credentialPasswordsForm.ssh_password.$error.required">{{:: vm.strings.get('prompt.PLEASE_ENTER_PASSWORD') }}</div>
<div class="error api-error" ng-bind="ssh_password_api_error"></div>
@ -96,7 +96,7 @@
<div class="error" ng-show="credentialPasswordsForm.ssh_key_unlock.$dirty && credentialPasswordsForm.ssh_key_unlock.$error.required">{{:: vm.strings.get('prompt.PLEASE_ENTER_PASSWORD') }}</div>
<div class="error api-error" ng-bind="ssh_key_unlock_api_error"></div>
</div>
<div class="form-group Form-formGroup Form-formGroup--singleColumn" ng-if="promptData.prompts.credentials.passwords.become">
<div class="form-group Form-formGroup Form-formGroup--singleColumn" ng-if="promptData.prompts.credentials.passwords.become_password">
<label for="become_password" class="Form-inputLabelContainer">
<span class="Form-requiredAsterisk">*</span>
<span class="Form-inputLabel">{{:: vm.strings.get('prompt.credential_passwords.PRIVILEGE_ESCALATION_PASSWORD') }}</span>
@ -105,7 +105,7 @@
<span class="input-group-btn">
<button type="button" class="btn btn-default show_input_button Prompt-passwordButton" id="prompt-become-password_show_input_button" aw-tool-tip="Toggle the display of plaintext." aw-tip-placement="top" ng-click="vm.togglePassword('#prompt-become-password')" data-container="job-launch-modal" data-original-title="" title="">{{:: vm.strings.get('SHOW') }}</button>
</span>
<input id="prompt-become-password" type="password" ng-model="promptData.prompts.credentials.passwords.become.value" name="become_password" class="password-field form-control input-sm Form-textInput" required>
<input id="prompt-become-password" type="password" ng-model="promptData.prompts.credentials.passwords.become_password.value" name="become_password" class="password-field form-control input-sm Form-textInput" required>
</div>
<div class="error" ng-show="credentialPasswordsForm.become_password.$dirty && credentialPasswordsForm.become_password.$error.required">{{:: vm.strings.get('prompt.PLEASE_ENTER_PASSWORD') }}</div>
<div class="error api-error" ng-bind="become_password_api_error"></div>
@ -118,9 +118,9 @@
</label>
<div class="input-group">
<span class="input-group-btn">
<button type="button" class="btn btn-default show_input_button Prompt-passwordButton" id="prompt-vault-password_show_input_button" aw-tool-tip="Toggle the display of plaintext." aw-tip-placement="top" ng-click="vm.togglePassword('#prompt-vault-password')" data-container="job-launch-modal" data-original-title="" title="">{{:: vm.strings.get('SHOW') }}</button>
<button type="button" class="btn btn-default show_input_button Prompt-passwordButton" ng-attr-id="{{ 'prompt-vault-password_show_input_button-' + $index }}" aw-tool-tip="Toggle the display of plaintext." aw-tip-placement="top" ng-click="vm.togglePassword('#prompt-vault-password')" data-container="job-launch-modal" data-original-title="" title="">{{:: vm.strings.get('SHOW') }}</button>
</span>
<input id="prompt-vault-password" type="password" ng-model="promptData.prompts.credentials.passwords.vault[$index].value" name="vault_password" class="password-field form-control input-sm Form-textInput" required>
<input ng-attr-id="{{ 'prompt-vault-password-' + $index }}" type="password" ng-model="promptData.prompts.credentials.passwords.vault[$index].value" name="vault_password" class="password-field form-control input-sm Form-textInput" required>
</div>
<div class="error" ng-show="credentialPasswordsForm.vault_password.$dirty && credentialPasswordsForm.vault_password.$error.required">{{:: vm.strings.get('prompt.PLEASE_ENTER_PASSWORD') }}</div>
<div class="error api-error" ng-bind="vault_password_api_error"></div>