KNOX-1203 - Shiro-based provider configurations must be produced with correct param order from Admin UI
Project: http://git-wip-us.apache.org/repos/asf/knox/repo Commit: http://git-wip-us.apache.org/repos/asf/knox/commit/4c1cb80c Tree: http://git-wip-us.apache.org/repos/asf/knox/tree/4c1cb80c Diff: http://git-wip-us.apache.org/repos/asf/knox/diff/4c1cb80c Branch: refs/heads/master Commit: 4c1cb80cca7c26b11f32febd23ec887f13b7606d Parents: 167053b Author: Phil Zampino <pzamp...@apache.org> Authored: Sat Mar 10 11:35:20 2018 -0500 Committer: Phil Zampino <pzamp...@apache.org> Committed: Sat Mar 10 21:54:26 2018 -0500 ---------------------------------------------------------------------- .../acls-authzn-provider-config.ts | 5 +- .../authentication-provider-config.ts | 4 +- .../authorization-wizard.ts | 1 - .../display-binding-provider-config.ts | 1 - .../src/app/provider-config-wizard/ha-wizard.ts | 4 +- .../identity-assertion-provider-config.ts | 4 +- .../ldap-provider-config.ts | 82 +++++++++++++++----- .../ordered-param-container.ts | 27 +++++++ .../pam-provider-config.ts | 42 ++++++++-- .../provider-config-wizard.component.ts | 38 ++++----- .../src/app/resource-detail/provider-config.ts | 2 +- .../resource-detail.component.ts | 9 +-- .../applications/admin-ui/app/index.html | 2 +- .../app/inline.01f49f7d13670ad68dea.bundle.js | 1 - .../app/inline.823868e44971b225d6b4.bundle.js | 1 + .../app/main.31f4c13b664f32c9ce4d.bundle.js | 1 + .../app/main.db638922a84cdef35de7.bundle.js | 1 - 17 files changed, 162 insertions(+), 63 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-admin-ui/src/app/provider-config-wizard/acls-authzn-provider-config.ts ---------------------------------------------------------------------- diff --git a/gateway-admin-ui/src/app/provider-config-wizard/acls-authzn-provider-config.ts b/gateway-admin-ui/src/app/provider-config-wizard/acls-authzn-provider-config.ts index fc5a2f5..76dcdff 100644 --- a/gateway-admin-ui/src/app/provider-config-wizard/acls-authzn-provider-config.ts +++ b/gateway-admin-ui/src/app/provider-config-wizard/acls-authzn-provider-config.ts @@ -33,11 +33,10 @@ export class ACLsAuthznProviderConfig extends DisplayBindingProviderConfig { constructor() { super(); - console.debug('new ACLsAuthznProviderConfig()'); - this.name = 'AclsAuthz'; this.role = 'authorization'; + this.name = 'AclsAuthz'; this.enabled = 'true'; - this.params = {}; + this.params = new Map<string, string>(); } getDisplayPropertyNames(): string[] { http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-admin-ui/src/app/provider-config-wizard/authentication-provider-config.ts ---------------------------------------------------------------------- diff --git a/gateway-admin-ui/src/app/provider-config-wizard/authentication-provider-config.ts b/gateway-admin-ui/src/app/provider-config-wizard/authentication-provider-config.ts index 59923ff..931bc2f 100644 --- a/gateway-admin-ui/src/app/provider-config-wizard/authentication-provider-config.ts +++ b/gateway-admin-ui/src/app/provider-config-wizard/authentication-provider-config.ts @@ -24,10 +24,10 @@ export abstract class AuthenticationProviderConfig extends DisplayBindingProvide constructor(name: string, role?: string) { super(); - this.name = name; this.role = role ? role : AuthenticationProviderConfig.AUTHENTICATION_ROLE; - this.params = {}; + this.name = name; this.enabled = 'true'; // enable by default + this.params = new Map<string, string>(); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-admin-ui/src/app/provider-config-wizard/authorization-wizard.ts ---------------------------------------------------------------------- diff --git a/gateway-admin-ui/src/app/provider-config-wizard/authorization-wizard.ts b/gateway-admin-ui/src/app/provider-config-wizard/authorization-wizard.ts index bb690b9..814282c 100644 --- a/gateway-admin-ui/src/app/provider-config-wizard/authorization-wizard.ts +++ b/gateway-admin-ui/src/app/provider-config-wizard/authorization-wizard.ts @@ -45,7 +45,6 @@ export class AuthorizationWizard extends CategoryWizard { onChange() { let configType = AuthorizationWizard.typeConfigMap.get(this.selectedType); if (configType) { - console.debug(configType.prototype.toString() + ' resolved for config type ' + this.selectedType); this.providerConfig = Object.create(configType.prototype) as DisplayBindingProviderConfig; this.providerConfig.constructor.apply(this.providerConfig); } else { http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-admin-ui/src/app/provider-config-wizard/display-binding-provider-config.ts ---------------------------------------------------------------------- diff --git a/gateway-admin-ui/src/app/provider-config-wizard/display-binding-provider-config.ts b/gateway-admin-ui/src/app/provider-config-wizard/display-binding-provider-config.ts index 4cc4d6c..c39025f 100644 --- a/gateway-admin-ui/src/app/provider-config-wizard/display-binding-provider-config.ts +++ b/gateway-admin-ui/src/app/provider-config-wizard/display-binding-provider-config.ts @@ -32,7 +32,6 @@ export abstract class DisplayBindingProviderConfig extends ProviderConfig { } setParam(name: string, value: string) { - console.debug('ProviderConfig --> setParam(' + name + ', ' + value + ')'); this.params[name] = value; } http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-admin-ui/src/app/provider-config-wizard/ha-wizard.ts ---------------------------------------------------------------------- diff --git a/gateway-admin-ui/src/app/provider-config-wizard/ha-wizard.ts b/gateway-admin-ui/src/app/provider-config-wizard/ha-wizard.ts index ee6b30e..df742bb 100644 --- a/gateway-admin-ui/src/app/provider-config-wizard/ha-wizard.ts +++ b/gateway-admin-ui/src/app/provider-config-wizard/ha-wizard.ts @@ -36,10 +36,10 @@ export class HaWizard extends CategoryWizard { getProviderConfig(): ProviderConfig { this.providerConfig = new ProviderConfig(); - this.providerConfig.name = 'HaProvider'; this.providerConfig.role = 'ha'; + this.providerConfig.name = 'HaProvider'; this.providerConfig.enabled = 'true'; - this.providerConfig.params = {}; + this.providerConfig.params = new Map<string, string>(); return this.providerConfig; } http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-admin-ui/src/app/provider-config-wizard/identity-assertion-provider-config.ts ---------------------------------------------------------------------- diff --git a/gateway-admin-ui/src/app/provider-config-wizard/identity-assertion-provider-config.ts b/gateway-admin-ui/src/app/provider-config-wizard/identity-assertion-provider-config.ts index 32f9e92..2c6abfa 100644 --- a/gateway-admin-ui/src/app/provider-config-wizard/identity-assertion-provider-config.ts +++ b/gateway-admin-ui/src/app/provider-config-wizard/identity-assertion-provider-config.ts @@ -23,10 +23,10 @@ export abstract class IdentityAssertionProviderConfig extends DisplayBindingProv constructor(name: string, role?: string) { super(); - this.name = name; this.role = role ? role : IdentityAssertionProviderConfig.ID_ASSERTION_ROLE; - this.params = {}; + this.name = name; this.enabled = 'true'; // enable by default + this.params = new Map<string, string>(); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-admin-ui/src/app/provider-config-wizard/ldap-provider-config.ts ---------------------------------------------------------------------- diff --git a/gateway-admin-ui/src/app/provider-config-wizard/ldap-provider-config.ts b/gateway-admin-ui/src/app/provider-config-wizard/ldap-provider-config.ts index 38e3b81..deb855a 100644 --- a/gateway-admin-ui/src/app/provider-config-wizard/ldap-provider-config.ts +++ b/gateway-admin-ui/src/app/provider-config-wizard/ldap-provider-config.ts @@ -16,35 +16,64 @@ */ import {AuthenticationProviderConfig} from "./authentication-provider-config"; +import {OrderedParamContainer} from "./ordered-param-container"; -export class LDAPProviderConfig extends AuthenticationProviderConfig { +export class LDAPProviderConfig extends AuthenticationProviderConfig implements OrderedParamContainer { - static SESSION_TIMEOUT = 'Session Timeout'; - static DN_TEMPLATE = 'User DN Template'; - static URL = 'URL'; - static MECHANISM = 'Mechanism'; + static SESSION_TIMEOUT = 'Session Timeout'; + static DN_TEMPLATE = 'User DN Template'; + static URL = 'URL'; + static MECHANISM = 'Mechanism'; + static REALM = 'Realm'; + static CONTEXT_FACTORY = 'LDAP Context Factory'; + static REALM_CONTEXT_FACTORY = 'Realm Context Factory'; + static AUTH_CHAIN = 'Authentication Chain'; private static displayPropertyNames = [ LDAPProviderConfig.SESSION_TIMEOUT, - LDAPProviderConfig.DN_TEMPLATE, LDAPProviderConfig.URL, - LDAPProviderConfig.MECHANISM + LDAPProviderConfig.DN_TEMPLATE, + LDAPProviderConfig.MECHANISM, + LDAPProviderConfig.AUTH_CHAIN ]; private static displayPropertyNameBindings: Map<string, string> = - new Map([ - [LDAPProviderConfig.SESSION_TIMEOUT, 'sessionTimeout'], - [LDAPProviderConfig.DN_TEMPLATE, 'main.ldapRealm.userDnTemplate'], - [LDAPProviderConfig.URL, 'main.ldapRealm.contextFactory.url'], - [LDAPProviderConfig.MECHANISM, 'main.ldapRealm.contextFactory.authenticationMechanism'] - ]); + new Map([ + [LDAPProviderConfig.SESSION_TIMEOUT, 'sessionTimeout'], + [LDAPProviderConfig.DN_TEMPLATE, 'main.ldapRealm.userDnTemplate'], + [LDAPProviderConfig.URL, 'main.ldapRealm.contextFactory.url'], + [LDAPProviderConfig.MECHANISM, 'main.ldapRealm.contextFactory.authenticationMechanism'], + [LDAPProviderConfig.REALM, 'main.ldapRealm'], + [LDAPProviderConfig.CONTEXT_FACTORY, 'main.ldapContextFactory'], + [LDAPProviderConfig.REALM_CONTEXT_FACTORY, 'main.ldapRealm.contextFactory'], + [LDAPProviderConfig.AUTH_CHAIN, 'urls./**'] + ] as [string, string][]); + private static paramsOrder: string[] = + [ LDAPProviderConfig.displayPropertyNameBindings.get(LDAPProviderConfig.SESSION_TIMEOUT), + LDAPProviderConfig.displayPropertyNameBindings.get(LDAPProviderConfig.REALM), + LDAPProviderConfig.displayPropertyNameBindings.get(LDAPProviderConfig.CONTEXT_FACTORY), + LDAPProviderConfig.displayPropertyNameBindings.get(LDAPProviderConfig.REALM_CONTEXT_FACTORY), + LDAPProviderConfig.displayPropertyNameBindings.get(LDAPProviderConfig.DN_TEMPLATE), + LDAPProviderConfig.displayPropertyNameBindings.get(LDAPProviderConfig.URL), + // user search attr name, // TODO: PJZ: Define Me + // authzn enabled, // TODO: PJZ: Define Me + // realm context fact system user, // TODO: PJZ: Define Me + // realm context fact system user pwd, // TODO: PJZ: Define Me + LDAPProviderConfig.displayPropertyNameBindings.get(LDAPProviderConfig.MECHANISM), + // user object class, // TODO: PJZ: Define Me + // realm search base, // TODO: PJZ: Define Me + // realm user search base // TODO: PJZ: Define Me + LDAPProviderConfig.displayPropertyNameBindings.get(LDAPProviderConfig.AUTH_CHAIN) + ]; constructor() { super('ShiroProvider'); - this.setParam('main.ldapRealm', 'org.apache.hadoop.gateway.shirorealm.KnoxLdapRealm'); - this.setParam('main.ldapContextFactory', 'org.apache.hadoop.gateway.shirorealm.KnoxLdapContextFactory'); - this.setParam('main.ldapRealm.contextFactory', '$ldapContextFactory'); - this.setParam('urls./**', 'authcBasic'); + this.setParam(this.getDisplayNamePropertyBinding(LDAPProviderConfig.REALM), + 'org.apache.hadoop.gateway.shirorealm.KnoxLdapRealm'); + this.setParam(this.getDisplayNamePropertyBinding(LDAPProviderConfig.CONTEXT_FACTORY), + 'org.apache.hadoop.gateway.shirorealm.KnoxLdapContextFactory'); + this.setParam(this.getDisplayNamePropertyBinding(LDAPProviderConfig.REALM_CONTEXT_FACTORY), '$ldapContextFactory'); + this.setParam(this.getDisplayNamePropertyBinding(LDAPProviderConfig.AUTH_CHAIN), 'authcBasic'); } getDisplayPropertyNames(): string[] { @@ -55,5 +84,22 @@ export class LDAPProviderConfig extends AuthenticationProviderConfig { return LDAPProviderConfig.displayPropertyNameBindings.get(name); } - // TODO: PJZ: Shiro-based providers have param ordering requirements; need to accommodate that + + getOrderedParamNames(): string[] { + return LDAPProviderConfig.paramsOrder; + } + + orderParams(params: Map<string, string>): Map<string, string> { + let result = new Map<string, string>(); + + for (let name of this.getOrderedParamNames()) { + let value = params[name]; + if (value) { + result[name] = value; + } + } + + return result; + } + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-admin-ui/src/app/provider-config-wizard/ordered-param-container.ts ---------------------------------------------------------------------- diff --git a/gateway-admin-ui/src/app/provider-config-wizard/ordered-param-container.ts b/gateway-admin-ui/src/app/provider-config-wizard/ordered-param-container.ts new file mode 100644 index 0000000..e6123f0 --- /dev/null +++ b/gateway-admin-ui/src/app/provider-config-wizard/ordered-param-container.ts @@ -0,0 +1,27 @@ +/* + * 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. + */ + +// ProviderConfig implementations, for which parameter order is important, should implement this interface +export interface OrderedParamContainer { + + // Get the param names in the correct order + getOrderedParamNames(): string[]; + + // Ensure the specified set of params is ordered correctly + orderParams(params: Map<string, string>): Map<string, string>; + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-admin-ui/src/app/provider-config-wizard/pam-provider-config.ts ---------------------------------------------------------------------- diff --git a/gateway-admin-ui/src/app/provider-config-wizard/pam-provider-config.ts b/gateway-admin-ui/src/app/provider-config-wizard/pam-provider-config.ts index f93c94e..55bc22c 100644 --- a/gateway-admin-ui/src/app/provider-config-wizard/pam-provider-config.ts +++ b/gateway-admin-ui/src/app/provider-config-wizard/pam-provider-config.ts @@ -16,24 +16,38 @@ */ import {AuthenticationProviderConfig} from "./authentication-provider-config"; +import {OrderedParamContainer} from "./ordered-param-container"; -export class PAMProviderConfig extends AuthenticationProviderConfig { +export class PAMProviderConfig extends AuthenticationProviderConfig implements OrderedParamContainer { static SESSION_TIMEOUT = 'Session Timeout'; + static REALM = 'Realm'; + static SERVICE = 'Service'; + static AUTH_CHAIN = 'Authentication Chain'; private static displayPropertyNames = [ PAMProviderConfig.SESSION_TIMEOUT ]; private static displayPropertyNameBindings: Map<string, string> = new Map([ - [PAMProviderConfig.SESSION_TIMEOUT, 'sessionTimeout'] + [PAMProviderConfig.SESSION_TIMEOUT, 'sessionTimeout'], + [PAMProviderConfig.REALM, 'main.pamRealm'], + [PAMProviderConfig.SERVICE, 'main.pamRealm.service'], + [PAMProviderConfig.AUTH_CHAIN, 'urls./**'] ]); + private static paramsOrder: string[] = + [ PAMProviderConfig.displayPropertyNameBindings.get(PAMProviderConfig.SESSION_TIMEOUT), + PAMProviderConfig.displayPropertyNameBindings.get(PAMProviderConfig.REALM), + PAMProviderConfig.displayPropertyNameBindings.get(PAMProviderConfig.SERVICE), + PAMProviderConfig.displayPropertyNameBindings.get(PAMProviderConfig.AUTH_CHAIN) + ]; constructor() { super('ShiroProvider'); - this.setParam('main.pamRealm', 'org.apache.knox.gateway.shirorealm.KnoxPamRealm'); - this.setParam('main.pamRealm.service', 'login'); - this.setParam('urls./**', 'authcBasic'); + this.setParam(this.getDisplayNamePropertyBinding(PAMProviderConfig.REALM), + 'org.apache.knox.gateway.shirorealm.KnoxPamRealm'); + this.setParam(this.getDisplayNamePropertyBinding(PAMProviderConfig.SERVICE), 'login'); + this.setParam(this.getDisplayNamePropertyBinding(PAMProviderConfig.AUTH_CHAIN), 'authcBasic'); } getDisplayPropertyNames(): string[] { @@ -44,5 +58,21 @@ export class PAMProviderConfig extends AuthenticationProviderConfig { return PAMProviderConfig.displayPropertyNameBindings.get(name); } - // TODO: PJZ: Shiro-based providers have param ordering requirements; need to accommodate that + getOrderedParamNames(): string[] { + return PAMProviderConfig.paramsOrder; + } + + orderParams(params: Map<string, string>): Map<string, string> { + let result = new Map<string, string>(); + + for (let name of this.getOrderedParamNames()) { + let value = params[name]; + if (value) { + result[name] = value; + } + } + + return result; + } + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-admin-ui/src/app/provider-config-wizard/provider-config-wizard.component.ts ---------------------------------------------------------------------- diff --git a/gateway-admin-ui/src/app/provider-config-wizard/provider-config-wizard.component.ts b/gateway-admin-ui/src/app/provider-config-wizard/provider-config-wizard.component.ts index 8cb4fb9..1453611 100644 --- a/gateway-admin-ui/src/app/provider-config-wizard/provider-config-wizard.component.ts +++ b/gateway-admin-ui/src/app/provider-config-wizard/provider-config-wizard.component.ts @@ -27,6 +27,8 @@ import {IdentityAssertionWizard} from "./identity-assertion-wizard"; import {HaWizard} from "./ha-wizard"; import {Resource} from "../resource/resource"; import {DisplayBindingProviderConfig} from "./display-binding-provider-config"; +import {OrderedParamContainer} from "./ordered-param-container"; + @Component({ selector: 'app-provider-config-wizard', @@ -87,26 +89,31 @@ export class ProviderConfigWizardComponent implements OnInit { this.selectedCategory = ProviderConfigWizardComponent.CATEGORY_AUTHENTICATION; } + + // Type Guard for identifying OrderedParamContainer implementations + static isOrderedParamContainer = (x: any): x is OrderedParamContainer => x.orderParams; + onFinishAdd() { - console.debug('Selected provider category: ' + this.selectedCategory); + console.debug('ProviderConfigWizard --> Selected provider category: ' + this.selectedCategory); let catWizard = this.getCategoryWizard(this.selectedCategory); let type = catWizard ? catWizard.getSelectedType() : 'undefined'; - console.debug('Selected provider type: ' + type); + console.debug('ProviderConfigWizard --> Selected provider type: ' + type); if (catWizard) { let pc: ProviderConfig = catWizard.getProviderConfig(); if (pc) { this.providers.push(pc); - console.debug('\tProvider Name: ' + pc.name); - console.debug('\tProvider Role: ' + pc.role); - console.debug('\tProvider Enabled: ' + pc.enabled); + console.debug('ProviderConfigWizard --> Provider: name=' + pc.name + ', role=' + pc.role + ', enabled=' + pc.enabled); if (pc.params) { + // If the provider is managing its own param order, allow it to re-order the params now + if (ProviderConfigWizardComponent.isOrderedParamContainer(pc)) { + pc.params = (pc as OrderedParamContainer).orderParams(pc.params); + } + for (let name of Object.getOwnPropertyNames(pc.params)) { - console.debug('\t\tParam: ' + name + ' = ' + pc.params[name]); + console.debug('\tParam: ' + name + ' = ' + pc.params[name]); } - } else { - console.debug('\tNo Params'); } } } @@ -115,12 +122,6 @@ export class ProviderConfigWizardComponent implements OnInit { } onClose() { - console.debug('Provider Configuration: ' + this.name); - - for (let pc of this.providers) { - console.debug('\tProvider: ' + pc.name + ' (' + pc.role + ')'); - } - // Identify the new resource let newResource = new Resource(); newResource.name = this.name + '.json'; @@ -195,7 +196,7 @@ export class ProviderConfigWizardComponent implements OnInit { if (catWizard) { return catWizard.getTypes(); } else { - console.debug('Unresolved category wizard for ' + (category ? category : this.selectedCategory)); + console.debug('ProviderConfigWizard --> Unresolved category wizard for ' + (category ? category : this.selectedCategory)); } return []; } @@ -209,14 +210,13 @@ export class ProviderConfigWizardComponent implements OnInit { let dispPC = pc as DisplayBindingProviderConfig; return dispPC.getDisplayPropertyNames(); } else { - console.debug('Got Vanilla ProviderConfig'); return []; } } else { - console.log('No provider config from category wizard ' + typeof(catWizard)); + console.log('ProviderConfigWizard --> No provider config from category wizard ' + typeof(catWizard)); } } else { - console.debug('Unresolved category wizard for ' + this.selectedCategory); + console.debug('ProviderConfigWizard --> Unresolved category wizard for ' + this.selectedCategory); } return []; } @@ -230,7 +230,7 @@ export class ProviderConfigWizardComponent implements OnInit { let dispPC = pc as DisplayBindingProviderConfig; let property = dispPC.getDisplayNamePropertyBinding(name); pc.setParam(property, value); - console.debug('Set ProviderConfig param value: ' + property + '=' + value); + console.debug('ProviderConfigWizard --> Set ProviderConfig param value: ' + property + '=' + value); } } } http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-admin-ui/src/app/resource-detail/provider-config.ts ---------------------------------------------------------------------- diff --git a/gateway-admin-ui/src/app/resource-detail/provider-config.ts b/gateway-admin-ui/src/app/resource-detail/provider-config.ts index 0811b9a..6be24f2 100644 --- a/gateway-admin-ui/src/app/resource-detail/provider-config.ts +++ b/gateway-admin-ui/src/app/resource-detail/provider-config.ts @@ -19,5 +19,5 @@ export class ProviderConfig { name: string; role: string; enabled: string; - params: Object; + params: Map<string, string>; } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-admin-ui/src/app/resource-detail/resource-detail.component.ts ---------------------------------------------------------------------- diff --git a/gateway-admin-ui/src/app/resource-detail/resource-detail.component.ts b/gateway-admin-ui/src/app/resource-detail/resource-detail.component.ts index 2ffaf77..a50a381 100644 --- a/gateway-admin-ui/src/app/resource-detail/resource-detail.component.ts +++ b/gateway-admin-ui/src/app/resource-detail/resource-detail.component.ts @@ -137,7 +137,7 @@ export class ResourceDetailComponent implements OnInit { // There may not be params if (entry.param) { - let params = {}; + let params = new Map<string, string>(); for (let i = 0; i < entry.param.length; i++) { let param = entry.param[i]; params[param.name[0]] = param.value[0]; @@ -518,7 +518,7 @@ export class ResourceDetailComponent implements OnInit { addProviderParam(provider: ProviderConfig, name: string, value: string) { if (!provider.params) { - provider.params = {}; + provider.params = new Map<string, string>(); } provider.params[name] = value; this.changedProviders = this.providers; @@ -526,12 +526,11 @@ export class ResourceDetailComponent implements OnInit { getProviderParamNames(provider: ProviderConfig): string[] { if (!provider.params) { - provider.params = {}; + provider.params = new Map<string, string>(); } - return Object.getOwnPropertyNames(provider.params); + return Object.keys(provider.params); } - isProviderEnabled(pc: ProviderConfig): boolean { let result: boolean = false; http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-applications/src/main/resources/applications/admin-ui/app/index.html ---------------------------------------------------------------------- diff --git a/gateway-applications/src/main/resources/applications/admin-ui/app/index.html b/gateway-applications/src/main/resources/applications/admin-ui/app/index.html index aae1ecd..69cc800 100644 --- a/gateway-applications/src/main/resources/applications/admin-ui/app/index.html +++ b/gateway-applications/src/main/resources/applications/admin-ui/app/index.html @@ -11,4 +11,4 @@ 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. ---><!doctype html><html><head><meta charset="utf-8"><title>Apache Knox Manager</title><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" type="image/x-icon" href="favicon.ico"><meta name="viewport" content="width=device-width,initial-scale=1"><!-- Latest compiled and minified CSS --><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"><!-- Optional theme --><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"><!-- Custom styles for this template --><link href="assets/sticky-footer.css" rel="stylesheet"><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script><!-- Latest compiled and minified JavaScript --><scr ipt src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script><script src="assets/vkbeautify.js"></script><link href="styles.2ee5b7f4cd59a6cf015e.bundle.css" rel="stylesheet"/></head><body><div class="navbar-wrapper"><div class="container-fluid"><nav class="navbar navbar-inverse navbar-static-top"><div class="container-fluid"><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"><span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span></button> <a class="navbar-brand" href="#"><img style="max-width:200px; margin-top: -9px;" src="assets/knox-logo-transparent.gif" alt="Apache Knox Manager"></a></div></div></nav></div><!-- Content --><resource-management></res ource-management><footer class="footer"><div>Knox Manager Version 0.1.0</div><gateway-version></gateway-version></footer><script type="text/javascript" src="inline.01f49f7d13670ad68dea.bundle.js"></script><script type="text/javascript" src="scripts.c50bb762c438ae0f8842.bundle.js"></script><script type="text/javascript" src="main.db638922a84cdef35de7.bundle.js"></script></div></body></html> \ No newline at end of file +--><!doctype html><html><head><meta charset="utf-8"><title>Apache Knox Manager</title><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" type="image/x-icon" href="favicon.ico"><meta name="viewport" content="width=device-width,initial-scale=1"><!-- Latest compiled and minified CSS --><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"><!-- Optional theme --><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"><!-- Custom styles for this template --><link href="assets/sticky-footer.css" rel="stylesheet"><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script><!-- Latest compiled and minified JavaScript --><scr ipt src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script><script src="assets/vkbeautify.js"></script><link href="styles.2ee5b7f4cd59a6cf015e.bundle.css" rel="stylesheet"/></head><body><div class="navbar-wrapper"><div class="container-fluid"><nav class="navbar navbar-inverse navbar-static-top"><div class="container-fluid"><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"><span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span></button> <a class="navbar-brand" href="#"><img style="max-width:200px; margin-top: -9px;" src="assets/knox-logo-transparent.gif" alt="Apache Knox Manager"></a></div></div></nav></div><!-- Content --><resource-management></res ource-management><footer class="footer"><div>Knox Manager Version 0.1.0</div><gateway-version></gateway-version></footer><script type="text/javascript" src="inline.823868e44971b225d6b4.bundle.js"></script><script type="text/javascript" src="scripts.c50bb762c438ae0f8842.bundle.js"></script><script type="text/javascript" src="main.31f4c13b664f32c9ce4d.bundle.js"></script></div></body></html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-applications/src/main/resources/applications/admin-ui/app/inline.01f49f7d13670ad68dea.bundle.js ---------------------------------------------------------------------- diff --git a/gateway-applications/src/main/resources/applications/admin-ui/app/inline.01f49f7d13670ad68dea.bundle.js b/gateway-applications/src/main/resources/applications/admin-ui/app/inline.01f49f7d13670ad68dea.bundle.js deleted file mode 100644 index 7cbd9f2..0000000 --- a/gateway-applications/src/main/resources/applications/admin-ui/app/inline.01f49f7d13670ad68dea.bundle.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,u){for(var a,i,f,l=0,s=[];l<r.length;l++)t[i=r[l]]&&s.push(t[i][0]),t[i]=0;for(a in c)Object.prototype.hasOwnProperty.call(c,a)&&(e[a]=c[a]);for(n&&n(r,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=o(o.s=u[l]);return f};var r={},t={2:0};function o(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,o){n=t[e]=[r,o]});n[2]=r;var c=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,o.nc&&u.setAttribute("nonce",o.nc),u.src=o.p+""+e+"."+{0:"db638922a84cdef35de7",1:"aed76669724804835353"}[e]+".chunk.js";var a=setTimeout(i,12e4);function i(){u.onerror=u.onload=null,clearTimeout(a);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chu nk "+e+" failed.")),t[e]=void 0)}return u.onerror=u.onload=i,c.appendChild(u),r},o.m=e,o.c=r,o.d=function(e,n,r){o.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},o.p="",o.oe=function(e){throw console.error(e),e}}([]); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/knox/blob/4c1cb80c/gateway-applications/src/main/resources/applications/admin-ui/app/inline.823868e44971b225d6b4.bundle.js ---------------------------------------------------------------------- diff --git a/gateway-applications/src/main/resources/applications/admin-ui/app/inline.823868e44971b225d6b4.bundle.js b/gateway-applications/src/main/resources/applications/admin-ui/app/inline.823868e44971b225d6b4.bundle.js new file mode 100644 index 0000000..d865f38 --- /dev/null +++ b/gateway-applications/src/main/resources/applications/admin-ui/app/inline.823868e44971b225d6b4.bundle.js @@ -0,0 +1 @@ +!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,u){for(var a,i,f,l=0,s=[];l<r.length;l++)t[i=r[l]]&&s.push(t[i][0]),t[i]=0;for(a in c)Object.prototype.hasOwnProperty.call(c,a)&&(e[a]=c[a]);for(n&&n(r,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=o(o.s=u[l]);return f};var r={},t={2:0};function o(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,o){n=t[e]=[r,o]});n[2]=r;var c=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,o.nc&&u.setAttribute("nonce",o.nc),u.src=o.p+""+e+"."+{0:"31f4c13b664f32c9ce4d",1:"aed76669724804835353"}[e]+".chunk.js";var a=setTimeout(i,12e4);function i(){u.onerror=u.onload=null,clearTimeout(a);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chu nk "+e+" failed.")),t[e]=void 0)}return u.onerror=u.onload=i,c.appendChild(u),r},o.m=e,o.c=r,o.d=function(e,n,r){o.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},o.p="",o.oe=function(e){throw console.error(e),e}}([]); \ No newline at end of file