From c366901224a8d0e8bc0098d7a7e05a46f484b2ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Muzik=C3=A1=C5=99?= Date: Wed, 22 Mar 2023 16:34:41 +0100 Subject: [PATCH] Fix dist build race condition Closes #19251 --- .../quarkus/deployment/KeycloakProcessor.java | 229 +++++++++--------- 1 file changed, 114 insertions(+), 115 deletions(-) diff --git a/quarkus/deployment/src/main/java/org/keycloak/quarkus/deployment/KeycloakProcessor.java b/quarkus/deployment/src/main/java/org/keycloak/quarkus/deployment/KeycloakProcessor.java index 108d8dd869..5bd87c5b6f 100644 --- a/quarkus/deployment/src/main/java/org/keycloak/quarkus/deployment/KeycloakProcessor.java +++ b/quarkus/deployment/src/main/java/org/keycloak/quarkus/deployment/KeycloakProcessor.java @@ -17,22 +17,100 @@ package org.keycloak.quarkus.deployment; -import static org.keycloak.quarkus.runtime.KeycloakRecorder.DEFAULT_HEALTH_ENDPOINT; -import static org.keycloak.quarkus.runtime.KeycloakRecorder.DEFAULT_METRICS_ENDPOINT; -import static org.keycloak.quarkus.runtime.Providers.getProviderManager; -import static org.keycloak.quarkus.runtime.configuration.Configuration.getConfig; -import static org.keycloak.quarkus.runtime.configuration.Configuration.getPropertyNames; -import static org.keycloak.quarkus.runtime.configuration.MicroProfileConfigProvider.NS_KEYCLOAK_PREFIX; -import static org.keycloak.quarkus.runtime.configuration.MicroProfileConfigProvider.NS_QUARKUS; -import static org.keycloak.quarkus.runtime.configuration.QuarkusPropertiesConfigSource.QUARKUS_PROPERTY_ENABLED; -import static org.keycloak.quarkus.runtime.storage.legacy.database.LegacyJpaConnectionProviderFactory.QUERY_PROPERTY_PREFIX; -import static org.keycloak.connections.jpa.util.JpaUtils.loadSpecificNamedQueries; -import static org.keycloak.representations.provider.ScriptProviderDescriptor.AUTHENTICATORS; -import static org.keycloak.representations.provider.ScriptProviderDescriptor.MAPPERS; -import static org.keycloak.representations.provider.ScriptProviderDescriptor.POLICIES; -import static org.keycloak.quarkus.runtime.Environment.getProviderFiles; -import static org.keycloak.theme.ClasspathThemeProviderFactory.KEYCLOAK_THEMES_JSON; -import static org.keycloak.representations.provider.ScriptProviderDescriptor.SAML_MAPPERS; +import io.quarkus.agroal.spi.JdbcDataSourceBuildItem; +import io.quarkus.arc.deployment.BuildTimeConditionBuildItem; +import io.quarkus.datasource.deployment.spi.DevServicesDatasourceResultBuildItem; +import io.quarkus.deployment.IsDevelopment; +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.annotations.Consume; +import io.quarkus.deployment.annotations.ExecutionTime; +import io.quarkus.deployment.annotations.Record; +import io.quarkus.deployment.builditem.BootstrapConfigSetupCompleteBuildItem; +import io.quarkus.deployment.builditem.CombinedIndexBuildItem; +import io.quarkus.deployment.builditem.ExecutorBuildItem; +import io.quarkus.deployment.builditem.FeatureBuildItem; +import io.quarkus.deployment.builditem.GeneratedResourceBuildItem; +import io.quarkus.deployment.builditem.HotDeploymentWatchedFileBuildItem; +import io.quarkus.deployment.builditem.IndexDependencyBuildItem; +import io.quarkus.deployment.builditem.StaticInitConfigSourceProviderBuildItem; +import io.quarkus.hibernate.orm.deployment.AdditionalJpaModelBuildItem; +import io.quarkus.hibernate.orm.deployment.HibernateOrmConfig; +import io.quarkus.hibernate.orm.deployment.PersistenceXmlDescriptorBuildItem; +import io.quarkus.hibernate.orm.deployment.integration.HibernateOrmIntegrationRuntimeConfiguredBuildItem; +import io.quarkus.resteasy.server.common.deployment.ResteasyDeploymentCustomizerBuildItem; +import io.quarkus.runtime.configuration.ProfileManager; +import io.quarkus.vertx.http.deployment.FilterBuildItem; +import io.quarkus.vertx.http.deployment.NonApplicationRootPathBuildItem; +import io.quarkus.vertx.http.deployment.RouteBuildItem; +import io.smallrye.config.ConfigValue; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor; +import org.hibernate.jpa.boot.internal.PersistenceXmlParser; +import org.jboss.jandex.AnnotationInstance; +import org.jboss.jandex.AnnotationTarget; +import org.jboss.jandex.ClassInfo; +import org.jboss.jandex.DotName; +import org.jboss.jandex.IndexView; +import org.jboss.logging.Logger; +import org.jboss.resteasy.plugins.server.servlet.ResteasyContextParameters; +import org.jboss.resteasy.spi.ResteasyDeployment; +import org.keycloak.Config; +import org.keycloak.authentication.AuthenticatorSpi; +import org.keycloak.authentication.authenticators.browser.DeployedScriptAuthenticatorFactory; +import org.keycloak.authorization.policy.provider.PolicySpi; +import org.keycloak.authorization.policy.provider.js.DeployedScriptPolicyFactory; +import org.keycloak.common.Profile; +import org.keycloak.common.crypto.FipsMode; +import org.keycloak.common.profile.PropertiesFileProfileConfigResolver; +import org.keycloak.common.util.StreamUtil; +import org.keycloak.config.SecurityOptions; +import org.keycloak.config.StorageOptions; +import org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory; +import org.keycloak.connections.jpa.JpaConnectionProvider; +import org.keycloak.connections.jpa.JpaConnectionSpi; +import org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProviderFactory; +import org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider; +import org.keycloak.models.map.storage.jpa.EventListenerIntegrator; +import org.keycloak.models.map.storage.jpa.JpaMapStorageProviderFactory; +import org.keycloak.policy.BlacklistPasswordPolicyProviderFactory; +import org.keycloak.protocol.ProtocolMapperSpi; +import org.keycloak.protocol.oidc.mappers.DeployedScriptOIDCProtocolMapper; +import org.keycloak.protocol.saml.mappers.DeployedScriptSAMLProtocolMapper; +import org.keycloak.provider.EnvironmentDependentProviderFactory; +import org.keycloak.provider.Provider; +import org.keycloak.provider.ProviderFactory; +import org.keycloak.provider.ProviderManager; +import org.keycloak.provider.Spi; +import org.keycloak.quarkus.runtime.Environment; +import org.keycloak.quarkus.runtime.KeycloakRecorder; +import org.keycloak.quarkus.runtime.QuarkusProfileConfigResolver; +import org.keycloak.quarkus.runtime.configuration.Configuration; +import org.keycloak.quarkus.runtime.configuration.KeycloakConfigSourceProvider; +import org.keycloak.quarkus.runtime.configuration.MicroProfileConfigProvider; +import org.keycloak.quarkus.runtime.configuration.PersistedConfigSource; +import org.keycloak.quarkus.runtime.configuration.QuarkusPropertiesConfigSource; +import org.keycloak.quarkus.runtime.configuration.mappers.PropertyMapper; +import org.keycloak.quarkus.runtime.configuration.mappers.PropertyMappers; +import org.keycloak.quarkus.runtime.integration.jaxrs.QuarkusKeycloakApplication; +import org.keycloak.quarkus.runtime.integration.web.NotFoundHandler; +import org.keycloak.quarkus.runtime.services.health.KeycloakReadyHealthCheck; +import org.keycloak.quarkus.runtime.storage.database.jpa.NamedJpaConnectionProviderFactory; +import org.keycloak.quarkus.runtime.themes.FlatClasspathThemeResourceProviderFactory; +import org.keycloak.representations.provider.ScriptProviderDescriptor; +import org.keycloak.representations.provider.ScriptProviderMetadata; +import org.keycloak.services.ServicesLogger; +import org.keycloak.theme.ClasspathThemeProviderFactory; +import org.keycloak.theme.ClasspathThemeResourceProviderFactory; +import org.keycloak.theme.FolderThemeProviderFactory; +import org.keycloak.theme.JarThemeProviderFactory; +import org.keycloak.theme.ThemeResourceSpi; +import org.keycloak.transaction.JBossJtaTransactionManagerLookup; +import org.keycloak.url.DefaultHostnameProviderFactory; +import org.keycloak.url.FixedHostnameProviderFactory; +import org.keycloak.url.RequestHostnameProviderFactory; +import org.keycloak.util.JsonSerialization; +import org.keycloak.vault.FilesPlainTextVaultProviderFactory; import javax.persistence.Entity; import javax.persistence.spi.PersistenceUnitTransactionType; @@ -60,103 +138,22 @@ import java.util.function.Predicate; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import io.quarkus.agroal.spi.JdbcDataSourceBuildItem; -import io.quarkus.arc.deployment.BuildTimeConditionBuildItem; -import io.quarkus.datasource.deployment.spi.DevServicesDatasourceResultBuildItem; -import io.quarkus.deployment.IsDevelopment; -import io.quarkus.deployment.annotations.Consume; -import io.quarkus.deployment.builditem.BootstrapConfigSetupCompleteBuildItem; -import io.quarkus.deployment.builditem.CombinedIndexBuildItem; -import io.quarkus.deployment.builditem.ExecutorBuildItem; -import io.quarkus.deployment.builditem.GeneratedResourceBuildItem; -import io.quarkus.deployment.builditem.HotDeploymentWatchedFileBuildItem; -import io.quarkus.deployment.builditem.IndexDependencyBuildItem; -import io.quarkus.deployment.builditem.StaticInitConfigSourceProviderBuildItem; -import io.quarkus.hibernate.orm.deployment.AdditionalJpaModelBuildItem; -import io.quarkus.hibernate.orm.deployment.HibernateOrmConfig; -import io.quarkus.hibernate.orm.deployment.PersistenceXmlDescriptorBuildItem; -import io.quarkus.hibernate.orm.deployment.integration.HibernateOrmIntegrationRuntimeConfiguredBuildItem; -import io.quarkus.resteasy.server.common.deployment.ResteasyDeploymentCustomizerBuildItem; -import io.quarkus.runtime.configuration.ProfileManager; -import io.quarkus.vertx.http.deployment.NonApplicationRootPathBuildItem; -import io.quarkus.vertx.http.deployment.RouteBuildItem; -import io.quarkus.vertx.http.runtime.HttpBuildTimeConfig; -import io.smallrye.config.ConfigValue; -import org.hibernate.cfg.AvailableSettings; -import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor; -import org.hibernate.jpa.boot.internal.PersistenceXmlParser; -import org.jboss.jandex.AnnotationInstance; -import org.jboss.jandex.AnnotationTarget; -import org.jboss.jandex.ClassInfo; -import org.jboss.jandex.DotName; -import org.jboss.jandex.IndexView; -import org.jboss.logging.Logger; -import org.jboss.resteasy.plugins.server.servlet.ResteasyContextParameters; -import org.jboss.resteasy.spi.ResteasyDeployment; -import org.keycloak.Config; -import org.keycloak.common.crypto.FipsMode; -import org.keycloak.common.profile.PropertiesFileProfileConfigResolver; -import org.keycloak.config.SecurityOptions; -import org.keycloak.config.StorageOptions; -import org.keycloak.connections.jpa.JpaConnectionProvider; -import org.keycloak.connections.jpa.JpaConnectionSpi; -import org.keycloak.models.map.storage.jpa.EventListenerIntegrator; -import org.keycloak.models.map.storage.jpa.JpaMapStorageProviderFactory; -import org.keycloak.protocol.saml.mappers.DeployedScriptSAMLProtocolMapper; -import org.keycloak.quarkus.runtime.QuarkusProfileConfigResolver; -import org.keycloak.quarkus.runtime.configuration.PersistedConfigSource; -import org.keycloak.quarkus.runtime.configuration.QuarkusPropertiesConfigSource; -import org.keycloak.quarkus.runtime.configuration.mappers.PropertyMapper; -import org.keycloak.quarkus.runtime.configuration.mappers.PropertyMappers; -import org.keycloak.quarkus.runtime.integration.jaxrs.QuarkusKeycloakApplication; -import org.keycloak.authentication.AuthenticatorSpi; -import org.keycloak.authentication.authenticators.browser.DeployedScriptAuthenticatorFactory; -import org.keycloak.authorization.policy.provider.PolicySpi; -import org.keycloak.authorization.policy.provider.js.DeployedScriptPolicyFactory; -import org.keycloak.common.Profile; -import org.keycloak.common.util.StreamUtil; -import org.keycloak.quarkus.runtime.configuration.Configuration; -import org.keycloak.quarkus.runtime.configuration.KeycloakConfigSourceProvider; -import org.keycloak.quarkus.runtime.configuration.MicroProfileConfigProvider; -import org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory; -import org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProviderFactory; -import org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider; -import org.keycloak.policy.BlacklistPasswordPolicyProviderFactory; -import org.keycloak.protocol.ProtocolMapperSpi; -import org.keycloak.protocol.oidc.mappers.DeployedScriptOIDCProtocolMapper; -import org.keycloak.provider.EnvironmentDependentProviderFactory; -import org.keycloak.provider.Provider; -import org.keycloak.provider.ProviderFactory; -import org.keycloak.provider.ProviderManager; -import org.keycloak.provider.Spi; -import org.keycloak.quarkus.runtime.KeycloakRecorder; - -import io.quarkus.deployment.annotations.BuildProducer; -import io.quarkus.deployment.annotations.BuildStep; -import io.quarkus.deployment.annotations.ExecutionTime; -import io.quarkus.deployment.annotations.Record; -import io.quarkus.deployment.builditem.FeatureBuildItem; -import io.quarkus.vertx.http.deployment.FilterBuildItem; - -import org.keycloak.quarkus.runtime.services.health.KeycloakReadyHealthCheck; -import org.keycloak.quarkus.runtime.storage.database.jpa.NamedJpaConnectionProviderFactory; -import org.keycloak.quarkus.runtime.themes.FlatClasspathThemeResourceProviderFactory; -import org.keycloak.representations.provider.ScriptProviderDescriptor; -import org.keycloak.representations.provider.ScriptProviderMetadata; -import org.keycloak.quarkus.runtime.integration.web.NotFoundHandler; -import org.keycloak.services.ServicesLogger; -import org.keycloak.theme.ClasspathThemeProviderFactory; -import org.keycloak.theme.ClasspathThemeResourceProviderFactory; -import org.keycloak.theme.FolderThemeProviderFactory; -import org.keycloak.theme.JarThemeProviderFactory; -import org.keycloak.theme.ThemeResourceSpi; -import org.keycloak.transaction.JBossJtaTransactionManagerLookup; -import org.keycloak.quarkus.runtime.Environment; -import org.keycloak.url.DefaultHostnameProviderFactory; -import org.keycloak.url.FixedHostnameProviderFactory; -import org.keycloak.url.RequestHostnameProviderFactory; -import org.keycloak.util.JsonSerialization; -import org.keycloak.vault.FilesPlainTextVaultProviderFactory; +import static org.keycloak.connections.jpa.util.JpaUtils.loadSpecificNamedQueries; +import static org.keycloak.quarkus.runtime.Environment.getProviderFiles; +import static org.keycloak.quarkus.runtime.KeycloakRecorder.DEFAULT_HEALTH_ENDPOINT; +import static org.keycloak.quarkus.runtime.KeycloakRecorder.DEFAULT_METRICS_ENDPOINT; +import static org.keycloak.quarkus.runtime.Providers.getProviderManager; +import static org.keycloak.quarkus.runtime.configuration.Configuration.getConfig; +import static org.keycloak.quarkus.runtime.configuration.Configuration.getPropertyNames; +import static org.keycloak.quarkus.runtime.configuration.MicroProfileConfigProvider.NS_KEYCLOAK_PREFIX; +import static org.keycloak.quarkus.runtime.configuration.MicroProfileConfigProvider.NS_QUARKUS; +import static org.keycloak.quarkus.runtime.configuration.QuarkusPropertiesConfigSource.QUARKUS_PROPERTY_ENABLED; +import static org.keycloak.quarkus.runtime.storage.legacy.database.LegacyJpaConnectionProviderFactory.QUERY_PROPERTY_PREFIX; +import static org.keycloak.representations.provider.ScriptProviderDescriptor.AUTHENTICATORS; +import static org.keycloak.representations.provider.ScriptProviderDescriptor.MAPPERS; +import static org.keycloak.representations.provider.ScriptProviderDescriptor.POLICIES; +import static org.keycloak.representations.provider.ScriptProviderDescriptor.SAML_MAPPERS; +import static org.keycloak.theme.ClasspathThemeProviderFactory.KEYCLOAK_THEMES_JSON; class KeycloakProcessor { @@ -221,7 +218,9 @@ class KeycloakProcessor { return new ConfigBuildItem(); } - // called from setCryptoProvider now + @Record(ExecutionTime.STATIC_INIT) + @BuildStep + @Consume(ConfigBuildItem.class) ProfileBuildItem configureProfile(KeycloakRecorder recorder) { Profile profile = Profile.configure( new QuarkusProfileConfigResolver(), @@ -627,10 +626,10 @@ class KeycloakProcessor { } @Consume(BootstrapConfigSetupCompleteBuildItem.class) + @Consume(ProfileBuildItem.class) @BuildStep @Record(ExecutionTime.STATIC_INIT) void setCryptoProvider(KeycloakRecorder recorder) { - configureProfile(recorder); FipsMode fipsMode = Configuration.getOptionalValue(NS_KEYCLOAK_PREFIX + SecurityOptions.FIPS_MODE.getKey()) .map(FipsMode::valueOfOption) .orElse(FipsMode.DISABLED);