Prevent users from attempting to create a template schedule or workflow node with credentials that require passwords

This commit is contained in:
mabashian 2018-04-16 15:38:32 -04:00
parent d5c2af0492
commit 895ad70a12
14 changed files with 41 additions and 12 deletions

View File

@ -5,5 +5,5 @@
data-placement="top">
<i class="icon-launch"></i>
</button>
<prompt prompt-data="vm.promptData" on-finish="vm.launchTemplateWithPrompts()"></launch>
<prompt prompt-data="vm.promptData" on-finish="vm.launchTemplateWithPrompts()"></prompt>
</div>

View File

@ -30,5 +30,5 @@
ng-if="!vm.showDropdown">
<i class="{{ vm.icon }}"></i>
</button>
<prompt prompt-data="vm.promptData" on-finish="vm.relaunchJobWithPassword()"></launch>
<prompt prompt-data="vm.promptData" on-finish="vm.relaunchJobWithPassword()"></prompt>
</div>

View File

@ -56,4 +56,4 @@
<translate>You can create a job template <a href="#/templates/add_job_template">here</a>.</translate></p>
</div>
</div>
<prompt prompt-data="promptData" on-finish="launchJob()"></launch>
<prompt prompt-data="promptData" on-finish="launchJob()"></prompt>

View File

@ -50,7 +50,7 @@ export default {
list: PortalJobTemplateList,
mode: 'edit'
});
return html + '<prompt prompt-data="promptData" on-finish="launchJob()"></launch>';
return html + '<prompt prompt-data="promptData" on-finish="launchJob()"></prompt>';
},
controller: PortalModeJobTemplatesController
}

View File

@ -32,6 +32,8 @@ export default ['$filter', '$state', '$stateParams', '$http', 'Wait',
$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
* invalid entry and never unsetting them. Presumably null is being truncated down to 2 chars

View File

@ -10,6 +10,8 @@ function($filter, $state, $stateParams, Wait, $scope, moment,
let schedule, scheduler, scheduleCredentials = [];
$scope.preventCredsWithPasswords = true;
// initial end @ midnight values
$scope.schedulerEndHour = "00";
$scope.schedulerEndMinute = "00";

View File

@ -686,5 +686,5 @@
ng-disabled="!schedulerIsValid || promptModalMissingReqFields"> 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>

View File

@ -16,6 +16,7 @@ export default [ 'Rest', 'GetBasePath', 'ProcessErrors', 'CredentialTypeModel',
({ modal } = scope[scope.ns]);
scope.$watch('vm.promptData.triggerModalOpen', () => {
vm.actionButtonClicked = false;
if(vm.promptData && vm.promptData.triggerModalOpen) {

View File

@ -5,7 +5,8 @@ export default [ 'templateUrl',
scope: {
promptData: '=',
onFinish: '&',
actionText: '@actionText'
actionText: '@actionText',
preventCredsWithPasswords: '<'
},
templateUrl: templateUrl('templates/prompt/prompt'),
replace: true,

View File

@ -12,7 +12,11 @@
<prompt-inventory prompt-data="vm.promptDataClone"></prompt-inventory>
</div>
<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 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>
@ -26,8 +30,13 @@
</div>
<div class="Prompt-footer">
<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.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.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="(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.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>

View File

@ -11,7 +11,8 @@ export default [ 'templateUrl', '$compile', 'generateList',
return {
scope: {
promptData: '=',
credentialPasswordsForm: '='
credentialPasswordsForm: '=',
preventCredsWithPasswords: '<'
},
templateUrl: templateUrl('templates/prompt/steps/credential/prompt-credential'),
controller: promptCredentialController,

View File

@ -44,6 +44,18 @@
<span class="fa fa-warning"></span>&nbsp;{{:: vm.strings.get('prompt.CREDENTIAL_TYPE_MISSING', missingCred.label) }}
</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">
<div class="Prompt-credentialSubSection">
<span class="Prompt-label">{{:: vm.strings.get('prompt.CREDENTIAL_TYPE') }}:</span>
@ -53,7 +65,7 @@
</div>
<div id="prompt-credential"></div>
</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>
<form name="credentialPasswordsForm" autocomplete="off" novalidate>
<div class="form-group Form-formGroup Form-formGroup--singleColumn" ng-if="promptData.prompts.credentials.passwords.ssh">

View File

@ -14,6 +14,7 @@ export default ['$scope', 'WorkflowService', 'GetBasePath', 'TemplatesService',
let promptWatcher, surveyQuestionWatcher;
$scope.strings = TemplatesStrings;
$scope.preventCredsWithPasswords = true;
$scope.workflowMakerFormConfig = {
nodeMode: "idle",

View File

@ -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-saveButton" ng-click="saveWorkflowMaker()" ng-show="workflowJobTemplateObj.summary_fields.user_capabilities.edit || canAddWorkflowJobTemplate" ng-disabled="edgeFlags.conflict || workflowMakerFormConfig.nodeMode === 'add'"> Save</button>
</div>
<prompt prompt-data="promptData" action-text="CONFIRM"></launch>
<prompt prompt-data="promptData" action-text="CONFIRM" prevent-creds-with-passwords="preventCredsWithPasswords"></prompt>
</div>