import { css } from '@emotion/css'; import { useEffect, useState } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { connect } from 'react-redux'; import { AppEvents, GrafanaTheme2, NavModelItem } from '@grafana/data'; import { getBackendSrv, getAppEvents } from '@grafana/runtime'; import { useStyles2, Alert, Box, Button, Field, Input, Stack, Text, TextLink } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; import config from 'app/core/config'; import { t, Trans } from 'app/core/internationalization'; import { Loader } from 'app/features/plugins/admin/components/Loader'; import { LdapPayload, MapKeyCertConfigured, StoreState } from 'app/types'; import { LdapDrawerComponent } from './LdapDrawer'; const appEvents = getAppEvents(); const mapStateToProps = (state: StoreState) => ({ ldapSsoSettings: state.ldap.ldapSsoSettings, }); const mapDispatchToProps = {}; const connector = connect(mapStateToProps, mapDispatchToProps); const pageNav: NavModelItem = { text: 'LDAP', icon: 'shield', id: 'LDAP', }; const emptySettings: LdapPayload = { id: '', provider: '', source: '', settings: { activeSyncEnabled: false, allowSignUp: false, config: { servers: [ { attributes: {}, bind_dn: '', bind_password: '', client_cert: '', client_cert_value: '', client_key: '', client_key_value: '', group_mappings: [], group_search_base_dns: [], group_search_filter: '', group_search_filter_user_attribute: '', host: '', min_tls_version: '', port: 389, root_ca_cert: '', root_ca_cert_value: [], search_base_dns: [], search_filter: '', skip_org_role_sync: false, ssl_skip_verify: false, start_tls: false, timeout: 10, tls_ciphers: [], tls_skip_verify: false, use_ssl: false, }, ], }, enabled: false, skipOrgRoleSync: false, syncCron: '', }, }; export const LdapSettingsPage = () => { const [isLoading, setIsLoading] = useState(true); const [isDrawerOpen, setIsDrawerOpen] = useState(false); const [mapKeyCertConfigured, setMapKeyCertConfigured] = useState({ // values rootCaCertValue: false, clientCertValue: false, clientKeyCertValue: false, // paths rootCaCertPath: false, clientCertPath: false, clientKeyCertPath: false, }); const methods = useForm({ defaultValues: emptySettings }); const { getValues, handleSubmit, register, reset } = methods; const styles = useStyles2(getStyles); useEffect(() => { async function init() { const payload = await getBackendSrv().get('/api/v1/sso-settings/ldap'); if (!payload || !payload.settings || !payload.settings.config) { appEvents.publish({ type: AppEvents.alertError.name, payload: [t('ldap-settings-page.alert.error-fetching', 'Error fetching LDAP settings')], }); return; } const serverConfig = payload.settings.config.servers[0]; setMapKeyCertConfigured({ rootCaCertValue: serverConfig.root_ca_cert_value?.length > 0, clientCertValue: serverConfig.client_cert_value !== '', clientKeyCertValue: serverConfig.client_key_value !== '', rootCaCertPath: serverConfig.root_ca_cert !== '', clientCertPath: serverConfig.client_cert !== '', clientKeyCertPath: serverConfig.client_key !== '', }); reset(payload); setIsLoading(false); } init(); }, [reset]); /** * Display warning if the feature flag is disabled */ if (!config.featureToggles.ssoSettingsLDAP) { return ( This page is only accessible by enabling the ssoSettingsLDAP feature flag. ); } /** * Save payload to the backend * @param payload LdapPayload */ const putPayload = async (payload: LdapPayload) => { try { const result = await getBackendSrv().put('/api/v1/sso-settings/ldap', payload); if (result) { appEvents.publish({ type: AppEvents.alertError.name, payload: [t('ldap-settings-page.alert.error-saving', 'Error saving LDAP settings')], }); } appEvents.publish({ type: AppEvents.alertSuccess.name, payload: [t('ldap-settings-page.alert.saved', 'LDAP settings saved')], }); } catch (error) { appEvents.publish({ type: AppEvents.alertError.name, payload: [t('ldap-settings-page.alert.error-saving', 'Error saving LDAP settings')], }); } }; const onErrors = () => { appEvents.publish({ type: AppEvents.alertError.name, payload: [t('ldap-settings-page.alert.error-validate-form', 'Error validating LDAP settings')], }); }; /** * Button's Actions */ const submitAndEnableLdapSettings = (payload: LdapPayload) => { payload.settings.enabled = true; putPayload(payload); }; const saveForm = () => { putPayload(getValues()); }; const discardForm = async () => { try { setIsLoading(true); await getBackendSrv().delete('/api/v1/sso-settings/ldap'); const payload = await getBackendSrv().get('/api/v1/sso-settings/ldap'); if (!payload || !payload.settings || !payload.settings.config) { appEvents.publish({ type: AppEvents.alertError.name, payload: [t('ldap-settings-page.alert.error-update', 'Error updating LDAP settings')], }); return; } appEvents.publish({ type: AppEvents.alertSuccess.name, payload: [t('ldap-settings-page.alert.discard-success', 'LDAP settings discarded')], }); reset(payload); } catch (error) { appEvents.publish({ type: AppEvents.alertError.name, payload: [t('ldap-settings-page.alert.error-saving', 'Error saving LDAP settings')], }); } finally { setIsLoading(false); } }; const documentation = ( documentation ); const subTitle = ( The LDAP integration in Grafana allows your Grafana users to log in with their LDAP credentials. Find out more in our {documentation}. ); return (
{isLoading && } {!isLoading && (

Basic Settings

Advanced Settings Mappings, extra security measures, and more.
)} {isDrawerOpen && ( setIsDrawerOpen(false)} mapKeyCertConfigured={mapKeyCertConfigured} setMapKeyCertConfigured={setMapKeyCertConfigured} /> )}
); }; function getStyles(theme: GrafanaTheme2) { return { form: css({ width: theme.spacing(68), }), }; } export default connector(LdapSettingsPage);