web-interface.assets.1255d548-2378.7792b4e7b39cf93c02aa.js.map Maven / Gradle / Ivy
{"version":3,"file":"1255d548-2378.7792b4e7b39cf93c02aa.js","mappings":"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","sources":["webpack://graylog-web-interface/./src/components/authentication/AuthenticationPageNavigation.tsx","webpack://graylog-web-interface/./src/components/authentication/BackendActionLinks.tsx","webpack://graylog-web-interface/./src/logic/authentication/directoryServices/BackendConfigParser.ts","webpack://graylog-web-interface/./src/components/authentication/directoryServices/ldap/WizardPageHeader.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/HandleCreate.ts","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/BackendWizardContext.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/ServerConfigStep.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/UserSyncStep.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/GroupSyncStep.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/StepTitleWarning.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/wizardSteps.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/ConnectionErrors.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/ServerConnectionTest.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/UserLoginTest.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/Sidebar.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/BackendWizard.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/index.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/ldap/BackendCreate.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/PrepareInitialWizardValues.ts","webpack://graylog-web-interface/./src/components/authentication/directoryServices/HandleUpdate.ts","webpack://graylog-web-interface/./src/components/authentication/directoryServices/ldap/BackendEdit.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendConfigDetails/EditLinkButton.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendConfigDetails/ServerConfigSection.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendConfigDetails/UserSyncSection.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendConfigDetails/GroupSyncSection.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/activeDirectory/BackendConfigDetails.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/ldap/BackendConfigDetails.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/activeDirectory/WizardPageHeader.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/activeDirectory/BackendCreate.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/activeDirectory/BackendEdit.tsx","webpack://graylog-web-interface/./src/components/authentication/bindings.ts","webpack://graylog-web-interface/./src/components/authentication/useActiveBackend.ts","webpack://graylog-web-interface/./src/components/common/PageNavigation.tsx","webpack://graylog-web-interface/./src/domainActions/authentication/AuthenticationDomain.ts","webpack://graylog-web-interface/./src/domainActions/roles/AuthzRolesDomain.ts","webpack://graylog-web-interface/./src/logic/users/UserOverview.ts","webpack://graylog-web-interface/./src/logic/authentication/AuthenticationBackend.ts","webpack://graylog-web-interface/./src/stores/authentication/AuthenticationStore.ts","webpack://graylog-web-interface/./src/logic/roles/Role.ts","webpack://graylog-web-interface/./src/actions/roles/AuthzRolesActions.ts","webpack://graylog-web-interface/./src/stores/roles/AuthzRolesStore.ts","webpack://graylog-web-interface/./src/util/AuthenticationService.ts","webpack://graylog-web-interface/./node_modules/lodash/mapKeys.js"],"sourcesContent":["/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport Routes from 'routing/Routes';\nimport PageNavigation from 'components/common/PageNavigation';\nimport { Row } from 'components/bootstrap';\n\nconst NAV_ITEMS = [\n { title: 'Authentication Services', path: Routes.SYSTEM.AUTHENTICATION.BACKENDS.OVERVIEW },\n { title: 'Authenticators', path: Routes.SYSTEM.AUTHENTICATION.AUTHENTICATORS.SHOW },\n];\n\nconst AuthenticationPageNavigation = () => (\n \n \n
\n);\n\nexport default AuthenticationPageNavigation;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport { LinkContainer } from 'components/common/router';\nimport type AuthenticationBackend from 'logic/authentication/AuthenticationBackend';\nimport Routes from 'routing/Routes';\nimport { ButtonToolbar, Button } from 'components/bootstrap';\n\ntype Props = {\n activeBackend: AuthenticationBackend | undefined,\n finishedLoading: boolean,\n};\n\nconst BackendActionLinks = ({ activeBackend, finishedLoading }: Props) => (\n \n \n \n \n \n \n \n \n \n \n \n);\n\nexport default BackendActionLinks;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport type { DirectoryServiceBackendConfigJson, DirectoryServiceBackendConfig } from './types';\n\nconst toJson = ({\n servers,\n systemUserDn,\n systemUserPassword,\n transportSecurity,\n type,\n emailAttributes,\n userFullNameAttribute,\n userNameAttribute,\n userSearchBase,\n userSearchPattern,\n userUniqueIdAttribute,\n verifyCertificates,\n}: DirectoryServiceBackendConfig): DirectoryServiceBackendConfigJson => ({\n servers,\n system_user_dn: systemUserDn,\n system_user_password: { is_set: systemUserPassword.isSet },\n transport_security: transportSecurity,\n type: type,\n email_attributes: emailAttributes,\n user_full_name_attribute: userFullNameAttribute,\n user_name_attribute: userNameAttribute,\n user_search_base: userSearchBase,\n user_search_pattern: userSearchPattern,\n user_unique_id_attribute: userUniqueIdAttribute,\n verify_certificates: verifyCertificates,\n});\n\nconst fromJson = ({\n servers,\n system_user_dn,\n system_user_password,\n transport_security,\n type,\n email_attributes,\n user_full_name_attribute,\n user_name_attribute,\n user_search_base,\n user_search_pattern,\n user_unique_id_attribute,\n verify_certificates,\n}: DirectoryServiceBackendConfigJson): DirectoryServiceBackendConfig => ({\n servers,\n systemUserDn: system_user_dn,\n systemUserPassword: { isSet: system_user_password.is_set },\n transportSecurity: transport_security,\n type: type,\n emailAttributes: email_attributes,\n userFullNameAttribute: user_full_name_attribute,\n userNameAttribute: user_name_attribute,\n userSearchBase: user_search_base,\n userSearchPattern: user_search_pattern,\n userUniqueIdAttribute: user_unique_id_attribute,\n verifyCertificates: verify_certificates,\n});\n\nexport default { fromJson, toJson };\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport AuthenticationPageNavigation from 'components/authentication/AuthenticationPageNavigation';\nimport DocsHelper from 'util/DocsHelper';\nimport StringUtils from 'util/StringUtils';\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport type { OktaBackend } from 'logic/authentication/okta/types';\nimport { PageHeader } from 'components/common';\nimport useActiveBackend from 'components/authentication/useActiveBackend';\nimport BackendActionLinks from 'components/authentication/BackendActionLinks';\n\ntype Props = {\n authenticationBackend?: DirectoryServiceBackend | OktaBackend,\n title?: string,\n};\n\nconst _pageTitle = (authBackend, title) => {\n if (authBackend) {\n const backendTitle = StringUtils.truncateWithEllipses(authBackend.title, 30);\n\n return <>Edit Authentication Service - {backendTitle}>;\n }\n\n return title || 'Create LDAP Authentication Service';\n};\n\nconst WizardPageHeader = ({ authenticationBackend: authBackend, title }: Props) => {\n const { finishedLoading, activeBackend } = useActiveBackend();\n const pageTitle = _pageTitle(authBackend, title);\n\n return (\n <>\n \n \n )}\n documentationLink={{\n title: 'Authentication documentation',\n path: DocsHelper.PAGES.USERS_ROLES,\n }}>\n Configure Graylog's authentication services of this Graylog cluster.\n \n >\n );\n};\n\nWizardPageHeader.defaultProps = {\n authenticationBackend: undefined,\n title: undefined,\n};\n\nexport default WizardPageHeader;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport type { $PropertyType } from 'utility-types';\n\nimport UserNotification from 'util/UserNotification';\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport { AuthenticationActions } from 'stores/authentication/AuthenticationStore';\n\nimport type { WizardFormValues, AuthBackendMeta } from './BackendWizard/BackendWizardContext';\n\nexport default (payload: WizardSubmitPayload, formValues: WizardFormValues, serviceType: $PropertyType, shouldUpdateGroupSync: boolean | undefined = true) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const notifyOnSuccess = () => UserNotification.success('Authentication service was created successfully.', 'Success');\n const notifyOnError = (error) => UserNotification.error(`Creating authentication service failed with status: ${error}`, 'Error');\n\n return AuthenticationActions.create(payload).then((result) => {\n if (result.backend && formValues.synchronizeGroups && enterpriseGroupSyncPlugin && shouldUpdateGroupSync) {\n return enterpriseGroupSyncPlugin.actions.onDirectoryServiceBackendUpdate(false, formValues, result.backend.id, serviceType).then(notifyOnSuccess);\n }\n\n notifyOnSuccess();\n\n return result;\n }).catch((error) => {\n notifyOnError(error);\n throw error;\n });\n};\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\nimport type { $PropertyType } from 'utility-types';\n\nimport type { Step, StepKey } from 'components/common/Wizard';\nimport { singleton } from 'logic/singleton';\n\nexport type WizardFormValues = {\n title?: string,\n description?: string,\n defaultRoles?: string,\n groupSearchBase?: string,\n groupSearchPattern?: string,\n serverHost?: string,\n serverPort?: string | number,\n systemUserDn?: string,\n systemUserPassword?: string,\n synchronizeGroups?: boolean,\n teamDefaultRoles?: string,\n teamNameAttribute?: string,\n teamUniqueIdAttribute?: string,\n teamSelectionType?: 'all' | 'include' | 'exclude',\n teamSelection?: Immutable.Set,\n transportSecurity?: 'tls' | 'start_tls' | 'none',\n emailAttributes?: Array,\n userFullNameAttribute?: string,\n userNameAttribute?: string,\n userUniqueIdAttribute?: string,\n userSearchBase?: string,\n userSearchPattern?: string,\n verifyCertificates?: boolean,\n oktaApiToken?: string,\n};\n\nexport type AuthBackendMeta = {\n backendId?: string, // only needed when editing an auth service\n backendHasPassword?: boolean, // only needed when editing an auth service\n backendGroupSyncIsActive?: boolean, // only needed when editing an auth service\n serviceType: string,\n serviceTitle: string,\n};\nexport type WizardStepsState = {\n activeStepKey: $PropertyType,\n backendValidationErrors: { [inputName: string]: React.ReactElement | string | null | undefined } | null | undefined,\n formValues: WizardFormValues,\n invalidStepKeys: Array,\n authBackendMeta: AuthBackendMeta,\n};\n\nexport type BackendWizardType = WizardStepsState & {\n setStepsState: (BackendWizardType) => void,\n};\n\nconst initialState = {\n activeStepKey: '',\n backendValidationErrors: undefined,\n authBackendMeta: { serviceType: '', serviceTitle: '' },\n formValues: {},\n invalidStepKeys: [],\n setStepsState: () => {},\n};\n\nconst BackendWizardContext = React.createContext(initialState);\nexport default singleton('contexts.authentication.directoryServices.backendWizard', () => BackendWizardContext);\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport styled from 'styled-components';\nimport { useContext } from 'react';\nimport type { FormikProps } from 'formik';\nimport { Formik, Form, Field } from 'formik';\n\nimport { validateField, formHasErrors } from 'util/FormsUtils';\nimport { FormikFormGroup, FormikInput, InputOptionalInfo as Opt } from 'components/common';\nimport { Input, Button, ButtonToolbar } from 'components/bootstrap';\nimport { getPathnameWithoutId } from 'util/URLUtils';\nimport useSendTelemetry from 'logic/telemetry/useSendTelemetry';\nimport useLocation from 'routing/useLocation';\nimport { TELEMETRY_EVENT_TYPE } from 'logic/telemetry/Constants';\n\nimport type { WizardFormValues } from './BackendWizardContext';\nimport BackendWizardContext from './BackendWizardContext';\n\nexport const STEP_KEY = 'server-configuration';\n// Form validation needs to include all input names\n// to be able to associate backend validation errors with the form\nexport const FORM_VALIDATION = {\n title: {\n required: true,\n },\n serverHost: {\n required: true,\n },\n serverPort: {\n required: true,\n min: 1,\n max: 65535,\n },\n description: {},\n transportSecurity: {},\n verifyCertificates: {},\n systemUserDn: {},\n systemUserPassword: {},\n};\n\nconst ServerUrl = styled.div`\n display: flex;\n\n > * {\n align-self: flex-start;\n min-height: 34px;\n flex-grow: 1;\n\n &:last-child {\n flex: 0.8;\n min-width: 130px;\n }\n }\n\n .input-group-addon {\n display: flex;\n align-items: center;\n max-width: fit-content;\n min-width: fit-content;\n }\n`;\n\nconst ProtocolOptions = styled.div`\n display: flex;\n\n div + * {\n margin-left: 10px;\n }\n`;\n\ntype Props = {\n formRef: React.Ref>,\n help: { [inputName: string]: React.ReactElement | string | null | undefined },\n onSubmit: () => void,\n onSubmitAll: () => Promise,\n submitAllError: React.ReactNode | null | undefined,\n validateOnMount: boolean,\n};\n\nconst ServerConfigStep = ({ formRef, help = {}, onSubmit, onSubmitAll, submitAllError, validateOnMount }: Props) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { setStepsState, ...stepsState } = useContext(BackendWizardContext);\n const { backendValidationErrors, authBackendMeta: { backendHasPassword } } = stepsState;\n const { pathname } = useLocation();\n const sendTelemetry = useSendTelemetry();\n\n const _onTransportSecurityChange = (event, values, setFieldValue, onChange) => {\n const currentValue = values.transportSecurity;\n const newValue = event.target.value;\n const defaultPort = 389;\n const defaultTlsPort = 636;\n\n if (currentValue === 'tls' && newValue !== 'tls' && values.serverPort === defaultTlsPort) {\n setFieldValue('serverPort', defaultPort);\n }\n\n if (currentValue !== 'tls' && newValue === 'tls' && values.serverPort === defaultPort) {\n setFieldValue('serverPort', defaultTlsPort);\n }\n\n onChange(event);\n };\n\n const _onSubmitAll = (validateForm) => {\n sendTelemetry(TELEMETRY_EVENT_TYPE.AUTHENTICATION.DIRECTORY_SERVER_CONFIG_SAVE_CLICKED, {\n app_pathname: getPathnameWithoutId(pathname),\n app_section: 'directory-service',\n app_action_value: 'server-configuration-save',\n });\n\n validateForm().then((errors) => {\n if (!formHasErrors(errors)) {\n onSubmitAll();\n }\n });\n };\n\n return (\n \n {({ isSubmitting, setFieldValue, values, validateForm }) => (\n \n )}\n \n );\n};\n\nexport default ServerConfigStep;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\nimport { useContext } from 'react';\nimport type { FormikProps } from 'formik';\nimport { Formik, Form, Field } from 'formik';\nimport styled from 'styled-components';\n\nimport type Role from 'logic/roles/Role';\nimport { validateField, formHasErrors } from 'util/FormsUtils';\nimport { FormikFormGroup, Select, InputList } from 'components/common';\nimport { Alert, Button, ButtonToolbar, Row, Col, Panel, Input } from 'components/bootstrap';\nimport { getPathnameWithoutId } from 'util/URLUtils';\nimport useSendTelemetry from 'logic/telemetry/useSendTelemetry';\nimport useLocation from 'routing/useLocation';\nimport { TELEMETRY_EVENT_TYPE } from 'logic/telemetry/Constants';\n\nimport type { WizardFormValues } from './BackendWizardContext';\nimport BackendWizardContext from './BackendWizardContext';\n\nexport const STEP_KEY = 'user-synchronization';\n// Form validation needs to include all input names\n// to be able to associate backend validation errors with the form\nexport const FORM_VALIDATION = {\n defaultRoles: { required: true },\n userFullNameAttribute: { required: true },\n userNameAttribute: { required: true },\n emailAttributes: {},\n userSearchBase: { required: true },\n userSearchPattern: { required: true },\n userUniqueIdAttribute: {},\n};\n\ntype Props = {\n formRef: React.Ref>,\n help: { [inputName: string]: React.ReactElement | string | null | undefined },\n excludedFields: { [inputName: string]: boolean },\n roles: Immutable.List,\n onSubmit: () => void,\n onSubmitAll: () => Promise,\n submitAllError: React.ReactNode | null | undefined,\n validateOnMount: boolean,\n};\nconst StyledInputList = styled(InputList)`\n margin: auto 15px;\n`;\n\nconst UserSyncStep = ({\n help = {},\n excludedFields = {},\n formRef,\n onSubmit,\n onSubmitAll,\n submitAllError,\n validateOnMount,\n roles,\n}: Props) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { setStepsState, ...stepsState } = useContext(BackendWizardContext);\n const { backendValidationErrors } = stepsState;\n const rolesOptions = roles.map((role) => ({ label: role.name, value: role.id })).toArray();\n const { pathname } = useLocation();\n const sendTelemetry = useSendTelemetry();\n\n const _onSubmitAll = (validateForm) => {\n sendTelemetry(TELEMETRY_EVENT_TYPE.AUTHENTICATION.DIRECTORY_USER_SYNC_SAVE_CLICKED, {\n app_pathname: getPathnameWithoutId(pathname),\n app_section: 'directory-service',\n app_action_value: 'usersync-save',\n });\n\n validateForm().then((errors) => {\n if (!formHasErrors(errors)) {\n onSubmitAll();\n }\n });\n };\n\n const getInitalFormValues = (values: WizardFormValues) => ({ ...values, ...(!excludedFields.emailAttributes && { emailAttributes: values.emailAttributes || [] }) });\n\n return (\n \n {({ isSubmitting, validateForm }) => (\n \n )}\n \n );\n};\n\nexport default UserSyncStep;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\nimport type { FormikProps } from 'formik';\n\nimport { Row, Col, Button, ButtonToolbar } from 'components/bootstrap';\nimport { EnterprisePluginNotFound } from 'components/common';\nimport type Role from 'logic/roles/Role';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport { getPathnameWithoutId } from 'util/URLUtils';\nimport useSendTelemetry from 'logic/telemetry/useSendTelemetry';\nimport useLocation from 'routing/useLocation';\nimport { TELEMETRY_EVENT_TYPE } from 'logic/telemetry/Constants';\n\nimport type { WizardFormValues } from './BackendWizardContext';\n\nexport const STEP_KEY = 'group-synchronization';\n\nexport type Props = {\n formRef: React.Ref>,\n onSubmitAll: (shouldUpdateGroupSync?: boolean) => Promise,\n help: { [inputName: string]: React.ReactElement | string | null | undefined },\n excludedFields: { [inputName: string]: boolean },\n prepareSubmitPayload: (fromValues: WizardFormValues | null | undefined) => WizardSubmitPayload,\n roles: Immutable.List,\n submitAllError: React.ReactNode | null | undefined,\n validateOnMount: boolean,\n};\n\nconst GroupSyncStep = ({\n onSubmitAll,\n prepareSubmitPayload,\n formRef,\n submitAllError,\n validateOnMount,\n roles,\n help,\n excludedFields,\n}: Props) => {\n const { pathname } = useLocation();\n const sendTelemetry = useSendTelemetry();\n\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const GroupSyncForm = enterpriseGroupSyncPlugin?.components?.GroupSyncForm;\n\n if (!GroupSyncForm) {\n return (\n <>\n \n \n \n \n
\n \n \n \n >\n );\n }\n\n return (\n \n );\n};\n\nexport default GroupSyncStep;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport { Icon } from 'components/common';\nimport type { StepKey } from 'components/common/Wizard';\n\ntype Props = {\n invalidStepKeys: Array,\n stepKey: string,\n};\n\nconst StepTitleWarning = ({ invalidStepKeys = [], stepKey }: Props) => {\n if (invalidStepKeys.includes(stepKey)) {\n return <> {' '}>;\n }\n\n return null;\n};\n\nexport default StepTitleWarning;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\nimport type { FormikProps } from 'formik';\n\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport type Role from 'logic/roles/Role';\nimport type { StepKey } from 'components/common/Wizard';\n\nimport type { WizardFormValues } from './BackendWizardContext';\nimport ServerConfigStep, { STEP_KEY as SERVER_CONFIG_KEY } from './ServerConfigStep';\nimport UserSyncStep, { STEP_KEY as USER_SYNC_KEY } from './UserSyncStep';\nimport GroupSyncStep, { STEP_KEY as GROUP_SYNC_KEY } from './GroupSyncStep';\nimport StepTitleWarning from './StepTitleWarning';\n\ntype Props = {\n formRefs: Record>>,\n excludedFields: { [inputName: string]: boolean },\n handleSubmitAll: (shouldUpdateGroupSync?: boolean) => Promise,\n help: { [inputName: string]: React.ReactElement | string | null | undefined },\n invalidStepKeys: Array,\n prepareSubmitPayload: (fromValues: WizardFormValues | null | undefined) => WizardSubmitPayload,\n roles: Immutable.List,\n setActiveStepKey: (stepKey: string) => void,\n submitAllError: React.ReactNode | null | undefined,\n};\n\nconst wizardSteps = ({\n formRefs,\n handleSubmitAll,\n help,\n excludedFields,\n invalidStepKeys,\n prepareSubmitPayload,\n roles,\n setActiveStepKey,\n submitAllError,\n}: Props) => [\n {\n key: SERVER_CONFIG_KEY,\n title: (\n <>\n \n Server Configuration\n >\n ),\n component: (\n setActiveStepKey(USER_SYNC_KEY)}\n onSubmitAll={handleSubmitAll}\n submitAllError={submitAllError}\n validateOnMount={invalidStepKeys.includes(SERVER_CONFIG_KEY)} />\n ),\n },\n {\n key: USER_SYNC_KEY,\n title: (\n <>\n \n User Synchronization\n >\n ),\n component: (\n setActiveStepKey(GROUP_SYNC_KEY)}\n onSubmitAll={handleSubmitAll}\n roles={roles}\n submitAllError={submitAllError}\n validateOnMount={invalidStepKeys.includes(USER_SYNC_KEY)} />\n ),\n },\n {\n key: GROUP_SYNC_KEY,\n title: (\n <>\n \n Group Synchronization (Opt.)\n >\n ),\n component: (\n \n ),\n },\n];\n\nexport default wizardSteps;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport { Alert } from 'components/bootstrap';\n\nexport const NotificationContainer = styled(Alert)`\n margin-top: 10px;\n word-break: break-word;\n`;\n\nexport const Title = styled.div`\n font-weight: bold;\n margin-bottom: 5px;\n`;\n\nconst ErrorsList = styled.ul(({ theme }) => `\n font-family: ${theme.fonts.family.monospace};\n list-style: initial;\n padding-left: 20px;\n`);\n\ntype Props = {\n errors: Array,\n message: string,\n};\n\nconst ConnectionErrors = ({ errors, message }: Props) => (\n \n \n {errors.map((error) => {String(error)} )}\n \n \n);\n\nConnectionErrors.propTypes = {\n errors: PropTypes.arrayOf(PropTypes.string).isRequired,\n message: PropTypes.string,\n};\n\nConnectionErrors.defaultProps = {\n message: 'There was an error',\n};\n\nexport default ConnectionErrors;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport { useState, useContext } from 'react';\n\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport AuthenticationDomain from 'domainActions/authentication/AuthenticationDomain';\nimport { Button } from 'components/bootstrap';\nimport { Spinner } from 'components/common';\n\nimport ConnectionErrors, { NotificationContainer } from './ConnectionErrors';\nimport type { WizardFormValues } from './BackendWizardContext';\nimport BackendWizardContext from './BackendWizardContext';\n\nconst _addRequiredRequestPayload = (formValues) => {\n const necessaryAttributes = { ...formValues };\n\n if (!necessaryAttributes.config.user_search_base) {\n necessaryAttributes.config.user_search_base = '';\n }\n\n if (!necessaryAttributes.config.user_search_pattern) {\n necessaryAttributes.config.user_search_pattern = '';\n }\n\n return necessaryAttributes;\n};\n\ntype Props = {\n prepareSubmitPayload: (fromValues: WizardFormValues | null | undefined) => WizardSubmitPayload,\n};\n\nconst ServerConnectionTest = ({ prepareSubmitPayload }: Props) => {\n const { authBackendMeta } = useContext(BackendWizardContext);\n const [{ loading, success, message, errors }, setConnectionStatus] = useState({ loading: false, success: false, message: undefined, errors: undefined });\n\n const _handleConnectionCheck = () => {\n const payload = _addRequiredRequestPayload(prepareSubmitPayload(undefined));\n\n setConnectionStatus({ loading: true, message: undefined, errors: undefined, success: false });\n\n AuthenticationDomain.testConnection({ backend_configuration: payload, backend_id: authBackendMeta.backendId }).then((response) => {\n setConnectionStatus({ loading: false, message: response?.message, success: response?.success, errors: response?.errors });\n }).catch((error) => {\n const requestErrors = [error?.message, error?.additional?.res?.text];\n setConnectionStatus({ loading: false, message: undefined, errors: requestErrors, success: false });\n });\n };\n\n return (\n <>\n \n Performs a background connection check with the address and credentials defined in the step "Server Configuration".\n
\n \n {success && (\n \n {message}\n \n )}\n {(errors && errors.length >= 1) && (\n \n )}\n >\n );\n};\n\nexport default ServerConnectionTest;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport { useState, useContext } from 'react';\nimport { Formik, Form } from 'formik';\n\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport AuthenticationDomain from 'domainActions/authentication/AuthenticationDomain';\nimport { FormikInput, Spinner } from 'components/common';\nimport { Button, Row, Col } from 'components/bootstrap';\nimport type { LoginTestResult } from 'stores/authentication/AuthenticationStore';\n\nimport ConnectionErrors, { NotificationContainer } from './ConnectionErrors';\nimport type { WizardFormValues } from './BackendWizardContext';\nimport BackendWizardContext from './BackendWizardContext';\n\ntype Props = {\n prepareSubmitPayload: (fromValues: WizardFormValues | null | undefined) => WizardSubmitPayload,\n};\n\nconst UserLoginTest = ({ prepareSubmitPayload }: Props) => {\n const { authBackendMeta } = useContext(BackendWizardContext);\n const initialLoginStatus = { loading: false, success: false, testFinished: false, result: undefined, message: undefined, errors: [] };\n const [{ loading, testFinished, success, message, errors, result }, setLoginStatus] = useState<\n LoginTestResult & {\n loading: boolean,\n testFinished: boolean,\n result: LoginTestResult['result'] | null | undefined\n }\n >(initialLoginStatus);\n const hasErrors = (errors && errors.length >= 1);\n\n const _handleLoginTest = ({ username, password }) => {\n setLoginStatus({ ...initialLoginStatus, loading: true });\n\n return AuthenticationDomain.testLogin({\n backend_configuration: prepareSubmitPayload(undefined),\n user_login: { username, password },\n backend_id: authBackendMeta.backendId,\n }).then((response) => {\n setLoginStatus({\n loading: false,\n testFinished: true,\n message: response.message,\n result: response.result,\n errors: response.errors,\n success: response.success,\n });\n }).catch((error) => {\n const requestErrors = [error?.message, error?.additional?.res?.text];\n setLoginStatus({ loading: false, success: false, testFinished: true, result: undefined, message: undefined, errors: requestErrors });\n });\n };\n\n return (\n <>\n \n Verify the settings by loading the entry for the given user name. If you omit the password, no authentication attempt will be made.\n
\n \n \n \n >\n );\n};\n\nexport default UserLoginTest;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport { useState, useContext, useEffect } from 'react';\nimport styled from 'styled-components';\nimport type { $PropertyType } from 'utility-types';\n\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport { PanelGroup, Panel } from 'components/bootstrap';\nimport type { Step } from 'components/common/Wizard';\n\nimport { STEP_KEY as SERVER_CONFIG_KEY } from './ServerConfigStep';\nimport { STEP_KEY as USER_SYNC_KEY } from './UserSyncStep';\nimport type { WizardFormValues } from './BackendWizardContext';\nimport BackendWizardContext from './BackendWizardContext';\nimport ServerConnectionTest from './ServerConnectionTest';\nimport UserLoginTest from './UserLoginTest';\n\nconst StyledPanelGroup = styled(PanelGroup)`\n &.panel-group .panel {\n margin-top: 0;\n border-color: ${(props) => props.theme.colors.input.border};\n background-color: ${(props) => props.theme.colors.global.contentBackground};\n\n .panel-heading {\n background-color: ${(props) => props.theme.colors.table.backgroundAlt};\n }\n\n &:not(:first-child) {\n border-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n\n &:not(:last-child) {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n`;\ntype Props = {\n prepareSubmitPayload: (fromValues: WizardFormValues | null | undefined) => WizardSubmitPayload,\n};\n\nconst Sidebar = ({ prepareSubmitPayload }: Props) => {\n const [activeKey, setActiveKey] = useState<$PropertyType>(SERVER_CONFIG_KEY);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { setStepsState, ...stepsState } = useContext(BackendWizardContext);\n\n useEffect(() => {\n setActiveKey(stepsState.activeStepKey);\n }, [stepsState.activeStepKey]);\n\n return (\n \n \n \n Server Connection Check \n \n \n \n \n \n \n \n User Login Test \n \n \n \n \n \n \n );\n};\n\nexport default Sidebar;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport { useState, useRef, useEffect, useMemo } from 'react';\nimport compact from 'lodash/compact';\nimport camelCase from 'lodash/camelCase';\nimport mapKeys from 'lodash/mapKeys';\nimport mapValues from 'lodash/mapValues';\nimport type { $PropertyType } from 'utility-types';\nimport PropTypes from 'prop-types';\nimport type { FormikProps } from 'formik';\n\nimport { validateField } from 'util/FormsUtils';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport { Row, Col, Alert } from 'components/bootstrap';\nimport { Spinner } from 'components/common';\nimport AuthzRolesDomain from 'domainActions/roles/AuthzRolesDomain';\nimport Routes from 'routing/Routes';\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport type { Step, StepKey } from 'components/common/Wizard';\nimport Wizard from 'components/common/Wizard';\nimport type FetchError from 'logic/errors/FetchError';\nimport type { LoadResponse as LoadBackendResponse } from 'stores/authentication/AuthenticationStore';\nimport type { PaginatedRoles } from 'actions/roles/AuthzRolesActions';\nimport type { HistoryFunction } from 'routing/useHistory';\nimport useHistory from 'routing/useHistory';\n\nimport type { WizardStepsState, WizardFormValues, AuthBackendMeta } from './BackendWizardContext';\nimport BackendWizardContext from './BackendWizardContext';\nimport { FORM_VALIDATION as SERVER_CONFIG_VALIDATION, STEP_KEY as SERVER_CONFIG_KEY } from './ServerConfigStep';\nimport { FORM_VALIDATION as USER_SYNC_VALIDATION, STEP_KEY as USER_SYNC_KEY } from './UserSyncStep';\nimport { STEP_KEY as GROUP_SYNC_KEY } from './GroupSyncStep';\nimport wizardSteps from './wizardSteps';\nimport Sidebar from './Sidebar';\n\nconst FORMS_VALIDATION = {\n [SERVER_CONFIG_KEY]: SERVER_CONFIG_VALIDATION,\n [USER_SYNC_KEY]: USER_SYNC_VALIDATION,\n};\n\nconst SubmitAllError = ({ error, backendId }: { error: FetchError, backendId: string | null | undefined }) => (\n \n \n \n {error?.message && <>{error.message}
>}\n {error?.additional?.res?.text}\n \n \n
\n);\n\nconst _formatBackendValidationErrors = (backendErrors: { [inputNameJSON: string]: string[] }) => {\n const backendErrorStrings = mapValues(backendErrors, (errorArray) => `Server validation error: ${errorArray.join(' ')}`);\n\n return mapKeys(backendErrorStrings, (_value, key) => camelCase(key));\n};\n\nexport const _passwordPayload = (backendId: string | null | undefined, systemUserPassword: string | null | undefined) => {\n const _formatPayload = (password) => {\n if (!password) {\n return undefined;\n }\n\n return password;\n };\n\n // Only update password on edit if necessary,\n // if a users resets the previously defined password its form value is an empty string\n if (backendId) {\n if (systemUserPassword === undefined) {\n return { keep_value: true };\n }\n\n if (systemUserPassword === '') {\n return { delete_value: true };\n }\n\n return { set_value: _formatPayload(systemUserPassword) };\n }\n\n return _formatPayload(systemUserPassword);\n};\n\nconst _prepareSubmitPayload = (stepsState, getUpdatedFormsValues) => (overrideFormValues: WizardFormValues): WizardSubmitPayload => {\n // We need to ensure that we are using the actual form values\n // It is possible to provide already updated form values, so we do not need to get them twice\n const formValues = overrideFormValues ?? getUpdatedFormsValues();\n const {\n defaultRoles = '',\n description,\n serverHost,\n serverPort,\n systemUserDn,\n systemUserPassword,\n title,\n transportSecurity,\n userUniqueIdAttribute,\n userFullNameAttribute,\n userNameAttribute,\n emailAttributes,\n userSearchBase,\n userSearchPattern,\n verifyCertificates,\n } = formValues;\n const {\n serviceType,\n backendId,\n } = stepsState.authBackendMeta;\n\n return {\n title,\n description,\n default_roles: defaultRoles.split(','),\n config: {\n servers: [{ host: serverHost, port: serverPort }],\n system_user_dn: systemUserDn,\n system_user_password: _passwordPayload(backendId, systemUserPassword),\n transport_security: transportSecurity,\n type: serviceType,\n email_attributes: emailAttributes,\n user_full_name_attribute: userFullNameAttribute,\n user_name_attribute: userNameAttribute,\n user_search_base: userSearchBase,\n user_search_pattern: userSearchPattern,\n user_unique_id_attribute: userUniqueIdAttribute,\n verify_certificates: verifyCertificates,\n },\n };\n};\n\nconst _getInvalidStepKeys = (formValues, newBackendValidationErrors, excludedFields): StepKey[] => {\n const validation = { ...FORMS_VALIDATION, [GROUP_SYNC_KEY]: {} };\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const groupSyncValidation = enterpriseGroupSyncPlugin?.validation.GroupSyncValidation;\n\n if (groupSyncValidation && formValues.synchronizeGroups) {\n validation[GROUP_SYNC_KEY] = groupSyncValidation(formValues.teamSelectionType);\n }\n\n const invalidStepKeys = Object.entries(validation).map(([stepKey, formValidation]) => {\n const stepHasError = Object.entries(formValidation).some(([fieldName, fieldValidation]) => {\n if (excludedFields[fieldName]) {\n return false;\n }\n\n if (newBackendValidationErrors?.[fieldName]) {\n return true;\n }\n\n return !!validateField(fieldValidation)(formValues?.[fieldName]);\n });\n\n return stepHasError ? stepKey : undefined;\n });\n\n return compact(invalidStepKeys);\n};\n\nconst _onSubmitAll = (\n stepsState,\n setSubmitAllError,\n onSubmit,\n getUpdatedFormsValues,\n getSubmitPayload,\n validateSteps,\n shouldUpdateGroupSync,\n history: HistoryFunction,\n) => {\n const formValues = getUpdatedFormsValues();\n const invalidStepKeys = validateSteps(formValues, {});\n\n // Do not submit if there are invalid steps\n if (invalidStepKeys.length >= 1) {\n return Promise.resolve();\n }\n\n // Reset submit all errors\n setSubmitAllError(null);\n\n const payload = getSubmitPayload(formValues);\n const _submit = () => onSubmit(payload, formValues, stepsState.authBackendMeta.serviceType, shouldUpdateGroupSync).then(() => {\n history.push(Routes.SYSTEM.AUTHENTICATION.BACKENDS.OVERVIEW);\n }).catch((error) => {\n if (typeof error?.additional?.body?.errors === 'object') {\n const backendValidationErrors = _formatBackendValidationErrors(error.additional.body.errors);\n validateSteps(formValues, backendValidationErrors);\n } else {\n setSubmitAllError(error);\n }\n });\n\n if (stepsState.authBackendMeta.backendGroupSyncIsActive && !formValues.synchronizeGroups) {\n // eslint-disable-next-line no-alert\n if (window.confirm('Do you really want to remove the group synchronization config for this authentication service?')) {\n return _submit();\n }\n\n return Promise.resolve();\n }\n\n return _submit();\n};\n\nconst _setDefaultCreateRole = (roles, stepsState, setStepsState) => {\n const defaultCreateRoleId = roles?.find((role) => role.name === 'Reader')?.id;\n\n if (defaultCreateRoleId) {\n setStepsState({ ...stepsState, formValues: { ...stepsState.formValues, defaultRoles: defaultCreateRoleId } });\n }\n};\n\ntype Props = {\n authBackendMeta: AuthBackendMeta,\n initialStepKey: $PropertyType,\n initialValues: WizardFormValues,\n excludedFields: { [inputName: string]: boolean },\n help: { [inputName: string]: React.ReactElement | string | null | undefined },\n onSubmit: (WizardSubmitPayload, WizardFormValues, serviceType: $PropertyType, shouldUpdateGroupSync?: boolean) => Promise,\n};\n\nconst _loadRoles = (setPaginatedRoles) => {\n const getUnlimited = { page: 1, perPage: 0, query: '' };\n\n AuthzRolesDomain.loadRolesPaginated(getUnlimited).then(setPaginatedRoles);\n};\n\nconst BackendWizard = ({ initialValues, initialStepKey, onSubmit, authBackendMeta, help, excludedFields }: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const MatchingGroupsProvider = enterpriseGroupSyncPlugin?.components.MatchingGroupsProvider;\n const [paginatedRoles, setPaginatedRoles] = useState();\n const [submitAllError, setSubmitAllError] = useState();\n const [stepsState, setStepsState] = useState({\n activeStepKey: initialStepKey,\n authBackendMeta,\n backendValidationErrors: undefined,\n formValues: initialValues,\n invalidStepKeys: [],\n });\n const history = useHistory();\n\n const formRefs = {\n [SERVER_CONFIG_KEY]: useRef>(null),\n [USER_SYNC_KEY]: useRef>(null),\n [GROUP_SYNC_KEY]: useRef>(null),\n };\n\n const wizardContextValue = useMemo(() => ({ ...stepsState, setStepsState }), [stepsState, setStepsState]);\n\n useEffect(() => _loadRoles(setPaginatedRoles), []);\n\n useEffect(() => {\n if (paginatedRoles && !authBackendMeta.backendId && !stepsState.formValues.defaultRoles) {\n _setDefaultCreateRole(paginatedRoles.list, stepsState, setStepsState);\n }\n }, [paginatedRoles, authBackendMeta.backendId, stepsState, setStepsState]);\n\n if (!paginatedRoles) {\n return ;\n }\n\n const _getUpdatedFormsValues = () => {\n const activeForm = formRefs[stepsState.activeStepKey]?.current;\n\n return { ...stepsState.formValues, ...activeForm?.values };\n };\n\n const _validateSteps = (formValues: WizardFormValues, newBackendValidationErrors): Array => {\n const invalidStepKeys = _getInvalidStepKeys(\n formValues,\n newBackendValidationErrors,\n excludedFields,\n );\n\n if (invalidStepKeys.length >= 1) {\n const nextStepKey = invalidStepKeys.includes(stepsState.activeStepKey) ? stepsState.activeStepKey : invalidStepKeys[0];\n\n setStepsState({\n ...stepsState,\n backendValidationErrors: newBackendValidationErrors,\n activeStepKey: nextStepKey,\n formValues,\n invalidStepKeys,\n });\n }\n\n return invalidStepKeys;\n };\n\n const _getSubmitPayload = _prepareSubmitPayload(stepsState, _getUpdatedFormsValues);\n\n const _setActiveStepKey = (stepKey: $PropertyType) => {\n const formValues = _getUpdatedFormsValues();\n let invalidStepKeys = [...stepsState.invalidStepKeys];\n\n // Only update invalid steps keys, we create them on submit all only\n if (invalidStepKeys.length >= 1) {\n invalidStepKeys = _getInvalidStepKeys(formValues, stepsState.backendValidationErrors, excludedFields);\n }\n\n setStepsState({\n ...stepsState,\n invalidStepKeys,\n formValues,\n activeStepKey: stepKey,\n });\n };\n\n const _handleSubmitAll = (shouldUpdateGroupSync?: boolean) => _onSubmitAll(\n stepsState,\n setSubmitAllError,\n onSubmit,\n _getUpdatedFormsValues,\n _getSubmitPayload,\n _validateSteps,\n shouldUpdateGroupSync,\n history,\n );\n\n const steps = wizardSteps({\n formRefs,\n help,\n handleSubmitAll: _handleSubmitAll,\n invalidStepKeys: stepsState.invalidStepKeys,\n prepareSubmitPayload: _getSubmitPayload,\n excludedFields,\n roles: paginatedRoles.list,\n setActiveStepKey: _setActiveStepKey,\n submitAllError: submitAllError && ,\n });\n\n const wizard = (\n \n \n \n );\n\n return (\n \n {MatchingGroupsProvider\n ? (\n \n {wizard}\n \n )\n : wizard}\n \n );\n};\n\nBackendWizard.defaultProps = {\n initialStepKey: SERVER_CONFIG_KEY,\n help: undefined,\n excludedFields: {},\n};\n\nBackendWizard.propTypes = {\n authBackendMeta: PropTypes.shape({\n backendHasPassword: PropTypes.bool,\n backendId: PropTypes.string,\n serviceTitle: PropTypes.string.isRequired,\n serviceType: PropTypes.string.isRequired,\n }).isRequired,\n help: PropTypes.object,\n initialStepKey: PropTypes.string,\n initialValues: PropTypes.object.isRequired,\n excludedFields: PropTypes.object,\n};\n\nexport default BackendWizard;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport BackendWizard from './BackendWizard';\n\nexport default BackendWizard;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport { DocumentTitle } from 'components/common';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport type { WizardFormValues } from 'components/authentication/directoryServices/BackendWizard/BackendWizardContext';\n\nimport WizardPageHeader from './WizardPageHeader';\n\nimport handleCreate from '../HandleCreate';\nimport BackendWizard from '../BackendWizard';\n\nexport const AUTH_BACKEND_META = {\n serviceType: 'ldap',\n serviceTitle: 'LDAP',\n};\n\nexport const HELP = {\n // server config help\n systemUserDn: (\n \n The username for the initial connection to the LDAP server, e.g. cn=admin,dc=example,dc=com
,\n this might be optional depending on your LDAP server.\n \n ),\n systemUserPassword: 'The password for the initial connection to the LDAP server.',\n // user sync help\n userSearchBase: (\n \n The base tree to limit the LDAP search query to, e.g. cn=users,dc=example,dc=com
.\n \n ),\n userSearchPattern: (\n \n For example {'(&(uid={0})(objectClass=inetOrgPerson))'}
.{' '}\n The string {'{0}'}
will be replaced by the entered username.\n \n ),\n userNameAttribute: (\n \n Which LDAP attribute to use for the username of the user in Graylog, e.g uid
.
\n Try to load a test user in the sidebar section User Login Test, if you are unsure which attribute to use.\n \n ),\n userFullNameAttribute: (\n \n Which LDAP attribute to use for the full name of a synchronized Graylog user, e.g. cn
.
\n \n ),\n userUniqueIdAttribute: (\n \n Which LDAP attribute to use for the ID of a synchronized Graylog user, e.g. entryUUID
.
\n \n ),\n defaultRoles: (\n The default Graylog roles synchronized user will obtain. All users need the Reader
role, to use the Graylog web interface\n ),\n emailAttributes: (\n \n Which LDAP attribute to use for the user's email address, e.g. mail
.
\n You can specify multiple attributes, type Tab or Enter to accept your value.\n \n ),\n};\n\nconst INITIAL_VALUES: Partial = {\n title: AUTH_BACKEND_META.serviceTitle,\n serverHost: 'localhost',\n serverPort: 636,\n transportSecurity: 'tls',\n userFullNameAttribute: 'cn',\n emailAttributes: ['mail', 'rfc822Mailbox'],\n userNameAttribute: 'uid',\n userUniqueIdAttribute: 'entryUUID',\n verifyCertificates: true,\n};\n\nconst BackendCreate = () => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const {\n help: groupSyncHelp = {},\n initialValues: initialGroupSyncValues = {},\n } = enterpriseGroupSyncPlugin?.wizardConfig?.ldap ?? {};\n const help = { ...HELP, ...groupSyncHelp };\n const initialValues = { ...INITIAL_VALUES, ...initialGroupSyncValues };\n\n return (\n \n \n \n \n );\n};\n\nexport default BackendCreate;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as Immutable from 'immutable';\n\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\n\nimport type { WizardFormValues } from './BackendWizard/BackendWizardContext';\n\nexport default ({\n title,\n description,\n defaultRoles = Immutable.List(),\n config: {\n servers = [],\n systemUserDn,\n transportSecurity,\n emailAttributes,\n userFullNameAttribute,\n userNameAttribute,\n userSearchBase,\n userSearchPattern,\n userUniqueIdAttribute,\n verifyCertificates,\n },\n}: DirectoryServiceBackend): WizardFormValues => ({\n title,\n description,\n defaultRoles: defaultRoles.join(),\n serverHost: servers[0].host,\n serverPort: servers[0].port,\n systemUserDn,\n transportSecurity,\n userFullNameAttribute,\n emailAttributes,\n userNameAttribute: userNameAttribute,\n userSearchBase,\n userSearchPattern,\n userUniqueIdAttribute,\n verifyCertificates,\n});\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport UserNotification from 'util/UserNotification';\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport { AuthenticationActions } from 'stores/authentication/AuthenticationStore';\n\nimport type { WizardFormValues } from './BackendWizard/BackendWizardContext';\n\nexport default (payload: WizardSubmitPayload, formValues: WizardFormValues, backendId: string, backendGroupSyncIsActive: boolean, serviceType: string, shouldUpdateGroupSync: boolean | undefined = true) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const notifyOnSuccess = () => UserNotification.success('Authentication service was updated successfully.', 'Success');\n const notifyOnError = (error) => UserNotification.error(`Updating authentication service failed with status: ${error}`, 'Error');\n\n return AuthenticationActions.update(backendId, {\n ...payload,\n id: backendId,\n }).then((result) => {\n if (enterpriseGroupSyncPlugin && shouldUpdateGroupSync) {\n return enterpriseGroupSyncPlugin.actions.onDirectoryServiceBackendUpdate(backendGroupSyncIsActive, formValues, backendId, serviceType).then(notifyOnSuccess);\n }\n\n notifyOnSuccess();\n\n return result;\n }).catch((error) => {\n notifyOnError(error);\n throw error;\n });\n};\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport { DocumentTitle, Spinner } from 'components/common';\n\nimport { AUTH_BACKEND_META, HELP } from './BackendCreate';\nimport WizardPageHeader from './WizardPageHeader';\n\nimport prepareInitialWizardValues from '../PrepareInitialWizardValues';\nimport BackendWizard from '../BackendWizard';\nimport handleUpdate from '../HandleUpdate';\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n initialStepKey: string | null | undefined,\n};\n\nconst _optionalWizardProps = (initialStepKey: string | null | undefined) => ({ initialStepKey });\n\nconst BackendEdit = ({ authenticationBackend, initialStepKey }: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const {\n help: groupSyncHelp = {},\n initialValues: initialGroupSyncValues = {},\n } = enterpriseGroupSyncPlugin?.wizardConfig?.ldap ?? {};\n const help = { ...HELP, ...groupSyncHelp };\n let initialValues = prepareInitialWizardValues(authenticationBackend);\n\n if (enterpriseGroupSyncPlugin) {\n const {\n formValues: groupSyncFormValues,\n finishedLoading,\n } = enterpriseGroupSyncPlugin.hooks.useInitialGroupSyncValues(authenticationBackend.id, initialGroupSyncValues);\n\n if (!finishedLoading) {\n return ;\n }\n\n initialValues = { ...initialValues, ...groupSyncFormValues };\n }\n\n const authBackendMeta = {\n ...AUTH_BACKEND_META,\n backendId: authenticationBackend.id,\n backendHasPassword: authenticationBackend.config.systemUserPassword.isSet,\n backendGroupSyncIsActive: !!initialValues.synchronizeGroups,\n };\n const _handleSubmit = (\n payload,\n formValues,\n serviceType,\n shouldUpdateGroupSync,\n ) => handleUpdate(\n payload,\n formValues,\n authenticationBackend.id,\n !!initialValues.synchronizeGroups,\n serviceType,\n shouldUpdateGroupSync,\n );\n\n return (\n \n \n \n \n );\n};\n\nexport default BackendEdit;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport { LinkContainer } from 'components/common/router';\nimport Routes from 'routing/Routes';\nimport { Button } from 'components/bootstrap';\n\ntype Props = {\n authenticationBackendId: string,\n stepKey: string,\n};\n\nconst EditLinkButton = ({ authenticationBackendId, stepKey }: Props) => (\n \n \n \n);\n\nexport default EditLinkButton;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport { ReadOnlyFormGroup } from 'components/common';\nimport SectionComponent from 'components/common/Section/SectionComponent';\n\nimport EditLinkButton from './EditLinkButton';\n\nimport { STEP_KEY as SERVER_CONFIG_KEY } from '../BackendWizard/ServerConfigStep';\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n};\n\nconst ServerConfigSection = ({ authenticationBackend }: Props) => {\n const { title, description, config: { servers = [], systemUserDn, systemUserPassword, transportSecurity, verifyCertificates } } = authenticationBackend;\n const serverUrls = servers.map((server) => `${server.host}:${server.port}`).join(', ');\n\n return (\n }>\n \n \n \n \n \n \n \n \n );\n};\n\nexport default ServerConfigSection;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport * as Immutable from 'immutable';\nimport * as PropTypes from 'prop-types';\n\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport type Role from 'logic/roles/Role';\nimport { ReadOnlyFormGroup } from 'components/common';\nimport SectionComponent from 'components/common/Section/SectionComponent';\n\nimport EditLinkButton from './EditLinkButton';\n\nimport { STEP_KEY as USER_SYNC_KEY } from '../BackendWizard/UserSyncStep';\n\nconst rolesList = (defaultRolesIds: Immutable.List, roles: Immutable.List) => {\n const defaultRolesNames = defaultRolesIds.map((roleId) => roles.find((role) => role.id === roleId)?.name ?? 'Role not found');\n\n return defaultRolesNames.join(', ');\n};\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n excludedFields: {[ inputName: string ]: boolean },\n roles: Immutable.List,\n};\n\nconst UserSyncSection = ({ authenticationBackend, roles, excludedFields }: Props) => {\n const {\n userSearchBase,\n userSearchPattern,\n userNameAttribute,\n userFullNameAttribute,\n userUniqueIdAttribute,\n emailAttributes,\n } = authenticationBackend.config;\n const {\n defaultRoles = Immutable.List(),\n } = authenticationBackend;\n\n return (\n }>\n \n \n \n \n {!excludedFields.emailAttributes && }\n {!excludedFields.userUniqueIdAttribute && (\n \n )}\n \n \n );\n};\n\nUserSyncSection.defaultProps = {\n excludedFields: {},\n};\n\nUserSyncSection.propTypes = {\n excludedFields: PropTypes.object,\n};\n\nexport default UserSyncSection;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\n\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport type Role from 'logic/roles/Role';\nimport { EnterprisePluginNotFound } from 'components/common';\nimport SectionComponent from 'components/common/Section/SectionComponent';\n\nimport EditLinkButton from './EditLinkButton';\n\nimport { STEP_KEY as GROUP_SYNC_KEY } from '../BackendWizard/GroupSyncStep';\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n excludedFields?: {[ inputName: string ]: boolean },\n roles: Immutable.List,\n};\n\nconst GroupSyncSection = ({ authenticationBackend, roles, excludedFields }: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const GroupSyncSectionPlugin = enterpriseGroupSyncPlugin?.components.GroupSyncSection;\n\n if (!GroupSyncSectionPlugin) {\n return (\n \n )}>\n \n \n );\n }\n\n return (\n \n );\n};\n\nGroupSyncSection.defaultProps = {\n excludedFields: undefined,\n};\n\nexport default GroupSyncSection;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\n\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport type Role from 'logic/roles/Role';\n\nimport ServerConfigSection from '../BackendConfigDetails/ServerConfigSection';\nimport UserSyncSection from '../BackendConfigDetails/UserSyncSection';\nimport GroupSyncSection from '../BackendConfigDetails/GroupSyncSection';\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n roles: Immutable.List,\n};\n\nconst BackendConfigDetails = ({ authenticationBackend, roles }: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const {\n excludedFields: groupSyncExcludedFields = {},\n } = enterpriseGroupSyncPlugin?.wizardConfig?.activeDirectory ?? {};\n const excludedFields = { ...groupSyncExcludedFields, userUniqueIdAttribute: true, emailAttributes: true };\n\n return (\n <>\n \n \n \n >\n );\n};\n\nexport default BackendConfigDetails;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\n\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport type Role from 'logic/roles/Role';\n\nimport ServerConfigSection from '../BackendConfigDetails/ServerConfigSection';\nimport UserSyncSection from '../BackendConfigDetails/UserSyncSection';\nimport GroupSyncSection from '../BackendConfigDetails/GroupSyncSection';\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n roles: Immutable.List,\n};\n\nconst BackendConfigDetails = ({ authenticationBackend, roles }: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const {\n excludedFields: groupSyncExcludedFields = {},\n } = enterpriseGroupSyncPlugin?.wizardConfig?.ldap ?? {};\n const excludedFields = { ...groupSyncExcludedFields };\n\n return (\n <>\n \n \n \n >\n );\n};\n\nexport default BackendConfigDetails;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport AuthenticationPageNavigation from 'components/authentication/AuthenticationPageNavigation';\nimport { PageHeader } from 'components/common';\nimport useActiveBackend from 'components/authentication/useActiveBackend';\nimport BackendActionLinks from 'components/authentication/BackendActionLinks';\nimport DocsHelper from 'util/DocsHelper';\nimport StringUtils from 'util/StringUtils';\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\n\ntype Props = {\n authenticationBackend?: DirectoryServiceBackend,\n};\n\nconst _pageTitle = (authBackend) => {\n if (authBackend) {\n const backendTitle = StringUtils.truncateWithEllipses(authBackend.title, 30);\n\n return <>Edit Authentication Service - {backendTitle}>;\n }\n\n return 'Create Active Directory Authentication Service';\n};\n\nconst WizardPageHeader = ({ authenticationBackend: authBackend }: Props) => {\n const { finishedLoading, activeBackend } = useActiveBackend();\n const pageTitle = _pageTitle(authBackend);\n\n return (\n <>\n \n \n )}\n documentationLink={{\n title: 'Authentication documentation',\n path: DocsHelper.PAGES.USERS_ROLES,\n }}>\n Configure Graylog's authentication services of this Graylog cluster.\n \n >\n );\n};\n\nWizardPageHeader.defaultProps = {\n authenticationBackend: undefined,\n};\n\nexport default WizardPageHeader;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport { DocumentTitle } from 'components/common';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport type { WizardFormValues } from 'components/authentication/directoryServices/BackendWizard/BackendWizardContext';\n\nimport WizardPageHeader from './WizardPageHeader';\n\nimport BackendWizard from '../BackendWizard';\nimport handleCreate from '../HandleCreate';\n\nexport const HELP = {\n // server config help\n systemUserDn: (\n \n The username for the initial connection to the Active Directory server, e.g. [email protected]
.
\n This needs to match the userPrincipalName
of that user.\n \n ),\n systemUserPassword: 'The password for the initial connection to the Active Directory server.',\n // user sync help\n userSearchBase: (\n \n The base tree to limit the Active Directory search query to, e.g. cn=users,dc=example,dc=com
.\n \n ),\n userSearchPattern: (\n \n For example {'(&(objectClass=user)(|(sAMAccountName={0})(userPrincipalName={0})))'}
.{' '}\n The string {'{0}'}
will be replaced by the entered username.\n \n ),\n userNameAttribute: (\n \n Which Active Directory attribute to use for the full name of the user in Graylog, e.g. userPrincipalName
.
\n Try to load a test user in the sidebar section User Login Test, if you are unsure which attribute to use.\n \n ),\n userFullNameAttribute: (\n \n Which Active Directory attribute to use for the full name of a synchronized Graylog user, e.g. displayName
.
\n \n ),\n defaultRoles: (\n The default Graylog roles synchronized user will obtain. All users need the Reader
role, to use the Graylog web interface\n ),\n};\n\nexport const AUTH_BACKEND_META = {\n serviceTitle: 'Active Directory',\n serviceType: 'active-directory',\n};\n\nconst INITIAL_VALUES: Partial = {\n title: AUTH_BACKEND_META.serviceTitle,\n serverHost: 'localhost',\n serverPort: 636,\n transportSecurity: 'tls',\n userSearchPattern: '(&(objectClass=user)(|(sAMAccountName={0})(userPrincipalName={0})))',\n userFullNameAttribute: 'displayName',\n userNameAttribute: 'userPrincipalName',\n verifyCertificates: true,\n};\n\nconst BackendCreate = () => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const {\n help: groupSyncHelp = {},\n excludedFields: groupSyncExcludedFields = {},\n initialValues: initialGroupSyncValues,\n } = enterpriseGroupSyncPlugin?.wizardConfig?.activeDirectory ?? {};\n const help = { ...HELP, ...groupSyncHelp };\n const initialValues = { ...INITIAL_VALUES, ...initialGroupSyncValues };\n const excludedFields = { ...groupSyncExcludedFields, userUniqueIdAttribute: true, emailAttributes: true };\n\n return (\n \n \n \n \n );\n};\n\nexport default BackendCreate;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport { DocumentTitle, Spinner } from 'components/common';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\n\nimport WizardPageHeader from './WizardPageHeader';\nimport { HELP, AUTH_BACKEND_META } from './BackendCreate';\n\nimport prepareInitialWizardValues from '../PrepareInitialWizardValues';\nimport BackendWizard from '../BackendWizard';\nimport handleUpdate from '../HandleUpdate';\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n initialStepKey: string | null | undefined,\n};\n\nconst _optionalWizardProps = (initialStepKey: string | null | undefined) => ({ initialStepKey });\n\nconst BackendEdit = ({ authenticationBackend, initialStepKey }: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const {\n help: groupSyncHelp = {},\n excludedFields: groupSyncExcludedFields = {},\n initialValues: initialGroupSyncValues = {},\n } = enterpriseGroupSyncPlugin?.wizardConfig?.activeDirectory ?? {};\n const help = { ...HELP, ...groupSyncHelp };\n const excludedFields = { ...groupSyncExcludedFields, userUniqueIdAttribute: true, emailAttributes: true };\n let initialValues = prepareInitialWizardValues(authenticationBackend);\n\n if (enterpriseGroupSyncPlugin) {\n const {\n formValues: groupFormValues,\n finishedLoading,\n } = enterpriseGroupSyncPlugin.hooks.useInitialGroupSyncValues(authenticationBackend.id, initialGroupSyncValues);\n\n if (!finishedLoading) {\n return ;\n }\n\n initialValues = { ...initialValues, ...groupFormValues };\n }\n\n const authBackendMeta = {\n ...AUTH_BACKEND_META,\n backendId: authenticationBackend.id,\n backendHasPassword: authenticationBackend.config.systemUserPassword.isSet,\n backendGroupSyncIsActive: !!initialValues.synchronizeGroups,\n };\n const _handleSubmit = (\n payload,\n formValues,\n serviceType,\n shouldUpdateGroupSync,\n ) => handleUpdate(\n payload,\n formValues,\n authenticationBackend.id,\n !!initialValues.synchronizeGroups,\n serviceType,\n shouldUpdateGroupSync,\n );\n\n return (\n \n \n \n \n );\n};\n\nexport default BackendEdit;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport { PluginManifest, PluginStore } from 'graylog-web-plugin/plugin';\n\nimport ConfigParser from 'logic/authentication/directoryServices/BackendConfigParser';\n\nimport BackendCreateLDAP from './directoryServices/ldap/BackendCreate';\nimport BackendEditLDAP from './directoryServices/ldap/BackendEdit';\nimport BackendConfigDetailsAD from './directoryServices/activeDirectory/BackendConfigDetails';\nimport BackendConfigDetailsLDAP from './directoryServices/ldap/BackendConfigDetails';\nimport BackendCreateAD from './directoryServices/activeDirectory/BackendCreate';\nimport BackendEditAD from './directoryServices/activeDirectory/BackendEdit';\n\nPluginStore.register(new PluginManifest({}, {\n 'authentication.services': [\n {\n name: 'ldap',\n displayName: 'LDAP',\n createComponent: BackendCreateLDAP,\n editComponent: BackendEditLDAP,\n configDetailsComponent: BackendConfigDetailsLDAP,\n configToJson: ConfigParser.toJson,\n configFromJson: ConfigParser.fromJson,\n },\n {\n name: 'active-directory',\n displayName: 'Active Directory',\n createComponent: BackendCreateAD,\n editComponent: BackendEditAD,\n configDetailsComponent: BackendConfigDetailsAD,\n configToJson: ConfigParser.toJson,\n configFromJson: ConfigParser.fromJson,\n },\n ],\n}));\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\n\nimport { useState, useEffect } from 'react';\n\nimport type { LoadActiveResponse } from 'stores/authentication/AuthenticationStore';\nimport type { ListenableAction, PromiseProvider } from 'stores/StoreTypes';\nimport AuthenticationDomain from 'domainActions/authentication/AuthenticationDomain';\n\nconst useActiveBackend = (listenableActions: Array> = []) => {\n const [loadActiveResponse, setLoadActiveResponse] = useState();\n const [finishedLoading, setFinishedLoading] = useState(false);\n const _loadActive = () => AuthenticationDomain.loadActive().then((response) => {\n setFinishedLoading(true);\n setLoadActiveResponse(response);\n });\n\n useEffect(() => { _loadActive(); }, []);\n\n useEffect(() => {\n const unlistenActions = listenableActions.map((action) => action.completed.listen(_loadActive));\n\n return () => {\n unlistenActions.forEach((unlistenAction) => unlistenAction());\n };\n }, [listenableActions]);\n\n return {\n finishedLoading,\n activeBackend: loadActiveResponse?.backend,\n backendsTotal: loadActiveResponse?.context?.backendsTotal,\n };\n};\n\nexport default useActiveBackend;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { Button, ButtonToolbar } from 'components/bootstrap';\nimport { LinkContainer } from 'components/common/router';\nimport { IfPermitted } from 'components/common';\nimport NavItemStateIndicator, {\n hoverIndicatorStyles,\n activeIndicatorStyles,\n} from 'components/common/NavItemStateIndicator';\n\nconst Container = styled(ButtonToolbar)`\n margin-bottom: 10px;\n`;\n\nconst StyledButton = styled(Button)(({ theme }) => css`\n font-family: ${theme.fonts.family.navigation};\n font-size: ${theme.fonts.size.navigation};\n\n &&&& {\n color: ${theme.colors.variant.darker.default};\n \n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > div {\n &:hover,\n &:focus {\n color: ${theme.colors.variant.darker.default};\n }\n }\n\n &:hover {\n ${hoverIndicatorStyles(theme)}\n }\n\n &.active {\n color: ${theme.colors.global.textDefault};\n\n ${activeIndicatorStyles(theme)}\n\n &:hover,\n &:focus {\n ${activeIndicatorStyles(theme)}\n }\n }\n }\n`);\n\nStyledButton.displayName = 'Button';\n\ntype Props = {\n /**\n * List of nav items. Define permissions, if the item should only be displayed for users with specific permissions.\n * By default, an item is active if the current URL starts with the item URL.\n * If you only want to display an item as active only when its path matches exactly, set `exactPathMatch` to true.\n */\n items: Array<{\n title: string,\n path: string,\n permissions?: string | Array\n exactPathMatch?: boolean,\n }>\n}\n\n/**\n * Simple tab navigation to allow navigating to subareas of a page.\n */\nconst PageNavigation = ({ items }: Props) => (\n \n {items.map(({ path, title, permissions, exactPathMatch }) => {\n if (!path) {\n return null;\n }\n\n return (\n \n \n \n \n {title}\n \n \n \n \n );\n })}\n \n);\n\nexport default PageNavigation;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport { AuthenticationActions } from 'stores/authentication/AuthenticationStore';\n\nimport notifyingAction from '../notifyingAction';\n\nconst create = notifyingAction({\n action: AuthenticationActions.create,\n success: (authBackend) => ({\n message: `Authentication service \"${authBackend.title} was created successfully`,\n }),\n error: (error, authBackend) => ({\n message: `Creating authentication service \"${authBackend.title}\" failed with status: ${error}`,\n }),\n});\n\nconst load = notifyingAction({\n action: AuthenticationActions.load,\n error: (error, authBackendId) => ({\n message: `Loading authentication service with id \"${authBackendId}\" failed with status: ${error}`,\n }),\n notFoundRedirect: true,\n});\n\nconst loadActive = notifyingAction({\n action: AuthenticationActions.loadActive,\n error: (error) => ({\n message: `Loading active authentication service failed with status: ${error}`,\n }),\n});\n\nconst update = notifyingAction({\n action: AuthenticationActions.update,\n success: (_authBackendId, authBackend) => ({\n message: `Authentication service \"${authBackend.title}\" was updated successfully`,\n }),\n error: (error, _authBackendId, authBackend) => ({\n message: `Updating authentication service \"${authBackend.title}\" failed with status: ${error}`,\n }),\n});\n\nconst deleteBackend = notifyingAction({\n action: AuthenticationActions.delete,\n success: (_authBackendId, authBackendTitle) => ({\n message: `Authentication service \"${authBackendTitle} was deleted successfully`,\n }),\n error: (error, _authBackendId, authBackendTitle) => ({\n message: `Deleting authentication service \"${authBackendTitle}\" failed with status: ${error}`,\n }),\n});\n\nconst testConnection = notifyingAction({\n action: AuthenticationActions.testConnection,\n error: (error) => ({\n message: `Connection test failed with status: ${error}`,\n }),\n});\n\nconst testLogin = notifyingAction({\n action: AuthenticationActions.testLogin,\n error: (error) => ({\n message: `Login test failed with status: ${error}`,\n }),\n});\n\nconst setActiveBackend = notifyingAction({\n action: AuthenticationActions.setActiveBackend,\n success: (authBackendId, authBackendTitle) => ({\n message: `Authentication service \"${authBackendTitle} was ${authBackendId ? 'activated' : 'deactivated'} successfully`,\n }),\n error: (error, _authBackendId, authBackendTitle) => ({\n message: `Activating authentication service \"${authBackendTitle}\" failed with status: ${error}`,\n }),\n});\n\nconst loadBackendsPaginated = notifyingAction({\n action: AuthenticationActions.loadBackendsPaginated,\n error: (error) => ({\n message: `Loading authentication services failed with status: ${error}`,\n }),\n});\n\nconst loadUsersPaginated = notifyingAction({\n action: AuthenticationActions.loadUsersPaginated,\n error: (authBackendId, error) => ({\n message: `Loading synchronized users for authentication service with id \"${authBackendId}\" failed with status: ${error}`,\n }),\n});\n\nconst loadActiveBackendType = notifyingAction({\n action: AuthenticationActions.loadActiveBackendType,\n error: (error) => ({\n message: `Loading active authentication service type failed with status: ${error}`,\n }),\n});\n\nexport default {\n create,\n update,\n load,\n loadActive,\n delete: deleteBackend,\n testConnection,\n testLogin,\n setActiveBackend,\n loadBackendsPaginated,\n loadUsersPaginated,\n loadActiveBackendType,\n};\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport { AuthzRolesActions } from 'stores/roles/AuthzRolesStore';\n\nimport notifyingAction from '../notifyingAction';\n\nconst load = notifyingAction({\n action: AuthzRolesActions.load,\n error: (error, roleId) => ({\n message: `Loading role with id \"${roleId}\" failed with status: ${error}`,\n }),\n notFoundRedirect: true,\n});\n\nconst deleteAction = notifyingAction({\n action: AuthzRolesActions.delete,\n success: (_roleId, roleName) => ({\n message: `Role \"${roleName}\" was deleted successfully`,\n }),\n error: (error, _roleId, roleName) => ({\n message: `Deleting role \"${roleName}\" failed with status: ${error}`,\n }),\n});\n\nconst addMembers = notifyingAction({\n action: AuthzRolesActions.addMembers,\n success: (_roleId, usernames) => ({\n message: `Users:\"${usernames.join(', ')}\" were assigned successfully`,\n }),\n error: (error, _roleId, usernames) => ({\n message: `Assigning users \"${usernames.join(', ')}\" failed with status: ${error}`,\n }),\n});\n\nconst removeMember = notifyingAction({\n action: AuthzRolesActions.removeMember,\n success: (_roleId, username) => ({\n message: `User \"${username}\" was unassigned successfully`,\n }),\n error: (error, _roleId, username) => ({\n message: `Unassign user \"${username}\" failed with status: ${error}`,\n }),\n});\n\nconst loadUsersForRole = notifyingAction({\n action: AuthzRolesActions.loadUsersForRole,\n error: (error, _roleId, roleName) => ({\n message: `Loading users for role \"${roleName}\" failed with status: ${error}`,\n }),\n});\n\nconst loadRolesForUser = notifyingAction({\n action: AuthzRolesActions.loadRolesForUser,\n error: (error, username) => ({\n message: `Loading roles for user \"${username}\" failed with status: ${error}`,\n }),\n});\n\nconst loadRolesPaginated = notifyingAction({\n action: AuthzRolesActions.loadRolesPaginated,\n error: (error) => ({\n message: `Loading roles failed with status: ${error}`,\n }),\n});\n\nexport default {\n load,\n delete: deleteAction,\n addMembers,\n removeMember,\n loadUsersForRole,\n loadRolesForUser,\n loadRolesPaginated,\n};\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport type { $PropertyType } from 'utility-types';\nimport * as Immutable from 'immutable';\n\nexport type AccountStatus = 'enabled' | 'disabled' | 'deleted';\n\nexport type UserOverviewJSON = {\n id: string;\n username: string;\n full_name: string;\n email: string;\n external_user: boolean | null | undefined;\n roles: Array;\n read_only: boolean | null | undefined;\n session_active: boolean | null | undefined;\n client_address: string;\n last_activity: string | null | undefined;\n enabled: boolean;\n auth_service_id: string;\n auth_service_uid: string;\n auth_service_enabled: boolean;\n account_status: AccountStatus;\n};\n\ntype InternalState = {\n id: string;\n username: string;\n fullName: string;\n email: string;\n roles: Immutable.Set;\n readOnly: boolean;\n external: boolean;\n sessionActive: boolean;\n clientAddress: string;\n lastActivity: string | null | undefined;\n enabled: boolean;\n authServiceId: string;\n authServiceUid: string;\n authServiceEnabled: boolean;\n accountStatus: AccountStatus;\n};\n\nexport default class UserOverview {\n _value: InternalState;\n\n constructor(\n id: $PropertyType,\n username: $PropertyType,\n fullName: $PropertyType,\n email: $PropertyType,\n roles: $PropertyType,\n readOnly: $PropertyType,\n external: $PropertyType,\n sessionActive: $PropertyType,\n clientAddress: $PropertyType,\n lastActivity: $PropertyType,\n enabled: $PropertyType,\n authServiceId: $PropertyType,\n authServiceUid: $PropertyType,\n authServiceEnabled: $PropertyType,\n accountStatus: $PropertyType,\n ) {\n this._value = {\n id,\n username,\n fullName,\n email,\n roles,\n readOnly,\n external,\n sessionActive,\n clientAddress,\n lastActivity,\n enabled,\n authServiceId,\n authServiceUid,\n authServiceEnabled,\n accountStatus,\n };\n }\n\n get id() {\n return this._value.id;\n }\n\n get username() {\n return this._value.username;\n }\n\n get name() {\n return this._value.username;\n }\n\n get fullName() {\n return this._value.fullName;\n }\n\n get description() {\n return this._value.fullName;\n }\n\n get email() {\n return this._value.email;\n }\n\n get roles() {\n return this._value.roles;\n }\n\n get readOnly() {\n return this._value.readOnly;\n }\n\n get external() {\n return this._value.external;\n }\n\n get sessionActive() {\n return this._value.sessionActive;\n }\n\n get clientAddress() {\n return this._value.clientAddress;\n }\n\n get lastActivity() {\n return this._value.lastActivity;\n }\n\n get enabled() {\n return this._value.enabled;\n }\n\n get authServiceId() {\n return this._value.authServiceId;\n }\n\n get authServiceUid() {\n return this._value.authServiceUid;\n }\n\n get authServiceEnabled() {\n return this._value.authServiceEnabled;\n }\n\n get accountStatus() {\n return this._value.accountStatus;\n }\n\n toBuilder() {\n const {\n id,\n username,\n fullName,\n email,\n roles,\n readOnly,\n external,\n sessionActive,\n clientAddress,\n lastActivity,\n enabled,\n authServiceId,\n authServiceUid,\n authServiceEnabled,\n accountStatus,\n } = this._value;\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return new Builder(Immutable.Map({\n id,\n username,\n fullName,\n email,\n roles,\n readOnly,\n external,\n sessionActive,\n clientAddress,\n lastActivity,\n enabled,\n authServiceId,\n authServiceUid,\n authServiceEnabled,\n accountStatus,\n }));\n }\n\n static create(\n id: $PropertyType,\n username: $PropertyType,\n fullName: $PropertyType,\n email: $PropertyType,\n roles: $PropertyType,\n readOnly: $PropertyType,\n external: $PropertyType,\n sessionActive: $PropertyType,\n clientAddress: $PropertyType,\n lastActivity: $PropertyType,\n enabled: $PropertyType,\n authServiceId: $PropertyType,\n authServiceUid: $PropertyType,\n authServiceEnabled: $PropertyType,\n accountStatus: $PropertyType,\n ) {\n return new UserOverview(\n id,\n username,\n fullName,\n email,\n roles,\n readOnly,\n external,\n sessionActive,\n clientAddress,\n lastActivity,\n enabled,\n authServiceId,\n authServiceUid,\n authServiceEnabled,\n accountStatus,\n );\n }\n\n toJSON(): UserOverviewJSON {\n const {\n id,\n username,\n fullName,\n email,\n roles,\n readOnly,\n external,\n sessionActive,\n clientAddress,\n lastActivity,\n enabled,\n authServiceId,\n authServiceUid,\n authServiceEnabled,\n accountStatus,\n } = this._value;\n\n return {\n id,\n username,\n full_name: fullName,\n email,\n roles: roles.toArray(),\n read_only: readOnly,\n external_user: external,\n session_active: sessionActive,\n client_address: clientAddress,\n last_activity: lastActivity,\n enabled,\n auth_service_id: authServiceId,\n auth_service_uid: authServiceUid,\n auth_service_enabled: authServiceEnabled,\n account_status: accountStatus,\n };\n }\n\n static fromJSON(value: UserOverviewJSON) {\n const {\n id,\n username,\n full_name: fullName,\n email,\n roles,\n read_only: readOnly,\n external_user: external,\n session_active: sessionActive,\n client_address: clientAddress,\n last_activity: lastActivity,\n enabled,\n auth_service_id: authServiceId,\n auth_service_uid: authServiceUid,\n auth_service_enabled: authServiceEnabled,\n account_status: accountStatus,\n } = value;\n\n return UserOverview.create(id,\n username,\n fullName,\n email,\n Immutable.Set(roles),\n readOnly ?? false,\n external ?? false,\n sessionActive ?? false,\n clientAddress,\n lastActivity,\n enabled,\n authServiceId,\n authServiceUid,\n authServiceEnabled,\n accountStatus);\n }\n\n static builder(): Builder {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return new Builder();\n }\n}\n\ntype BuilderState = Immutable.Map;\n\nclass Builder {\n value: BuilderState;\n\n constructor(value: BuilderState = Immutable.Map()) {\n this.value = value;\n }\n\n id(value: $PropertyType) {\n return new Builder(this.value.set('id', value));\n }\n\n username(value: $PropertyType) {\n return new Builder(this.value.set('username', value));\n }\n\n fullName(value: $PropertyType) {\n return new Builder(this.value.set('fullName', value));\n }\n\n email(value: $PropertyType) {\n return new Builder(this.value.set('email', value));\n }\n\n roles(value: $PropertyType) {\n return new Builder(this.value.set('roles', value));\n }\n\n readOnly(value: $PropertyType) {\n return new Builder(this.value.set('readOnly', value));\n }\n\n external(value: $PropertyType) {\n return new Builder(this.value.set('external', value));\n }\n\n sessionActive(value: $PropertyType) {\n return new Builder(this.value.set('sessionActive', value));\n }\n\n clientAddress(value: $PropertyType) {\n return new Builder(this.value.set('clientAddress', value));\n }\n\n lastActivity(value: $PropertyType) {\n return new Builder(this.value.set('lastActivity', value));\n }\n\n enabled(value: $PropertyType) {\n return new Builder(this.value.set('enabled', value));\n }\n\n authServiceId(value: $PropertyType) {\n return new Builder(this.value.set('authServiceId', value));\n }\n\n authServiceUid(value: $PropertyType) {\n return new Builder(this.value.set('authServiceUid', value));\n }\n\n authServiceEnabled(value: $PropertyType) {\n return new Builder(this.value.set('authServiceEnabled', value));\n }\n\n accountStatus(value: $PropertyType) {\n return new Builder(this.value.set('accountStatus', value));\n }\n\n build() {\n const {\n id,\n username,\n fullName,\n email,\n roles,\n readOnly,\n external,\n sessionActive,\n clientAddress,\n lastActivity,\n enabled,\n authServiceId,\n authServiceUid,\n authServiceEnabled,\n accountStatus,\n } = this.value.toObject();\n\n return new UserOverview(\n id,\n username,\n fullName,\n email,\n roles,\n readOnly,\n external,\n sessionActive,\n clientAddress,\n lastActivity,\n enabled,\n authServiceId,\n authServiceUid,\n authServiceEnabled,\n accountStatus,\n );\n }\n}\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as Immutable from 'immutable';\nimport type { $PropertyType } from 'utility-types';\n\nimport type { DirectoryServiceAuthenticationService } from 'components/authentication/types';\nimport { getAuthServicePlugin } from 'util/AuthenticationService';\nimport type { DirectoryServiceBackendConfig } from 'logic/authentication/directoryServices/types';\nimport type { OktaBackendConfig } from 'logic/authentication/okta/types';\n\ntype InternalState = {\n id: string,\n title: string,\n description: string,\n defaultRoles: Immutable.List,\n config: DirectoryServiceBackendConfig | OktaBackendConfig,\n};\n\ntype TypedConfig = {\n type: string,\n};\n\nexport type AuthenticationBackendJSON = {\n id: string,\n title: string,\n description: string,\n default_roles: Array,\n config: DirectoryServiceBackendConfig | OktaBackendConfig,\n};\n\nconst configFromJson = (config: $PropertyType) => {\n const authService = getAuthServicePlugin((config as TypedConfig).type, true);\n\n if (authService && typeof authService.configFromJson === 'function') {\n return (authService as DirectoryServiceAuthenticationService).configFromJson(config);\n }\n\n return config;\n};\n\nconst configToJson = (config: $PropertyType) => {\n const authService = getAuthServicePlugin((config as TypedConfig).type, true);\n\n if (authService && typeof authService.configToJson === 'function') {\n return authService.configToJson(config);\n }\n\n return config;\n};\n\nexport default class AuthenticationBackend {\n _value: InternalState;\n\n constructor(\n id: $PropertyType,\n title: $PropertyType,\n description: $PropertyType,\n defaultRoles: $PropertyType,\n config: $PropertyType,\n ) {\n this._value = {\n id,\n title,\n description,\n defaultRoles,\n config,\n };\n }\n\n get id(): $PropertyType {\n return this._value.id;\n }\n\n get title(): $PropertyType {\n return this._value.title;\n }\n\n get description(): $PropertyType {\n return this._value.description;\n }\n\n get defaultRoles(): $PropertyType {\n return this._value.defaultRoles;\n }\n\n get config(): $PropertyType {\n return this._value.config;\n }\n\n toBuilder(): Builder {\n const {\n id,\n title,\n description,\n defaultRoles,\n config,\n } = this._value;\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return new Builder(Immutable.Map({\n id,\n title,\n description,\n defaultRoles,\n config,\n }));\n }\n\n toJSON() {\n const {\n id,\n title,\n description,\n defaultRoles = Immutable.List(),\n config,\n } = this._value;\n\n const formattedConfig = configToJson(config);\n\n return {\n id,\n title,\n description,\n default_roles: defaultRoles.toJS(),\n config: formattedConfig,\n };\n }\n\n static fromJSON(value: AuthenticationBackendJSON) {\n const {\n id,\n title,\n description,\n default_roles: defaultRoles,\n config,\n } = value;\n\n const formattedConfig = configFromJson(config);\n\n return new AuthenticationBackend(\n id,\n title,\n description,\n Immutable.List(defaultRoles),\n formattedConfig,\n );\n }\n\n static builder(): Builder {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return new Builder();\n }\n}\n\ntype InternalBuilderState = Immutable.Map;\n\nclass Builder {\n value: InternalBuilderState;\n\n constructor(value: InternalBuilderState = Immutable.Map()) {\n this.value = value;\n }\n\n id(value: $PropertyType): Builder {\n return new Builder(this.value.set('id', value));\n }\n\n title(value: $PropertyType): Builder {\n return new Builder(this.value.set('title', value));\n }\n\n description(value: $PropertyType): Builder {\n return new Builder(this.value.set('description', value));\n }\n\n defaultRoles(value: $PropertyType): Builder {\n return new Builder(this.value.set('defaultRoles', value));\n }\n\n config(value: $PropertyType): Builder {\n return new Builder(this.value.set('config', value));\n }\n\n build(): AuthenticationBackend {\n const {\n id,\n title,\n description,\n defaultRoles,\n config,\n } = this.value.toObject();\n\n return new AuthenticationBackend(\n id,\n title,\n description,\n defaultRoles,\n config,\n );\n }\n}\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport Reflux from 'reflux';\nimport * as Immutable from 'immutable';\n\nimport AuthenticationBackend from 'logic/authentication/AuthenticationBackend';\nimport { qualifyUrl } from 'util/URLUtils';\nimport fetch, { Builder } from 'logic/rest/FetchProvider';\nimport { singletonStore, singletonActions } from 'logic/singleton';\nimport PaginationURL from 'util/PaginationURL';\nimport type { PaginatedUsers } from 'stores/users/UsersStore';\nimport type { PaginatedResponseType, Pagination, PaginatedList } from 'stores/PaginationTypes';\nimport type { AuthenticationBackendJSON } from 'logic/authentication/AuthenticationBackend';\nimport ApiRoutes from 'routing/ApiRoutes';\nimport type { UserOverviewJSON } from 'logic/users/UserOverview';\nimport UserOverview from 'logic/users/UserOverview';\n\nexport type AuthenticationBackendCreate = {\n title: AuthenticationBackendJSON['title'],\n description: AuthenticationBackendJSON['description'],\n config: {\n type: string,\n },\n};\n\nexport type AuthenticationBackendUpdate = {\n id: AuthenticationBackendJSON['id'],\n title: AuthenticationBackendJSON['title'],\n description: AuthenticationBackendJSON['description'],\n config: {\n type: string,\n },\n};\n\nexport type PaginatedBackends = PaginatedList & {\n context: {\n activeBackend: AuthenticationBackendJSON | undefined | null,\n },\n};\n\nexport type ConnectionTestPayload = {\n backend_configuration: AuthenticationBackendCreate,\n backend_id: string | undefined | null,\n};\nexport type ConnectionTestResult = {\n success: boolean,\n message: string,\n errors: Array,\n};\nexport type LoginTestPayload = {\n backend_id: string | undefined | null,\n backend_configuration: AuthenticationBackendCreate,\n user_login: {\n username: string,\n password: string,\n },\n};\n\nexport type LoginTestResult = {\n success: boolean,\n message: string,\n errors: Array,\n result: {\n user_exists: boolean,\n login_success: boolean,\n user_details: {\n dn: string,\n entryUUID: string,\n uid: string,\n cn: string,\n email: string,\n },\n },\n};\n\nexport type LoadResponse = {\n backend: AuthenticationBackend | undefined | null,\n};\n\nexport type LoadActiveResponse = LoadResponse & {\n context: {\n backendsTotal: number,\n },\n};\n\nexport type ActionsType = {\n create: (AuthenticationBackendCreate) => Promise,\n delete: (authBackendId: AuthenticationBackend['id'] | undefined | null, authBackendTitle: AuthenticationBackend['title']) => Promise,\n load: (id: string) => Promise,\n loadActive: () => Promise,\n loadBackendsPaginated: (pagination: Pagination) => Promise,\n loadUsersPaginated: (authBackendId: string, pagination: Pagination) => Promise,\n loadActiveBackendType: () => Promise,\n setActiveBackend: (authBackendId: AuthenticationBackend['id'] | undefined | null, authBackendTitle: AuthenticationBackend['title']) => Promise,\n testConnection: (payload: ConnectionTestPayload) => Promise,\n testLogin: (payload: LoginTestPayload) => Promise,\n update: (id: string, AuthenticationBackendUpdate) => Promise,\n};\n\nexport const AuthenticationActions = singletonActions(\n 'Authentication',\n () => Reflux.createActions({\n create: { asyncResult: true },\n delete: { asyncResult: true },\n load: { asyncResult: true },\n loadActive: { asyncResult: true },\n loadBackendsPaginated: { asyncResult: true },\n loadUsersPaginated: { asyncResult: true },\n loadActiveBackendType: { asyncResult: true },\n setActiveBackend: { asyncResult: true },\n testConnection: { asyncResult: true },\n testLogin: { asyncResult: true },\n update: { asyncResult: true },\n }),\n);\n\ntype PaginatedBackendsResponse = PaginatedResponseType & {\n context: {\n active_backend: AuthenticationBackendJSON | null | undefined,\n },\n backends: Array,\n};\n\ntype PaginatedUsersResponse = PaginatedResponseType & {\n users: Array,\n};\n\nexport const AuthenticationStore = singletonStore(\n 'Authentication',\n () => Reflux.createStore<{ authenticators: any }>({\n listenables: [AuthenticationActions],\n\n getInitialState() {\n return {\n authenticators: null,\n };\n },\n\n create(authBackend: AuthenticationBackendCreate): Promise {\n const url = qualifyUrl(ApiRoutes.AuthenticationController.create().url);\n const promise = fetch('POST', url, authBackend).then((result) => (result ? {\n backend: AuthenticationBackend.fromJSON(result.backend),\n } : null));\n AuthenticationActions.create.promise(promise);\n\n return promise;\n },\n\n load(backendId: string): Promise {\n const url = qualifyUrl(ApiRoutes.AuthenticationController.load(encodeURIComponent(backendId)).url);\n const promise = fetch('GET', url).then((result) => (result ? {\n backend: AuthenticationBackend.fromJSON(result.backend),\n } : null));\n\n AuthenticationActions.load.promise(promise);\n\n return promise;\n },\n\n loadActive(): Promise {\n const url = qualifyUrl(ApiRoutes.AuthenticationController.loadActive().url);\n const promise = fetch('GET', url).then((result) => (result ? {\n backend: result.backend ? AuthenticationBackend.fromJSON(result.backend) : null,\n context: { backendsTotal: result.context.backends_total },\n } : null));\n\n AuthenticationActions.loadActive.promise(promise);\n\n return promise;\n },\n\n update(backendId: null | undefined | AuthenticationBackend['id'], payload: AuthenticationBackendUpdate): Promise {\n const url = qualifyUrl(ApiRoutes.AuthenticationController.update(backendId).url);\n const promise = fetch('PUT', url, payload).then((result) => (result ? {\n backend: AuthenticationBackend.fromJSON(result.backend),\n } : null));\n\n AuthenticationActions.update.promise(promise);\n\n return promise;\n },\n\n delete(backendId: null | undefined | AuthenticationBackend['id']): Promise {\n const url = qualifyUrl(ApiRoutes.AuthenticationController.delete(backendId).url);\n const promise = fetch('DELETE', url);\n AuthenticationActions.delete.promise(promise);\n\n return promise;\n },\n\n testConnection(payload: ConnectionTestPayload): Promise {\n const url = qualifyUrl(ApiRoutes.AuthenticationController.testConnection().url);\n const promise = fetch('POST', url, payload);\n AuthenticationActions.testConnection.promise(promise);\n\n return promise;\n },\n\n testLogin(payload: LoginTestPayload): Promise {\n const url = qualifyUrl(ApiRoutes.AuthenticationController.testLogin().url);\n const promise = fetch('POST', url, payload);\n AuthenticationActions.testLogin.promise(promise);\n\n return promise;\n },\n\n setActiveBackend(backendId: null | undefined | AuthenticationBackend['id']): Promise {\n const url = qualifyUrl(ApiRoutes.AuthenticationController.updateConfiguration().url);\n const promise = fetch('POST', url, { active_backend: backendId });\n AuthenticationActions.setActiveBackend.promise(promise);\n\n return promise;\n },\n\n loadBackendsPaginated({ page, perPage, query }: Pagination): Promise {\n const url = PaginationURL(ApiRoutes.AuthenticationController.servicesPaginated().url, page, perPage, query);\n const promise = fetch('GET', qualifyUrl(url))\n .then((response: PaginatedBackendsResponse) => ({\n context: {\n activeBackend: response.context.active_backend,\n },\n list: Immutable.List(response.backends.map((backend) => AuthenticationBackend.fromJSON(backend))),\n pagination: {\n page: response.page,\n perPage: response.per_page,\n query: response.query,\n count: response.count,\n total: response.total,\n },\n }));\n\n AuthenticationActions.loadBackendsPaginated.promise(promise);\n\n return promise;\n },\n\n loadUsersPaginated(authBackendId, { page, perPage, query }: Pagination): Promise {\n const url = PaginationURL(ApiRoutes.AuthenticationController.loadUsersPaginated(authBackendId).url, page, perPage, query);\n\n const promise = fetch('GET', qualifyUrl(url))\n .then((response: PaginatedUsersResponse) => ({\n list: Immutable.List(response.users.map((user) => UserOverview.fromJSON(user))),\n pagination: {\n page: response.page,\n perPage: response.per_page,\n query: response.query,\n count: response.count,\n total: response.total,\n },\n adminUser: undefined,\n }));\n\n AuthenticationActions.loadUsersPaginated.promise(promise);\n\n return promise;\n },\n\n loadActiveBackendType(): Promise {\n const url = qualifyUrl(ApiRoutes.AuthenticationController.loadActiveBackendType().url);\n\n // no authentication required\n const promise = new Builder('GET', url)\n .build()\n .then((response) => response.json())\n .then((result: { backend: string | undefined }) => result.backend);\n\n AuthenticationActions.loadActiveBackendType.promise(promise);\n\n return promise;\n },\n }),\n);\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as Immutable from 'immutable';\nimport type { $PropertyType } from 'utility-types';\n\ntype InternalState = {\n id: string,\n name: string,\n description: string,\n permissions: Immutable.Set,\n readOnly: boolean,\n};\n\nexport type RoleJSON = {\n id: string,\n name: string,\n description: string,\n permissions: Immutable.Set,\n read_only: boolean,\n};\n\nexport default class Role {\n _value: InternalState;\n\n constructor(\n id: $PropertyType,\n name: $PropertyType,\n description: $PropertyType,\n permissions: $PropertyType,\n readOnly: $PropertyType,\n ) {\n this._value = {\n id,\n name,\n description,\n permissions,\n readOnly,\n };\n }\n\n get id() {\n return this._value.id;\n }\n\n get name() {\n return this._value.name;\n }\n\n get description() {\n return this._value.description;\n }\n\n get permissions() {\n return this._value.permissions;\n }\n\n get readOnly() {\n return this._value.readOnly;\n }\n\n toBuilder() {\n const {\n id,\n name,\n description,\n permissions,\n readOnly,\n } = this._value;\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return new Builder(Immutable.Map({\n id,\n name,\n description,\n permissions,\n readOnly,\n }));\n }\n\n static create(\n id: $PropertyType,\n name: $PropertyType,\n description: $PropertyType,\n permissions: $PropertyType,\n readOnly: $PropertyType,\n ) {\n return new Role(\n id,\n name,\n description,\n permissions,\n readOnly,\n );\n }\n\n toJSON() {\n const {\n id,\n name,\n description,\n permissions,\n readOnly,\n } = this._value;\n\n return {\n id,\n name,\n description,\n permissions,\n read_only: readOnly,\n };\n }\n\n static fromJSON(value: RoleJSON) {\n const {\n id,\n name,\n description,\n permissions,\n read_only: readOnly,\n } = value;\n\n return Role.create(\n id,\n name,\n description,\n permissions,\n readOnly,\n );\n }\n\n static builder(): Builder {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return new Builder();\n }\n}\n\ntype BuilderState = Immutable.Map;\n\nclass Builder {\n value: BuilderState;\n\n constructor(value: BuilderState = Immutable.Map()) {\n this.value = value;\n }\n\n id(value: $PropertyType) {\n return new Builder(this.value.set('id', value));\n }\n\n name(value: $PropertyType) {\n return new Builder(this.value.set('name', value));\n }\n\n description(value: $PropertyType) {\n return new Builder(this.value.set('description', value));\n }\n\n permissions(value: $PropertyType) {\n return new Builder(this.value.set('permissions', value));\n }\n\n readOnly(value: $PropertyType) {\n return new Builder(this.value.set('readOnly', value));\n }\n\n build() {\n const {\n id,\n name,\n description,\n permissions,\n readOnly,\n } = this.value.toObject();\n\n return new Role(\n id,\n name,\n description,\n permissions,\n readOnly,\n );\n }\n}\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport Reflux from 'reflux';\nimport type * as Immutable from 'immutable';\n\nimport type Role from 'logic/roles/Role';\nimport type UserOverview from 'logic/users/UserOverview';\nimport { singletonActions } from 'logic/singleton';\nimport type { PaginatedList, Pagination } from 'stores/PaginationTypes';\n\nexport type UserContext = {\n id: string,\n username: string,\n};\n\nexport type RoleContext = {\n users: { [key: string]: UserContext[] },\n};\n\nexport type PaginatedRoles = PaginatedList & {\n context: RoleContext,\n};\nexport type PaginatedUsers = PaginatedList;\n\nexport type ActionsType = {\n load: (roleId: string) => Promise,\n delete: (roleId: string, roleName: string) => Promise,\n addMembers: (roleId: string, usernames: Immutable.Set) => Promise,\n removeMember: (roleId: string, username: string) => Promise,\n loadUsersForRole: (roleId: string, roleName: string, pagination: Pagination) => Promise,\n loadRolesForUser: (username: string, pagination: Pagination) => Promise,\n loadRolesPaginated: (pagination: Pagination) => Promise,\n};\n\nconst AuthzRolesActions = singletonActions(\n 'AuthzRoles',\n () => Reflux.createActions({\n load: { asyncResult: true },\n delete: { asyncResult: true },\n addMembers: { asyncResult: true },\n removeMember: { asyncResult: true },\n loadUsersForRole: { asyncResult: true },\n loadRolesForUser: { asyncResult: true },\n loadRolesPaginated: { asyncResult: true },\n }),\n);\n\nexport default AuthzRolesActions;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport Reflux from 'reflux';\nimport * as Immutable from 'immutable';\nimport type { $PropertyType } from 'utility-types';\n\nimport type { PaginatedUsersResponse } from 'stores/users/UsersStore';\nimport type { Store } from 'stores/StoreTypes';\nimport fetch from 'logic/rest/FetchProvider';\nimport ApiRoutes from 'routing/ApiRoutes';\nimport { qualifyUrl } from 'util/URLUtils';\nimport { singletonStore } from 'logic/singleton';\nimport PaginationURL from 'util/PaginationURL';\nimport Role from 'logic/roles/Role';\nimport type { RoleJSON } from 'logic/roles/Role';\nimport type { PaginatedRoles, PaginatedUsers, RoleContext } from 'actions/roles/AuthzRolesActions';\nimport AuthzRolesActions from 'actions/roles/AuthzRolesActions';\nimport UserOverview from 'logic/users/UserOverview';\nimport type { PaginatedListJSON, Pagination } from 'stores/PaginationTypes';\n\nexport type PaginatedRolesResponse = PaginatedListJSON & {\n roles: Array,\n context?: RoleContext,\n};\n\nconst _responseToPaginatedList = ({\n count,\n total,\n page,\n per_page,\n query,\n roles = [],\n context = { users: undefined },\n}: PaginatedRolesResponse) => ({\n list: Immutable.List(roles.map((r) => Role.fromJSON(r))),\n pagination: {\n query,\n page,\n perPage: per_page,\n count,\n total,\n },\n context,\n});\n\nconst _responseToPaginatedUserList = ({ count, total, page, per_page, query, users }: PaginatedUsersResponse) => ({\n list: Immutable.List(users.map((u) => UserOverview.fromJSON(u))),\n pagination: {\n page,\n perPage: per_page,\n query,\n count,\n total,\n },\n});\n\nconst encodeApiUrl = (apiRoute: (...args: Array) => { url: string }, uriParams: Array = []): string => {\n const encodedUriParams = uriParams.map((param) => encodeURIComponent(param));\n\n return apiRoute(...encodedUriParams).url;\n};\n\nconst AuthzRolesStore: Store<{}> = singletonStore(\n 'AuthzRoles',\n () => Reflux.createStore({\n listenables: [AuthzRolesActions],\n\n load(roleId: $PropertyType): Promise {\n const url = qualifyUrl(encodeApiUrl(ApiRoutes.AuthzRolesController.load, [roleId]));\n const promise = fetch('GET', url).then(Role.fromJSON);\n\n AuthzRolesActions.load.promise(promise);\n\n return promise;\n },\n\n delete(roleId: string): Promise {\n const url = qualifyUrl(encodeApiUrl(ApiRoutes.AuthzRolesController.delete, [roleId]));\n const promise = fetch('DELETE', url);\n\n AuthzRolesActions.delete.promise(promise);\n\n return promise;\n },\n\n addMembers(roleId: string, usernames: Immutable.Set): Promise {\n const url = encodeApiUrl(ApiRoutes.AuthzRolesController.addMembers, [roleId]);\n const promise = fetch('PUT', qualifyUrl(url), usernames.toArray());\n\n AuthzRolesActions.addMembers.promise(promise);\n\n return promise;\n },\n\n removeMember(roleId: string, username: string): Promise {\n const url = encodeApiUrl(ApiRoutes.AuthzRolesController.removeMember, [roleId, username]);\n const promise = fetch('DELETE', qualifyUrl(url));\n\n AuthzRolesActions.removeMember.promise(promise);\n\n return promise;\n },\n\n loadUsersForRole(roleId: string, _roleName: string, {\n page,\n perPage,\n query,\n }: Pagination): Promise {\n const apiUrl = encodeApiUrl(ApiRoutes.AuthzRolesController.loadUsersForRole, [roleId]);\n const url = PaginationURL(apiUrl, page, perPage, query);\n\n const promise = fetch('GET', qualifyUrl(url))\n .then(_responseToPaginatedUserList);\n\n AuthzRolesActions.loadUsersForRole.promise(promise);\n\n return promise;\n },\n\n loadRolesForUser(username: string, { page, perPage, query }: Pagination): Promise {\n const apiUrl = encodeApiUrl(ApiRoutes.AuthzRolesController.loadRolesForUser, [username]);\n const url = PaginationURL(apiUrl, page, perPage, query);\n\n const promise = fetch('GET', qualifyUrl(url))\n .then(_responseToPaginatedList);\n\n AuthzRolesActions.loadRolesForUser.promise(promise);\n\n return promise;\n },\n\n loadRolesPaginated({ page, perPage, query }: Pagination): Promise {\n const apiUrl = encodeApiUrl(ApiRoutes.AuthzRolesController.list);\n const url = PaginationURL(apiUrl, page, perPage, query);\n\n const promise = fetch('GET', qualifyUrl(url))\n .then(_responseToPaginatedList);\n\n AuthzRolesActions.loadRolesPaginated.promise(promise);\n\n return promise;\n },\n }),\n);\n\nexport { AuthzRolesActions, AuthzRolesStore };\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport { PluginStore } from 'graylog-web-plugin/plugin';\n\nexport const getAuthServicePlugin = (type: string, throwError: boolean = false) => {\n const authServices = PluginStore.exports('authentication.services') || [];\n const authService = authServices.find((service) => service.name === type);\n\n if (!authService && throwError) {\n throw new Error(`Authentication service with type \"${type}\" not found.`);\n }\n\n return authService;\n};\n\nexport const getEnterpriseGroupSyncPlugin = () => {\n const authGroupSyncPlugins = PluginStore.exports('authentication.enterprise.directoryServices.groupSync');\n\n return authGroupSyncPlugins?.[0];\n};\n\nexport const getEnterpriseAuthenticationPlugin = () => {\n const authPlugins = PluginStore.exports('authentication.enterprise');\n\n return authPlugins?.[0];\n};\n","var baseAssignValue = require('./_baseAssignValue'),\n baseForOwn = require('./_baseForOwn'),\n baseIteratee = require('./_baseIteratee');\n\n/**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */\nfunction mapKeys(object, iteratee) {\n var result = {};\n iteratee = baseIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, iteratee(value, key, object), value);\n });\n return result;\n}\n\nmodule.exports = mapKeys;\n"],"names":["NAV_ITEMS","activeBackend","finishedLoading","servers","system_user_dn","system_user_password","transport_security","type","email_attributes","user_full_name_attribute","user_name_attribute","user_search_base","user_search_pattern","user_unique_id_attribute","verify_certificates","systemUserDn","systemUserPassword","transportSecurity","emailAttributes","userFullNameAttribute","userNameAttribute","userSearchBase","userSearchPattern","userUniqueIdAttribute","verifyCertificates","_pageTitle","authBackend","title","backendTitle","StringUtils","WizardPageHeader","useActiveBackend","pageTitle","AuthenticationPageNavigation","BackendActionLinks","DocsHelper","payload","formValues","serviceType","shouldUpdateGroupSync","enterpriseGroupSyncPlugin","notifyOnSuccess","UserNotification","notifyOnError","error","result","initialState","BackendWizardContext","singleton","STEP_KEY","FORM_VALIDATION","ServerUrl","ProtocolOptions","formRef","help","onSubmit","onSubmitAll","submitAllError","validateOnMount","setStepsState","stepsState","backendValidationErrors","backendHasPassword","pathname","useLocation","sendTelemetry","useSendTelemetry","_onTransportSecurityChange","event","values","setFieldValue","onChange","currentValue","newValue","defaultPort","defaultTlsPort","_onSubmitAll","validateForm","errors","isSubmitting","name","onBlur","value","e","StyledInputList","excludedFields","roles","rolesOptions","role","getInitalFormValues","selectedRoles","prepareSubmitPayload","GroupSyncForm","invalidStepKeys","stepKey","formRefs","handleSubmitAll","setActiveStepKey","NotificationContainer","Title","ErrorsList","theme","ConnectionErrors","message","_addRequiredRequestPayload","necessaryAttributes","authBackendMeta","loading","success","setConnectionStatus","_handleConnectionCheck","AuthenticationDomain","response","requestErrors","initialLoginStatus","testFinished","setLoginStatus","hasErrors","_handleLoginTest","username","password","key","StyledPanelGroup","props","activeKey","setActiveKey","FORMS_VALIDATION","SubmitAllError","backendId","_formatBackendValidationErrors","backendErrors","backendErrorStrings","errorArray","_value","_passwordPayload","_formatPayload","_prepareSubmitPayload","getUpdatedFormsValues","overrideFormValues","defaultRoles","description","serverHost","serverPort","_getInvalidStepKeys","newBackendValidationErrors","validation","groupSyncValidation","formValidation","fieldName","fieldValidation","setSubmitAllError","getSubmitPayload","validateSteps","history","_submit","Routes","_setDefaultCreateRole","defaultCreateRoleId","_loadRoles","setPaginatedRoles","getUnlimited","AuthzRolesDomain","BackendWizard","initialValues","initialStepKey","MatchingGroupsProvider","paginatedRoles","useHistory","wizardContextValue","_getUpdatedFormsValues","activeForm","_validateSteps","nextStepKey","_getSubmitPayload","_setActiveStepKey","steps","wizard","Wizard","AUTH_BACKEND_META","HELP","INITIAL_VALUES","groupSyncHelp","initialGroupSyncValues","backendGroupSyncIsActive","_optionalWizardProps","authenticationBackend","groupSyncFormValues","_handleSubmit","authenticationBackendId","serverUrls","server","SectionComponent","rolesList","defaultRolesIds","roleId","UserSyncSection","GroupSyncSection","GroupSyncSectionPlugin","groupSyncExcludedFields","groupFormValues","listenableActions","loadActiveResponse","setLoadActiveResponse","setFinishedLoading","_loadActive","unlistenActions","action","unlistenAction","Container","StyledButton","items","path","permissions","exactPathMatch","create","load","authBackendId","loadActive","update","_authBackendId","deleteBackend","authBackendTitle","testConnection","testLogin","setActiveBackend","loadBackendsPaginated","loadUsersPaginated","loadActiveBackendType","deleteAction","_roleId","roleName","addMembers","usernames","removeMember","loadUsersForRole","loadRolesForUser","loadRolesPaginated","UserOverview","id","fullName","email","readOnly","external","sessionActive","clientAddress","lastActivity","enabled","authServiceId","authServiceUid","authServiceEnabled","accountStatus","Builder","configFromJson","config","authService","configToJson","AuthenticationBackend","formattedConfig","AuthenticationActions","AuthenticationStore","url","ApiRoutes","promise","page","perPage","query","PaginationURL","backend","user","Role","_responseToPaginatedList","count","total","per_page","context","r","_responseToPaginatedUserList","users","u","encodeApiUrl","apiRoute","uriParams","encodedUriParams","param","AuthzRolesStore","_roleName","apiUrl","getAuthServicePlugin","throwError","service","getEnterpriseGroupSyncPlugin","authGroupSyncPlugins","getEnterpriseAuthenticationPlugin","authPlugins","baseAssignValue","baseForOwn","baseIteratee","mapKeys","object","iteratee","module"],"sourceRoot":""}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy