mirror of
https://github.com/ansible/awx.git
synced 2026-05-07 17:37:37 -02:30
Prevent users from attempting to create a template schedule or workflow node with credentials that require passwords
This commit is contained in:
@@ -5,5 +5,5 @@
|
|||||||
data-placement="top">
|
data-placement="top">
|
||||||
<i class="icon-launch"></i>
|
<i class="icon-launch"></i>
|
||||||
</button>
|
</button>
|
||||||
<prompt prompt-data="vm.promptData" on-finish="vm.launchTemplateWithPrompts()"></launch>
|
<prompt prompt-data="vm.promptData" on-finish="vm.launchTemplateWithPrompts()"></prompt>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -30,5 +30,5 @@
|
|||||||
ng-if="!vm.showDropdown">
|
ng-if="!vm.showDropdown">
|
||||||
<i class="{{ vm.icon }}"></i>
|
<i class="{{ vm.icon }}"></i>
|
||||||
</button>
|
</button>
|
||||||
<prompt prompt-data="vm.promptData" on-finish="vm.relaunchJobWithPassword()"></launch>
|
<prompt prompt-data="vm.promptData" on-finish="vm.relaunchJobWithPassword()"></prompt>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -56,4 +56,4 @@
|
|||||||
<translate>You can create a job template <a href="#/templates/add_job_template">here</a>.</translate></p>
|
<translate>You can create a job template <a href="#/templates/add_job_template">here</a>.</translate></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<prompt prompt-data="promptData" on-finish="launchJob()"></launch>
|
<prompt prompt-data="promptData" on-finish="launchJob()"></prompt>
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ export default {
|
|||||||
list: PortalJobTemplateList,
|
list: PortalJobTemplateList,
|
||||||
mode: 'edit'
|
mode: 'edit'
|
||||||
});
|
});
|
||||||
return html + '<prompt prompt-data="promptData" on-finish="launchJob()"></launch>';
|
return html + '<prompt prompt-data="promptData" on-finish="launchJob()"></prompt>';
|
||||||
},
|
},
|
||||||
controller: PortalModeJobTemplatesController
|
controller: PortalModeJobTemplatesController
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ export default ['$filter', '$state', '$stateParams', '$http', 'Wait',
|
|||||||
$scope.$parent.schedulerEndDt = month + '/' + day + '/' + dt.getFullYear();
|
$scope.$parent.schedulerEndDt = month + '/' + day + '/' + dt.getFullYear();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$scope.preventCredsWithPasswords = true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is a workaround for the angular-scheduler library inserting `ll` into fields after an
|
* This is a workaround for the angular-scheduler library inserting `ll` into fields after an
|
||||||
* invalid entry and never unsetting them. Presumably null is being truncated down to 2 chars
|
* invalid entry and never unsetting them. Presumably null is being truncated down to 2 chars
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ function($filter, $state, $stateParams, Wait, $scope, moment,
|
|||||||
|
|
||||||
let schedule, scheduler, scheduleCredentials = [];
|
let schedule, scheduler, scheduleCredentials = [];
|
||||||
|
|
||||||
|
$scope.preventCredsWithPasswords = true;
|
||||||
|
|
||||||
// initial end @ midnight values
|
// initial end @ midnight values
|
||||||
$scope.schedulerEndHour = "00";
|
$scope.schedulerEndHour = "00";
|
||||||
$scope.schedulerEndMinute = "00";
|
$scope.schedulerEndMinute = "00";
|
||||||
|
|||||||
@@ -686,5 +686,5 @@
|
|||||||
ng-disabled="!schedulerIsValid || promptModalMissingReqFields"> Save</button>
|
ng-disabled="!schedulerIsValid || promptModalMissingReqFields"> Save</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<prompt prompt-data="promptData" action-text="CONFIRM"></launch>
|
<prompt prompt-data="promptData" action-text="CONFIRM" prevent-creds-with-passwords="preventCredsWithPasswords"></prompt>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ export default [ 'Rest', 'GetBasePath', 'ProcessErrors', 'CredentialTypeModel',
|
|||||||
({ modal } = scope[scope.ns]);
|
({ modal } = scope[scope.ns]);
|
||||||
|
|
||||||
scope.$watch('vm.promptData.triggerModalOpen', () => {
|
scope.$watch('vm.promptData.triggerModalOpen', () => {
|
||||||
|
|
||||||
vm.actionButtonClicked = false;
|
vm.actionButtonClicked = false;
|
||||||
if(vm.promptData && vm.promptData.triggerModalOpen) {
|
if(vm.promptData && vm.promptData.triggerModalOpen) {
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ export default [ 'templateUrl',
|
|||||||
scope: {
|
scope: {
|
||||||
promptData: '=',
|
promptData: '=',
|
||||||
onFinish: '&',
|
onFinish: '&',
|
||||||
actionText: '@actionText'
|
actionText: '@actionText',
|
||||||
|
preventCredsWithPasswords: '<'
|
||||||
},
|
},
|
||||||
templateUrl: templateUrl('templates/prompt/prompt'),
|
templateUrl: templateUrl('templates/prompt/prompt'),
|
||||||
replace: true,
|
replace: true,
|
||||||
|
|||||||
@@ -12,7 +12,11 @@
|
|||||||
<prompt-inventory prompt-data="vm.promptDataClone"></prompt-inventory>
|
<prompt-inventory prompt-data="vm.promptDataClone"></prompt-inventory>
|
||||||
</div>
|
</div>
|
||||||
<div ng-if="vm.steps.credential.includeStep" ng-show="vm.steps.credential.tab._active">
|
<div ng-if="vm.steps.credential.includeStep" ng-show="vm.steps.credential.tab._active">
|
||||||
<prompt-credential prompt-data="vm.promptDataClone" credential-passwords-form="vm.forms.credentialPasswords"></prompt-credential>
|
<prompt-credential
|
||||||
|
prompt-data="vm.promptDataClone"
|
||||||
|
credential-passwords-form="vm.forms.credentialPasswords"
|
||||||
|
prevent-creds-with-passwords="vm.preventCredsWithPasswords">
|
||||||
|
</prompt-credential>
|
||||||
</div>
|
</div>
|
||||||
<div ng-if="vm.steps.other_prompts.includeStep" ng-show="vm.steps.other_prompts.tab._active">
|
<div ng-if="vm.steps.other_prompts.includeStep" ng-show="vm.steps.other_prompts.tab._active">
|
||||||
<prompt-other-prompts prompt-data="vm.promptDataClone" other-prompts-form="vm.forms.otherPrompts" is-active-step="vm.steps.other_prompts.tab._active"></prompt-other-prompts>
|
<prompt-other-prompts prompt-data="vm.promptDataClone" other-prompts-form="vm.forms.otherPrompts" is-active-step="vm.steps.other_prompts.tab._active"></prompt-other-prompts>
|
||||||
@@ -26,8 +30,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="Prompt-footer">
|
<div class="Prompt-footer">
|
||||||
<button class="Prompt-defaultButton" ng-click="vm.cancel()">{{:: vm.strings.get('CANCEL') }}</button>
|
<button class="Prompt-defaultButton" ng-click="vm.cancel()">{{:: vm.strings.get('CANCEL') }}</button>
|
||||||
<button class="Prompt-actionButton" ng-show="vm.steps.inventory.tab._active" ng-click="vm.next(vm.steps.inventory.tab)" ng-disabled="!vm.promptDataClone.prompts.inventory.value.id">{{:: vm.strings.get('NEXT') }}</button>
|
<button class="Prompt-actionButton" ng-show="vm.steps.inventory.tab._active" ng-click="vm.next(vm.steps.inventory.tab)" ng-disabled="!vm.vm.promptDataClone.prompts.inventory.value.id">{{:: vm.strings.get('NEXT') }}</button>
|
||||||
<button class="Prompt-actionButton" ng-show="vm.steps.credential.tab._active" ng-click="vm.next(vm.steps.credential.tab)" ng-disabled="!vm.forms.credentialPasswords.$valid || (vm.promptDataClone.credentialTypeMissing && vm.promptDataClone.credentialTypeMissing.length > 0)">{{:: vm.strings.get('NEXT') }}</button>
|
<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))) ||
|
||||||
|
!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>
|
<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>
|
||||||
<button class="Prompt-actionButton" ng-show="vm.steps.survey.tab._active" ng-click="vm.next(vm.steps.survey.tab)" ng-disabled="!vm.forms.survey.$valid">{{:: vm.strings.get('NEXT') }}</button>
|
<button class="Prompt-actionButton" ng-show="vm.steps.survey.tab._active" ng-click="vm.next(vm.steps.survey.tab)" ng-disabled="!vm.forms.survey.$valid">{{:: vm.strings.get('NEXT') }}</button>
|
||||||
<button class="Prompt-actionButton" ng-show="vm.steps.preview.tab._active" ng-click="vm.finish()" ng-bind="vm.actionText" ng-disabled="vm.actionButtonClicked"></button>
|
<button class="Prompt-actionButton" ng-show="vm.steps.preview.tab._active" ng-click="vm.finish()" ng-bind="vm.actionText" ng-disabled="vm.actionButtonClicked"></button>
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ export default [ 'templateUrl', '$compile', 'generateList',
|
|||||||
return {
|
return {
|
||||||
scope: {
|
scope: {
|
||||||
promptData: '=',
|
promptData: '=',
|
||||||
credentialPasswordsForm: '='
|
credentialPasswordsForm: '=',
|
||||||
|
preventCredsWithPasswords: '<'
|
||||||
},
|
},
|
||||||
templateUrl: templateUrl('templates/prompt/steps/credential/prompt-credential'),
|
templateUrl: templateUrl('templates/prompt/steps/credential/prompt-credential'),
|
||||||
controller: promptCredentialController,
|
controller: promptCredentialController,
|
||||||
|
|||||||
@@ -44,6 +44,18 @@
|
|||||||
<span class="fa fa-warning"></span> {{:: vm.strings.get('prompt.CREDENTIAL_TYPE_MISSING', missingCred.label) }}
|
<span class="fa fa-warning"></span> {{:: vm.strings.get('prompt.CREDENTIAL_TYPE_MISSING', missingCred.label) }}
|
||||||
</div>
|
</div>
|
||||||
</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 style="margin-bottom: 5px;color:#D9534F;">
|
||||||
|
<span class="fa fa-warning"></span>
|
||||||
|
<span>Credentials that require passwords on launch are not permitted for template schedules and workflow nodes. The following credentials must be removed or replaced to proceed:</span>
|
||||||
|
</div>
|
||||||
|
<div style="margin-bottom: 20px;">
|
||||||
|
<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.vault && promptData.prompts.credentials.passwords.vault.length > 0" ng-repeat="vaultCred in promptData.prompts.credentials.passwords.vault">{{vaultCred.name}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</span>
|
||||||
<span ng-show="promptData.launchConf.ask_credential_on_launch">
|
<span ng-show="promptData.launchConf.ask_credential_on_launch">
|
||||||
<div class="Prompt-credentialSubSection">
|
<div class="Prompt-credentialSubSection">
|
||||||
<span class="Prompt-label">{{:: vm.strings.get('prompt.CREDENTIAL_TYPE') }}:</span>
|
<span class="Prompt-label">{{:: vm.strings.get('prompt.CREDENTIAL_TYPE') }}:</span>
|
||||||
@@ -53,7 +65,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="prompt-credential"></div>
|
<div id="prompt-credential"></div>
|
||||||
</span>
|
</span>
|
||||||
<div ng-show="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 || 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 class="Prompt-instructions">{{:: vm.strings.get('prompt.PASSWORDS_REQUIRED_HELP') }}</div>
|
<div class="Prompt-instructions">{{:: vm.strings.get('prompt.PASSWORDS_REQUIRED_HELP') }}</div>
|
||||||
<form name="credentialPasswordsForm" autocomplete="off" novalidate>
|
<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">
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export default ['$scope', 'WorkflowService', 'GetBasePath', 'TemplatesService',
|
|||||||
let promptWatcher, surveyQuestionWatcher;
|
let promptWatcher, surveyQuestionWatcher;
|
||||||
|
|
||||||
$scope.strings = TemplatesStrings;
|
$scope.strings = TemplatesStrings;
|
||||||
|
$scope.preventCredsWithPasswords = true;
|
||||||
|
|
||||||
$scope.workflowMakerFormConfig = {
|
$scope.workflowMakerFormConfig = {
|
||||||
nodeMode: "idle",
|
nodeMode: "idle",
|
||||||
|
|||||||
@@ -129,5 +129,5 @@
|
|||||||
<button type="button" class="btn btn-sm WorkflowMaker-cancelButton" ng-click="closeWorkflowMaker()"> Close</button>
|
<button type="button" class="btn btn-sm WorkflowMaker-cancelButton" ng-click="closeWorkflowMaker()"> Close</button>
|
||||||
<button type="button" class="btn btn-sm WorkflowMaker-saveButton" ng-click="saveWorkflowMaker()" ng-show="workflowJobTemplateObj.summary_fields.user_capabilities.edit || canAddWorkflowJobTemplate" ng-disabled="edgeFlags.conflict || workflowMakerFormConfig.nodeMode === 'add'"> Save</button>
|
<button type="button" class="btn btn-sm WorkflowMaker-saveButton" ng-click="saveWorkflowMaker()" ng-show="workflowJobTemplateObj.summary_fields.user_capabilities.edit || canAddWorkflowJobTemplate" ng-disabled="edgeFlags.conflict || workflowMakerFormConfig.nodeMode === 'add'"> Save</button>
|
||||||
</div>
|
</div>
|
||||||
<prompt prompt-data="promptData" action-text="CONFIRM"></launch>
|
<prompt prompt-data="promptData" action-text="CONFIRM" prevent-creds-with-passwords="preventCredsWithPasswords"></prompt>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user