Show details for error messages where they were missing (#32534)

Closes #32533

Signed-off-by: Alexander Schwartz <aschwart@redhat.com>
Signed-off-by: Jon Koops <jonkoops@gmail.com>
Co-authored-by: Jon Koops <jonkoops@gmail.com>
This commit is contained in:
Alexander Schwartz 2024-09-04 13:23:54 +02:00 committed by GitHub
parent 557d7e87b2
commit 4d1e1e0bcb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 150 additions and 123 deletions

View file

@ -187,7 +187,7 @@ searchByName=Buscar por nombre
executorTypeSwitchHelpText=Texto de ayuda del interruptor de tipo de ejecutor executorTypeSwitchHelpText=Texto de ayuda del interruptor de tipo de ejecutor
attributeConsumingServiceNameHelp=Nombre del perfil de Servicio de Consumo de Atributos para anunciar en los metadatos del SP. attributeConsumingServiceNameHelp=Nombre del perfil de Servicio de Consumo de Atributos para anunciar en los metadatos del SP.
overrideActionTokens=Sobreescribir tokens de acción overrideActionTokens=Sobreescribir tokens de acción
deleteGrantsError=Error al eliminar concesiones. deleteGrantsError=Error al eliminar concesiones: {{error}}
defaultGroupAdded_other=Se añadieron {{count}} grupos a los grupos predeterminados defaultGroupAdded_other=Se añadieron {{count}} grupos a los grupos predeterminados
used.SPECIFIC_CLIENTS=Clientes específicos used.SPECIFIC_CLIENTS=Clientes específicos
freeMemory=Memoria libre freeMemory=Memoria libre
@ -420,7 +420,7 @@ displayOnConsentScreen=Mostrar en la pantalla de consentimiento
noClientPolicies=Sin políticas de cliente noClientPolicies=Sin políticas de cliente
defaultAdminInitiatedActionLifespanHelp=Tiempo máximo antes de que un permiso de acción enviado a un usuario por un administrador caduque. Se recomienda que este valor sea largo para permitir a los administradores enviar correos electrónicos a usuarios que actualmente están desconectados. El tiempo de espera predeterminado se puede anular inmediatamente antes de emitir el token. defaultAdminInitiatedActionLifespanHelp=Tiempo máximo antes de que un permiso de acción enviado a un usuario por un administrador caduque. Se recomienda que este valor sea largo para permitir a los administradores enviar correos electrónicos a usuarios que actualmente están desconectados. El tiempo de espera predeterminado se puede anular inmediatamente antes de emitir el token.
syncUsersSuccess=Sincronización de usuarios finalizada con éxito. syncUsersSuccess=Sincronización de usuarios finalizada con éxito.
updatedCredentialMoveError=La configuración de credenciales de usuario no se ha guardado updatedCredentialMoveError=La configuración de credenciales de usuario no se ha guardado: {{error}}
searchForRoles=Buscar rol por nombre searchForRoles=Buscar rol por nombre
refresh=Actualizar refresh=Actualizar
roleDeletedSuccess=El rol ha sido eliminado roleDeletedSuccess=El rol ha sido eliminado
@ -563,7 +563,7 @@ jsonType.label=Tipo JSON de reclamación
fullScopeAllowed=Se permite el alcance completo fullScopeAllowed=Se permite el alcance completo
syncModes.inherit=Heredar syncModes.inherit=Heredar
masterSamlProcessingUrlHelp=Si está configurada, esta URL se utilizará para cada enlace tanto para el Consumidor de Aserciones del SP como para los Servicios de Cierre de Sesión Únicos. Esto se puede anular individualmente para cada enlace y servicio en la Configuración de Punto Final SAML de Grano Fino. masterSamlProcessingUrlHelp=Si está configurada, esta URL se utilizará para cada enlace tanto para el Consumidor de Aserciones del SP como para los Servicios de Cierre de Sesión Únicos. Esto se puede anular individualmente para cada enlace y servicio en la Configuración de Punto Final SAML de Grano Fino.
addedGroupMembershipError=Error al agregar la membresía del grupo addedGroupMembershipError=Error al agregar la membresía del grupo: {{error}}
authenticatorAttachment.platform=Plataforma authenticatorAttachment.platform=Plataforma
configSaveSuccess=Configuración guardada con éxito configSaveSuccess=Configuración guardada con éxito
regenerate=Regenerar regenerate=Regenerar
@ -737,7 +737,7 @@ eventTypes.EXECUTE_ACTIONS_ERROR.name=Error al ejecutar acciones.
path=Ruta. path=Ruta.
overwritten=Sobrescrito. overwritten=Sobrescrito.
mapperNameHelp=Nombre del mapeador. mapperNameHelp=Nombre del mapeador.
deleteProviderError=Error al eliminar el proveedor. deleteProviderError=Error al eliminar el proveedor: {{error}}
supportedLocalesHelp=Los idiomas admitidos para este reino. El usuario elige uno de estos idiomas en la pantalla de inicio de sesión. supportedLocalesHelp=Los idiomas admitidos para este reino. El usuario elige uno de estos idiomas en la pantalla de inicio de sesión.
comparisonHelp=Especifica el método de comparación usado para evaluar las clases o declaraciones de contexto solicitadas. El valor predeterminado es "Exacto". comparisonHelp=Especifica el método de comparación usado para evaluar las clases o declaraciones de contexto solicitadas. El valor predeterminado es "Exacto".
generatedIdTokenIsDisabled=El token ID generado está desactivado cuando no se selecciona ningún usuario. generatedIdTokenIsDisabled=El token ID generado está desactivado cuando no se selecciona ningún usuario.
@ -861,7 +861,7 @@ back=Atrás.
deleteScopeConfirm=Si eliminas este alcance de autorización, algunas permisiones se verán afectadas. deleteScopeConfirm=Si eliminas este alcance de autorización, algunas permisiones se verán afectadas.
updateOtpSuccess=Política OTP actualizada correctamente. updateOtpSuccess=Política OTP actualizada correctamente.
title=Autenticación. title=Autenticación.
deleteAttributeError=Atributo no eliminado. deleteAttributeError=Atributo no eliminado: {{error}}
enableClientSignatureRequiredExplain=Si habilitas "Firma del cliente requerida", el adaptador de este cliente se actualizará. Es posible que necesites descargar un nuevo adaptador para este cliente. Debes generar o importar claves para este cliente; de lo contrario, la autenticación no funcionará. enableClientSignatureRequiredExplain=Si habilitas "Firma del cliente requerida", el adaptador de este cliente se actualizará. Es posible que necesites descargar un nuevo adaptador para este cliente. Debes generar o importar claves para este cliente; de lo contrario, la autenticación no funcionará.
policiesConfigTypes.formView=Vista de formulario. policiesConfigTypes.formView=Vista de formulario.
residentKey.No=No. residentKey.No=No.
@ -1103,13 +1103,13 @@ archiveFormat=Formato de archivo.
requestObjectEncryptionHelp=Algoritmo JWE, que el cliente necesita usar al enviar el objeto de solicitud OIDC especificado por los parámetros 'request' o 'request_uri'. Si se establece en 'cualquiera', la encriptación es opcional y se permite cualquier algoritmo. requestObjectEncryptionHelp=Algoritmo JWE, que el cliente necesita usar al enviar el objeto de solicitud OIDC especificado por los parámetros 'request' o 'request_uri'. Si se establece en 'cualquiera', la encriptación es opcional y se permite cualquier algoritmo.
importSuccess=Nuevo certificado importado. importSuccess=Nuevo certificado importado.
attributeConsumingServiceName=Nombre del Servicio Consumidor de Atributos. attributeConsumingServiceName=Nombre del Servicio Consumidor de Atributos.
invalidJsonError=No se puede guardar el perfil de usuario, la información proporcionada no es un JSON válido. invalidJsonError=No se puede guardar el perfil de usuario, la información proporcionada no es un JSON válido: {{error}}
promptHelp=Especifica si el Servidor de Autorización solicita al Usuario Final una nueva autenticación y consentimiento. promptHelp=Especifica si el Servidor de Autorización solicita al Usuario Final una nueva autenticación y consentimiento.
deleteBtn=Eliminar. deleteBtn=Eliminar.
defaultLocale=Idioma predeterminado. defaultLocale=Idioma predeterminado.
addLdapWizardDescription=Texto necesario aquí. addLdapWizardDescription=Texto necesario aquí.
aggregate.attrs.label=Agregar valores de atributo. aggregate.attrs.label=Agregar valores de atributo.
removedGroupMembershipError=Error al eliminar la membresía del grupo. removedGroupMembershipError=Error al eliminar la membresía del grupo: {{error}}
allowPasswordAuthenticationHelp=Habilitar/deshabilitar la posibilidad de autenticación de nombre de usuario/contraseña contra la base de datos Kerberos. allowPasswordAuthenticationHelp=Habilitar/deshabilitar la posibilidad de autenticación de nombre de usuario/contraseña contra la base de datos Kerberos.
deleteExecutorSuccess=¡Éxito! El ejecutor fue eliminado. deleteExecutorSuccess=¡Éxito! El ejecutor fue eliminado.
eventTypes.SEND_RESET_PASSWORD_ERROR.name=Error al enviar restablecer contraseña. eventTypes.SEND_RESET_PASSWORD_ERROR.name=Error al enviar restablecer contraseña.
@ -1199,7 +1199,7 @@ fineGrainOpenIdConnectConfigurationHelp=Esta sección se utiliza para configurar
searchForUserDescription=Este reino puede tener un proveedor federado. Ver todos los usuarios puede hacer que el sistema se vuelva lento, pero se puede hacer buscando "*". Por favor, busca un usuario arriba. searchForUserDescription=Este reino puede tener un proveedor federado. Ver todos los usuarios puede hacer que el sistema se vuelva lento, pero se puede hacer buscando "*". Por favor, busca un usuario arriba.
expirationHelp=Establece la expiración para eventos. Los eventos caducados se eliminan periódicamente de la base de datos. expirationHelp=Establece la expiración para eventos. Los eventos caducados se eliminan periódicamente de la base de datos.
webAuthnPolicySignatureAlgorithmsHelp=Qué algoritmos de firma se deben usar para la Asertación de Autenticación. webAuthnPolicySignatureAlgorithmsHelp=Qué algoritmos de firma se deben usar para la Asertación de Autenticación.
setToNowError=¡Error\! No se pudo establecer 'No antes' en la fecha y hora actuales. setToNowError=¡Error\! No se pudo establecer 'No antes' en la fecha y hora actuales: {{error}}
eventTypes.UNREGISTER_NODE_ERROR.description=Error al anular el registro del nodo eventTypes.UNREGISTER_NODE_ERROR.description=Error al anular el registro del nodo
clientScopeTypes.optional=Opcional clientScopeTypes.optional=Opcional
nameIdFormat=Formato de ID de nombre nameIdFormat=Formato de ID de nombre
@ -1761,7 +1761,7 @@ setPasswordFor=Establecer contraseña para {{username}}
eventTypes.CODE_TO_TOKEN.name=Código a token eventTypes.CODE_TO_TOKEN.name=Código a token
updateUserLocale=Actualizar idioma del usuario updateUserLocale=Actualizar idioma del usuario
whoWillAppearPopoverTextUsers=Los grupos son jerárquicos. Cuando seleccionas Membresía Directa, solo ves el grupo secundario al que se unió el usuario. Los grupos ancestrales no están incluidos. whoWillAppearPopoverTextUsers=Los grupos son jerárquicos. Cuando seleccionas Membresía Directa, solo ves el grupo secundario al que se unió el usuario. Los grupos ancestrales no están incluidos.
mapperCreateError=Error al crear el mapeador. mapperCreateError=Error al crear el mapeador: {{error}}
resetBtn=Reiniciar resetBtn=Reiniciar
mode=Modo mode=Modo
kc.realm.name=Reino kc.realm.name=Reino
@ -1900,7 +1900,7 @@ targetOptions.local=LOCAL
addMessageBundleError=Error al crear el paquete de mensajes, {{error}} addMessageBundleError=Error al crear el paquete de mensajes, {{error}}
pkceMethodHelp=Método PKCE para usar pkceMethodHelp=Método PKCE para usar
encryption=Cifrado encryption=Cifrado
addExecutorError=Ejecutor no creado addExecutorError=Ejecutor no creado: {{error}}
scopePermissions.clients.manage-description=Políticas que deciden si un administrador puede administrar este cliente scopePermissions.clients.manage-description=Políticas que deciden si un administrador puede administrar este cliente
vendor=Proveedor vendor=Proveedor
roleRemoveAssociatedText=Esta acción eliminará {{rol}} de {{nombreRol}}. Todos los roles asociados a {{rol}} también se eliminarán. roleRemoveAssociatedText=Esta acción eliminará {{rol}} de {{nombreRol}}. Todos los roles asociados a {{rol}} también se eliminarán.
@ -2128,7 +2128,7 @@ includeInAccessToken.label=Agregar al token de acceso
samlKeysExportSuccess=Claves exportadas con éxito samlKeysExportSuccess=Claves exportadas con éxito
usersInRole=Usuarios en rol usersInRole=Usuarios en rol
policyProvider.group=Define condiciones para tus permisos donde se permite un conjunto de uno o más grupos (y sus jerarquías) para acceder a un objeto. policyProvider.group=Define condiciones para tus permisos donde se permite un conjunto de uno o más grupos (y sus jerarquías) para acceder a un objeto.
updatedUserProfileError=La configuración del perfil de usuario no se ha guardado updatedUserProfileError=La configuración del perfil de usuario no se ha guardado: {{error}}
emptyPermissions=Sin permisos emptyPermissions=Sin permisos
deletePermission=¿Eliminar permiso permanentemente? deletePermission=¿Eliminar permiso permanentemente?
selectUser=Seleccionar un usuario cuya identidad se usará para consultar permisos desde el servidor. selectUser=Seleccionar un usuario cuya identidad se usará para consultar permisos desde el servidor.
@ -2656,7 +2656,7 @@ emptyAuthorizationInstructions=Si deseas crear alcances de autorización, haz cl
subjectHelp=Una expresión regular para validar el DN de sujeto en el Certificado del Cliente. Usa "(.*?)(?\:$)" para coincidir con todo tipo de expresiones. subjectHelp=Una expresión regular para validar el DN de sujeto en el Certificado del Cliente. Usa "(.*?)(?\:$)" para coincidir con todo tipo de expresiones.
updatePolicySuccess=Política actualizada con éxito updatePolicySuccess=Política actualizada con éxito
eventTypes.CUSTOM_REQUIRED_ACTION.name=Acción requerida personalizada eventTypes.CUSTOM_REQUIRED_ACTION.name=Acción requerida personalizada
updateExecutorError=Executor no actualizado updateExecutorError=Executor no actualizado: {{error}}
clientIdHelpHelp=ID de cliente del cliente al que se asignarán los mapeos de roles LDAP. Aplicable solo si 'Usar Mapeo de Roles de Reino' es falso. clientIdHelpHelp=ID de cliente del cliente al que se asignarán los mapeos de roles LDAP. Aplicable solo si 'Usar Mapeo de Roles de Reino' es falso.
createdAt=Creado en createdAt=Creado en
moveGroupEmpty=No hay subgrupos moveGroupEmpty=No hay subgrupos

View file

@ -187,7 +187,7 @@ searchByName=Szukaj według nazwy
executorTypeSwitchHelpText=Tekst pomocy przełącznika typu wykonawcy executorTypeSwitchHelpText=Tekst pomocy przełącznika typu wykonawcy
attributeConsumingServiceNameHelp=Nazwa profilu usługi konsumującej atrybuty do reklamowania w metadanych SP. attributeConsumingServiceNameHelp=Nazwa profilu usługi konsumującej atrybuty do reklamowania w metadanych SP.
overrideActionTokens=Nadpisz tokeny akcji overrideActionTokens=Nadpisz tokeny akcji
deleteGrantsError=Błąd usuwania grantów. deleteGrantsError=Błąd usuwania grantów: {{error}}
defaultGroupAdded_other=Dodano {{count}} grup do domyślnych grup defaultGroupAdded_other=Dodano {{count}} grup do domyślnych grup
used.SPECIFIC_CLIENTS=Specyficzni klienci used.SPECIFIC_CLIENTS=Specyficzni klienci
freeMemory=Wolna pamięć freeMemory=Wolna pamięć
@ -420,7 +420,7 @@ displayOnConsentScreen=Wyświetl na ekranie zgody
noClientPolicies=Brak polityk klienta noClientPolicies=Brak polityk klienta
defaultAdminInitiatedActionLifespanHelp=Maksymalny czas przed wygaśnięciem pozwolenia na działanie wysłanego do użytkownika przez administratora. Zaleca się, aby wartość ta była długa, aby umożliwić administratorom wysyłanie e-maili do użytkowników, którzy są obecnie offline. Domyślny limit czasu można zastąpić bezpośrednio przed wydaniem tokenu. defaultAdminInitiatedActionLifespanHelp=Maksymalny czas przed wygaśnięciem pozwolenia na działanie wysłanego do użytkownika przez administratora. Zaleca się, aby wartość ta była długa, aby umożliwić administratorom wysyłanie e-maili do użytkowników, którzy są obecnie offline. Domyślny limit czasu można zastąpić bezpośrednio przed wydaniem tokenu.
syncUsersSuccess=Synchronizacja użytkowników zakończona pomyślnie. syncUsersSuccess=Synchronizacja użytkowników zakończona pomyślnie.
updatedCredentialMoveError=Konfiguracja poświadczeń użytkownika nie została zapisana updatedCredentialMoveError=Konfiguracja poświadczeń użytkownika nie została zapisana: {{error}}
searchForRoles=Wyszukaj rolę według nazwy searchForRoles=Wyszukaj rolę według nazwy
refresh=Odśwież refresh=Odśwież
roleDeletedSuccess=Rola została usunięta roleDeletedSuccess=Rola została usunięta
@ -563,7 +563,7 @@ jsonType.label=Typ JSON roszczenia
fullScopeAllowed=Pełny zakres dozwolony fullScopeAllowed=Pełny zakres dozwolony
syncModes.inherit=Dziedzicz syncModes.inherit=Dziedzicz
masterSamlProcessingUrlHelp=Jeśli skonfigurowane, ten URL zostanie użyty dla każdego wiązania zarówno do Usługi Konsumenckiej Zapewnienia SP, jak i Usług Jednokrotnego Wylogowania. Może to być indywidualnie zmienione dla każdego wiązania i usługi w Konfiguracji Punktów Końcowych SAML o Drobnoziarnistym Ustawieniu. masterSamlProcessingUrlHelp=Jeśli skonfigurowane, ten URL zostanie użyty dla każdego wiązania zarówno do Usługi Konsumenckiej Zapewnienia SP, jak i Usług Jednokrotnego Wylogowania. Może to być indywidualnie zmienione dla każdego wiązania i usługi w Konfiguracji Punktów Końcowych SAML o Drobnoziarnistym Ustawieniu.
addedGroupMembershipError=Błąd dodania członkostwa w grupie addedGroupMembershipError=Błąd dodania członkostwa w grupie: {{error}}
authenticatorAttachment.platform=Platforma authenticatorAttachment.platform=Platforma
configSaveSuccess=Pomyślnie zapisano konfigurację wykonania configSaveSuccess=Pomyślnie zapisano konfigurację wykonania
regenerate=Wygeneruj ponownie regenerate=Wygeneruj ponownie
@ -737,7 +737,7 @@ eventTypes.EXECUTE_ACTIONS_ERROR.name=Błąd wykonania akcji
path=Ścieżka path=Ścieżka
overwritten=Nadpisany overwritten=Nadpisany
mapperNameHelp=Nazwa mapera mapperNameHelp=Nazwa mapera
deleteProviderError=Błąd usuwania dostawcy deleteProviderError=Błąd usuwania dostawcy: {{error}}
supportedLocalesHelp=Lokalizacje obsługiwane przez tę domenę. Użytkownik wybiera jedną z tych lokalizacji na ekranie logowania. supportedLocalesHelp=Lokalizacje obsługiwane przez tę domenę. Użytkownik wybiera jedną z tych lokalizacji na ekranie logowania.
comparisonHelp=Określa metodę porównania używaną do oceny żądanych klas kontekstu lub oświadczeń. Domyślnie jest to "Dokładne". comparisonHelp=Określa metodę porównania używaną do oceny żądanych klas kontekstu lub oświadczeń. Domyślnie jest to "Dokładne".
generatedIdTokenIsDisabled=Wygenerowany token ID jest wyłączony, gdy nie wybrano użytkownika generatedIdTokenIsDisabled=Wygenerowany token ID jest wyłączony, gdy nie wybrano użytkownika
@ -860,7 +860,7 @@ back=Wstecz
deleteScopeConfirm=Jeśli usuniesz ten zakres autoryzacji, niektóre uprawnienia zostaną dotknięte. deleteScopeConfirm=Jeśli usuniesz ten zakres autoryzacji, niektóre uprawnienia zostaną dotknięte.
updateOtpSuccess=Pomyślnie zaktualizowano politykę OTP updateOtpSuccess=Pomyślnie zaktualizowano politykę OTP
title=Autentykacja title=Autentykacja
deleteAttributeError=Atrybut nie został usunięty deleteAttributeError=Atrybut nie został usunięty: {{error}}
enableClientSignatureRequiredExplain=Jeśli włączysz "Wymagany podpis klienta", adapter tego klienta zostanie zaktualizowany. Może być konieczne pobranie nowego adaptera dla tego klienta. Musisz wygenerować lub zaimportować klucze dla tego klienta, inaczej autentykacja nie zadziała. enableClientSignatureRequiredExplain=Jeśli włączysz "Wymagany podpis klienta", adapter tego klienta zostanie zaktualizowany. Może być konieczne pobranie nowego adaptera dla tego klienta. Musisz wygenerować lub zaimportować klucze dla tego klienta, inaczej autentykacja nie zadziała.
policiesConfigTypes.formView=Widok formularza policiesConfigTypes.formView=Widok formularza
residentKey.No=Nie residentKey.No=Nie
@ -1102,13 +1102,13 @@ archiveFormat=Format archiwum
requestObjectEncryptionHelp=Algorytm JWE, który klient musi użyć podczas wysyłania obiektu żądania OIDC określonego przez parametry 'request' lub 'request_uri'. Jeśli ustawione na 'any', szyfrowanie jest opcjonalne, a dozwolony jest dowolny algorytm. requestObjectEncryptionHelp=Algorytm JWE, który klient musi użyć podczas wysyłania obiektu żądania OIDC określonego przez parametry 'request' lub 'request_uri'. Jeśli ustawione na 'any', szyfrowanie jest opcjonalne, a dozwolony jest dowolny algorytm.
importSuccess=Nowy certyfikat został zaimportowany importSuccess=Nowy certyfikat został zaimportowany
attributeConsumingServiceName=Nazwa usługi konsumującej atrybuty attributeConsumingServiceName=Nazwa usługi konsumującej atrybuty
invalidJsonError=Nie można zapisać profilu użytkownika, dostarczone informacje nie są prawidłowym JSON-em. invalidJsonError=Nie można zapisać profilu użytkownika, dostarczone informacje nie są prawidłowym JSON-em: {{error}}
promptHelp=Określa, czy Serwer Autoryzacji ma prosić Koniec-Użytkownika o ponowne uwierzytelnienie i wyrażenie zgody. promptHelp=Określa, czy Serwer Autoryzacji ma prosić Koniec-Użytkownika o ponowne uwierzytelnienie i wyrażenie zgody.
deleteBtn=Usuń deleteBtn=Usuń
defaultLocale=Domyślne ustawienia regionalne defaultLocale=Domyślne ustawienia regionalne
addLdapWizardDescription=Tekst potrzebny tutaj addLdapWizardDescription=Tekst potrzebny tutaj
aggregate.attrs.label=Zagreguj wartości atrybutów aggregate.attrs.label=Zagreguj wartości atrybutów
removedGroupMembershipError=Błąd usuwania przynależności do grupy removedGroupMembershipError=Błąd usuwania przynależności do grupy: {{error}}
allowPasswordAuthenticationHelp=Włącz/wyłącz możliwość uwierzytelniania za pomocą nazwy użytkownika/hasła w bazie danych Kerberos allowPasswordAuthenticationHelp=Włącz/wyłącz możliwość uwierzytelniania za pomocą nazwy użytkownika/hasła w bazie danych Kerberos
deleteExecutorSuccess=Sukces! Wykonawca został usunięty. deleteExecutorSuccess=Sukces! Wykonawca został usunięty.
eventTypes.SEND_RESET_PASSWORD_ERROR.name=Błąd wysyłania resetowania hasła eventTypes.SEND_RESET_PASSWORD_ERROR.name=Błąd wysyłania resetowania hasła
@ -1198,7 +1198,7 @@ fineGrainOpenIdConnectConfigurationHelp=Ta sekcja służy do konfiguracji zaawan
searchForUserDescription=Ten obszar może mieć dostawcę federacyjnego. Wyświetlanie wszystkich użytkowników może spowodować spowolnienie systemu, ale można to zrobić, wyszukując "*". Proszę szukać użytkownika powyżej. searchForUserDescription=Ten obszar może mieć dostawcę federacyjnego. Wyświetlanie wszystkich użytkowników może spowodować spowolnienie systemu, ale można to zrobić, wyszukując "*". Proszę szukać użytkownika powyżej.
expirationHelp=Ustawia wygaśnięcie zdarzeń. Wygasłe zdarzenia są regularnie usuwane z bazy danych. expirationHelp=Ustawia wygaśnięcie zdarzeń. Wygasłe zdarzenia są regularnie usuwane z bazy danych.
webAuthnPolicySignatureAlgorithmsHelp=Jakie algorytmy podpisu powinny być używane do tworzenia twierdzeń uwierzytelniających. webAuthnPolicySignatureAlgorithmsHelp=Jakie algorytmy podpisu powinny być używane do tworzenia twierdzeń uwierzytelniających.
setToNowError=Błąd! Nie można ustawić "notBefore" na bieżącą datę i godzinę. setToNowError=Błąd! Nie można ustawić "notBefore" na bieżącą datę i godzinę: {{error}}
eventTypes.UNREGISTER_NODE_ERROR.description=Błąd wyrejestrowywania węzła eventTypes.UNREGISTER_NODE_ERROR.description=Błąd wyrejestrowywania węzła
clientScopeTypes.optional=Opcjonalne clientScopeTypes.optional=Opcjonalne
nameIdFormat=Format nazwy ID nameIdFormat=Format nazwy ID
@ -1760,7 +1760,7 @@ setPasswordFor=Ustaw hasło dla {{username}}
eventTypes.CODE_TO_TOKEN.name=Kod na token eventTypes.CODE_TO_TOKEN.name=Kod na token
updateUserLocale=Zaktualizuj ustawienia regionalne użytkownika updateUserLocale=Zaktualizuj ustawienia regionalne użytkownika
whoWillAppearPopoverTextUsers=Grupy są hierarchiczne. Po wybraniu Bezpośredniego Członkostwa widoczna jest tylko grupa potomna, do której dołączył użytkownik. Grupy przodków nie są uwzględnione. whoWillAppearPopoverTextUsers=Grupy są hierarchiczne. Po wybraniu Bezpośredniego Członkostwa widoczna jest tylko grupa potomna, do której dołączył użytkownik. Grupy przodków nie są uwzględnione.
mapperCreateError=Błąd tworzenia mapera. mapperCreateError=Błąd tworzenia mapera: {{error}}
resetBtn=Resetuj resetBtn=Resetuj
mode=Tryb mode=Tryb
kc.realm.name=Obszar kc.realm.name=Obszar
@ -1899,7 +1899,7 @@ targetOptions.local=LOKALNY
addMessageBundleError=Błąd podczas tworzenia pakietu wiadomości: {{error}} addMessageBundleError=Błąd podczas tworzenia pakietu wiadomości: {{error}}
pkceMethodHelp=Metoda PKCE do użycia pkceMethodHelp=Metoda PKCE do użycia
encryption=Szyfrowanie encryption=Szyfrowanie
addExecutorError=Nie utworzono wykonawcy addExecutorError=Nie utworzono wykonawcy: {{error}}
scopePermissions.clients.manage-description=Polityki decydujące, czy administrator może zarządzać tym klientem scopePermissions.clients.manage-description=Polityki decydujące, czy administrator może zarządzać tym klientem
vendor=Dostawca vendor=Dostawca
roleRemoveAssociatedText=Ta akcja usunie {{role}} z {{roleName}}. Wszystkie powiązane role z {{role}} zostaną również usunięte. roleRemoveAssociatedText=Ta akcja usunie {{role}} z {{roleName}}. Wszystkie powiązane role z {{role}} zostaną również usunięte.
@ -2127,7 +2127,7 @@ includeInAccessToken.label=Dodaj do tokena dostępu
samlKeysExportSuccess=Klucze zostały pomyślnie wyeksportowane samlKeysExportSuccess=Klucze zostały pomyślnie wyeksportowane
usersInRole=Użytkownicy w roli usersInRole=Użytkownicy w roli
policyProvider.group=Zdefiniuj warunki uprawnień, w których zbiór jednej lub więcej grup (i ich hierarchie) ma dostęp do obiektu. policyProvider.group=Zdefiniuj warunki uprawnień, w których zbiór jednej lub więcej grup (i ich hierarchie) ma dostęp do obiektu.
updatedUserProfileError=Konfiguracja profilu użytkownika nie została zapisana updatedUserProfileError=Konfiguracja profilu użytkownika nie została zapisana: {{error}}
emptyPermissions=Brak uprawnień emptyPermissions=Brak uprawnień
deletePermission=Usuń uprawnienia na stałe? deletePermission=Usuń uprawnienia na stałe?
selectUser=Wybierz użytkownika, którego tożsamość zostanie użyta do zapytania o uprawnienia z serwera. selectUser=Wybierz użytkownika, którego tożsamość zostanie użyta do zapytania o uprawnienia z serwera.
@ -2655,7 +2655,7 @@ emptyAuthorizationInstructions=Jeśli chcesz utworzyć zakresy autoryzacji, pros
subjectHelp=Wyrażenie regularne do walidacji Distinguished Name (DN) w certyfikacie klienta. Użyj "(.*?)(?\:$)" aby dopasować wszystkie rodzaje wyrażeń. subjectHelp=Wyrażenie regularne do walidacji Distinguished Name (DN) w certyfikacie klienta. Użyj "(.*?)(?\:$)" aby dopasować wszystkie rodzaje wyrażeń.
updatePolicySuccess=Zaktualizowano politykę pomyślnie updatePolicySuccess=Zaktualizowano politykę pomyślnie
eventTypes.CUSTOM_REQUIRED_ACTION.name=Custom required action eventTypes.CUSTOM_REQUIRED_ACTION.name=Custom required action
updateExecutorError=Executor nie został zaktualizowany updateExecutorError=Executor nie został zaktualizowany: {{error}}
clientIdHelpHelp=Identyfikator klienta, do którego zostaną mapowane odwzorowania ról LDAP. Dotyczy tylko sytuacji, gdy opcja 'Use Realm Roles Mapping' jest ustawiona na false. clientIdHelpHelp=Identyfikator klienta, do którego zostaną mapowane odwzorowania ról LDAP. Dotyczy tylko sytuacji, gdy opcja 'Use Realm Roles Mapping' jest ustawiona na false.
createdAt=Utworzono o createdAt=Utworzono o
moveGroupEmpty=Brak podgrup moveGroupEmpty=Brak podgrup

View file

@ -179,7 +179,7 @@ searchByName=按名称搜索
executorTypeSwitchHelpText=执行器类型切换帮助文本 executorTypeSwitchHelpText=执行器类型切换帮助文本
attributeConsumingServiceNameHelp=要在 SP 元数据中通告的属性消费服务配置文件的名称。 attributeConsumingServiceNameHelp=要在 SP 元数据中通告的属性消费服务配置文件的名称。
overrideActionTokens=覆盖操作令牌 overrideActionTokens=覆盖操作令牌
deleteGrantsError=删除授权时出错。 deleteGrantsError=删除授权时出错。 {{error}}
defaultGroupAdded_other={{count}} 个新群组已被添加到默认群组 defaultGroupAdded_other={{count}} 个新群组已被添加到默认群组
used.SPECIFIC_CLIENTS=特定客户 used.SPECIFIC_CLIENTS=特定客户
freeMemory=空余内存 freeMemory=空余内存
@ -410,7 +410,7 @@ userInfoUrl=用户信息网址
displayOnConsentScreen=在许可上显示 displayOnConsentScreen=在许可上显示
noClientPolicies=无客户端策略 noClientPolicies=无客户端策略
syncUsersSuccess=用户同步成功完成。 syncUsersSuccess=用户同步成功完成。
updatedCredentialMoveError=尚未保存用户凭据设置 updatedCredentialMoveError=尚未保存用户凭据设置 {{error}}
shortVerificationUriTooltip=如果设置,此值将在设备授权流程中作为 verification_uri 返回。此 uri 需要重定向到 {server-root}/realms/{realm}/device shortVerificationUriTooltip=如果设置,此值将在设备授权流程中作为 verification_uri 返回。此 uri 需要重定向到 {server-root}/realms/{realm}/device
searchForRoles=按名称搜索角色 searchForRoles=按名称搜索角色
refresh=刷新 refresh=刷新
@ -554,7 +554,7 @@ jsonType.label=声明的 JSON 类型
fullScopeAllowed=允许全范围 fullScopeAllowed=允许全范围
syncModes.inherit=继承 syncModes.inherit=继承
masterSamlProcessingUrlHelp=如果配置,则此 URL 将用于每个绑定到 SP 的断言消费者和单点注销服务。这可以在 Fine Grain SAML 端点配置中为每个绑定和服务单独覆写。 masterSamlProcessingUrlHelp=如果配置,则此 URL 将用于每个绑定到 SP 的断言消费者和单点注销服务。这可以在 Fine Grain SAML 端点配置中为每个绑定和服务单独覆写。
addedGroupMembershipError=添加群组成员身份时出错 addedGroupMembershipError=添加群组成员身份时出错 {{error}}
authenticatorAttachment.platform=平台 authenticatorAttachment.platform=平台
configSaveSuccess=成功保存配置 configSaveSuccess=成功保存配置
regenerate=重新生成 regenerate=重新生成
@ -724,7 +724,7 @@ createClientPolicyError=无法创建策略,因为:{{error}}
eventTypes.EXECUTE_ACTIONS_ERROR.name=执行动作错误 eventTypes.EXECUTE_ACTIONS_ERROR.name=执行动作错误
path=路经 path=路经
overwritten=已被覆写 overwritten=已被覆写
deleteProviderError=删除密钥供应商时出错 deleteProviderError=删除密钥供应商时出错 {{error}}
supportedLocalesHelp=该领域支持的语言环境。用户在登录屏幕上选择这些语言环境之一。 supportedLocalesHelp=该领域支持的语言环境。用户在登录屏幕上选择这些语言环境之一。
comparisonHelp=指定用于评估请求的上下文类或语句的比较方法。默认为"Exact"。 comparisonHelp=指定用于评估请求的上下文类或语句的比较方法。默认为"Exact"。
generatedIdTokenIsDisabled=未选择用户时禁用生成的 ID 令牌 generatedIdTokenIsDisabled=未选择用户时禁用生成的 ID 令牌
@ -845,7 +845,7 @@ back=返回
deleteScopeConfirm=如果删除此授权范围,部分权限将受到影响。 deleteScopeConfirm=如果删除此授权范围,部分权限将受到影响。
updateOtpSuccess=OTP 策略成功更新 updateOtpSuccess=OTP 策略成功更新
title=身份验证 title=身份验证
deleteAttributeError=属性未删除 deleteAttributeError=属性未删除 {{error}}
enableClientSignatureRequiredExplain=如果启用"需要客户端签名",此客户端的适配器将被更新。您可能需要为此客户端下载一个新的适配器。您需要为此客户端生成或导入密钥,否则身份验证不管用。 enableClientSignatureRequiredExplain=如果启用"需要客户端签名",此客户端的适配器将被更新。您可能需要为此客户端下载一个新的适配器。您需要为此客户端生成或导入密钥,否则身份验证不管用。
policiesConfigTypes.formView=表单视图 policiesConfigTypes.formView=表单视图
residentKey.No= residentKey.No=
@ -1084,13 +1084,13 @@ archiveFormat=存档格式
requestObjectEncryptionHelp=JWE算法客户端发送'request'或'request_uri'参数指定的OIDC请求对象时需要使用的JWE算法。如果设置为'任何',加密是可选的,允许任何算法。 requestObjectEncryptionHelp=JWE算法客户端发送'request'或'request_uri'参数指定的OIDC请求对象时需要使用的JWE算法。如果设置为'任何',加密是可选的,允许任何算法。
importSuccess=导入新证书 importSuccess=导入新证书
attributeConsumingServiceName=属性消费服务名称 attributeConsumingServiceName=属性消费服务名称
invalidJsonError=无法保存用户配置文件,提供的信息不是有效的 JSON。 invalidJsonError=无法保存用户配置文件,提供的信息不是有效的 JSON。 {{error}}
promptHelp=指定授权服务器是否提示最终用户重新验证和授权。 promptHelp=指定授权服务器是否提示最终用户重新验证和授权。
deleteBtn=删除 deleteBtn=删除
defaultLocale=默认语言环境 defaultLocale=默认语言环境
addLdapWizardDescription=此处需要文本 addLdapWizardDescription=此处需要文本
aggregate.attrs.label=聚合属性值 aggregate.attrs.label=聚合属性值
removedGroupMembershipError=移除群组成员身份时出错 removedGroupMembershipError=移除群组成员身份时出错 {{error}}
allowPasswordAuthenticationHelp=启用/禁用针对 Kerberos 数据库的用户名/密码身份验证的可能性 allowPasswordAuthenticationHelp=启用/禁用针对 Kerberos 数据库的用户名/密码身份验证的可能性
deleteExecutorSuccess=成功!执行器被删除。 deleteExecutorSuccess=成功!执行器被删除。
eventTypes.SEND_RESET_PASSWORD_ERROR.name=发送重置密码错误 eventTypes.SEND_RESET_PASSWORD_ERROR.name=发送重置密码错误
@ -1179,7 +1179,7 @@ fineGrainOpenIdConnectConfigurationHelp=此部分用于配置此客户端与 Ope
searchForUserDescription=此领域可能具有联合提供程序。查看所有用户可能会导致系统变慢,但可以通过搜索来完成。请通过上面的搜索框搜索用户。 searchForUserDescription=此领域可能具有联合提供程序。查看所有用户可能会导致系统变慢,但可以通过搜索来完成。请通过上面的搜索框搜索用户。
expirationHelp=设置事件的到期时间。过期的事件会定期从数据库中清除。 expirationHelp=设置事件的到期时间。过期的事件会定期从数据库中清除。
webAuthnPolicySignatureAlgorithmsHelp=身份验证断言应该使用什么签名算法。 webAuthnPolicySignatureAlgorithmsHelp=身份验证断言应该使用什么签名算法。
setToNowError=错误!无法设置为当前日期和时间。 setToNowError=错误!无法设置为当前日期和时间。 {{error}}
eventTypes.UNREGISTER_NODE_ERROR.description=注销节点错误 eventTypes.UNREGISTER_NODE_ERROR.description=注销节点错误
clientScopeTypes.optional=非必需 clientScopeTypes.optional=非必需
nameIdFormat=姓名ID格式 nameIdFormat=姓名ID格式
@ -1731,7 +1731,7 @@ setPasswordFor=设置{{username}}的密码
eventTypes.CODE_TO_TOKEN.name=用于交换令牌的代码 eventTypes.CODE_TO_TOKEN.name=用于交换令牌的代码
updateUserLocale=更新用户区域设置 updateUserLocale=更新用户区域设置
whoWillAppearPopoverTextUsers=群组是分层的。选择“直接群组成员资格”时,只会看到用户直接加入的子组,而不包括父级群组。 whoWillAppearPopoverTextUsers=群组是分层的。选择“直接群组成员资格”时,只会看到用户直接加入的子组,而不包括父级群组。
mapperCreateError=创建映射器时出错。 mapperCreateError=创建映射器时出错。 {{error}}
resetBtn=重置 resetBtn=重置
mode=模式 mode=模式
kc.realm.name=领域 kc.realm.name=领域
@ -1862,7 +1862,7 @@ targetOptions.local=本地
addMessageBundleError=创建消息包时出错,{{error}} addMessageBundleError=创建消息包时出错,{{error}}
pkceMethodHelp=使用的 PKCE 方法 pkceMethodHelp=使用的 PKCE 方法
encryption=加密 encryption=加密
addExecutorError=未创建执行器 addExecutorError=未创建执行器 {{error}}
scopePermissions.clients.manage-description=决定管理员是否可以管理此客户端的策略 scopePermissions.clients.manage-description=决定管理员是否可以管理此客户端的策略
vendor=供应商 vendor=供应商
roleRemoveAssociatedText=此操作将从{{roleName}}中移除{{role}}。{{role}}的所有关联角色也将被移除。 roleRemoveAssociatedText=此操作将从{{roleName}}中移除{{role}}。{{role}}的所有关联角色也将被移除。
@ -2085,8 +2085,8 @@ includeInAccessToken.label=添加到访问令牌
samlKeysExportSuccess=成功导出密钥 samlKeysExportSuccess=成功导出密钥
usersInRole=角色中的用户 usersInRole=角色中的用户
policyProvider.group=为您的权限定义条件,允许一组一个或多个组(及其层次结构)访问一个对象。 policyProvider.group=为您的权限定义条件,允许一组一个或多个组(及其层次结构)访问一个对象。
updatedUserProfileError=用户资料的配置尚未保存 updatedUserProfileError=用户资料的配置尚未保存 {{error}}
密码策略.lowerCase=密码字符串中要求的小写字母的个数。 passwordPoliciesHelp.lowerCase=密码字符串中要求的小写字母的个数。
emptyPermissions=无权限 emptyPermissions=无权限
deletePermission=永久删除权限? deletePermission=永久删除权限?
selectUser=选择一个用户,其身份将用于从服务器查询权限。 selectUser=选择一个用户,其身份将用于从服务器查询权限。
@ -2605,7 +2605,7 @@ emptyAuthorizationInstructions=如果要创建授权范围,请点击下方按
subjectHelp=用于验证客户端证书中的主题 DN 的正则表达式。使用 "(.*?)(?\:$)" 匹配所有类型的表达式。 subjectHelp=用于验证客户端证书中的主题 DN 的正则表达式。使用 "(.*?)(?\:$)" 匹配所有类型的表达式。
updatePolicySuccess=成功更新策略 updatePolicySuccess=成功更新策略
eventTypes.CUSTOM_REQUIRED_ACTION.name=自定义所需操作 eventTypes.CUSTOM_REQUIRED_ACTION.name=自定义所需操作
updateExecutorError=执行器未更新 updateExecutorError=执行器未更新 {{error}}
clientIdHelpHelp=LDAP 角色映射将映射到的客户端的客户端ID。仅当'使用领域角色映射'为假时适用。 clientIdHelpHelp=LDAP 角色映射将映射到的客户端的客户端ID。仅当'使用领域角色映射'为假时适用。
createdAt=创建时间 createdAt=创建时间
moveGroupEmpty=无子级群组 moveGroupEmpty=无子级群组

View file

@ -197,7 +197,7 @@ searchByName=Search by name
executorTypeSwitchHelpText=Executor Type Switch Help Text executorTypeSwitchHelpText=Executor Type Switch Help Text
attributeConsumingServiceNameHelp=Name of the Attribute Consuming Service profile to advertise in the SP metadata. attributeConsumingServiceNameHelp=Name of the Attribute Consuming Service profile to advertise in the SP metadata.
overrideActionTokens=Override Action Tokens overrideActionTokens=Override Action Tokens
deleteGrantsError=Error deleting grants. deleteGrantsError=Error deleting grants: {{error}}
defaultGroupAdded_other=Added {{count}} groups to the default groups defaultGroupAdded_other=Added {{count}} groups to the default groups
used.SPECIFIC_CLIENTS=Specific clients used.SPECIFIC_CLIENTS=Specific clients
freeMemory=Free memory freeMemory=Free memory
@ -286,7 +286,7 @@ minuteHelp=Defines the minute when the policy MUST be granted. You can also prov
updateCibaSuccess=CIBA policy successfully updated updateCibaSuccess=CIBA policy successfully updated
newRoleNameHelp=The new role name. The new name format corresponds to where in the access token the role will be mapped to. So, a new name of 'myapp.newname' will map the role to that position in the access token. A new name of 'newname' will map the role to the realm roles in the token. newRoleNameHelp=The new role name. The new name format corresponds to where in the access token the role will be mapped to. So, a new name of 'myapp.newname' will map the role to that position in the access token. A new name of 'newname' will map the role to the realm roles in the token.
mapperTypeFullNameLdapMapper=full-name-ldap-mapper mapperTypeFullNameLdapMapper=full-name-ldap-mapper
searchUserByAttributeMissingKeyError=Specify a attribute key searchUserByAttributeMissingKeyError=Specify an attribute key
eventTypes.INVALID_SIGNATURE.name=Invalid signature eventTypes.INVALID_SIGNATURE.name=Invalid signature
topLevelFlowTypeHelp=What kind of top level flow is it? Type 'client' is used for authentication of clients (applications) when generic is for users and everything else topLevelFlowTypeHelp=What kind of top level flow is it? Type 'client' is used for authentication of clients (applications) when generic is for users and everything else
authDetailsHelp=Export and download all resource settings for this resource server. authDetailsHelp=Export and download all resource settings for this resource server.
@ -435,7 +435,7 @@ displayOnConsentScreen=Display on consent screen
noClientPolicies=No client policies noClientPolicies=No client policies
defaultAdminInitiatedActionLifespanHelp=Maximum time before an action permit sent to a user by administrator is expired. This value is recommended to be long to allow administrators to send e-mails for users that are currently offline. The default timeout can be overridden immediately before issuing the token. defaultAdminInitiatedActionLifespanHelp=Maximum time before an action permit sent to a user by administrator is expired. This value is recommended to be long to allow administrators to send e-mails for users that are currently offline. The default timeout can be overridden immediately before issuing the token.
syncUsersSuccess=Sync of users finished successfully. syncUsersSuccess=Sync of users finished successfully.
updatedCredentialMoveError=User Credential configuration hasn't been saved updatedCredentialMoveError=User Credential configuration hasn't been saved: {{error}}
searchForRoles=Search role by name searchForRoles=Search role by name
refresh=Refresh refresh=Refresh
roleDeletedSuccess=The role has been deleted roleDeletedSuccess=The role has been deleted
@ -578,7 +578,7 @@ jsonType.label=Claim JSON Type
fullScopeAllowed=Full scope allowed fullScopeAllowed=Full scope allowed
syncModes.inherit=Inherit syncModes.inherit=Inherit
masterSamlProcessingUrlHelp=If configured, this URL will be used for every binding to both the SP's Assertion Consumer and Single Logout Services. This can be individually overridden for each binding and service in the Fine Grain SAML Endpoint Configuration. masterSamlProcessingUrlHelp=If configured, this URL will be used for every binding to both the SP's Assertion Consumer and Single Logout Services. This can be individually overridden for each binding and service in the Fine Grain SAML Endpoint Configuration.
addedGroupMembershipError=Error adding group membership addedGroupMembershipError=Error adding group membership: {{error}}
authenticatorAttachment.platform=Platform authenticatorAttachment.platform=Platform
configSaveSuccess=Successfully saved the config configSaveSuccess=Successfully saved the config
regenerate=Regenerate regenerate=Regenerate
@ -764,7 +764,7 @@ overwritten=Overwritten
mapperNameHelp=Name of the mapper mapperNameHelp=Name of the mapper
keyProviderMapperNameHelp=Display name of provider when linked in admin console. keyProviderMapperNameHelp=Display name of provider when linked in admin console.
providerIdHelp=Provider ID providerIdHelp=Provider ID
deleteProviderError=Error deleting the provider deleteProviderError=Error deleting the provider: {{error}}
supportedLocalesHelp=The locales to support for this realm. The user chooses one of these locales on the login screen. supportedLocalesHelp=The locales to support for this realm. The user chooses one of these locales on the login screen.
comparisonHelp=Specifies the comparison method used to evaluate the requested context classes or statements. The default is "Exact". comparisonHelp=Specifies the comparison method used to evaluate the requested context classes or statements. The default is "Exact".
generatedIdTokenIsDisabled=Generated id token is disabled when no user is selected generatedIdTokenIsDisabled=Generated id token is disabled when no user is selected
@ -886,7 +886,7 @@ back=Back
deleteScopeConfirm=If you delete this authorization scope, some permissions will be affected. deleteScopeConfirm=If you delete this authorization scope, some permissions will be affected.
updateOtpSuccess=OTP policy successfully updated updateOtpSuccess=OTP policy successfully updated
title=Authentication title=Authentication
deleteAttributeError=Attribute not deleted deleteAttributeError=Attribute not deleted: {{error}}
enableClientSignatureRequiredExplain=If you enable "Client signature required", the adapter of this client will be updated. You may need to download a new adapter for this client. You need to generate or import keys for this client otherwise the authentication will not work. enableClientSignatureRequiredExplain=If you enable "Client signature required", the adapter of this client will be updated. You may need to download a new adapter for this client. You need to generate or import keys for this client otherwise the authentication will not work.
policiesConfigTypes.formView=Form view policiesConfigTypes.formView=Form view
residentKey.No=No residentKey.No=No
@ -1079,6 +1079,7 @@ clientScope=Client scope
inheritedFrom=Inherited from inheritedFrom=Inherited from
clientScopeSearch.name=Name clientScopeSearch.name=Name
deleteConditionSuccess=The condition has been deleted deleteConditionSuccess=The condition has been deleted
deleteConditionError=Failed to delete condition\: {{error}}
clientProfile=Client profile details clientProfile=Client profile details
syncAllUsers=Sync all users syncAllUsers=Sync all users
allowedClockSkewHelp=Clock skew in seconds that is tolerated when validating identity provider tokens. Default value is zero. allowedClockSkewHelp=Clock skew in seconds that is tolerated when validating identity provider tokens. Default value is zero.
@ -1145,15 +1146,15 @@ archiveFormat=Archive format
requestObjectEncryptionHelp=JWE algorithm, which client needs to use when sending OIDC request object specified by 'request' or 'request_uri' parameters. If set to 'any', encryption is optional and any algorithm is allowed. requestObjectEncryptionHelp=JWE algorithm, which client needs to use when sending OIDC request object specified by 'request' or 'request_uri' parameters. If set to 'any', encryption is optional and any algorithm is allowed.
importSuccess=New certificate imported importSuccess=New certificate imported
attributeConsumingServiceName=Attribute Consuming Service Name attributeConsumingServiceName=Attribute Consuming Service Name
invalidJsonError=Unable to save user profile, the provided information is not valid JSON. invalidJsonError=Unable to save user profile, the provided information is not valid JSON: {{error}}
invalidJsonClientProfilesError=Unable to save client profiles, the provided information is not valid JSON. invalidJsonClientProfilesError=Unable to save client profiles, the provided information is not valid JSON: {{error}}
invalidJsonClientPoliciesError=Unable to save client policies, the provided information is not valid JSON. invalidJsonClientPoliciesError=Unable to save client policies, the provided information is not valid JSON: {{error}}
promptHelp=Specifies whether the Authorization Server prompts the End-User for re-authentication and consent. promptHelp=Specifies whether the Authorization Server prompts the End-User for re-authentication and consent.
deleteBtn=Delete deleteBtn=Delete
defaultLocale=Default locale defaultLocale=Default locale
addLdapWizardDescription=Text needed here addLdapWizardDescription=Text needed here
aggregate.attrs.label=Aggregate attribute values aggregate.attrs.label=Aggregate attribute values
removedGroupMembershipError=Error removing group membership removedGroupMembershipError=Error removing group membership: {{error}}
allowPasswordAuthenticationHelp=Enable/disable possibility of username/password authentication against Kerberos database allowPasswordAuthenticationHelp=Enable/disable possibility of username/password authentication against Kerberos database
deleteExecutorSuccess=Success\! The executor was deleted. deleteExecutorSuccess=Success\! The executor was deleted.
eventTypes.SEND_RESET_PASSWORD_ERROR.name=Send reset password error eventTypes.SEND_RESET_PASSWORD_ERROR.name=Send reset password error
@ -1244,7 +1245,7 @@ fineGrainOpenIdConnectConfigurationHelp=This section is used to configure advanc
searchForUserDescription=This realm may have a federated provider. Viewing all users may cause the system to slow down, but it can be done by searching for "*". Please search for a user above. searchForUserDescription=This realm may have a federated provider. Viewing all users may cause the system to slow down, but it can be done by searching for "*". Please search for a user above.
expirationHelp=Sets the expiration for events. Expired events are periodically deleted from the database. expirationHelp=Sets the expiration for events. Expired events are periodically deleted from the database.
webAuthnPolicySignatureAlgorithmsHelp=What signature algorithms should be used for Authentication Assertion. webAuthnPolicySignatureAlgorithmsHelp=What signature algorithms should be used for Authentication Assertion.
setToNowError=Error\! Failed to set notBefore to current date and time. setToNowError=Error\! Failed to set notBefore to current date and time: {{error}}
eventTypes.UNREGISTER_NODE_ERROR.description=Unregister node error eventTypes.UNREGISTER_NODE_ERROR.description=Unregister node error
clientScopeTypes.optional=Optional clientScopeTypes.optional=Optional
nameIdFormat=Name ID format nameIdFormat=Name ID format
@ -1810,7 +1811,7 @@ setPasswordFor=Set password for {{username}}
eventTypes.CODE_TO_TOKEN.name=Code to token eventTypes.CODE_TO_TOKEN.name=Code to token
updateUserLocale=Update User Locale updateUserLocale=Update User Locale
whoWillAppearPopoverTextUsers=Groups are hierarchical. When you select Direct Membership, you see only the child group that the user joined. Ancestor groups are not included. whoWillAppearPopoverTextUsers=Groups are hierarchical. When you select Direct Membership, you see only the child group that the user joined. Ancestor groups are not included.
mapperCreateError=Error creating mapper. mapperCreateError=Error creating mapper: {{error}}
resetBtn=Reset resetBtn=Reset
mode=Mode mode=Mode
kc.realm.name=Realm kc.realm.name=Realm
@ -1949,7 +1950,7 @@ targetOptions.local=LOCAL
addTranslationError=Error creating translation, {{error}} addTranslationError=Error creating translation, {{error}}
pkceMethodHelp=PKCE Method to use pkceMethodHelp=PKCE Method to use
encryption=Encryption encryption=Encryption
addExecutorError=Executor not created addExecutorError=Executor not created: {{error}}
scopePermissions.clients.manage-description=Policies that decide if an administrator can manage this client scopePermissions.clients.manage-description=Policies that decide if an administrator can manage this client
vendor=Vendor vendor=Vendor
roleRemoveAssociatedText=This action will remove {{role}} from {{roleName}}. All the associated roles of {{role}} will also be removed. roleRemoveAssociatedText=This action will remove {{role}} from {{roleName}}. All the associated roles of {{role}} will also be removed.
@ -2179,7 +2180,7 @@ includeInAccessToken.label=Add to access token
samlKeysExportSuccess=Successfully exported keys samlKeysExportSuccess=Successfully exported keys
usersInRole=Users in role usersInRole=Users in role
policyProvider.group=Define conditions for your permissions where a set of one or more groups (and their hierarchies) is permitted to access an object. policyProvider.group=Define conditions for your permissions where a set of one or more groups (and their hierarchies) is permitted to access an object.
updatedUserProfileError=User Profile configuration hasn't been saved updatedUserProfileError=User Profile configuration hasn't been saved: {{error}}
emptyPermissions=No permissions emptyPermissions=No permissions
deletePermission=Permanently delete permission? deletePermission=Permanently delete permission?
selectUser=Select a user whose identity is going to be used to query permissions from the server. selectUser=Select a user whose identity is going to be used to query permissions from the server.
@ -2708,7 +2709,7 @@ emptyAuthorizationInstructions=If you want to create authorization scopes, pleas
subjectHelp=A regular expression for validating Subject DN in the Client Certificate. Use "(.*?)(?\:$)" to match all kind of expressions. subjectHelp=A regular expression for validating Subject DN in the Client Certificate. Use "(.*?)(?\:$)" to match all kind of expressions.
updatePolicySuccess=Successfully updated the policy updatePolicySuccess=Successfully updated the policy
eventTypes.CUSTOM_REQUIRED_ACTION.name=Custom required action eventTypes.CUSTOM_REQUIRED_ACTION.name=Custom required action
updateExecutorError=Executor not updated updateExecutorError=Executor not updated: {{error}}
clientIdHelpHelp=Client ID of client to which LDAP role mappings will be mapped. Applicable only if 'Use Realm Roles Mapping' is false. clientIdHelpHelp=Client ID of client to which LDAP role mappings will be mapped. Applicable only if 'Use Realm Roles Mapping' is false.
createdAt=Created at createdAt=Created at
moveGroupEmpty=No sub groups moveGroupEmpty=No sub groups
@ -2877,7 +2878,7 @@ addProvider_other=Add {{provider}} providers
resetAction=Reset action resetAction=Reset action
cibaExpiresIn=Expires In cibaExpiresIn=Expires In
dynamicScopeFormatHelp=This is the regular expression that the system will use to extract the scope name and variable. dynamicScopeFormatHelp=This is the regular expression that the system will use to extract the scope name and variable.
updateTranslationError=Error updating translation. updateTranslationError=Error updating translation: {{error}}
resetPasswordConfirmText=Are you sure you want to reset the password for the user {{username}}? resetPasswordConfirmText=Are you sure you want to reset the password for the user {{username}}?
create=Create create=Create
noAvailableIdentityProviders=No available identity providers. noAvailableIdentityProviders=No available identity providers.
@ -3128,7 +3129,7 @@ addTranslationsDialogRowsTable=Add a translations dialog rows table
addTranslationDialogHelperText=The translation based on the default language is required. addTranslationDialogHelperText=The translation based on the default language is required.
noLanguagesSearchResultsInstructions=Click on the search bar above to search for languages noLanguagesSearchResultsInstructions=Click on the search bar above to search for languages
addTranslationDialogOkBtn=Ok addTranslationDialogOkBtn=Ok
translationError=Please add translations before saving translationError=Please add translations before saving: {{error}}
fetchRoles=Fetch Roles fetchRoles=Fetch Roles
fetchRolesHelp=By default, only the roles available from the token sent with the authorization requests are used to check if the user is granted with a role. If this setting is enabled, the policy will ignore roles from the token and check any role associated with the user instead. fetchRolesHelp=By default, only the roles available from the token sent with the authorization requests are used to check if the user is granted with a role. If this setting is enabled, the policy will ignore roles from the token and check any role associated with the user instead.
emptyAdminEvents=No admin events emptyAdminEvents=No admin events

View file

@ -180,7 +180,7 @@ export default function ClientScopesSection() {
addError("deleteErrorClientScope", error); addError("deleteErrorClientScope", error);
} }
} else { } else {
addError(t("notAllowedToDeleteAllClientScopes"), "error"); addAlert(t("notAllowedToDeleteAllClientScopes"), AlertVariant.danger);
} }
}, },
}); });

View file

@ -93,7 +93,7 @@ export const AuthorizationExport = () => {
await navigator.clipboard.writeText(code!); await navigator.clipboard.writeText(code!);
addAlert(t("copied"), AlertVariant.success); addAlert(t("copied"), AlertVariant.success);
} catch (error) { } catch (error) {
addError(t("copyError"), error); addError("copyError", error);
} }
}} }}
> >

View file

@ -85,7 +85,7 @@ export default function AddMapper() {
); );
addAlert(t("mapperSaveSuccess"), AlertVariant.success); addAlert(t("mapperSaveSuccess"), AlertVariant.success);
} catch (error) { } catch (error) {
addError(t("mapperSaveError"), error); addError("mapperSaveError", error);
} }
} else { } else {
try { try {
@ -104,7 +104,7 @@ export default function AddMapper() {
}), }),
); );
} catch (error) { } catch (error) {
addError(t("mapperCreateError"), error); addError("mapperCreateError", error);
} }
} }
}; };

View file

@ -172,7 +172,7 @@ export default function ClientProfileForm() {
addAlert(t("deleteExecutorSuccess"), AlertVariant.success); addAlert(t("deleteExecutorSuccess"), AlertVariant.success);
navigate(toClientProfile({ realm, profileName })); navigate(toClientProfile({ realm, profileName }));
} catch (error) { } catch (error) {
addError(t("deleteExecutorError"), error); addError("deleteExecutorError", error);
} }
} else { } else {
try { try {
@ -180,7 +180,7 @@ export default function ClientProfileForm() {
addAlert(t("deleteClientSuccess"), AlertVariant.success); addAlert(t("deleteClientSuccess"), AlertVariant.success);
navigate(toClientPolicies({ realm, tab: "profiles" })); navigate(toClientPolicies({ realm, tab: "profiles" }));
} catch (error) { } catch (error) {
addError(t("deleteClientError"), error); addError("deleteClientError", error);
} }
} }
}, },

