From 61f305211361dc45f76965fd647bebb733501ac3 Mon Sep 17 00:00:00 2001 From: Kent Wang Date: Mon, 6 Jan 2025 14:48:48 +0800 Subject: [PATCH] 1.remove aws related code --- .../settings/cloud-service-credentials.tsx | 184 ------------------ .../aws-secret-manager-form.tsx | 132 ------------- .../external-vault/external-vault-form.tsx | 60 ------ .../templating/local-template-tags.ts | 99 ---------- 4 files changed, 475 deletions(-) delete mode 100644 packages/insomnia/src/ui/components/settings/cloud-service-credentials.tsx delete mode 100644 packages/insomnia/src/ui/components/templating/external-vault/aws-secret-manager-form.tsx delete mode 100644 packages/insomnia/src/ui/components/templating/external-vault/external-vault-form.tsx diff --git a/packages/insomnia/src/ui/components/settings/cloud-service-credentials.tsx b/packages/insomnia/src/ui/components/settings/cloud-service-credentials.tsx deleted file mode 100644 index 743e388d8d..0000000000 --- a/packages/insomnia/src/ui/components/settings/cloud-service-credentials.tsx +++ /dev/null @@ -1,184 +0,0 @@ -import React, { useState } from 'react'; -import { Button, Menu, MenuItem, MenuTrigger, Popover } from 'react-aria-components'; -import { useFetcher } from 'react-router-dom'; - -import { type CloudProviderCredential, type CloudProviderName, getProviderDisplayName } from '../../../models/cloud-credential'; -import { usePlanData } from '../../hooks/use-plan'; -import { useRootLoaderData } from '../../routes/root'; -import { Icon } from '../icon'; -import { showModal } from '../modals'; -import { AskModal } from '../modals/ask-modal'; -import { CloudCredentialModal } from '../modals/cloud-credential-modal/cloud-credential-modal'; -import { UpgradeNotice } from '../upgrade-notices'; -import { NumberSetting } from './number-setting'; - -interface createCredentialItemType { - name: string; - id: CloudProviderName; -} -const createCredentialItemList: createCredentialItemType[] = [ - { - id: 'aws', - name: getProviderDisplayName('aws'), - }, - // TODO only support aws for now - // { - // id: 'azure', - // name: getProviderDisplayName('azure'), - // }, - // { - // id: 'gcp', - // name: getProviderDisplayName('gcp'), - // }, -]; -const buttonClassName = 'disabled:opacity-50 h-7 aspect-square aria-pressed:bg-[--hl-sm] rounded-sm text-[--color-font] hover:bg-[--hl-xs] transition-all text-sm py-1 px-2'; - -export const CloudServiceCredentialList = () => { - const { isOwner, isEnterprisePlan } = usePlanData(); - const { cloudCredentials } = useRootLoaderData(); - const [modalState, setModalState] = useState<{ show: boolean; provider: CloudProviderName; credential?: CloudProviderCredential }>(); - const deleteCredentialFetcher = useFetcher(); - - const handleDeleteItem = (id: string, name: string) => { - showModal(AskModal, { - title: 'Delete Cloud Credential?', - message: `Are you sure to delete ${name}?`, - onDone: async (isYes: boolean) => { - if (isYes) { - deleteCredentialFetcher.submit({}, { - action: `/cloud-credential/${id}/delete`, - method: 'delete', - }); - } - }, - }); - }; - - const hideModal = () => { - setModalState(prevState => { - const newState = { - show: false, - provider: prevState!.provider, - credentials: undefined, - }; - return newState; - }); - }; - - if (!isEnterprisePlan) { - return ( - - ); - } - - return ( -
-
-

Service Provider Credential List

- - - - setModalState({ show: true, provider: key as CloudProviderName })} - items={createCredentialItemList} - className="border select-none text-sm min-w-max border-solid border-[--hl-sm] shadow-lg bg-[--color-bg] py-2 rounded-md overflow-y-auto max-h-[85vh] focus:outline-none" - > - {item => ( - - {item.name} - - )} - - - -
- {cloudCredentials.length === 0 ? -
No cloud servicie provider credentials found
: - - - - - - - - - - {cloudCredentials.map(cloudCred => { - const { _id, name, provider } = cloudCred; - return ( - - - - - - ); - })} - -
NameService ProviderAction
- {name} - - {getProviderDisplayName(provider!)} - -
- - -
-
- } -
-

