Uploaded image for project: 'Red Hat build of Keycloak'
  1. Red Hat build of Keycloak
  2. RHBK-2321

New credential templates broken in KC26 [GHI#34687]

XMLWordPrintable

    • False
    • Hide

      None

      Show
      None
    • False

      _Originally posted by @dingsoyr in https://github.com/keycloak/keycloak/issues/32685#issuecomment-2440981296_

      Hi..

      After upgrading to Keycloak 26.0.2 i get an error in the logs related to the new credential templates. When e.g. a user is updating his/her passord the error is:

      ```
      2024-10-28 10:05:43,747 SEVERE [freemarker.runtime] (executor-thread-3) Error executing FreeMarker template: freemarker.core.NonHashException: For "." left-hand operand: Expected a hash, but this has evaluated to a sequence (wrapper: f.t.SimpleSequence):
      ==> event.details [in template "text/event-update_credential.ftl" at line 2, column 36]


      FTL stack trace ("~" means nesting-related):

          - Failed at: ${msg("eventUpdateCredentialBody", ev...  [in template "text/event-update_credential.ftl" at line 2, column 1]
      

          at freemarker.core.Dot._eval(Dot.java:48)
          at freemarker.core.Expression.eval(Expression.java:101)
          at freemarker.core.DefaultToExpression._eval(DefaultToExpression.java:96)
          at freemarker.core.Expression.eval(Expression.java:101)
          at freemarker.core.ListLiteral.getModelList(ListLiteral.java:98)
          at freemarker.core.MethodCall._eval(MethodCall.java:60)
          at freemarker.core.Expression.eval(Expression.java:101)
          at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:104)
          at freemarker.core.DollarVariable.accept(DollarVariable.java:63)
          at freemarker.core.Environment.visit(Environment.java:335)
          at freemarker.core.Environment.process(Environment.java:314)
          at freemarker.template.Template.process(Template.java:383)
          at org.keycloak.theme.freemarker.DefaultFreeMarkerProvider.processTemplate(DefaultFreeMarkerProvider.java:49)
          at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.processTemplate(FreeMarkerEmailTemplateProvider.java:233)
          at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.send(FreeMarkerEmailTemplateProvider.java:262)
          at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.send(FreeMarkerEmailTemplateProvider.java:257)
          at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.send(FreeMarkerEmailTemplateProvider.java:211)
          at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.sendEvent(FreeMarkerEmailTemplateProvider.java:108)
          at org.keycloak.events.email.EmailEventListenerProvider$1.run(EmailEventListenerProvider.java:97)
          at org.keycloak.models.utils.KeycloakModelUtils.lambda$runJobInTransaction$1(KeycloakModelUtils.java:274)
          at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransactionWithResult(KeycloakModelUtils.java:393)
          at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:273)
          at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:263)
          at org.keycloak.events.email.EmailEventListenerProvider.sendEmail(EmailEventListenerProvider.java:75)
          at java.base/java.lang.Iterable.forEach(Iterable.java:75)
          at org.keycloak.events.EventListenerTransaction.commitImpl(EventListenerTransaction.java:62)
          at org.keycloak.models.AbstractKeycloakTransaction.commit(AbstractKeycloakTransaction.java:46)
          at org.keycloak.services.DefaultKeycloakTransactionManager.commit(DefaultKeycloakTransactionManager.java:146)
          at org.keycloak.services.DefaultKeycloakSession.closeTransactionManager(DefaultKeycloakSession.java:414)
          at org.keycloak.services.DefaultKeycloakSession.close(DefaultKeycloakSession.java:379)
          at org.keycloak.models.KeycloakBeanProducer_ProducerMethod_getKeycloakSession_XoSEUTXOsE3bpqXlGMAykCiECUM_ClientProxy.close(Unknown Source)
          at org.keycloak.quarkus.runtime.transaction.TransactionalSessionHandler.close(TransactionalSessionHandler.java:60)
          at org.keycloak.quarkus.runtime.integration.jaxrs.CloseSessionFilter.closeSession(CloseSessionFilter.java:67)
          at org.keycloak.quarkus.runtime.integration.jaxrs.CloseSessionFilter.filter(CloseSessionFilter.java:63)
          at org.jboss.resteasy.reactive.server.handlers.ResourceResponseFilterHandler.handle(ResourceResponseFilterHandler.java:25)
          at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:150)
          at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147)
          at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:635)
          at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
          at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
          at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
          at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:11)
          at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:11)
          at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
          at java.base/java.lang.Thread.run(Thread.java:840)
      

      2024-10-28 10:05:43,748 ERROR [org.keycloak.events.email.EmailEventListenerProvider] (executor-thread-3) Failed to send type mail: org.keycloak.email.EmailException: Failed to template email

          at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.processTemplate(FreeMarkerEmailTemplateProvider.java:247)
          at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.send(FreeMarkerEmailTemplateProvider.java:262)
          at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.send(FreeMarkerEmailTemplateProvider.java:257)
          at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.send(FreeMarkerEmailTemplateProvider.java:211)
          at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.sendEvent(FreeMarkerEmailTemplateProvider.java:108)
          at org.keycloak.events.email.EmailEventListenerProvider$1.run(EmailEventListenerProvider.java:97)
          at org.keycloak.models.utils.KeycloakModelUtils.lambda$runJobInTransaction$1(KeycloakModelUtils.java:274)
          at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransactionWithResult(KeycloakModelUtils.java:393)
          at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:273)
          at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:263)
          at org.keycloak.events.email.EmailEventListenerProvider.sendEmail(EmailEventListenerProvider.java:75)
          at java.base/java.lang.Iterable.forEach(Iterable.java:75)
          at org.keycloak.events.EventListenerTransaction.commitImpl(EventListenerTransaction.java:62)
          at org.keycloak.models.AbstractKeycloakTransaction.commit(AbstractKeycloakTransaction.java:46)
          at org.keycloak.services.DefaultKeycloakTransactionManager.commit(DefaultKeycloakTransactionManager.java:146)
          at org.keycloak.services.DefaultKeycloakSession.closeTransactionManager(DefaultKeycloakSession.java:414)
          at org.keycloak.services.DefaultKeycloakSession.close(DefaultKeycloakSession.java:379)
          at org.keycloak.models.KeycloakBeanProducer_ProducerMethod_getKeycloakSession_XoSEUTXOsE3bpqXlGMAykCiECUM_ClientProxy.close(Unknown Source)
          at org.keycloak.quarkus.runtime.transaction.TransactionalSessionHandler.close(TransactionalSessionHandler.java:60)
          at org.keycloak.quarkus.runtime.integration.jaxrs.CloseSessionFilter.closeSession(CloseSessionFilter.java:67)
          at org.keycloak.quarkus.runtime.integration.jaxrs.CloseSessionFilter.filter(CloseSessionFilter.java:63)
          at org.jboss.resteasy.reactive.server.handlers.ResourceResponseFilterHandler.handle(ResourceResponseFilterHandler.java:25)
          at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:150)
          at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147)
          at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:635)
          at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
          at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
          at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
          at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:11)
          at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:11)
          at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
          at java.base/java.lang.Thread.run(Thread.java:840)
      

      Caused by: org.keycloak.email.EmailException: Failed to template plain text email.

          at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.processTemplate(FreeMarkerEmailTemplateProvider.java:235)
          ... 31 more
      

      Caused by: org.keycloak.theme.FreeMarkerException: Failed to process template text/event-update_credential.ftl

          at org.keycloak.theme.freemarker.DefaultFreeMarkerProvider.processTemplate(DefaultFreeMarkerProvider.java:52)
          at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.processTemplate(FreeMarkerEmailTemplateProvider.java:233)
          ... 31 more
      

      Caused by: freemarker.core.NonHashException: For "." left-hand operand: Expected a hash, but this has evaluated to a sequence (wrapper: f.t.SimpleSequence):
      ==> event.details [in template "text/event-update_credential.ftl" at line 2, column 36]


      FTL stack trace ("~" means nesting-related):

          - Failed at: ${msg("eventUpdateCredentialBody", ev...  [in template "text/event-update_credential.ftl" at line 2, column 1]
      

          at freemarker.core.Dot._eval(Dot.java:48)
          at freemarker.core.Expression.eval(Expression.java:101)
          at freemarker.core.DefaultToExpression._eval(DefaultToExpression.java:96)
          at freemarker.core.Expression.eval(Expression.java:101)
          at freemarker.core.ListLiteral.getModelList(ListLiteral.java:98)
          at freemarker.core.MethodCall._eval(MethodCall.java:60)
          at freemarker.core.Expression.eval(Expression.java:101)
          at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:104)
          at freemarker.core.DollarVariable.accept(DollarVariable.java:63)
          at freemarker.core.Environment.visit(Environment.java:335)
          at freemarker.core.Environment.process(Environment.java:314)
          at freemarker.template.Template.process(Template.java:383)
          at org.keycloak.theme.freemarker.DefaultFreeMarkerProvider.processTemplate(DefaultFreeMarkerProvider.java:49)
          ... 32 more
      

      ```

      Using the "keycloak" email theme.

      The same type of error also occurs when the event-remove_credential.ftl is triggered, eg when removing OTP from an account.

              Unassigned Unassigned
              pvlha Pavel Vlha
              Keycloak Core Clients
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

                Created:
                Updated:
                Resolved: