Skip to content

Commit

Permalink
Make sure realm is available from session when migrating to 23
Browse files Browse the repository at this point in the history
 Closes keycloak#25183

Signed-off-by: Pedro Igor <[email protected]>
  • Loading branch information
pedroigor committed Dec 6, 2023
1 parent c5ee3dc commit ab11731
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
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;
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
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;
Expand Down Expand Up @@ -121,7 +122,13 @@ public class RepresentationToModel {


public static void importRealm(KeycloakSession session, RealmRepresentation rep, RealmModel newRealm, boolean skipUserDependent) {
session.getProvider(DatastoreProvider.class).getExportImportManager().importRealm(rep, newRealm, 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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
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;
Expand Down Expand Up @@ -59,6 +60,7 @@
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> {

Expand Down Expand Up @@ -206,10 +208,39 @@ protected List<String> getArgs(Map<String, String> env) {
}

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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -229,4 +231,12 @@ public FipsMode getFipsMode() {
public void setFipsMode(FipsMode fipsMode) {
this.fipsMode = fipsMode;
}

public void setDefaultFeatures(String defaultFeatures) {
this.defaultFeatures = defaultFeatures;
}

public String getDefaultFeatures() {
return defaultFeatures;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ private void executeCommand(File wrkDir, String command, String... args) throws
commands.add(getCommand());
commands.add("-v");
commands.add(command);
addFeaturesOption(commands);
if (args != null) {
commands.addAll(Arrays.asList(args));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down
2 changes: 2 additions & 0 deletions testsuite/integration-arquillian/tests/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down

0 comments on commit ab11731

Please sign in to comment.