import { css } from '@emotion/css'; import { Dispatch, SetStateAction, useEffect, useId, useState } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; import { GrafanaTheme2, SelectableValue } from '@grafana/data'; import { useStyles2, Button, CollapsableSection, Divider, Drawer, Field, Icon, Input, Label, MultiSelect, Select, Stack, Switch, TextLink, Tooltip, RadioButtonGroup, SecretInput, } from '@grafana/ui'; import { t, Trans } from 'app/core/internationalization'; import { LdapPayload, MapKeyCertConfigured } from 'app/types'; import { GroupMappingComponent } from './LdapGroupMapping'; interface Props { onClose: () => void; mapKeyCertConfigured: MapKeyCertConfigured; setMapKeyCertConfigured: Dispatch>; } const serverConfig = 'settings.config.servers.0'; const tlsOptions: Array> = ['TLS1.2', 'TLS1.3'].map((v) => ({ label: v, value: v })); enum EncryptionProvider { Base64 = 'base64', FilePath = 'path', } export const LdapDrawerComponent = ({ onClose, mapKeyCertConfigured: mapCertConfigured, setMapKeyCertConfigured: setMapCertConfigured, }: Props) => { const [encryptionProvider, setEncryptionProvider] = useState(EncryptionProvider.Base64); const styles = useStyles2(getStyles); const { control, getValues, register, setValue, watch } = useFormContext(); const nameId = useId(); const surnameId = useId(); const usernameId = useId(); const memberOfId = useId(); const emailId = useId(); useEffect(() => { const { client_cert, client_key, root_ca_cert } = getValues(serverConfig); setEncryptionProvider( !client_cert?.length && !client_key?.length && !root_ca_cert?.length ? EncryptionProvider.Base64 : EncryptionProvider.FilePath ); }, [getValues]); const renderMultiSelectLabel = (value: string) => { if (value.length >= 5) { return `${value.slice(0, 2)}...${value.slice(-2)}`; } return value; }; const attributesLabel = ( ); const groupMappingsLabel = ( ); const useTlsDescription = ( <> For a complete list of supported ciphers and TLS versions, refer to: {' '} {/* eslint-disable-next-line @grafana/no-untranslated-strings */} https://go.dev/src/crypto/tls/cipher_suites.go ); const onAddGroupMapping = () => { const groupMappings = getValues(`${serverConfig}.group_mappings`) || []; setValue(`${serverConfig}.group_mappings`, [ ...groupMappings, { group_dn: '', org_id: 1, org_role: 'Viewer', grafana_admin: false, }, ]); }; const onRemoveGroupMapping = (index: number) => { const groupMappings = getValues(`${serverConfig}.group_mappings`); setValue(`${serverConfig}.group_mappings`, [...groupMappings.slice(0, index), ...groupMappings.slice(index + 1)]); }; return ( ( onChange(v.map(({ value }) => String(value)))} value={value?.map((v) => ({ label: v, value: v }))} /> )} /> {watch('settings.config.servers.0.group_mappings')?.map((_, i) => { return onRemoveGroupMapping(i)} />; })} {watch(`${serverConfig}.use_ssl`) && ( <> { setValue(`${serverConfig}.client_key_value`, ''); setMapCertConfigured({ ...mapCertConfigured, clientKeyCertValue: false }); }} /> )} {encryptionProvider === EncryptionProvider.FilePath && ( <> { setValue(`${serverConfig}.client_key`, ''); setMapCertConfigured({ ...mapCertConfigured, clientKeyCertPath: false }); }} value={watch(`${serverConfig}.client_key`)} onChange={({ currentTarget: { value } }) => setValue(`${serverConfig}.client_key`, value)} /> )} )} ); }; function getStyles(theme: GrafanaTheme2) { return { sectionLabel: css({ fontSize: theme.typography.size.lg, }), button: css({ marginBottom: theme.spacing(4), }), multiSelect: css({ 'div:last-of-type > svg': { display: 'none', }, }), }; }