vault/ui/lib/pki/addon/components/pki-key-parameters.ts
claire bontempo e32cf520f4
UI: fixes pki role editing changing to default key parameter values (#20907)
* add integer-to-string helper

* rename and add test

* add role test

* finish tests

* pass options so values are only converted if the type matches

* okay lets hit it with the loose-equal instead

* add changelog
2023-05-31 15:44:22 -07:00

67 lines
2.2 KiB
TypeScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: MPL-2.0
*/
import Component from '@glimmer/component';
import { action } from '@ember/object';
import type PkiRoleModel from 'vault/models/pki/role';
import type PkiKeyModel from 'vault/models/pki/key';
import type PkiActionModel from 'vault/models/pki/action';
import type { HTMLElementEvent } from 'forms';
/**
* @module PkiKeyParameters
* PkiKeyParameters components are used to display a list of key bit options depending on the selected key type. The key bits field is disabled until a key type is selected.
* If the component renders in a group, other attrs may be passed in and will be rendered using the <FormField> component
* @example
* ```js
* <PkiKeyParameters @model={{@model}} @fields={{fields}}/>
* ```
* @param {class} model - The pki/role, pki/action, pki/key model.
* @param {string} fields - Array of attributes from a formFieldGroup generated by the @withFormFields decorator ex: [{ name: 'attrName', type: 'string', options: {...} }]
*/
interface Args {
model: PkiRoleModel | PkiKeyModel | PkiActionModel;
}
interface ModelAttributeName {
keyType: string;
keyBits: string;
}
interface TypeOptions {
rsa: string;
ec: string;
ed25519: string;
any: string;
}
interface BitOptions {
[key: string]: Array<string>;
}
// first value in array is the default bits for that key type
const KEY_BITS_OPTIONS: BitOptions = {
rsa: ['2048', '3072', '4096', '0'],
ec: ['256', '224', '384', '521', '0'],
ed25519: ['0'],
any: ['0'],
};
export default class PkiKeyParameters extends Component<Args> {
get keyBitOptions() {
if (!this.args.model.keyType) return [];
return KEY_BITS_OPTIONS[this.args.model.keyType];
}
@action handleSelection(name: string, selection: string) {
this.args.model[name as keyof ModelAttributeName] = selection;
if (name === 'keyType' && Object.keys(KEY_BITS_OPTIONS)?.includes(selection)) {
const bitOptions = KEY_BITS_OPTIONS[selection as keyof TypeOptions];
this.args.model.keyBits = bitOptions?.firstObject;
}
}
@action onKeyBitsChange(event: HTMLElementEvent<HTMLInputElement>) {
this.handleSelection(event.target.name, event.target.value);
}
}