diff --git a/ui/app/adapters/secret-engine.js b/ui/app/adapters/secret-engine.js index 4c483f990189..9f40219315b5 100644 --- a/ui/app/adapters/secret-engine.js +++ b/ui/app/adapters/secret-engine.js @@ -1,6 +1,5 @@ import Ember from 'ember'; import ApplicationAdapter from './application'; -import DS from 'ember-data'; export default ApplicationAdapter.extend({ url(path) { @@ -8,30 +7,16 @@ export default ApplicationAdapter.extend({ return path ? url + '/' + path : url; }, - pathForType(type) { - let path; - switch (type) { - case 'cluster': - path = 'clusters'; - break; - case 'secret-engine': - path = 'mounts'; - break; - default: - path = Ember.String.pluralize(type); - break; - } - return path; + pathForType() { + return 'mounts'; }, - query() { - return this.ajax(this.url(), 'GET').catch(e => { - if (e instanceof DS.AdapterError) { - Ember.set(e, 'policyPath', 'sys/mounts'); - } - - throw e; - }); + query(store, type, query) { + let url = `/${this.urlPrefix()}/internal/ui/mounts`; + if (query.path) { + url = `${url}/${query.path}`; + } + return this.ajax(url, 'GET'); }, createRecord(store, type, snapshot) { diff --git a/ui/app/controllers/vault/cluster/response-wrapping.js b/ui/app/controllers/vault/cluster/response-wrapping.js deleted file mode 100644 index 612c01b887c8..000000000000 --- a/ui/app/controllers/vault/cluster/response-wrapping.js +++ /dev/null @@ -1,9 +0,0 @@ -import Ember from 'ember'; - -export default Ember.Controller.extend({ - queryParams: { - selectedAction: 'action', - }, - - selectedAction: 'wrap', -}); diff --git a/ui/app/router.js b/ui/app/router.js index f3c65df00ecf..ecb289b57511 100644 --- a/ui/app/router.js +++ b/ui/app/router.js @@ -116,7 +116,6 @@ Router.map(function() { }); }); - this.route('response-wrapping'); this.route('not-found', { path: '/*path' }); }); this.route('not-found', { path: '/*path' }); diff --git a/ui/app/routes/vault/cluster/secrets.js b/ui/app/routes/vault/cluster/secrets.js index d86c74eadb24..faca1fd5f307 100644 --- a/ui/app/routes/vault/cluster/secrets.js +++ b/ui/app/routes/vault/cluster/secrets.js @@ -1,8 +1,4 @@ import Ember from 'ember'; import ClusterRoute from 'vault/mixins/cluster-route'; -export default Ember.Route.extend(ClusterRoute, { - model() { - return this.store.query('secret-engine', {}); - }, -}); +export default Ember.Route.extend(ClusterRoute); diff --git a/ui/app/routes/vault/cluster/secrets/backend.js b/ui/app/routes/vault/cluster/secrets/backend.js index 2cdd61554a5f..71c10ee90293 100644 --- a/ui/app/routes/vault/cluster/secrets/backend.js +++ b/ui/app/routes/vault/cluster/secrets/backend.js @@ -2,19 +2,31 @@ import Ember from 'ember'; const { inject } = Ember; export default Ember.Route.extend({ flashMessages: inject.service(), - beforeModel(transition) { - const target = transition.targetName; - const { backend } = this.paramsFor(this.routeName); - const backendModel = this.store.peekRecord('secret-engine', backend); - const type = backendModel && backendModel.get('type'); - if (type === 'kv' && backendModel.get('options.version') === 2) { + model(params) { + let { backend } = params; + return this.store + .query('secret-engine', { + path: backend, + }) + .then(model => { + if (model) { + return model.get('firstObject'); + } + }); + }, + + afterModel(model, transition) { + let target = transition.targetName; + let path = model && model.get('path'); + let type = model && model.get('type'); + if (type === 'kv' && model.get('options.version') === 2) { this.get('flashMessages').stickyInfo( - `"${backend}" is a newer version of the KV backend. The Vault UI does not currently support the additional versioning features. All actions taken through the UI in this engine will operate on the most recent version of a secret.` + `"${path}" is a newer version of the KV backend. The Vault UI does not currently support the additional versioning features. All actions taken through the UI in this engine will operate on the most recent version of a secret.` ); } if (target === this.routeName) { - return this.replaceWith('vault.cluster.secrets.backend.list-root', backend); + return this.replaceWith('vault.cluster.secrets.backend.list-root', path); } }, }); diff --git a/ui/app/routes/vault/cluster/secrets/backend/credentials.js b/ui/app/routes/vault/cluster/secrets/backend/credentials.js index 034117161340..ecbd745b0652 100644 --- a/ui/app/routes/vault/cluster/secrets/backend/credentials.js +++ b/ui/app/routes/vault/cluster/secrets/backend/credentials.js @@ -7,8 +7,7 @@ export default Ember.Route.extend(UnloadModel, { templateName: 'vault/cluster/secrets/backend/credentials', backendModel() { - const backend = this.paramsFor('vault.cluster.secrets.backend').backend; - return this.store.peekRecord('secret-engine', backend); + return this.modelFor('vault.cluster.secrets.backend'); }, pathQuery(role, backend) { diff --git a/ui/app/routes/vault/cluster/secrets/backend/list.js b/ui/app/routes/vault/cluster/secrets/backend/list.js index 6c7520159a44..d3ebd7851ba2 100644 --- a/ui/app/routes/vault/cluster/secrets/backend/list.js +++ b/ui/app/routes/vault/cluster/secrets/backend/list.js @@ -45,29 +45,29 @@ export default Ember.Route.extend({ model(params) { const secret = params.secret ? params.secret : ''; const { backend } = this.paramsFor('vault.cluster.secrets.backend'); - const backends = this.modelFor('vault.cluster.secrets').mapBy('id'); + const backendModel = this.modelFor('vault.cluster.secrets.backend'); return Ember.RSVP.hash({ secret, secrets: this.store - .lazyPaginatedQuery(this.getModelType(backend, params.tab), { - id: secret, - backend, - responsePath: 'data.keys', - page: params.page, - pageFilter: params.pageFilter, - size: 100, - }) - .then(model => { - this.set('has404', false); - return model; - }) - .catch(err => { - if (backends.includes(backend) && err.httpStatus === 404 && secret === '') { - return []; - } else { - throw err; - } - }), + .lazyPaginatedQuery(this.getModelType(backend, params.tab), { + id: secret, + backend, + responsePath: 'data.keys', + page: params.page, + pageFilter: params.pageFilter, + size: 100, + }) + .then(model => { + this.set('has404', false); + return model; + }) + .catch(err => { + if (backendModel && err.httpStatus === 404 && secret === '') { + return []; + } else { + throw err; + } + }) }); }, @@ -138,11 +138,9 @@ export default Ember.Route.extend({ error(error, transition) { const { secret } = this.paramsFor(this.routeName); const { backend } = this.paramsFor('vault.cluster.secrets.backend'); - const backends = this.modelFor('vault.cluster.secrets').mapBy('id'); Ember.set(error, 'secret', secret); Ember.set(error, 'isRoot', true); - Ember.set(error, 'hasBackend', backends.includes(backend)); Ember.set(error, 'backend', backend); const hasModel = this.controllerFor(this.routeName).get('hasModel'); // only swallow the error if we have a previous model diff --git a/ui/app/routes/vault/cluster/secrets/backend/secret-edit.js b/ui/app/routes/vault/cluster/secrets/backend/secret-edit.js index dd8d69d3b4ca..13d96d7bd6bd 100644 --- a/ui/app/routes/vault/cluster/secrets/backend/secret-edit.js +++ b/ui/app/routes/vault/cluster/secrets/backend/secret-edit.js @@ -5,7 +5,7 @@ import UnloadModelRoute from 'vault/mixins/unload-model-route'; export default Ember.Route.extend(UnloadModelRoute, { capabilities(secret) { const { backend } = this.paramsFor('vault.cluster.secrets.backend'); - let backendModel = this.store.peekRecord('secret-engine', backend); + let backendModel = this.modelFor('vault.cluster.secrets.backend'); let backendType = backendModel.get('type'); let version = backendModel.get('options.version'); let path; @@ -21,8 +21,8 @@ export default Ember.Route.extend(UnloadModelRoute, { return this.store.findRecord('capabilities', path); }, - backendType(path) { - return this.store.peekRecord('secret-engine', path).get('type'); + backendType() { + return this.modelFor('vault.cluster.secrets.backend').get('type'); }, templateName: 'vault/cluster/secrets/backend/secretEditLayout', @@ -50,7 +50,7 @@ export default Ember.Route.extend(UnloadModelRoute, { aws: 'role-aws', pki: secret && secret.startsWith('cert/') ? 'pki-certificate' : 'role-pki', }; - let backendModel = this.store.peekRecord('secret-engine', backend); + let backendModel = this.modelFor('vault.cluster.secrets.backend', backend); let defaultType = 'secret'; if (backendModel.get('type') === 'kv' && backendModel.get('options.version') === 2) { defaultType = 'secret-v2'; @@ -81,7 +81,7 @@ export default Ember.Route.extend(UnloadModelRoute, { const { backend } = this.paramsFor('vault.cluster.secrets.backend'); const preferAdvancedEdit = this.controllerFor('vault.cluster.secrets.backend').get('preferAdvancedEdit') || false; - const backendType = this.backendType(backend); + const backendType = this.backendType(); model.secret.setProperties({ backend }); controller.setProperties({ model: model.secret, @@ -105,10 +105,8 @@ export default Ember.Route.extend(UnloadModelRoute, { error(error) { const { secret } = this.paramsFor(this.routeName); const { backend } = this.paramsFor('vault.cluster.secrets.backend'); - const backends = this.modelFor('vault.cluster.secrets').mapBy('id'); Ember.set(error, 'keyId', backend + '/' + secret); Ember.set(error, 'backend', backend); - Ember.set(error, 'hasBackend', backends.includes(backend)); return true; }, diff --git a/ui/app/routes/vault/cluster/secrets/backend/sign.js b/ui/app/routes/vault/cluster/secrets/backend/sign.js index b4329d5271a9..8e645dd838a5 100644 --- a/ui/app/routes/vault/cluster/secrets/backend/sign.js +++ b/ui/app/routes/vault/cluster/secrets/backend/sign.js @@ -5,8 +5,7 @@ export default Ember.Route.extend(UnloadModel, { templateName: 'vault/cluster/secrets/backend/sign', backendModel() { - const backend = this.paramsFor('vault.cluster.secrets.backend').backend; - return this.store.peekRecord('secret-engine', backend); + return this.modelFor('vault.cluster.secrets.backend'); }, pathQuery(role, backend) { diff --git a/ui/app/routes/vault/cluster/secrets/backends.js b/ui/app/routes/vault/cluster/secrets/backends.js new file mode 100644 index 000000000000..ceb3edd5b818 --- /dev/null +++ b/ui/app/routes/vault/cluster/secrets/backends.js @@ -0,0 +1,7 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ + model() { + return this.store.query('secret-engine', {}); + }, +}); diff --git a/ui/app/routes/vault/cluster/settings/configure-secret-backend.js b/ui/app/routes/vault/cluster/settings/configure-secret-backend.js index 3c6217dff815..bf813726fed1 100644 --- a/ui/app/routes/vault/cluster/settings/configure-secret-backend.js +++ b/ui/app/routes/vault/cluster/settings/configure-secret-backend.js @@ -6,8 +6,8 @@ const CONFIGURABLE_BACKEND_TYPES = ['aws', 'ssh', 'pki']; export default Ember.Route.extend({ model() { const { backend } = this.paramsFor(this.routeName); - return this.store.query('secret-engine', {}).then(() => { - const model = this.store.peekRecord('secret-engine', backend); + return this.store.query('secret-engine', { path: backend }).then(modelList => { + let model = modelList && modelList.get('firstObject'); if (!model || !CONFIGURABLE_BACKEND_TYPES.includes(model.get('type'))) { const error = new DS.AdapterError(); Ember.set(error, 'httpStatus', 404); diff --git a/ui/app/serializers/secret-engine.js b/ui/app/serializers/secret-engine.js index c14495549892..e10325615c4b 100644 --- a/ui/app/serializers/secret-engine.js +++ b/ui/app/serializers/secret-engine.js @@ -38,7 +38,17 @@ export default DS.RESTSerializer.extend({ } else if (isQueryRecord) { backends = this.normalizeBackend(null, payload); } else { - backends = Object.keys(payload.data).map(id => this.normalizeBackend(id, payload[id])); + // this is terrible, I'm sorry + // TODO extract AWS and SSH config saving from the secret-engine model to simplify this + if (payload.data.secret) { + backends = Object.keys(payload.data.secret).map(id => + this.normalizeBackend(id, payload.data.secret[id]) + ); + } else if (!payload.data.path) { + backends = Object.keys(payload.data).map(id => this.normalizeBackend(id, payload[id])); + } else { + backends = [this.normalizeBackend(payload.data.path, payload.data)]; + } } const transformedPayload = { [primaryModelClass.modelName]: backends }; diff --git a/ui/app/templates/components/ttl-picker.hbs b/ui/app/templates/components/ttl-picker.hbs index f42a890c788b..ce6ec531f31f 100644 --- a/ui/app/templates/components/ttl-picker.hbs +++ b/ui/app/templates/components/ttl-picker.hbs @@ -6,7 +6,7 @@ value={{time}} id="time-{{elementId}}" type="text" - name="time-{{elementId}}" + name="time" class="input" oninput={{action 'changedValue' 'time'}} /> @@ -15,8 +15,8 @@