Cloud Secret Config

-
- - -
-
- {modalState && modalState.show && - - } -
- ); -}; diff --git a/packages/insomnia/src/ui/components/templating/external-vault/aws-secret-manager-form.tsx b/packages/insomnia/src/ui/components/templating/external-vault/aws-secret-manager-form.tsx deleted file mode 100644 index a444b5741f..0000000000 --- a/packages/insomnia/src/ui/components/templating/external-vault/aws-secret-manager-form.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import React, { useState } from 'react'; - -import type { AWSSecretConfig } from '../../../../main/ipc/cloud-service-integration/types'; -import type { NunjucksParsedTag } from '../../../../templating/utils'; -import { HelpTooltip } from '../../help-tooltip'; - -export interface AWSSecretManagerFormProps { - formData: AWSSecretConfig; - onChange: (newConfig: AWSSecretConfig) => void; - activeTagData: NunjucksParsedTag; -} -const secretTypeOptions = [ - { - key: 'plaintext', - label: 'Plaintext', - }, - { - key: 'kv', - label: 'Key/Value', - }, -]; - -export const AWSSecretManagerForm = (props: AWSSecretManagerFormProps) => { - const { formData, onChange } = props; - const { - SecretId, - SecretType, - VersionId = '', - VersionStage = '', - SecretKey = '', - } = formData; - const [showSecretKeyInput, setShowSecretKeyInput] = useState(SecretType === 'kv'); - const handleOnChange = (name: keyof AWSSecretConfig) => { - const formElement = document.getElementById('aws-secret-manager-form') as HTMLFormElement; - if (formElement) { - const formData = new FormData(formElement); - const newConfig = Object.fromEntries(formData.entries()); - if (name === 'SecretType') { - const secretTypeValue = newConfig['SecretType']; - setShowSecretKeyInput(secretTypeValue === 'kv'); - if (secretTypeValue === 'plaintext') { - newConfig['SecretKey'] = ''; - } - }; - onChange(newConfig as unknown as AWSSecretConfig); - } - }; - return ( -
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
- {showSecretKeyInput && -
-
- -
-
- } -
- ); -}; diff --git a/packages/insomnia/src/ui/components/templating/external-vault/external-vault-form.tsx b/packages/insomnia/src/ui/components/templating/external-vault/external-vault-form.tsx deleted file mode 100644 index 5439c3b19a..0000000000 --- a/packages/insomnia/src/ui/components/templating/external-vault/external-vault-form.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React, { useState } from 'react'; -import { Button } from 'react-aria-components'; - -import { debounce } from '../../../../common/misc'; -import type { AWSSecretConfig } from '../../../../main/ipc/cloud-service-integration/types'; -import { type CloudProviderCredential, type CloudProviderName, type } from '../../../../models/cloud-credential'; -import { Icon } from '../../icon'; -import { CloudCredentialModal } from '../../modals/cloud-credential-modal/cloud-credential-modal'; -import type { ArgConfigFormProps } from '../tag-editor-arg-sub-form'; -import { AWSSecretManagerForm } from './aws-secret-manager-form'; - -export const ExternalVaultForm = (props: ArgConfigFormProps) => { - const { onChange, configValue, activeTagData, docs } = props; - const [showModal, setShowModal] = useState(false); - const formData = JSON.parse(configValue) as AWSSecretConfig; - const provider = activeTagData.args[0].value as CloudProviderName; - const selectedCredentialId = activeTagData.args[1].value; - const cloudCredentialDocs = docs[type] as CloudProviderCredential[] || []; - const selectedCredentialDoc = cloudCredentialDocs.find(d => d._id === selectedCredentialId); - - const handleFormChange = debounce((newConfig: AWSSecretConfig) => { - const newFormValue = JSON.stringify(newConfig); - onChange(newFormValue); - }, 1000); - let SubForm; - - switch (provider) { - case 'aws': - SubForm = ; - break; - default: - SubForm = null; - }; - - return ( - <> - {selectedCredentialDoc && - - } - {SubForm} - {showModal && - setShowModal(false)} - /> - } - - ); -}; diff --git a/packages/insomnia/src/ui/components/templating/local-template-tags.ts b/packages/insomnia/src/ui/components/templating/local-template-tags.ts index e806d53aec..70e9b79dba 100644 --- a/packages/insomnia/src/ui/components/templating/local-template-tags.ts +++ b/packages/insomnia/src/ui/components/templating/local-template-tags.ts @@ -7,11 +7,6 @@ import os from 'os'; import { CookieJar } from 'tough-cookie'; import * as uuid from 'uuid'; -import type { RenderPurpose } from '../../../common/render'; -import type { AWSSecretConfig } from '../../../main/ipc/cloud-service-integration/types'; -import * as models from '../../../models'; -import type { CloudProviderCredential, CloudProviderName } from '../../../models/cloud-credential'; -import { vaultEnvironmentMaskValue } from '../../../models/environment'; import type { Request, RequestParameter } from '../../../models/request'; import type { Response } from '../../../models/response'; import type { TemplateTag } from '../../../plugins'; @@ -21,100 +16,6 @@ import { buildQueryStringFromParams, joinUrlAndQueryString, smartEncodeUrl } fro import { fakerFunctions } from './faker-functions'; const localTemplatePlugins: { templateTag: PluginTemplateTag }[] = [ - { - templateTag: { - name: 'vault', - displayName: 'External Vault', - description: 'Link secret from external vault', - // external vault is an enterprise feature - needsEnterprisePlan: true, - args: [ - { - displayName: 'Vault Service Provider', - type: 'enum', - options: [ - { displayName: 'AWS Secrets Manager', value: 'aws' }, - ], - }, - { - displayName: 'Credential For Vault Service Provider', - type: 'model', - modelFilter: (credentialModel, args) => { - const providerNameFromArg = args[0].value; - const { provider } = credentialModel as CloudProviderCredential; - return providerNameFromArg === provider; - }, - model: 'CloudCredential', - }, - { - type: 'string', - defaultValue: '{}', - requireSubForm: true, - }, - ], - async run(context, provider: CloudProviderName, credentialId: string, configStr: string) { - if (!provider) { - throw new Error('Vault service provider is required'); - } - if (!credentialId) { - throw new Error('Credential is required'); - }; - const providerCredential = await models.cloudCrendential.getById(credentialId); - if (!providerCredential) { - throw new Error('No Cloud Credential found'); - } - const renderContext = context.renderPurpose as RenderPurpose; - // Get secret from external vaults when send request or in tag-preview, otherwise return defautl mask value - if (renderContext === 'preview' || renderContext === 'send') { - let secretConfig = {}; - try { - secretConfig = JSON.parse(configStr); - } catch (error) { - throw new Error('Invalid vault secret config'); - } - if (provider === 'aws') { - const { - SecretId, VersionId, VersionStage, SecretKey, - SecretType = 'plaintext', - } = secretConfig as AWSSecretConfig; - if (!SecretId) { - throw new Error('Secret Name or ARN is required'); - } - const getSecretOption = { - provider, - secretId: SecretId, - config: { - VersionId, VersionStage, - }, - credentials: providerCredential.credentials, - }; - const secretResult = await window.main.cloudService.getSecret(getSecretOption); - const { success, error, result } = secretResult; - if (success && result) { - const { SecretString } = result!; - let parsedJSON; - if (SecretType === 'plaintext' || !SecretKey) { - return SecretString; - } else { - try { - parsedJSON = JSON.parse(SecretString || '{}'); - } catch (error) { - throw new Error(`Secret value ${SecretString} can not parsed to key/value pair, please change Secret Type to plaintext`); - } - if (SecretKey in parsedJSON) { - return parsedJSON[SecretKey]; - } - throw new Error(`Secret key ${SecretKey} does not exist in key/value secret ${SecretString}`); - } - } else { - throw new Error(error?.errorMessage); - } - } - } - return vaultEnvironmentMaskValue; - }, - }, - }, { templateTag: { name: 'faker',