| /** |
| * Copyright (c) HashiCorp, Inc. |
| * SPDX-License-Identifier: MPL-2.0 |
| */ |
| |
| import { inject as service } from '@ember/service'; |
| import { computed, set } from '@ember/object'; |
| import Component from '@ember/component'; |
| |
| const MODEL_TYPES = { |
| 'ssh-sign': { |
| model: 'ssh-sign', |
| }, |
| 'ssh-creds': { |
| model: 'ssh-otp-credential', |
| title: 'Generate SSH Credentials', |
| }, |
| 'aws-creds': { |
| model: 'aws-credential', |
| title: 'Generate AWS Credentials', |
| backIsListLink: true, |
| }, |
| 'pki-issue': { |
| model: 'pki/cert', |
| title: 'Issue Certificate', |
| }, |
| 'pki-sign': { |
| model: 'pki-certificate-sign', |
| title: 'Sign Certificate', |
| }, |
| }; |
| |
| export default Component.extend({ |
| controlGroup: service(), |
| store: service(), |
| router: service(), |
| // set on the component |
| backendType: null, |
| backendPath: null, |
| roleName: null, |
| action: null, |
| |
| model: null, |
| loading: false, |
| emptyData: '{\n}', |
| |
| modelForType() { |
| const type = this.options; |
| if (type) { |
| return type.model; |
| } |
| // if we don't have a mode for that type then redirect them back to the backend list |
| this.router.transitionTo('vault.cluster.secrets.backend.list-root', this.backendPath); |
| }, |
| |
| options: computed('action', 'backendType', function () { |
| const action = this.action || 'creds'; |
| return MODEL_TYPES[`${this.backendType}-${action}`]; |
| }), |
| |
| init() { |
| this._super(...arguments); |
| this.createOrReplaceModel(); |
| }, |
| |
| willDestroy() { |
| if (!this.model.isDestroyed && !this.model.isDestroying) { |
| this.model.unloadRecord(); |
| } |
| this._super(...arguments); |
| }, |
| |
| createOrReplaceModel() { |
| const modelType = this.modelForType(); |
| const model = this.model; |
| const roleName = this.roleName; |
| const backendPath = this.backendPath; |
| if (!modelType) { |
| return; |
| } |
| if (model) { |
| model.unloadRecord(); |
| } |
| const attrs = { |
| role: { |
| backend: backendPath, |
| name: roleName, |
| }, |
| id: `${backendPath}-${roleName}`, |
| }; |
| const newModel = this.store.createRecord(modelType, attrs); |
| this.set('model', newModel); |
| }, |
| |
| actions: { |
| create() { |
| const model = this.model; |
| this.set('loading', true); |
| this.model |
| .save() |
| .then(() => { |
| model.set('hasGenerated', true); |
| }) |
| .catch((error) => { |
| // Handle control group AdapterError |
| if (error.message === 'Control Group encountered') { |
| this.controlGroup.saveTokenFromError(error); |
| const err = this.controlGroup.logFromError(error); |
| error.errors = [err.content]; |
| } |
| throw error; |
| }) |
| .finally(() => { |
| this.set('loading', false); |
| }); |
| }, |
| |
| codemirrorUpdated(attr, val, codemirror) { |
| codemirror.performLint(); |
| const hasErrors = codemirror.state.lint.marked.length > 0; |
| |
| if (!hasErrors) { |
| set(this.model, attr, JSON.parse(val)); |
| } |
| }, |
| |
| newModel() { |
| this.createOrReplaceModel(); |
| }, |
| }, |
| }); |