View file

@ -42,7 +42,7 @@ export const RealmSettingsLoginTab = ({
addAlert(t("enableSwitchSuccess", { switch: t(name) })); addAlert(t("enableSwitchSuccess", { switch: t(name) }));
refresh(); refresh();
} catch (error) { } catch (error) {
addError(t("enableSwitchError"), error); addError("enableSwitchError", error);
} }
}; };

View file

@ -237,7 +237,7 @@ export default function NewClientPolicy() {
}), }),
); );
} catch (error) { } catch (error) {
addError(t("deleteClientPolicyError"), error); addError("deleteClientPolicyError", error);
} }
}, },
}); });
@ -262,7 +262,7 @@ export default function NewClientPolicy() {
toEditClientPolicy({ realm, policyName: formValues.name! }), toEditClientPolicy({ realm, policyName: formValues.name! }),
); );
} catch (error) { } catch (error) {
addError(t("deleteConditionError"), error); addError("deleteConditionError", error);
} }
} else { } else {
const updatedPolicies = policies?.filter( const updatedPolicies = policies?.filter(
@ -281,7 +281,7 @@ export default function NewClientPolicy() {
}), }),
); );
} catch (error) { } catch (error) {
addError(t("deleteClientError"), error); addError("deleteClientError", error);
} }
} }
}, },
@ -306,7 +306,7 @@ export default function NewClientPolicy() {
form.setValue("profiles", currentPolicy?.profiles || []); form.setValue("profiles", currentPolicy?.profiles || []);
navigate(toEditClientPolicy({ realm, policyName: formValues.name! })); navigate(toEditClientPolicy({ realm, policyName: formValues.name! }));
} catch (error) { } catch (error) {
addError(t("deleteClientPolicyProfileError"), error); addError("deleteClientPolicyProfileError", error);
} }
} else { } else {
const updatedPolicies = policies?.filter( const updatedPolicies = policies?.filter(
@ -325,7 +325,7 @@ export default function NewClientPolicy() {
}), }),
); );
} catch (error) { } catch (error) {
addError(t("deleteClientError"), error); addError("deleteClientError", error);
} }
} }
}, },

