mirror of
https://github.com/ansible/awx.git
synced 2026-01-15 11:50:42 -03:30
Fixed error showing vault password prompts on relaunch
This commit is contained in:
parent
7781667977
commit
24e363888a
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user