mirror of
https://github.com/ansible/awx.git
synced 2026-03-17 17:07:33 -02:30
add access token and authorization code expiration settings to ui
This commit is contained in:
@@ -94,7 +94,8 @@ export default [
|
|||||||
{label: i18n._('LDAP'), value: 'ldap'},
|
{label: i18n._('LDAP'), value: 'ldap'},
|
||||||
{label: i18n._('RADIUS'), value: 'radius'},
|
{label: i18n._('RADIUS'), value: 'radius'},
|
||||||
{label: i18n._('SAML'), value: 'saml'},
|
{label: i18n._('SAML'), value: 'saml'},
|
||||||
{label: i18n._('TACACS+'), value: 'tacacs'}
|
{label: i18n._('TACACS+'), value: 'tacacs'},
|
||||||
|
{label: i18n._('MISC'), value: 'authMisc'}
|
||||||
];
|
];
|
||||||
|
|
||||||
authVm.ldapDropdownOptions = [
|
authVm.ldapDropdownOptions = [
|
||||||
@@ -198,6 +199,11 @@ export default [
|
|||||||
id: 'auth-ldap5-form',
|
id: 'auth-ldap5-form',
|
||||||
name: 'ldap5'
|
name: 'ldap5'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
formDef: formDefs.authMisc,
|
||||||
|
id: 'auth-misc-form',
|
||||||
|
name: 'authMisc'
|
||||||
|
},
|
||||||
];
|
];
|
||||||
var forms = _.map(authForms, 'formDef');
|
var forms = _.map(authForms, 'formDef');
|
||||||
_.each(forms, function(form) {
|
_.each(forms, function(form) {
|
||||||
|
|||||||
@@ -97,6 +97,10 @@
|
|||||||
<div ng-show="authVm.activeAuthForm === 'saml'">
|
<div ng-show="authVm.activeAuthForm === 'saml'">
|
||||||
<div id="auth-saml-form"></div>
|
<div id="auth-saml-form"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div ng-show="authVm.activeAuthForm === 'authMisc'">
|
||||||
|
<div id="auth-misc-form"></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/*************************************************
|
||||||
|
* Copyright (c) 2016 Ansible, Inc.
|
||||||
|
*
|
||||||
|
* All Rights Reserved
|
||||||
|
*************************************************/
|
||||||
|
|
||||||
|
export default ['i18n', function(i18n) {
|
||||||
|
return {
|
||||||
|
name: 'configuration_authMisc_template',
|
||||||
|
showActions: true,
|
||||||
|
showHeader: false,
|
||||||
|
|
||||||
|
fields: {
|
||||||
|
ACCESS_TOKEN_EXPIRE_SECONDS: {
|
||||||
|
type: 'text',
|
||||||
|
reset: 'ACCESS_TOKEN_EXPIRE_SECONDS'
|
||||||
|
},
|
||||||
|
AUTHORIZATION_CODE_EXPIRE_SECONDS: {
|
||||||
|
type: 'text',
|
||||||
|
reset: 'AUTHORIZATION_CODE_EXPIRE_SECONDS'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
buttons: {
|
||||||
|
reset: {
|
||||||
|
ngShow: '!user_is_system_auditor',
|
||||||
|
ngClick: 'vm.resetAllConfirm()',
|
||||||
|
label: i18n._('Revert all to default'),
|
||||||
|
class: 'Form-resetAll'
|
||||||
|
},
|
||||||
|
cancel: {
|
||||||
|
ngClick: 'vm.formCancel()',
|
||||||
|
},
|
||||||
|
save: {
|
||||||
|
ngClick: 'vm.formSave()',
|
||||||
|
ngDisabled: "!enterprise_auth || configuration_authMisc_template_form.$invalid || configuration_authMisc_template_form.$pending"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
@@ -19,6 +19,7 @@ export default [
|
|||||||
'configurationRadiusForm',
|
'configurationRadiusForm',
|
||||||
'configurationTacacsForm',
|
'configurationTacacsForm',
|
||||||
'configurationSamlForm',
|
'configurationSamlForm',
|
||||||
|
'configurationMiscForm',
|
||||||
'systemActivityStreamForm',
|
'systemActivityStreamForm',
|
||||||
'systemLoggingForm',
|
'systemLoggingForm',
|
||||||
'systemMiscForm',
|
'systemMiscForm',
|
||||||
@@ -44,6 +45,7 @@ export default [
|
|||||||
configurationRadiusForm,
|
configurationRadiusForm,
|
||||||
configurationTacacsForm,
|
configurationTacacsForm,
|
||||||
configurationSamlForm,
|
configurationSamlForm,
|
||||||
|
configurationMiscForm,
|
||||||
systemActivityStreamForm,
|
systemActivityStreamForm,
|
||||||
systemLoggingForm,
|
systemLoggingForm,
|
||||||
systemMiscForm,
|
systemMiscForm,
|
||||||
@@ -71,6 +73,7 @@ export default [
|
|||||||
'radius': configurationRadiusForm,
|
'radius': configurationRadiusForm,
|
||||||
'tacacs': configurationTacacsForm,
|
'tacacs': configurationTacacsForm,
|
||||||
'saml': configurationSamlForm,
|
'saml': configurationSamlForm,
|
||||||
|
'authMisc': configurationMiscForm,
|
||||||
'activity_stream': systemActivityStreamForm,
|
'activity_stream': systemActivityStreamForm,
|
||||||
'logging': systemLoggingForm,
|
'logging': systemLoggingForm,
|
||||||
'misc': systemMiscForm,
|
'misc': systemMiscForm,
|
||||||
@@ -92,10 +95,15 @@ export default [
|
|||||||
var populateFromApi = function() {
|
var populateFromApi = function() {
|
||||||
SettingsService.getCurrentValues()
|
SettingsService.getCurrentValues()
|
||||||
.then(function(data) {
|
.then(function(data) {
|
||||||
|
// these two values need to be unnested from the
|
||||||
|
// OAUTH2_PROVIDER key
|
||||||
|
data.ACCESS_TOKEN_EXPIRE_SECONDS = data
|
||||||
|
.OAUTH2_PROVIDER.ACCESS_TOKEN_EXPIRE_SECONDS;
|
||||||
|
data.AUTHORIZATION_CODE_EXPIRE_SECONDS = data
|
||||||
|
.OAUTH2_PROVIDER.AUTHORIZATION_CODE_EXPIRE_SECONDS;
|
||||||
var currentKeys = _.keys(data);
|
var currentKeys = _.keys(data);
|
||||||
$scope.requiredLogValues = {};
|
$scope.requiredLogValues = {};
|
||||||
_.each(currentKeys, function(key) {
|
_.each(currentKeys, function(key) {
|
||||||
|
|
||||||
if(key === "LOG_AGGREGATOR_HOST") {
|
if(key === "LOG_AGGREGATOR_HOST") {
|
||||||
$scope.requiredLogValues.LOG_AGGREGATOR_HOST = data[key];
|
$scope.requiredLogValues.LOG_AGGREGATOR_HOST = data[key];
|
||||||
}
|
}
|
||||||
@@ -232,7 +240,18 @@ export default [
|
|||||||
$scope.resetValue = function(key) {
|
$scope.resetValue = function(key) {
|
||||||
Wait('start');
|
Wait('start');
|
||||||
var payload = {};
|
var payload = {};
|
||||||
payload[key] = $scope.configDataResolve[key].default;
|
if (key === 'ACCESS_TOKEN_EXPIRE_SECONDS' || key === 'AUTHORIZATION_CODE_EXPIRE_SECONDS') {
|
||||||
|
// the reset for these two keys needs to be nested under OAUTH2_PROVIDER
|
||||||
|
if (payload.OAUTH2_PROVIDER === undefined) {
|
||||||
|
payload.OAUTH2_PROVIDER = {
|
||||||
|
ACCESS_TOKEN_EXPIRE_SECONDS: $scope.ACCESS_TOKEN_EXPIRE_SECONDS,
|
||||||
|
AUTHORIZATION_CODE_EXPIRE_SECONDS: $scope.AUTHORIZATION_CODE_EXPIRE_SECONDS
|
||||||
|
};
|
||||||
|
}
|
||||||
|
payload.OAUTH2_PROVIDER[key] = $scope.configDataResolve[key].default;
|
||||||
|
} else {
|
||||||
|
payload[key] = $scope.configDataResolve[key].default;
|
||||||
|
}
|
||||||
SettingsService.patchConfiguration(payload)
|
SettingsService.patchConfiguration(payload)
|
||||||
.then(function() {
|
.then(function() {
|
||||||
$scope[key] = $scope.configDataResolve[key].default;
|
$scope[key] = $scope.configDataResolve[key].default;
|
||||||
@@ -310,7 +329,16 @@ export default [
|
|||||||
var keys = _.keys(formDefs[formTracker.getCurrent()].fields);
|
var keys = _.keys(formDefs[formTracker.getCurrent()].fields);
|
||||||
var payload = {};
|
var payload = {};
|
||||||
_.each(keys, function(key) {
|
_.each(keys, function(key) {
|
||||||
if($scope.configDataResolve[key].type === 'choice' || multiselectDropdowns.indexOf(key) !== -1) {
|
if (key === 'ACCESS_TOKEN_EXPIRE_SECONDS' || key === 'AUTHORIZATION_CODE_EXPIRE_SECONDS') {
|
||||||
|
// These two values need to be POSTed nested under the OAUTH2_PROVIDER key
|
||||||
|
if (payload.OAUTH2_PROVIDER === undefined) {
|
||||||
|
payload.OAUTH2_PROVIDER = {
|
||||||
|
ACCESS_TOKEN_EXPIRE_SECONDS: $scope.ACCESS_TOKEN_EXPIRE_SECONDS,
|
||||||
|
AUTHORIZATION_CODE_EXPIRE_SECONDS: $scope.AUTHORIZATION_CODE_EXPIRE_SECONDS
|
||||||
|
};
|
||||||
|
}
|
||||||
|
payload.OAUTH2_PROVIDER[key] = $scope[key];
|
||||||
|
} else if($scope.configDataResolve[key].type === 'choice' || multiselectDropdowns.indexOf(key) !== -1) {
|
||||||
//Parse dropdowns and dropdowns labeled as lists
|
//Parse dropdowns and dropdowns labeled as lists
|
||||||
if($scope[key] === null) {
|
if($scope[key] === null) {
|
||||||
payload[key] = null;
|
payload[key] = null;
|
||||||
@@ -394,7 +422,7 @@ export default [
|
|||||||
return saveDeferred.promise;
|
return saveDeferred.promise;
|
||||||
};
|
};
|
||||||
|
|
||||||
vm.formCancel = function() {
|
vm.formCancel = function() {
|
||||||
if ($scope[formTracker.currentFormName()].$dirty === true) {
|
if ($scope[formTracker.currentFormName()].$dirty === true) {
|
||||||
var msg = i18n._('You have unsaved changes. Would you like to proceed <strong>without</strong> saving?');
|
var msg = i18n._('You have unsaved changes. Would you like to proceed <strong>without</strong> saving?');
|
||||||
var title = i18n._('Warning: Unsaved Changes');
|
var title = i18n._('Warning: Unsaved Changes');
|
||||||
@@ -518,7 +546,18 @@ export default [
|
|||||||
var payload = {};
|
var payload = {};
|
||||||
clearApiErrors();
|
clearApiErrors();
|
||||||
_.each(keys, function(key) {
|
_.each(keys, function(key) {
|
||||||
payload[key] = $scope.configDataResolve[key].default;
|
if (key === 'ACCESS_TOKEN_EXPIRE_SECONDS' || key === 'AUTHORIZATION_CODE_EXPIRE_SECONDS') {
|
||||||
|
// the reset for these two keys needs to be nested under OAUTH2_PROVIDER
|
||||||
|
if (payload.OAUTH2_PROVIDER === undefined) {
|
||||||
|
payload.OAUTH2_PROVIDER = {
|
||||||
|
ACCESS_TOKEN_EXPIRE_SECONDS: $scope.ACCESS_TOKEN_EXPIRE_SECONDS,
|
||||||
|
AUTHORIZATION_CODE_EXPIRE_SECONDS: $scope.AUTHORIZATION_CODE_EXPIRE_SECONDS
|
||||||
|
};
|
||||||
|
}
|
||||||
|
payload.OAUTH2_PROVIDER[key] = $scope.configDataResolve[key].default;
|
||||||
|
} else {
|
||||||
|
payload[key] = $scope.configDataResolve[key].default;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Wait('start');
|
Wait('start');
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import configurationLdap5Form from './forms/auth-form/sub-forms/auth-ldap5.form.
|
|||||||
import configurationRadiusForm from './forms/auth-form/sub-forms/auth-radius.form.js';
|
import configurationRadiusForm from './forms/auth-form/sub-forms/auth-radius.form.js';
|
||||||
import configurationTacacsForm from './forms/auth-form/sub-forms/auth-tacacs.form.js';
|
import configurationTacacsForm from './forms/auth-form/sub-forms/auth-tacacs.form.js';
|
||||||
import configurationSamlForm from './forms/auth-form/sub-forms/auth-saml.form';
|
import configurationSamlForm from './forms/auth-form/sub-forms/auth-saml.form';
|
||||||
|
import configurationMiscForm from './forms/auth-form/sub-forms/auth-misc.form';
|
||||||
|
|
||||||
//system sub-forms
|
//system sub-forms
|
||||||
import systemActivityStreamForm from './forms/system-form/sub-forms/system-activity-stream.form.js';
|
import systemActivityStreamForm from './forms/system-form/sub-forms/system-activity-stream.form.js';
|
||||||
@@ -56,6 +57,7 @@ angular.module('configuration', [])
|
|||||||
.factory('configurationRadiusForm', configurationRadiusForm)
|
.factory('configurationRadiusForm', configurationRadiusForm)
|
||||||
.factory('configurationTacacsForm', configurationTacacsForm)
|
.factory('configurationTacacsForm', configurationTacacsForm)
|
||||||
.factory('configurationSamlForm', configurationSamlForm)
|
.factory('configurationSamlForm', configurationSamlForm)
|
||||||
|
.factory('configurationMiscForm', configurationMiscForm)
|
||||||
//system forms
|
//system forms
|
||||||
.factory('systemActivityStreamForm', systemActivityStreamForm)
|
.factory('systemActivityStreamForm', systemActivityStreamForm)
|
||||||
.factory('systemLoggingForm', systemLoggingForm)
|
.factory('systemLoggingForm', systemLoggingForm)
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
* All Rights Reserved
|
* All Rights Reserved
|
||||||
*************************************************/
|
*************************************************/
|
||||||
|
|
||||||
export default ['$rootScope', 'GetBasePath', 'ProcessErrors', '$q', '$http', 'Rest',
|
export default ['GetBasePath', '$q', 'Rest', 'i18n',
|
||||||
function($rootScope, GetBasePath, ProcessErrors, $q, $http, Rest) {
|
function(GetBasePath, $q, Rest, i18n) {
|
||||||
var url = GetBasePath('settings') + 'all';
|
var url = GetBasePath('settings') + 'all';
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -18,9 +18,32 @@ export default ['$rootScope', 'GetBasePath', 'ProcessErrors', '$q', '$http', 'Re
|
|||||||
.then(({data}) => {
|
.then(({data}) => {
|
||||||
// Compare GET actions with PUT actions and flag discrepancies
|
// Compare GET actions with PUT actions and flag discrepancies
|
||||||
// for disabling in the UI
|
// for disabling in the UI
|
||||||
var getActions = data.actions.GET;
|
//
|
||||||
|
// since OAUTH2_PROVIDER returns two of the keys in a nested format,
|
||||||
|
// we need to split those out into the root of the options payload
|
||||||
|
// in order for them to be consumed
|
||||||
|
var appendOauth2ProviderKeys = (optsFromAPI) => {
|
||||||
|
var unnestOauth2ProviderKey = (key, label, parentKey) => {
|
||||||
|
optsFromAPI[key] = _.cloneDeep(optsFromAPI[parentKey]);
|
||||||
|
optsFromAPI[key].label = i18n._(label);
|
||||||
|
optsFromAPI[key].type = optsFromAPI[parentKey].child.type;
|
||||||
|
optsFromAPI[key].min_value = optsFromAPI[parentKey].child.min_value;
|
||||||
|
if (optsFromAPI[parentKey].default) {
|
||||||
|
optsFromAPI[key].default = optsFromAPI[parentKey].default[key];
|
||||||
|
}
|
||||||
|
delete optsFromAPI[key].child;
|
||||||
|
};
|
||||||
|
unnestOauth2ProviderKey('ACCESS_TOKEN_EXPIRE_SECONDS',
|
||||||
|
'Access Token Expiration',
|
||||||
|
'OAUTH2_PROVIDER');
|
||||||
|
unnestOauth2ProviderKey('AUTHORIZATION_CODE_EXPIRE_SECONDS',
|
||||||
|
'Authorization Code Expiration',
|
||||||
|
'OAUTH2_PROVIDER');
|
||||||
|
return optsFromAPI;
|
||||||
|
};
|
||||||
|
var getActions = appendOauth2ProviderKeys(data.actions.GET);
|
||||||
var getKeys = _.keys(getActions);
|
var getKeys = _.keys(getActions);
|
||||||
var putActions = data.actions.PUT;
|
var putActions = appendOauth2ProviderKeys(data.actions.PUT);
|
||||||
|
|
||||||
_.each(getKeys, function(key) {
|
_.each(getKeys, function(key) {
|
||||||
if(putActions && putActions[key]) {
|
if(putActions && putActions[key]) {
|
||||||
|
|||||||
Reference in New Issue
Block a user