View file

@ -175,7 +175,7 @@ export const PoliciesTab = () => {
addAlert(t("deleteClientPolicySuccess"), AlertVariant.success); addAlert(t("deleteClientPolicySuccess"), AlertVariant.success);
refresh(); refresh();
} catch (error) { } catch (error) {
addError(t("deleteClientPolicyError"), error); addError("deleteClientPolicyError", error);
} }
}, },
}); });

View file

@ -112,7 +112,7 @@ export default function ProfilesTab() {
addAlert(t("deleteClientSuccess"), AlertVariant.success); addAlert(t("deleteClientSuccess"), AlertVariant.success);
setKey(key + 1); setKey(key + 1);
} catch (error) { } catch (error) {
addError(t("deleteClientError"), error); addError("deleteClientError", error);
} }
}, },
}); });

View file

@ -225,7 +225,7 @@ export const RealmOverrides = ({
addAlert(t("addTranslationSuccess"), AlertVariant.success); addAlert(t("addTranslationSuccess"), AlertVariant.success);
} catch (error) { } catch (error) {
addError(t("addTranslationError"), error); addError("addTranslationError", error);
} }
}; };
@ -325,8 +325,8 @@ export const RealmOverrides = ({
addAlert(t("updateTranslationSuccess"), AlertVariant.success); addAlert(t("updateTranslationSuccess"), AlertVariant.success);
setTableRows(newRows); setTableRows(newRows);
} catch { } catch (error) {
addAlert(t("updateTranslationError"), AlertVariant.danger); addError("updateTranslationError", error);
} }
setEditStates((prevEditStates) => ({ setEditStates((prevEditStates) => ({

View file

@ -28,7 +28,7 @@ export const RevocationModal = ({
const { adminClient } = useAdminClient(); const { adminClient } = useAdminClient();
const { t } = useTranslation(); const { t } = useTranslation();
const { addAlert } = useAlerts(); const { addAlert, addError } = useAlerts();
const { realm: realmName, realmRepresentation: realm, refresh } = useRealm(); const { realm: realmName, realmRepresentation: realm, refresh } = useRealm();
const { register, handleSubmit } = useForm(); const { register, handleSubmit } = useForm();
@ -74,7 +74,7 @@ export const RevocationModal = ({
addAlert(t("notBeforeSuccess"), AlertVariant.success); addAlert(t("notBeforeSuccess"), AlertVariant.success);
} catch (error) { } catch (error) {
addAlert(t("setToNowError", { error }), AlertVariant.danger); addError("setToNowError", error);
} }
}; };
@ -90,7 +90,7 @@ export const RevocationModal = ({
addAlert(t("notBeforeClearedSuccess"), AlertVariant.success); addAlert(t("notBeforeClearedSuccess"), AlertVariant.success);
refresh(); refresh();
} catch (error) { } catch (error) {
addAlert(t("notBeforeError", { error }), AlertVariant.danger); addError("notBeforeError", error);
} }
}; };

View file

@ -22,14 +22,21 @@ package org.keycloak.email;
*/ */
public class EmailException extends Exception { public class EmailException extends Exception {
public EmailException(Throwable cause) { /**
super(cause); * Record an exception around email generation and sending
} *
* @param message Shown to users in the admin console
*/
public EmailException(String message) { public EmailException(String message) {
super(message); super(message);
} }
/**
* Record an exception around email generation and sending
*
* @param message Shown to users in the admin console
* @param cause Additional information to be logged
*/
public EmailException(String message, Throwable cause) { public EmailException(String message, Throwable cause) {
super(message, cause); super(message, cause);
} }

View file

@ -84,6 +84,8 @@ import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import static org.keycloak.utils.StreamsUtil.closing;
/** /**
* Set of helper methods, which are useful in various model implementations. * Set of helper methods, which are useful in various model implementations.
* *
@ -922,7 +924,7 @@ public final class KeycloakModelUtils {
Stream<ClientModel> browserFlowOverridingClients = realm.searchClientByAuthenticationFlowBindingOverrides(Collections.singletonMap("browser", model.getId()), 0, 1); Stream<ClientModel> browserFlowOverridingClients = realm.searchClientByAuthenticationFlowBindingOverrides(Collections.singletonMap("browser", model.getId()), 0, 1);
Stream<ClientModel> directGrantFlowOverridingClients = realm.searchClientByAuthenticationFlowBindingOverrides(Collections.singletonMap("direct_grant", model.getId()), 0, 1); Stream<ClientModel> directGrantFlowOverridingClients = realm.searchClientByAuthenticationFlowBindingOverrides(Collections.singletonMap("direct_grant", model.getId()), 0, 1);
boolean usedByClient = Stream.concat(browserFlowOverridingClients, directGrantFlowOverridingClients) boolean usedByClient = closing(Stream.concat(browserFlowOverridingClients, directGrantFlowOverridingClients))
.limit(1) .limit(1)
.findAny() .findAny()
.isPresent(); .isPresent();

View file

@ -63,7 +63,11 @@ public class DefaultEmailSenderProvider implements EmailSenderProvider {
@Override @Override
public void send(Map<String, String> config, UserModel user, String subject, String textBody, String htmlBody) throws EmailException { public void send(Map<String, String> config, UserModel user, String subject, String textBody, String htmlBody) throws EmailException {
send(config, retrieveEmailAddress(user), subject, textBody, htmlBody); String address = retrieveEmailAddress(user);
if (address == null) {
throw new EmailException("No email address configured for the user");
}
send(config, address, subject, textBody, htmlBody);
} }
@Override @Override
@ -107,6 +111,10 @@ public class DefaultEmailSenderProvider implements EmailSenderProvider {
props.setProperty("mail.smtp.connectiontimeout", "10000"); props.setProperty("mail.smtp.connectiontimeout", "10000");
String from = config.get("from"); String from = config.get("from");
if (from == null) {
throw new EmailException("No sender address configured in the realm settings for emails");
}
String fromDisplayName = config.get("fromDisplayName"); String fromDisplayName = config.get("fromDisplayName");
String replyTo = config.get("replyTo"); String replyTo = config.get("replyTo");
String replyToDisplayName = config.get("replyToDisplayName"); String replyToDisplayName = config.get("replyToDisplayName");
@ -156,9 +164,11 @@ public class DefaultEmailSenderProvider implements EmailSenderProvider {
transport.connect(); transport.connect();
} }
transport.sendMessage(msg, new InternetAddress[]{new InternetAddress(address)}); transport.sendMessage(msg, new InternetAddress[]{new InternetAddress(address)});
} catch (EmailException e) {
throw e;
} catch (Exception e) { } catch (Exception e) {
ServicesLogger.LOGGER.failedToSendEmail(e); ServicesLogger.LOGGER.failedToSendEmail(e);
throw new EmailException(e); throw new EmailException("Error when attempting to send the email to the server. More information is available in the server log.", e);
} finally { } finally {
if (transport != null) { if (transport != null) {
try { try {

View file

@ -75,12 +75,13 @@ public class KeycloakErrorHandler implements ExceptionMapper<Throwable> {
KeycloakTransaction tx = session.getTransactionManager(); KeycloakTransaction tx = session.getTransactionManager();
tx.setRollbackOnly(); tx.setRollbackOnly();
int statusCode = getStatusCode(throwable); Response.Status responseStatus = getResponseStatus(throwable);
boolean isServerError = responseStatus.getFamily().equals(Response.Status.Family.SERVER_ERROR);
if (statusCode >= 500 && statusCode <= 599) { if (isServerError) {
logger.error(UNCAUGHT_SERVER_ERROR_TEXT, throwable); logger.error(UNCAUGHT_SERVER_ERROR_TEXT, throwable);
} else { } else {
logger.debugv(throwable, ERROR_RESPONSE_TEXT, statusCode); logger.debugv(throwable, ERROR_RESPONSE_TEXT, responseStatus);
} }
HttpHeaders headers = session.getContext().getRequestHeaders(); HttpHeaders headers = session.getContext().getRequestHeaders();
@ -89,9 +90,15 @@ public class KeycloakErrorHandler implements ExceptionMapper<Throwable> {
OAuth2ErrorRepresentation error = new OAuth2ErrorRepresentation(); OAuth2ErrorRepresentation error = new OAuth2ErrorRepresentation();
error.setError(getErrorCode(throwable)); error.setError(getErrorCode(throwable));
error.setErrorDescription("For more on this error consult the server log at the debug level."); if (throwable instanceof ModelDuplicateException || throwable instanceof ModelValidationException) {
error.setErrorDescription(throwable.getMessage());
} else if (throwable instanceof JsonProcessingException || throwable.getCause() instanceof JsonProcessingException) {
error.setErrorDescription("Cannot parse the JSON");
} else if (isServerError) {
error.setErrorDescription("For more on this error consult the server log.");
}
return Response.status(statusCode) return Response.status(responseStatus)
.header(HttpHeaders.CONTENT_TYPE, jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE.toString()) .header(HttpHeaders.CONTENT_TYPE, jakarta.ws.rs.core.MediaType.APPLICATION_JSON_TYPE.toString())
.entity(error) .entity(error)
.build(); .build();
@ -105,36 +112,36 @@ public class KeycloakErrorHandler implements ExceptionMapper<Throwable> {
Locale locale = session.getContext().resolveLocale(null); Locale locale = session.getContext().resolveLocale(null);
FreeMarkerProvider freeMarker = session.getProvider(FreeMarkerProvider.class); FreeMarkerProvider freeMarker = session.getProvider(FreeMarkerProvider.class);
Map<String, Object> attributes = initAttributes(session, realm, theme, locale, statusCode); Map<String, Object> attributes = initAttributes(session, realm, theme, locale, responseStatus);
String templateName = "error.ftl"; String templateName = "error.ftl";
String content = freeMarker.processTemplate(attributes, templateName, theme); String content = freeMarker.processTemplate(attributes, templateName, theme);
return Response.status(statusCode).type(MediaType.TEXT_HTML_UTF_8_TYPE).entity(content).build(); return Response.status(responseStatus).type(MediaType.TEXT_HTML_UTF_8_TYPE).entity(content).build();
} catch (Throwable t) { } catch (Throwable t) {
logger.error("Failed to create error page", t); logger.error("Failed to create error page", t);
return Response.serverError().build(); return Response.serverError().build();
} }
} }
private static int getStatusCode(Throwable throwable) { private static Response.Status getResponseStatus(Throwable throwable) {
int status = Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(); if (throwable instanceof WebApplicationException ex) {
if (throwable instanceof WebApplicationException) { return Response.Status.fromStatusCode(ex.getResponse().getStatus());
WebApplicationException ex = (WebApplicationException) throwable;
status = ex.getResponse().getStatus();
}
if (throwable instanceof JsonProcessingException
|| throwable instanceof ModelValidationException) {
status = Response.Status.BAD_REQUEST.getStatusCode();
}
if (throwable instanceof ModelIllegalStateException) {
status = Response.Status.INTERNAL_SERVER_ERROR.getStatusCode();
}
if (throwable instanceof ModelDuplicateException) {
status = Response.Status.CONFLICT.getStatusCode();
} }
return status; if (throwable instanceof JsonProcessingException || throwable instanceof ModelValidationException) {
return Response.Status.BAD_REQUEST;
}
if (throwable instanceof ModelIllegalStateException) {
return Response.Status.INTERNAL_SERVER_ERROR;
}
if (throwable instanceof ModelDuplicateException) {
return Response.Status.CONFLICT;
}
return Response.Status.INTERNAL_SERVER_ERROR;
} }
private static String getErrorCode(Throwable throwable) { private static String getErrorCode(Throwable throwable) {
@ -172,18 +179,18 @@ public class KeycloakErrorHandler implements ExceptionMapper<Throwable> {
return realm; return realm;
} }
private static Map<String, Object> initAttributes(KeycloakSession session, RealmModel realm, Theme theme, Locale locale, int statusCode) throws IOException { private static Map<String, Object> initAttributes(KeycloakSession session, RealmModel realm, Theme theme, Locale locale, Response.Status responseStatus) throws IOException {
Map<String, Object> attributes = new HashMap<>(); Map<String, Object> attributes = new HashMap<>();
Properties messagesBundle = theme.getMessages(locale); Properties messagesBundle = theme.getMessages(locale);
attributes.put("statusCode", statusCode); attributes.put("statusCode", responseStatus.getStatusCode());
attributes.put("realm", realm); attributes.put("realm", realm);
attributes.put("url", new UrlBean(realm, theme, session.getContext().getUri().getBaseUri(), null)); attributes.put("url", new UrlBean(realm, theme, session.getContext().getUri().getBaseUri(), null));
attributes.put("locale", new LocaleBean(realm, locale, session.getContext().getUri().getRequestUriBuilder(), messagesBundle)); attributes.put("locale", new LocaleBean(realm, locale, session.getContext().getUri().getRequestUriBuilder(), messagesBundle));
String errorKey = statusCode == 404 ? Messages.PAGE_NOT_FOUND : Messages.INTERNAL_SERVER_ERROR; String errorKey = responseStatus == Response.Status.NOT_FOUND ? Messages.PAGE_NOT_FOUND : Messages.INTERNAL_SERVER_ERROR;
String errorMessage = messagesBundle.getProperty(errorKey); String errorMessage = messagesBundle.getProperty(errorKey);
attributes.put("message", new MessageBean(errorMessage, MessageType.ERROR)); attributes.put("message", new MessageBean(errorMessage, MessageType.ERROR));

View file

@ -44,12 +44,10 @@ import org.keycloak.models.ClientModel;
import org.keycloak.models.Constants; import org.keycloak.models.Constants;
import org.keycloak.models.FederatedIdentityModel; import org.keycloak.models.FederatedIdentityModel;
import org.keycloak.models.GroupModel; import org.keycloak.models.GroupModel;
import org.keycloak.models.IdentityProviderModel;
import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSession;
import org.keycloak.models.ModelDuplicateException; import org.keycloak.models.ModelDuplicateException;
import org.keycloak.models.ModelException; import org.keycloak.models.ModelException;
import org.keycloak.models.ModelIllegalStateException; import org.keycloak.models.ModelIllegalStateException;
import org.keycloak.models.OrganizationModel;
import org.keycloak.models.RealmModel; import org.keycloak.models.RealmModel;
import org.keycloak.models.UserConsentModel; import org.keycloak.models.UserConsentModel;
import org.keycloak.models.UserCredentialModel; import org.keycloak.models.UserCredentialModel;
@ -924,7 +922,7 @@ public class UserResource {
return Response.noContent().build(); return Response.noContent().build();
} catch (EmailException e) { } catch (EmailException e) {
ServicesLogger.LOGGER.failedToSendActionsEmail(e); ServicesLogger.LOGGER.failedToSendActionsEmail(e);
throw ErrorResponse.error("Failed to send execute actions email", Status.INTERNAL_SERVER_ERROR); throw ErrorResponse.error("Failed to send execute actions email: " + e.getMessage(), Status.INTERNAL_SERVER_ERROR);
} }
} }

View file

@ -278,10 +278,10 @@ public class FlowTest extends AbstractAuthenticationTest {
Runnable assertRemoveFail = () -> { Runnable assertRemoveFail = () -> {
try { try {
authMgmtResource.deleteFlow(flowId); authMgmtResource.deleteFlow(flowId);
Assert.fail("Not expected to delete flow that in used."); Assert.fail("Not expected to delete flow that is in use.");
} catch (WebApplicationException e) { } catch (WebApplicationException e) {
OAuth2ErrorRepresentation error = e.getResponse().readEntity(OAuth2ErrorRepresentation.class); OAuth2ErrorRepresentation error = e.getResponse().readEntity(OAuth2ErrorRepresentation.class);
Assert.assertEquals("For more on this error consult the server log at the debug level.", error.getErrorDescription()); Assert.assertEquals("For more on this error consult the server log.", error.getErrorDescription());
} }
}; };

View file

@ -93,12 +93,13 @@ public class UncaughtErrorPageTest extends AbstractKeycloakTest {
post.setEntity(new StringEntity("{ invalid : invalid }")); post.setEntity(new StringEntity("{ invalid : invalid }"));
post.setHeader("Content-Type", "application/json"); post.setHeader("Content-Type", "application/json");
CloseableHttpResponse response = client.execute(post); try (CloseableHttpResponse response = client.execute(post)) {
assertEquals(400, response.getStatusLine().getStatusCode()); assertEquals(400, response.getStatusLine().getStatusCode());
OAuth2ErrorRepresentation error = JsonSerialization.readValue(response.getEntity().getContent(), OAuth2ErrorRepresentation.class); OAuth2ErrorRepresentation error = JsonSerialization.readValue(response.getEntity().getContent(), OAuth2ErrorRepresentation.class);
assertEquals(OAuthErrorException.INVALID_REQUEST, error.getError()); assertEquals(OAuthErrorException.INVALID_REQUEST, error.getError());
assertNotNull(error.getErrorDescription()); assertNotNull("found error with " + error.getError() + "/" + error.getErrorDescription(), error.getErrorDescription());
}
} }
} }
@ -113,12 +114,13 @@ public class UncaughtErrorPageTest extends AbstractKeycloakTest {
post.setHeader("Authorization", "bearer " + accessToken); post.setHeader("Authorization", "bearer " + accessToken);
post.setHeader("Content-Type", "application/json"); post.setHeader("Content-Type", "application/json");
CloseableHttpResponse response = client.execute(post); try (CloseableHttpResponse response = client.execute(post)) {
assertEquals(400, response.getStatusLine().getStatusCode()); assertEquals(400, response.getStatusLine().getStatusCode());
OAuth2ErrorRepresentation error = JsonSerialization.readValue(response.getEntity().getContent(), OAuth2ErrorRepresentation.class); OAuth2ErrorRepresentation error = JsonSerialization.readValue(response.getEntity().getContent(), OAuth2ErrorRepresentation.class);
assertEquals(OAuthErrorException.INVALID_REQUEST, error.getError()); assertEquals(OAuthErrorException.INVALID_REQUEST, error.getError());
assertNotNull(error.getErrorDescription()); assertNotNull("found error with " + error.getError() + "/" + error.getErrorDescription(), error.getErrorDescription());
}
} }
} }