Skip to content
Merged
5 changes: 5 additions & 0 deletions admin-ui/app/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -837,6 +837,9 @@
"view_script_details": "View custom script details",
"add_new_user": "Add User",
"error_in_saving": "Error in saving.",
"partial_update_failure": "Some configurations failed to update. Please review and try again.",
"min_characters": "Minimum {{count}} characters",
"field_required": "This field is required",
"default_policy_store_is_used": "Admin UI is already using default policy-store for access control.",
"insufficient_token_read_permission": "Access to token data is not granted.",
"try_again_later": "Please try again later",
Expand Down Expand Up @@ -887,6 +890,8 @@
"user_updated_successfully": "User updated successfully",
"user_deleted_successfully": "User deleted successfully",
"password_changed_successfully": "Password changed successfully",
"persistence_config_load_failed": "Failed to load persistence configuration",
"persistence_config_load_failed_detail": "Could not load persistence configuration. LDAP-specific settings may not be applied correctly.",
"revokeUserSession": "The user's session will be revoked as one or more of the following fields have been modified: Password, Status, Admin Role.",
"device_deleted_successfully": "Device deleted successfully",
"service_status_up": "Service is running normally.",
Expand Down
3 changes: 3 additions & 0 deletions admin-ui/app/locales/es/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -839,6 +839,9 @@
"view_script_details": "Ver detalles del script personalizado",
"add_new_user": "Agregar Usuario",
"error_in_saving": "Error al guardar.",
"partial_update_failure": "Algunas configuraciones no se pudieron actualizar. Por favor, revise e intente de nuevo.",
"min_characters": "Mínimo {{count}} caracteres",
"field_required": "Este campo es obligatorio",
"try_again_later": "Por favor intente de nuevo más tarde",
"loading_attributes": "Cargando atributos",
"error_processiong_request": "Error al procesar la solicitud.",
Expand Down
3 changes: 3 additions & 0 deletions admin-ui/app/locales/fr/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -686,6 +686,9 @@
"add_asset": "Add Jans Asset",
"asset_document_error": "Document is mandatory.",
"add_configuration": "Ajouter une configuration",
"partial_update_failure": "Certaines configurations n'ont pas pu être mises à jour. Veuillez vérifier et réessayer.",
"min_characters": "Minimum {{count}} caractères",
"field_required": "Ce champ est obligatoire",
"credentials": "Credentials",
"view_configuration": "Afficher la configuration",
"new_role": "Nouveau rôle",
Expand Down
3 changes: 3 additions & 0 deletions admin-ui/app/locales/pt/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -681,6 +681,9 @@
"add_asset": "Add Jans Asset",
"asset_document_error": "Document is mandatory.",
"add_configuration": "Adicionar configuração",
"partial_update_failure": "Algumas configurações não puderam ser atualizadas. Por favor, revise e tente novamente.",
"min_characters": "Mínimo {{count}} caracteres",
"field_required": "Este campo é obrigatório",
"credentials": "Credenciais",
"view_configuration": "Ver Configuração",
"add_idp": "Adicionar IDP SAML",
Expand Down
51 changes: 28 additions & 23 deletions admin-ui/plugins/auth-server/components/AuthN/AuthNListPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import React, {
} from 'react'
import MaterialTable, { type Action, type Column } from '@material-table/core'
import { Paper } from '@mui/material'
import { useSelector, useDispatch } from 'react-redux'
import { useSetAtom } from 'jotai'
import { useAppNavigation, ROUTES } from '@/helpers/navigation'
import { useCedarling } from '@/cedarling'
Expand All @@ -22,12 +21,11 @@ import SetTitle from 'Utils/SetTitle'
import { ThemeContext } from 'Context/theme/themeContext'
import getThemeColor from 'Context/theme/config'
import AuthNDetailPage from './AuthNDetailPage'
import { getLdapConfig } from 'Plugins/services/redux/features/ldapSlice'
import { useCustomScriptsByType } from 'Plugins/admin/components/CustomScripts/hooks'
import { DEFAULT_SCRIPT_TYPE } from 'Plugins/admin/components/CustomScripts/constants'
import { currentAuthNItemAtom, type AuthNItem } from './atoms'
import { BUILT_IN_ACRS } from './constants'
import { useGetAcrs } from 'JansConfigApi'
import { useGetAcrs, useGetConfigDatabaseLdap, type GluuLdapConfiguration } from 'JansConfigApi'

const PAGE_SIZE = 10

Expand All @@ -40,17 +38,9 @@ interface ListState {
scripts: AuthNItem[]
}

interface RootState {
ldapReducer: {
ldap: AuthNItem[]
loading: boolean
}
}

function AuthNListPage({ isBuiltIn = false }: AuthNListPageProps): ReactElement {
const { hasCedarReadPermission, hasCedarWritePermission, authorizeHelper } = useCedarling()
const { t } = useTranslation()
const dispatch = useDispatch()
const setCurrentItem = useSetAtom(currentAuthNItemAtom)
const [myActions, setMyActions] = useState<
Array<Action<AuthNItem> | ((rowData: AuthNItem) => Action<AuthNItem>)>
Expand All @@ -66,8 +56,9 @@ function AuthNListPage({ isBuiltIn = false }: AuthNListPageProps): ReactElement
scripts: [],
})

