Skip to content
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
63ad577
feat: make cedarling config UI
kdhttps Oct 21, 2025
dd9909c
feat: add other language translation
kdhttps Oct 22, 2025
ae6e0c5
feat: add admin config api reducer
kdhttps Oct 23, 2025
3a16b18
feat: add form validation
kdhttps Oct 23, 2025
57c56f1
Merge branch 'main' of github.com:GluuFederation/flex into feat-2313-…
kdhttps Oct 27, 2025
077dbd9
chore: fix format
kdhttps Oct 27, 2025
4fe77b4
feat: add config saga
kdhttps Oct 28, 2025
b2e7f4a
feat: edit config
kdhttps Oct 30, 2025
ec2e56e
feat: use react query and remove saga
kdhttps Oct 31, 2025
c092ac0
feat: update translation
kdhttps Oct 31, 2025
1b5e6d0
Merge branch 'main' of github.com:GluuFederation/flex into feat-2313-…
kdhttps Nov 3, 2025
13106fc
feat: add toast and audit log
kdhttps Nov 3, 2025
501dc0b
feat: set remote policy store as default
kdhttps Nov 3, 2025
0e49977
fix: add code rabbit changes
kdhttps Nov 4, 2025
febcfc3
fix: add code rabbit changes
kdhttps Nov 4, 2025
15fa453
feat: role to scope mapping and PRP config
kdhttps Nov 5, 2025
6bbd7e8
refactor: remove add update operation on mapping
kdhttps Nov 5, 2025
718ea05
chore: update notes
kdhttps Nov 5, 2025
911dfa9
refactor: remove essential scope section
kdhttps Nov 5, 2025
f4a2c62
feat: update form and invalidate get query
kdhttps Nov 7, 2025
e6699a2
fix: addressed PR review changes
kdhttps Nov 7, 2025
1cb798e
fix: addressed PR review changes
kdhttps Nov 7, 2025
4ebd8df
refactor: update translations
kdhttps Nov 10, 2025
8e1edd5
refactor: remove role and capabilities page
kdhttps Nov 10, 2025
7f2d615
feat: add mapping notes in translation
kdhttps Nov 10, 2025
47625c8
refactor: PR review fixes
kdhttps Nov 10, 2025
7f3da04
docs: add cedarling config doc
kdhttps Nov 12, 2025
ff56cb8
docs: add policy store detaisl
kdhttps Nov 12, 2025
0010707
docs: rephase sentence
kdhttps Nov 12, 2025
e80cce5
docs: code review fixes
kdhttps Nov 12, 2025
799181d
docs: fix spelling mistake
kdhttps Nov 12, 2025
e84df41
fix: pushed arnab review changes
kdhttps Nov 12, 2025
4b5cf15
feat: check remote url empty
kdhttps Nov 12, 2025
59af644
fix: fix code review changes
kdhttps Nov 12, 2025
98f84f0
fix: Remove redundant checked props
kdhttps Nov 13, 2025
12c6407
refactor: remove docs content
kdhttps Nov 17, 2025
0979d9b
Merge branch 'main' into feat-2313-cedarling-ui
kdhttps Nov 17, 2025
c3e75a1
refactor: update review doc
kdhttps Nov 17, 2025
e529e1b
fix: arnab review changes
kdhttps Nov 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions admin-ui/app/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -620,7 +620,9 @@
"reloginToViewCedarlingChanges": "Please Re-login to view the cedarling changes.",
"allAvailableHintsSelected": "All available hint options are selected",
"noMatchingOptions": "No matching options",
"nothingToShowInTheList": "Nothing to show in the list"
"nothingToShowInTheList": "Nothing to show in the list",
"auiPolicyStoreUrl": "Admin UI Policy Store",
"configApiPolicyStoreUrl": "Config API Policy Store"
},
"languages": {
"french": "French",
Expand Down Expand Up @@ -653,7 +655,8 @@
"securityDropdown": {
"adminUiRoles": "Admin UI Roles",
"capabilities": "Capabilities",
"mapping": "Mapping"
"mapping": "Mapping",
"cedarlingConfig": "Cedarling"
},
"basic_configuration": "Basic Configuration",
"inum_configuration": "Inum Configuration",
Expand Down Expand Up @@ -972,6 +975,7 @@
"jwk_keys": "JWK keys",
"jans_json_property": "Properties",
"mapping": "Role/Permission Mapping",
"cedarling_config": "Cedarling Configuration",
"modules_properties": "Module Properties",
"oauth_server_status_title": "OAuth server status",
"oidc_clients": "OpenID Connect Clients",
Expand Down Expand Up @@ -1740,6 +1744,13 @@
"enabled": "SAML functionality enabled.",
"selectedIdp": "Selected SAML server.",
"ignoreValidation": "Boolean value to enable/disable SAML validation."
},
"cedarlingConfig": {
"title": "Configure fine-grained control using Cedarling",
"point1": "1. Create a policy store using Agama Lab. Fork project",
"point2": "2. Copy PolicyStore URL and configure.",
"note": "Note: This will help you to create your own cedarling project. You can update roles and permissions using",
"localPoliciesNote:": "Note: Recommended to set ON for production. If on, it will fetch policies from above URLs, store them in DB, and use them for Cedarling authorization."
}
}
}
15 changes: 13 additions & 2 deletions admin-ui/app/locales/es/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -620,7 +620,9 @@
"reloginToViewCedarlingChanges": "Por favor, vuelve a iniciar sesión para ver los cambios de Cedarling.",
"allAvailableHintsSelected": "Todas las opciones de sugerencia disponibles están seleccionadas",
"noMatchingOptions": "No hay opciones coincidentes",
"nothingToShowInTheList": "Nada que mostrar en la lista"
"nothingToShowInTheList": "Nada que mostrar en la lista",
"auiPolicyStoreUrl": "Tienda de políticas de la interfaz de usuario del administrador",
"configApiPolicyStoreUrl": "Almacén de políticas de la API de configuración"
},
"languages": {
"french": "Frances",
Expand Down Expand Up @@ -653,7 +655,8 @@
"securityDropdown": {
"adminUiRoles": "Roles de la Interfaz de Administración",
"capabilities": "Capacidades",
"mapping": "Mapeo"
"mapping": "Mapeo",
"cedarlingConfig": "Cedarling"
},
"basic_configuration": "Configuración Básica",
"inum_configuration": "Configuración Inum",
Expand Down Expand Up @@ -965,6 +968,7 @@
"jwk_keys": "Claves JWK",
"jans_json_property": "Propiedades",
"mapping": "Mapeo Rol/Permiso",
"cedarling_config": "Configuración de Cedarling",
"modules_properties": "Propiedades del módulo",
"oauth_server_status_title": "Estado del servidor OAuth",
"oidc_clients": "Clientes OpenID Connect",
Expand Down Expand Up @@ -1733,6 +1737,13 @@
"enabled": "Funcionalidad SAML habilitada",
"selectedIdp": "Servidor SAML seleccionado",
"ignoreValidation": "Valor booleano para habilitar/deshabilitar validación SAML"
},
"cedarlingConfig": {
"title": "Configurar un control detallado mediante Cedarling",
"point1": "1. Crear un almacén de políticas con Agama Lab. Bifurcar proyecto.",
"point2": "2. Copie la URL de PolicyStore y configúrela.",
"note": "Nota: Esto te ayudará a crear tu propio proyecto de Cedarling. Puedes actualizar roles y permisos usando",
"localPoliciesNote:": "Nota: Se recomienda activarlo en producción. Si está activado, se obtendrán las políticas de las URL anteriores, se almacenarán en la base de datos y se usarán para la autorización de Cedarling."
}
},
"validations": {
Expand Down
15 changes: 13 additions & 2 deletions admin-ui/app/locales/fr/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@
"securityDropdown": {
"adminUiRoles": "Rôles de l'interface utilisateur d'administration",
"capabilities": "Capacités",
"mapping": "Mapping"
"mapping": "Mapping",
"cedarlingConfig": "Cèdre"
},
"lock": "Verrouillage",
"cache": "Cacher",
Expand Down Expand Up @@ -653,7 +654,9 @@
"noMatchingOptions": "Aucune option correspondante",
"nothingToShowInTheList": "Rien à montrer dans la liste",
"disable_logger_timer": "Désactiver le Minuteur du Journal",
"skip_defined_password_validation": "Ignorer la Validation du Mot de Passe Défini"
"skip_defined_password_validation": "Ignorer la Validation du Mot de Passe Défini",
"auiPolicyStoreUrl": "Magasin de politiques de l'interface utilisateur d'administration",
"configApiPolicyStoreUrl": "Magasin de politiques de configuration de l'API"
},
"messages": {
"add_permission": "Ajouter une autorisation",
Expand Down Expand Up @@ -863,6 +866,7 @@
"loading_database_information": "Chargement des informations de la base de données...",
"jans_json_property": "Propriétés",
"all_oidc_clients": "Tous les clients OIDC",
"cedarling_config": "Configuration Cedarling",
"jans_kc_link": "Lien KC Jans",
"all_scopes": "Toutes les portées",
"idp": "IDP",
Expand Down Expand Up @@ -1588,6 +1592,13 @@
"description": "Description de la permission",
"tag": "Nom-de-la-balise pour identifier l'autorisation à inclure dans le jeton d'accès à l'API.",
"default_permission_in_token": "Si défini sur vrai, l'autorisation sera disponible par défaut dans le jeton d'autorisation pour accéder à l'API (avant l'authentification)."
},
"cedarlingConfig": {
"title": "Configurer un contrôle précis à l'aide de Cedarling",
"point1": "1. Créer un magasin de politiques avec Agama Lab. Projet Fork",
"point2": "2. Copiez l'URL de PolicyStore et configurez-la.",
"note": "Remarque : Ceci vous aidera à créer votre propre projet Cedarling. Vous pouvez modifier les rôles et les autorisations via",
"localPoliciesNote:": "Remarque : Il est recommandé d'activer cette option pour la production. Si elle est activée, les politiques seront récupérées à partir des URL ci-dessus, stockées dans la base de données et utilisées pour l'autorisation Cedarling."
}
},
"script": {
Expand Down
15 changes: 13 additions & 2 deletions admin-ui/app/locales/pt/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@
"securityDropdown": {
"adminUiRoles": "Funções da interface do administrador",
"capabilities": "Capacidades",
"mapping": "Mapeamento"
"mapping": "Mapeamento",
"cedarlingConfig": "Cedarling"
},
"lock": "Trancar",
"cache": "Cache",
Expand Down Expand Up @@ -648,7 +649,9 @@
"noMatchingOptions": "Nenhuma opção correspondente",
"nothingToShowInTheList": "Nada a mostrar na lista",
"disable_logger_timer": "Desativar Temporizador de Logs",
"skip_defined_password_validation": "Pular Validação de Senha Definida"
"skip_defined_password_validation": "Pular Validação de Senha Definida",
"auiPolicyStoreUrl": "Política de armazenamento da interface de administração",
"configApiPolicyStoreUrl": "Política de armazenamento da API de configuração"
},
"messages": {
"add_permission": "Adicionar permissão",
Expand Down Expand Up @@ -851,6 +854,7 @@
"all_attributes": "Todos os Atributos",
"all_custom_scripts": "Todos os scripts personalizados",
"jans_json_property": "Propriedades",
"cedarling_config": "Configuração Cedarling",
"jans_lock": "Trava Jans",
"config_api_configuration": "Configuração da API de Configuração",
"database_information": "Informações do Banco de Dados",
Expand Down Expand Up @@ -1582,6 +1586,13 @@
},
"authn": {
"acr": "Référence de classe de contexte d'authentification"
},
"cedarlingConfig": {
"title": "Configurar o controlo refinado usando Cedarling",
"point1": "1. Crie um repositório de políticas utilizando o Agama Lab. Fork Project",
"point2": "2.º Copie o URL do PolicyStore e configure.",
"note": "Nota: isto irá ajudá-lo a criar o seu próprio projeto cedarling. Pode atualizar funções e permissões usando",
"localPoliciesNote:": "Nota: Recomenda-se ativar a opção para produção. Se ativado, o sistema irá procurar políticas dos URLs acima, armazená-las na base de dados e utilizá-las para autorização do Cedarling."
}
},
"script": {
Expand Down
213 changes: 213 additions & 0 deletions admin-ui/plugins/admin/components/Cedarling/CedarlingConfigPage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
import React, { useEffect, useState } from 'react'
import {
Button,
Card,
CardBody,
FormGroup,
CardTitle,
CardText,
Form,
Input,
Col,
} from 'Components'
import { useTranslation } from 'react-i18next'
import SetTitle from 'Utils/SetTitle'
import GluuLabel from '@/routes/Apps/Gluu/GluuLabel'
import { useDispatch, useSelector } from 'react-redux'
import { PROPERTIES_DELETE, PROPERTIES_READ, PROPERTIES_WRITE } from '@/utils/PermChecker'
import { useCedarling } from '@/cedarling'
import {
useGetAdminuiConf,
useEditAdminuiConf,
useSetRemotePolicyStoreAsDefault,
} from 'JansConfigApi'
import GluuLoader from '@/routes/Apps/Gluu/GluuLoader'
import type { AppConfigResponse } from 'JansConfigApi'
import { updateToast } from '@/redux/features/toastSlice'
import { getErrorMessage } from 'Plugins/schema/utils/errorHandler'
import { logAudit } from '@/utils/AuditLogger'
import type { RootState } from '@/redux/sagas/types/audit'
import { UPDATE } from '@/audit/UserActionType'
import { IconButton } from '@mui/material'
import { RefreshOutlined } from '@mui/icons-material'

const CedarlingConfigPage: React.FC = () => {
const { authorize } = useCedarling()
const { t } = useTranslation()
SetTitle(t('titles.cedarling_config'))
const [auiPolicyStoreUrl, setAuiPolicyStoreUrl] = useState('')
const [configApiPolicyStoreUrl, setConfigApiPolicyStoreUrl] = useState('')
const { data: auiConfig, isLoading, isSuccess } = useGetAdminuiConf()
const editAdminuiConfMutation = useEditAdminuiConf()
const setRemotePolicyStoreAsDefaultMutation = useSetRemotePolicyStoreAsDefault()
const token: string | undefined = useSelector(
(state: RootState) => state.authReducer?.token?.access_token,
)
const userinfo: RootState['authReducer']['userinfo'] | undefined = useSelector(
(state: RootState) => state.authReducer?.userinfo,
)
const client_id: string | undefined = useSelector(
(state: RootState) => state.authReducer?.config?.clientId,
)

const dispatch = useDispatch()

const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault()
const requestData = {
auiPolicyStoreUrl,
useRemotePolicyStore: true,
}

try {
const editAppConfigResponse: AppConfigResponse = await editAdminuiConfMutation.mutateAsync({
data: { ...auiConfig, ...requestData },
})
console.log('Edit Response:', editAppConfigResponse)
setAuiPolicyStoreUrl(editAppConfigResponse?.auiPolicyStoreUrl || '')
dispatch(updateToast(true, 'success'))

const userMessage: string = 'Policy Store URL configuration updated'
await logAudit({
token: token ?? undefined,
userinfo: userinfo ?? undefined,
action: UPDATE,
resource: 'update_admin_ui_config',
message: userMessage,
client_id: client_id,
payload: requestData,
})
} catch (error) {
console.error('Error updating Cedarling configuration:', error)
const errorMessage = getErrorMessage(error, 'messages.error_in_saving', t)
dispatch(updateToast(true, 'error', errorMessage))
}
}

const handleSetRemotePolicyStoreAsDefault = async (e: React.MouseEvent<HTMLButtonElement>) => {
e.preventDefault()

try {
const setPolicyDefaultResponse = await setRemotePolicyStoreAsDefaultMutation.mutateAsync()

console.log('Edit Response:', setPolicyDefaultResponse)
dispatch(updateToast(true, 'success'))

const userMessage: string = 'Set policy store as default'
await logAudit({
token: token ?? undefined,
userinfo: userinfo ?? undefined,
action: UPDATE,
resource: 'set_remote_policy_store_as_default',
message: userMessage,
client_id: client_id,
payload: {},
})
} catch (error) {
console.error('Error updating Cedarling configuration:', error)
const errorMessage = getErrorMessage(error, 'messages.error_in_saving', t)
dispatch(updateToast(true, 'error', errorMessage))
}
}

useEffect(() => {
const initPermissions = async () => {
const permissions = [PROPERTIES_READ, PROPERTIES_WRITE, PROPERTIES_DELETE]
for (const permission of permissions) {
await authorize([permission])
}
}
initPermissions()
}, [])

useEffect(() => {
if (isSuccess) {
setAuiPolicyStoreUrl(auiConfig?.auiPolicyStoreUrl || '')
}
}, [isSuccess])

return (
<GluuLoader blocking={isLoading}>
<Card className="shadow-sm align-items-center">
<Col sm="9">
<CardBody>
<CardTitle tag="h4" className="text-center fw-bold mb-4">
{t('documentation.cedarlingConfig.title')}
</CardTitle>

<Card className="bg-light border-0 p-3 mb-4">
<CardText className="text-center text-secondary">
{t('documentation.cedarlingConfig.point1')}{' '}
<a
href="https://github.com/kdhttps/admin-ui-cedarling-config"
target="_blank"
rel="noopener noreferrer"
>
AdminUICedarling
</a>
.
<br />
{t('documentation.cedarlingConfig.point2')}
</CardText>
<CardText className="text-center text-muted small">
{t('documentation.cedarlingConfig.note')}{' '}
<a
href="https://cloud.gluu.org/agama-lab"
target="_blank"
rel="noopener noreferrer"
>
Agama-Lab
</a>
.
</CardText>
</Card>

<Form onSubmit={handleSubmit}>
<FormGroup row>
<GluuLabel label={'fields.auiPolicyStoreUrl'} />
<Col sm={8}>
<Input
id="auiPolicyStoreUrl"
type="url"
name="auiPolicyStoreUrl"
value={auiPolicyStoreUrl}
onChange={(e) => setAuiPolicyStoreUrl(e.target.value)}
/>
</Col>
<Col sm={1}>
<IconButton
type="button"
aria-label="search"
onClick={handleSetRemotePolicyStoreAsDefault}
>
<RefreshOutlined />
</IconButton>
</Col>
</FormGroup>
<FormGroup row>
<GluuLabel label={'fields.configApiPolicyStoreUrl'} />
<Col sm={8}>
<Input
id="configApiPolicyStoreUrl"
type="url"
name="configApiPolicyStoreUrl"
value={configApiPolicyStoreUrl}
onChange={(e) => setConfigApiPolicyStoreUrl(e.target.value)}
/>
</Col>
</FormGroup>

<div className="text-center mt-4">
<Button color="dark" size="lg" type="submit">
{t('actions.apply')}
</Button>
</div>
</Form>
</CardBody>
</Col>
</Card>
</GluuLoader>
)
}

export default CedarlingConfigPage
Loading
Loading