KEYCLOAK-18194 fix migration of default role when realm id contains apostrophe
This commit is contained in:
parent
f0e777c592
commit
2b9b50d50a
4 changed files with 23 additions and 4 deletions
|
@ -59,14 +59,15 @@ public class JpaUpdate13_0_0_MigrateDefaultRoles extends CustomKeycloakTask {
|
||||||
// assign the role to the realm
|
// assign the role to the realm
|
||||||
new UpdateStatement(null, null, database.correctObjectName("REALM", Table.class))
|
new UpdateStatement(null, null, database.correctObjectName("REALM", Table.class))
|
||||||
.addNewColumnValue("DEFAULT_ROLE", id)
|
.addNewColumnValue("DEFAULT_ROLE", id)
|
||||||
.setWhereClause("REALM.ID = '" + realmId + "'")
|
.setWhereClause("REALM.ID=?")
|
||||||
|
.addWhereParameter(realmId)
|
||||||
);
|
);
|
||||||
|
|
||||||
statements.add(
|
statements.add(
|
||||||
// copy data from REALM_DEFAULT_ROLES to COMPOSITE_ROLE
|
// copy data from REALM_DEFAULT_ROLES to COMPOSITE_ROLE
|
||||||
new RawSqlStatement("INSERT INTO " + compositeRoleTable + " (COMPOSITE, CHILD_ROLE) " +
|
new RawSqlStatement("INSERT INTO " + compositeRoleTable + " (COMPOSITE, CHILD_ROLE) " +
|
||||||
"SELECT '" + id + "', ROLE_ID FROM " + getTableName("REALM_DEFAULT_ROLES") +
|
"SELECT '" + id + "', ROLE_ID FROM " + getTableName("REALM_DEFAULT_ROLES") +
|
||||||
" WHERE REALM_ID = '" + realmId + "'")
|
" WHERE REALM_ID = '" + database.escapeStringForDatabase(realmId) + "'")
|
||||||
);
|
);
|
||||||
statements.add(
|
statements.add(
|
||||||
// copy data from CLIENT_DEFAULT_ROLES to COMPOSITE_ROLE
|
// copy data from CLIENT_DEFAULT_ROLES to COMPOSITE_ROLE
|
||||||
|
@ -74,7 +75,7 @@ public class JpaUpdate13_0_0_MigrateDefaultRoles extends CustomKeycloakTask {
|
||||||
"SELECT '" + id + "', " + clientDefaultRolesTable + ".ROLE_ID FROM " +
|
"SELECT '" + id + "', " + clientDefaultRolesTable + ".ROLE_ID FROM " +
|
||||||
clientDefaultRolesTable + " INNER JOIN " + clientTable + " ON " +
|
clientDefaultRolesTable + " INNER JOIN " + clientTable + " ON " +
|
||||||
clientTable + ".ID = " + clientDefaultRolesTable + ".CLIENT_ID AND " +
|
clientTable + ".ID = " + clientDefaultRolesTable + ".CLIENT_ID AND " +
|
||||||
clientTable + ".REALM_ID = '" + realmId + "'")
|
clientTable + ".REALM_ID = '" + database.escapeStringForDatabase(realmId) + "'")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,10 @@ public class JsonFileImport255MigrationTest extends AbstractJsonFileImportMigrat
|
||||||
try {
|
try {
|
||||||
reps = ImportUtils.getRealmsFromStream(JsonSerialization.mapper, IOUtil.class.getResourceAsStream("/migration-test/migration-realm-2.5.5.Final.json"));
|
reps = ImportUtils.getRealmsFromStream(JsonSerialization.mapper, IOUtil.class.getResourceAsStream("/migration-test/migration-realm-2.5.5.Final.json"));
|
||||||
masterRep = reps.remove("master");
|
masterRep = reps.remove("master");
|
||||||
|
|
||||||
|
//the realm with special characters in its id is intended for db migration test, not json file test
|
||||||
|
reps.remove("test ' and ; and -- and \"");
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,8 @@ import org.keycloak.testsuite.arquillian.migration.Migration;
|
||||||
|
|
||||||
import javax.ws.rs.NotFoundException;
|
import javax.ws.rs.NotFoundException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import org.keycloak.models.RealmModel;
|
||||||
|
import org.keycloak.services.managers.RealmManager;
|
||||||
|
|
||||||
import org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude.AuthServer;
|
import org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude.AuthServer;
|
||||||
import static org.keycloak.testsuite.auth.page.AuthRealm.MASTER;
|
import static org.keycloak.testsuite.auth.page.AuthRealm.MASTER;
|
||||||
|
@ -101,6 +103,14 @@ public class MigrationTest extends AbstractMigrationTest {
|
||||||
@Test
|
@Test
|
||||||
@Migration(versionFrom = "2.")
|
@Migration(versionFrom = "2.")
|
||||||
public void migration2_xTest() throws Exception {
|
public void migration2_xTest() throws Exception {
|
||||||
|
//the realm with special characters in its id was succesfully migrated (no error during migration)
|
||||||
|
//removing it now as testMigratedData() expects specific clients and roles
|
||||||
|
//we need to perform the removal via run on server to workaround escaping parameters when using rest call
|
||||||
|
testingClient.server().run(session -> {
|
||||||
|
RealmModel realm = session.realms().getRealm("test ' and ; and -- and \"");
|
||||||
|
new RealmManager(session).removeRealm(realm);
|
||||||
|
});
|
||||||
|
|
||||||
testMigratedData();
|
testMigratedData();
|
||||||
testMigrationTo3_x();
|
testMigrationTo3_x();
|
||||||
testMigrationTo4_x();
|
testMigrationTo4_x();
|
||||||
|
|
|
@ -4631,4 +4631,8 @@
|
||||||
"waitIncrementSeconds" : "60"
|
"waitIncrementSeconds" : "60"
|
||||||
},
|
},
|
||||||
"keycloakVersion" : "2.5.5.Final"
|
"keycloakVersion" : "2.5.5.Final"
|
||||||
} ]
|
},
|
||||||
|
{
|
||||||
|
"id" : "test ' and ; and -- and \"",
|
||||||
|
"realm" : "test ' and ; and -- and \""
|
||||||
|
}]
|
||||||
|
|
Loading…
Reference in a new issue