const ldap = useSelector((state: RootState) => state.ldapReducer.ldap)
const loading = useSelector((state: RootState) => state.ldapReducer.loading)
const { data: ldapConfigurations = [], isLoading: ldapLoading } = useGetConfigDatabaseLdap({
query: { staleTime: 30000 },
})

// Fetch ACR config using Orval hook
const { data: acrs, isLoading: acrsLoading } = useGetAcrs({
Expand Down Expand Up @@ -105,8 +96,7 @@ function AuthNListPage({ isBuiltIn = false }: AuthNListPageProps): ReactElement

useEffect(() => {
authorizeHelper(authNScopes)
dispatch(getLdapConfig())
}, [authorizeHelper, authNScopes, dispatch])
}, [authorizeHelper, authNScopes])

// Actions as state that will rebuild when permissions change
useEffect(() => {
Expand All @@ -131,21 +121,36 @@ function AuthNListPage({ isBuiltIn = false }: AuthNListPageProps): ReactElement
setMyActions(newActions)
}, [canWriteAuthN, t, handleGoToAuthNEditPage])

const mapLdapToAuthNItem = useCallback(
(config: GluuLdapConfiguration): AuthNItem => ({
configId: config.configId,
bindDN: config.bindDN,
bindPassword: config.bindPassword,
servers: config.servers,
maxConnections: config.maxConnections,
useSSL: config.useSSL,
baseDNs: config.baseDNs,
primaryKey: config.primaryKey,
localPrimaryKey: config.localPrimaryKey,
enabled: config.enabled,
level: config.level,
name: 'default_ldap_password',
acrName: config.configId,
}),
[],
)

useEffect(() => {
setList((prevList) => ({ ...prevList, ldap: [] }))

if (ldap.length > 0 && !loading) {
const enabledLdap = ldap.filter((item) => item.enabled === true)
if (ldapConfigurations.length > 0 && !ldapLoading) {
const enabledLdap = ldapConfigurations.filter((item) => item.enabled === true)
if (enabledLdap.length > 0) {
const updateLDAPItems = enabledLdap.map((item) => ({
...item,
name: 'default_ldap_password',
acrName: item.configId,
}))
const updateLDAPItems = enabledLdap.map(mapLdapToAuthNItem)
setList((prevList) => ({ ...prevList, ldap: updateLDAPItems }))
}
}
}, [ldap, loading])
}, [ldapConfigurations, ldapLoading, mapLdapToAuthNItem])

useEffect(() => {
setList((prevList) => ({ ...prevList, scripts: [] }))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import React from 'react'
import React, { ReactElement } from 'react'
import { FormGroup, Card, Col, CardBody } from 'Components'
import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow'
import { CACHE } from 'Utils/ApiResources'
import { useTranslation } from 'react-i18next'
import PropTypes from 'prop-types'
import type { CacheInMemoryProps } from './types'

function CacheInMemory({ formik }) {
function CacheInMemory({ formik }: CacheInMemoryProps): ReactElement {
const { t } = useTranslation()
return (
<Card>
Expand All @@ -31,6 +31,3 @@ function CacheInMemory({ formik }) {
}

export default CacheInMemory
CacheInMemory.propTypes = {
formik: PropTypes.object,
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import React, { useContext } from 'react'
import React, { useContext, ReactElement } from 'react'
import { Badge, FormGroup, Card, Col, CardBody, CustomInput } from 'Components'
import GluuLabel from 'Routes/Apps/Gluu/GluuLabel'
import { CACHE } from 'Utils/ApiResources'
import GluuTooltip from 'Routes/Apps/Gluu/GluuTooltip'
import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow'
import { useTranslation } from 'react-i18next'
import { ThemeContext } from 'Context/theme/themeContext'
import PropTypes from 'prop-types'
import type { CacheMemcachedProps } from './types'

function CacheMemcached({ config, formik }) {
function CacheMemcached({ config, formik }: CacheMemcachedProps): ReactElement {
const { t } = useTranslation()
const theme = useContext(ThemeContext)
const selectedTheme = theme.state.theme
const selectedTheme = theme?.state?.theme || 'darkBlue'

return (
<Card>
Expand Down Expand Up @@ -77,7 +77,3 @@ function CacheMemcached({ config, formik }) {
}

export default CacheMemcached
CacheMemcached.propTypes = {
formik: PropTypes.object,
config: PropTypes.any,
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import React from 'react'
import React, { ReactElement } from 'react'
import { FormGroup, Card, Col, CardBody } from 'Components'
import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow'
import GluuToogleRow from 'Routes/Apps/Gluu/GluuToogleRow'
import { CACHE } from 'Utils/ApiResources'
import { useTranslation } from 'react-i18next'
import PropTypes from 'prop-types'
import type { CacheNativeProps } from './types'

function CacheNative({ formik }) {
function CacheNative({ formik }: CacheNativeProps): ReactElement {
const { t } = useTranslation()
return (
<Card>
Expand Down Expand Up @@ -51,6 +51,3 @@ function CacheNative({ formik }) {
}

export default CacheNative
CacheNative.propTypes = {
formik: PropTypes.object,
}
Loading
Loading