import type { ChangeEvent } from 'react'; import React, { useCallback } from 'react'; import type { ConnectionOptions } from 'mongodb-data-service'; import { Accordion, Banner, Body, Checkbox, FormFieldContainer, Label, Link, Description, TextInput, spacing, css, } from '@mongodb-js/compass-components'; import type { Document, AutoEncryptionOptions } from 'mongodb'; import type { UpdateConnectionFormField } from '../../../hooks/use-connect-form'; import KMSProviderStatusIndicator from './kms-provider-status-indicator'; import KMSProviderFieldsForm from './kms-provider-fields'; import EncryptedFieldConfigInput from './encrypted-field-config-input'; import type { ConnectionFormError } from '../../../utils/validation'; import { errorsByFieldTab, errorMessageByFieldName, fieldNameHasError, } from '../../../utils/validation'; import type { KMSProviderName, KMSField, } from '../../../utils/csfle-kms-fields'; import { KMSProviderFields } from '../../../utils/csfle-kms-fields'; import { useConnectionFormPreference } from '../../../hooks/use-connect-form-preferences'; const kmsProviderComponentWrapperStyles = css({ paddingLeft: spacing[3], marginBottom: spacing[3], }); interface KMSProviderMetadata { kmsProvider: KMSProviderName; title: string; noTLS?: boolean; clientCertIsOptional?: boolean; } const options: KMSProviderMetadata[] = [ { title: 'Local KMS', kmsProvider: 'local', noTLS: true, }, { title: 'AWS', kmsProvider: 'aws', }, { title: 'GCP', kmsProvider: 'gcp', }, { title: 'Azure', kmsProvider: 'azure', }, { title: 'KMIP', kmsProvider: 'kmip', clientCertIsOptional: false, }, ]; const containerStyles = css({ marginTop: spacing[3], }); const accordionContainerStyles = css({ marginTop: spacing[3], }); const titleStyles = css({ display: 'flex', alignItems: 'center', }); function CSFLETab({ connectionOptions, updateConnectionFormField, errors: errors_, }: { errors: ConnectionFormError[]; updateConnectionFormField: UpdateConnectionFormField; connectionOptions: ConnectionOptions; }): React.ReactElement { const autoEncryptionOptions = connectionOptions.fleOptions?.autoEncryption ?? {}; const enableSchemaMapDebugFlag = useConnectionFormPreference( 'enableDebugUseCsfleSchemaMap' ); const errors = errorsByFieldTab(errors_, 'csfle'); const handleFieldChanged = useCallback( ( key: keyof AutoEncryptionOptions, value?: AutoEncryptionOptions[keyof AutoEncryptionOptions] ) => { return updateConnectionFormField({ type: 'update-csfle-param', key: key, value, }); }, [updateConnectionFormField] ); const handleStoreCredentialsChanged = useCallback( (value: boolean) => { return updateConnectionFormField({ type: 'update-csfle-store-credentials', value, }); }, [updateConnectionFormField] ); return (
In-Use Encryption is an Enterprise/Atlas-only feature of MongoDB.  {/* TODO(COMPASS-5925): Use generic In-Use Encryption URL */} Learn More ) => { handleFieldChanged('keyVaultNamespace', value); }} name="csfle-keyvault" data-testid="csfle-keyvault" label="Key Vault Namespace" type="text" optional={false} value={autoEncryptionOptions.keyVaultNamespace || ''} errorMessage={errorMessageByFieldName(errors, 'keyVaultNamespace')} state={ fieldNameHasError(errors, 'keyVaultNamespace') ? 'error' : 'none' } spellCheck={false} description="Specify a collection in which data encryption keys are stored in the format .." /> KMS Providers Specify one or more Key Management Systems to use. ) => { handleStoreCredentialsChanged(event.target.checked); }} data-testid="csfle-store-credentials-input" id="csfle-store-credentials-input" label={ <> Control whether KMS secrets are stored on disk (protected by the OS keychain) or discarded after disconnecting. } checked={connectionOptions?.fleOptions?.storeCredentials} /> {options.map(({ title, kmsProvider, ...kmsFieldComponentOptions }) => { const accordionTitle = ( {title} [] } /> ); return (
[] } {...kmsFieldComponentOptions} />
); })}
{ handleFieldChanged('encryptedFieldsMap', value); }} /> {enableSchemaMapDebugFlag && ( { handleFieldChanged('schemaMap', value); }} /> )}
); } export default CSFLETab;