Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,21 +1,8 @@
package org.keycloak.migration.migrators;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.keycloak.authorization.AuthorizationProvider;
import org.keycloak.authorization.fgap.AdminPermissionsSchema;
import org.keycloak.authorization.model.Policy;
import org.keycloak.authorization.model.Policy.FilterOption;
import org.keycloak.authorization.model.Resource;
import org.keycloak.authorization.model.ResourceServer;
import org.keycloak.authorization.model.Scope;
import org.keycloak.authorization.store.ResourceStore;
import org.keycloak.authorization.store.ScopeStore;
import org.keycloak.authorization.store.StoreFactory;
import org.keycloak.migration.ModelVersion;
import org.keycloak.models.ClientModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;

Expand All @@ -31,40 +18,6 @@ public ModelVersion getVersion() {

@Override
public void migrateRealm(KeycloakSession session, RealmModel realm) {
ClientModel client = realm.getAdminPermissionsClient();

if (client == null) {
return;
}

AuthorizationProvider authorizationProvider = session.getProvider(AuthorizationProvider.class);
StoreFactory storeFactory = authorizationProvider.getStoreFactory();
ResourceServer resourceServer = storeFactory.getResourceServerStore().findByClient(client);

if (resourceServer == null) {
return;
}

ScopeStore scopeStore = storeFactory.getScopeStore();
Scope resetPassword = scopeStore.findByName(resourceServer, AdminPermissionsSchema.RESET_PASSWORD);

if (resetPassword == null) {
resetPassword = scopeStore.create(resourceServer, AdminPermissionsSchema.RESET_PASSWORD);
}

ResourceStore resourceStore = storeFactory.getResourceStore();
String userResourceType = AdminPermissionsSchema.USERS.getType();
Resource resourceTypeResource = resourceStore.findByName(resourceServer, userResourceType);
Set<Scope> newScopes = new HashSet<>(resourceTypeResource.getScopes());

newScopes.add(resetPassword);

resourceTypeResource.updateScopes(newScopes);

for (Policy policy : storeFactory.getPolicyStore().find(resourceServer, Map.of(FilterOption.CONFIG, new String[]{"defaultResourceType", userResourceType}), -1, -1)) {
for (Resource resource : policy.getResources()) {
resource.updateScopes(newScopes);
}
}
AdminPermissionsSchema.SCHEMA.addResourceTypeScope(session, realm, AdminPermissionsSchema.USERS_RESOURCE_TYPE, AdminPermissionsSchema.RESET_PASSWORD);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.keycloak.migration.migrators;


import org.keycloak.authorization.fgap.AdminPermissionsSchema;
import org.keycloak.migration.ModelVersion;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;


public class MigrateTo26_6_2 extends RealmMigration {

public static final ModelVersion VERSION = new ModelVersion("26.6.2");

@Override
public ModelVersion getVersion() {
return VERSION;
}


@Override
public void migrateRealm(KeycloakSession session, RealmModel realm) {
AdminPermissionsSchema.SCHEMA.addResourceTypeScope(session, realm, AdminPermissionsSchema.GROUPS_RESOURCE_TYPE, AdminPermissionsSchema.MANAGE_MEMBERSHIP_OF_MEMBERS);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
import org.keycloak.migration.migrators.MigrateTo26_4_0;
import org.keycloak.migration.migrators.MigrateTo26_4_3;
import org.keycloak.migration.migrators.MigrateTo26_6_1;
import org.keycloak.migration.migrators.MigrateTo26_6_2;
import org.keycloak.migration.migrators.MigrateTo2_0_0;
import org.keycloak.migration.migrators.MigrateTo2_1_0;
import org.keycloak.migration.migrators.MigrateTo2_2_0;
Expand Down Expand Up @@ -133,7 +134,8 @@ public class DefaultMigrationManager implements MigrationManager {
new MigrateTo26_3_0(),
new MigrateTo26_4_0(),
new MigrateTo26_4_3(),
new MigrateTo26_6_1()
new MigrateTo26_6_1(),
new MigrateTo26_6_2()
};

private final KeycloakSession session;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,5 +92,7 @@
"class" : "org.keycloak.migration.migrators.MigrateTo26_4_0"
}, {
"class" : "org.keycloak.migration.migrators.MigrateTo26_6_1"
}, {
"class" : "org.keycloak.migration.migrators.MigrateTo26_6_2"
} ]
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.keycloak.authorization.fgap.evaluation.partial.PartialEvaluationStorageProvider;
import org.keycloak.authorization.fgap.evaluation.partial.PartialEvaluator;
import org.keycloak.authorization.model.Policy;
import org.keycloak.authorization.model.Policy.FilterOption;
import org.keycloak.authorization.model.Resource;
import org.keycloak.authorization.model.ResourceServer;
import org.keycloak.authorization.model.Scope;
Expand Down Expand Up @@ -545,4 +546,41 @@ public static boolean isSkipEvaluation(KeycloakSession session) {

return Boolean.parseBoolean(session.getAttributeOrDefault(SKIP_EVALUATION, Boolean.FALSE.toString()));
}

public void addResourceTypeScope(KeycloakSession session, RealmModel realm, String resourceType, String scopeName) {
ClientModel client = realm.getAdminPermissionsClient();

if (client == null) {
return;
}

AuthorizationProvider authorizationProvider = session.getProvider(AuthorizationProvider.class);
StoreFactory storeFactory = authorizationProvider.getStoreFactory();
ResourceServer resourceServer = storeFactory.getResourceServerStore().findByClient(client);

if (resourceServer == null) {
return;
}

ScopeStore scopeStore = storeFactory.getScopeStore();
Scope newScope = scopeStore.findByName(resourceServer, scopeName);

if (newScope == null) {
newScope = scopeStore.create(resourceServer, scopeName);
}

ResourceStore resourceStore = storeFactory.getResourceStore();
Resource resourceTypeResource = resourceStore.findByName(resourceServer, resourceType);
Set<Scope> newScopes = new HashSet<>(resourceTypeResource.getScopes());

newScopes.add(newScope);

resourceTypeResource.updateScopes(newScopes);

for (Policy policy : storeFactory.getPolicyStore().find(resourceServer, Map.of(FilterOption.CONFIG, new String[]{"defaultResourceType", resourceType}), -1, -1)) {
for (Resource resource : policy.getResources()) {
resource.updateScopes(newScopes);
}
}
}
}
Loading