Make sure realm is available from session when migrating to 23
Closes #25183 Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com>
This commit is contained in:
parent
c5ee3dc0ad
commit
ab1173182c
7 changed files with 64 additions and 2 deletions
|
@ -25,6 +25,7 @@ import org.jboss.logging.Logger;
|
|||
import org.keycloak.authentication.AuthenticationFlow;
|
||||
import org.keycloak.component.ComponentModel;
|
||||
import org.keycloak.migration.ModelVersion;
|
||||
import org.keycloak.models.KeycloakContext;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.RealmModel;
|
||||
import org.keycloak.representations.idm.RealmRepresentation;
|
||||
|
@ -43,7 +44,16 @@ public class MigrateTo23_0_0 implements Migration {
|
|||
|
||||
@Override
|
||||
public void migrate(KeycloakSession session) {
|
||||
session.realms().getRealmsStream().forEach(this::migrateRealm);
|
||||
session.realms().getRealmsStream().forEach(realm -> {
|
||||
KeycloakContext context = session.getContext();
|
||||
|
||||
try {
|
||||
context.setRealm(realm);
|
||||
migrateRealm(realm);
|
||||
} finally {
|
||||
context.setRealm(null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -67,6 +67,7 @@ import org.keycloak.models.FederatedIdentityModel;
|
|||
import org.keycloak.models.GroupModel;
|
||||
import org.keycloak.models.IdentityProviderMapperModel;
|
||||
import org.keycloak.models.IdentityProviderModel;
|
||||
import org.keycloak.models.KeycloakContext;
|
||||
import org.keycloak.models.KeycloakSession;
|
||||
import org.keycloak.models.ModelException;
|
||||
import org.keycloak.models.ProtocolMapperModel;
|
||||
|
@ -121,7 +122,13 @@ public class RepresentationToModel {
|
|||
|
||||
|
||||
public static void importRealm(KeycloakSession session, RealmRepresentation rep, RealmModel newRealm, boolean skipUserDependent) {
|
||||
KeycloakContext context = session.getContext();
|
||||
try {
|
||||
context.setRealm(newRealm);
|
||||
session.getProvider(DatastoreProvider.class).getExportImportManager().importRealm(rep, newRealm, skipUserDependent);
|
||||
} finally {
|
||||
context.setRealm(null);
|
||||
}
|
||||
}
|
||||
|
||||
public static void importRoles(RolesRepresentation realmRoles, RealmModel realm) {
|
||||
|
|
|
@ -31,6 +31,7 @@ import java.security.cert.X509Certificate;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
@ -59,6 +60,7 @@ import org.jboss.shrinkwrap.descriptor.api.Descriptor;
|
|||
import org.keycloak.common.crypto.FipsMode;
|
||||
import org.keycloak.testsuite.arquillian.SuiteContext;
|
||||
import org.keycloak.testsuite.model.StoreProvider;
|
||||
import org.keycloak.utils.StringUtil;
|
||||
|
||||
public abstract class AbstractQuarkusDeployableContainer implements DeployableContainer<KeycloakQuarkusConfiguration> {
|
||||
|
||||
|
@ -206,10 +208,39 @@ public abstract class AbstractQuarkusDeployableContainer implements DeployableCo
|
|||
}
|
||||
|
||||
addStorageOptions(storeProvider, commands);
|
||||
addFeaturesOption(commands);
|
||||
|
||||
return commands;
|
||||
}
|
||||
|
||||
protected void addFeaturesOption(List<String> commands) {
|
||||
String defaultFeatures = configuration.getDefaultFeatures();
|
||||
|
||||
if (StringUtil.isBlank(defaultFeatures)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (commands.stream().anyMatch(List.of("import", "export")::contains)) {
|
||||
return;
|
||||
}
|
||||
|
||||
StringBuilder featuresOption = new StringBuilder("--features=").append(defaultFeatures);
|
||||
Iterator<String> iterator = commands.iterator();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
String command = iterator.next();
|
||||
|
||||
if (command.startsWith("--features")) {
|
||||
featuresOption = new StringBuilder(command);
|
||||
featuresOption.append(",").append(defaultFeatures);
|
||||
iterator.remove();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
commands.add(featuresOption.toString());
|
||||
}
|
||||
|
||||
protected List<String> configureArgs(List<String> commands) {
|
||||
return commands;
|
||||
}
|
||||
|
|
|
@ -47,6 +47,8 @@ public class KeycloakQuarkusConfiguration implements ContainerConfiguration {
|
|||
|
||||
private FipsMode fipsMode = FipsMode.valueOfOption(System.getProperty("auth.server.fips.mode"));
|
||||
|
||||
private String defaultFeatures;
|
||||
|
||||
@Override
|
||||
public void validate() throws ConfigurationException {
|
||||
int basePort = getBindHttpPort();
|
||||
|
@ -229,4 +231,12 @@ public class KeycloakQuarkusConfiguration implements ContainerConfiguration {
|
|||
public void setFipsMode(FipsMode fipsMode) {
|
||||
this.fipsMode = fipsMode;
|
||||
}
|
||||
|
||||
public void setDefaultFeatures(String defaultFeatures) {
|
||||
this.defaultFeatures = defaultFeatures;
|
||||
}
|
||||
|
||||
public String getDefaultFeatures() {
|
||||
return defaultFeatures;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -73,6 +73,7 @@ public class KeycloakQuarkusServerDeployableContainer extends AbstractQuarkusDep
|
|||
commands.add(getCommand());
|
||||
commands.add("-v");
|
||||
commands.add(command);
|
||||
addFeaturesOption(commands);
|
||||
if (args != null) {
|
||||
commands.addAll(Arrays.asList(args));
|
||||
}
|
||||
|
|
|
@ -649,6 +649,7 @@
|
|||
<property name="javaOpts">-Xms512m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=512m
|
||||
-Djava.net.preferIPv4Stack=true -Dauth.server.db.host=some
|
||||
</property>
|
||||
<property name="defaultFeatures">${auth.server.feature}</property>
|
||||
</configuration>
|
||||
</container>
|
||||
|
||||
|
|
|
@ -1534,6 +1534,8 @@
|
|||
<auth.server.migration>true</auth.server.migration>
|
||||
<keycloak.migration.home>${containers.home}/auth-server-migration</keycloak.migration.home>
|
||||
<migration.import.props.previous>${migration.import.props.previous}</migration.import.props.previous>
|
||||
<auth.server.feature>${auth.server.feature}</auth.server.feature>
|
||||
<auth.server.feature>declarative-user-profile</auth.server.feature>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
|
Loading…
Reference in a new issue