blob: 7e464311a10d2502be0ba911d10b7e9158159fc6 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var App = require('app');
var credentialsUtils = require('utils/credentials');
App.ManageCredentialsFormView = Em.View.extend({
templateName: require('templates/common/form/manage_credentilas_form'),
viewName: 'manageCredentialsForm',
principal: "",
password: "",
/**
* Store Admin credentials checkbox value
*
* @type {boolean}
*/
storeCredentials: false,
/**
* Status of persistent storage. Returns <code>true</code> if persistent storage is available.
* @type {boolean}
*/
storePersisted: Em.computed.alias('App.isCredentialStorePersistent'),
/**
* Disable checkbox if persistent storage not available
*
* @type {boolean}
*/
checkboxDisabled: Em.computed.not('storePersisted'),
/**
* Credentials can be removed, in case when they stored to persistent secure storage.
*
* @type {boolean}
*/
isRemovable: false,
/**
* Remove button disabled status.
*
* @type {boolean}
*/
isRemoveDisabled: true,
/**
* Signalize that action was performed and waiting for result.
*
* @type {boolean}
*/
isActionInProgress: false,
/**
* Status message of performed action, e.g. remove or save credentials. Set to <code>false</code> to hide this message.
*
* @type {boolean|string}
*/
actionStatus: false,
/**
* Validation message error regarding principal name.
* When value is <code>false</code> error is hidden.
*
* @type {boolean|string}
*/
passwordError: false,
/**
* Validation message error regarding principal name field.
* When value is <code>false</code> error is hidden.
*
* @type {boolean|string}
*/
principalError: false,
isSubmitDisabled: true,
principalNameObserver: function() {
this.set('isPrincipalDirty', true);
if (Em.isEmpty(this.get('principal'))) {
this.set('principalError', Em.I18n.t('admin.users.editError.requiredField'));
} else if (/\s+/.test(this.get('principal'))) {
this.set('principalError', Em.I18n.t('host.spacesValidation'));
} else {
this.set('principalError', false);
}
this.toggleSubmitState();
}.observes('principal'),
passwordObserver: function() {
this.set('isPasswordDirty', true);
if (Em.isEmpty(this.get('password'))) {
this.set('passwordError', Em.I18n.t('admin.users.editError.requiredField'));
} else {
this.set('passwordError', false);
}
this.toggleSubmitState();
}.observes('password'),
/**
* Toggle submit disable state only when principal and password fields were modified.
*/
toggleSubmitState: function() {
if (this.get('isPrincipalDirty') && this.get('isPasswordDirty')) {
this.set('isSubmitDisabled', !!this.get('principalError') || !!this.get('passwordError'));
}
},
/**
* Returns storage type used to save credentials e.g. <b>persistent</b>, <b>temporary</b> (default)
*
* @type {string}
*/
storageType: function() {
return credentialsUtils.STORE_TYPES.PERSISTENT;
}.property('storeCredentials'),
formHeader: Em.computed.ifThenElse('isRemovable', Em.I18n.t('admin.kerberos.credentials.form.header.stored'), Em.I18n.t('admin.kerberos.credentials.form.header.not.stored')),
/**
* Message to display in tooltip regarding persistent storage state.
*
* @type {string}
*/
hintMessage: Em.computed.ifThenElse('storePersisted', Em.I18n.t('admin.kerberos.credentials.store.hint.supported'), Em.I18n.t('admin.kerberos.credentials.store.hint.not.supported')),
/**
* Observe changes for principal and password.
* Hide status message and toggle action progress if performed.
*/
formInputObserver: function() {
if (this.get('actionStatus') || this.get('isActionInProgress')) {
this.setInProgress(false);
this.set('actionStatus', false);
}
}.observes('password', 'principal'),
didInsertElement: function() {
this._super();
App.tooltip(this.$('[rel="tooltip"]'));
},
willInsertElement: function() {
this._super();
this.prepareContent();
},
prepareContent: function() {
var self = this;
credentialsUtils.credentials(App.get('clusterName'), function(credentials) {
Em.run.next(function() {
self.set('isRemovable', credentialsUtils.isKDCCredentialsPersisted(credentials));
self.set('isRemoveDisabled', !self.get('isRemovable'));
});
});
},
/**
* Save credentials action.
*
* @returns {boolean|$.Deferred}
*/
saveKDCCredentials: function () {
var self = this;
var dfd = $.Deferred();
this.setInProgress(true);
credentialsUtils.createOrUpdateCredentials(
App.get('clusterName'),
credentialsUtils.ALIAS.KDC_CREDENTIALS,
credentialsUtils.createCredentialResource(this.get('principal'), this.get('password'), this.get('storageType')))
.always(function() {
self.setInProgress(false);
self.prepareContent();
self.set('actionStatus', Em.I18n.t('common.success'));
self.get('parentView').set('isCredentialsSaved', true);
dfd.resolve();
});
return dfd.promise();
},
/**
* Remove KDC credentials action.
*
* @returns {object} for better testing purpose returns object { deferred: $.Deferred, popup: App.ModalPopup }
*/
removeKDCCredentials: function() {
var t = Em.I18n.t;
var self = this;
var dfd = $.Deferred();
this.set('actionStatus', false);
var popup = App.showConfirmationPopup(
function() {
self.setInProgress(true);
credentialsUtils.removeCredentials(App.get('clusterName'), credentialsUtils.ALIAS.KDC_CREDENTIALS)
.always(function() {
self.setInProgress(false);
self.prepareContent();
self.set('actionStatus', Em.I18n.t('common.success'));
self.get('parentView').set('isCredentialsRemoved', true);
dfd.resolve();
});
}, t('admin.kerberos.credentials.remove.confirmation.body'),
function () {},
null,
t('yes'),
false);
popup.set('secondary', t('no'));
return {
deferred: dfd,
popup: popup
};
},
/**
* Toggle action status and disable/enable appropriate buttons.
*
* @param {boolean} [isInProgress=false] progress status
*/
setInProgress: function(isInProgress) {
if (isInProgress) {
this.set('actionStatus', false);
if (this.get('isRemovable')) {
this.set('isRemoveDisabled', true);
}
this.set('isSubmitDisabled', true);
this.set('isActionInProgress', true);
} else {
if (this.get('isRemovable')) {
this.set('isRemoveDisabled', false);
}
this.set('isSubmitDisabled', false);
this.set('isActionInProgress', false);
}
}
});