From a109e28be7efea34964e5e82836472b3b26baa65 Mon Sep 17 00:00:00 2001 From: Alexander Schwartz Date: Tue, 17 May 2022 16:28:25 +0200 Subject: [PATCH] moving some functionality around imports --- .../datastore/LegacyExportImportManager.java | 92 ++++++++++++++++++- .../exportimport/dir/DirExportProvider.java | 0 .../dir/DirExportProviderFactory.java | 0 .../exportimport/dir/DirImportProvider.java | 0 .../dir/DirImportProviderFactory.java | 0 .../singlefile/SingleFileExportProvider.java | 0 .../SingleFileExportProviderFactory.java | 0 .../singlefile/SingleFileImportProvider.java | 0 .../SingleFileImportProviderFactory.java | 0 .../util/ExportImportSessionTask.java | 0 .../exportimport/util/ImportUtils.java | 4 +- .../util/MultipleStepsExportProvider.java | 0 ...eycloak.exportimport.ExportProviderFactory | 0 ...eycloak.exportimport.ImportProviderFactory | 0 .../models/utils/RepresentationToModel.java | 91 +----------------- 15 files changed, 94 insertions(+), 93 deletions(-) rename {services => model/legacy-services}/src/main/java/org/keycloak/exportimport/dir/DirExportProvider.java (100%) rename {services => model/legacy-services}/src/main/java/org/keycloak/exportimport/dir/DirExportProviderFactory.java (100%) rename {services => model/legacy-services}/src/main/java/org/keycloak/exportimport/dir/DirImportProvider.java (100%) rename {services => model/legacy-services}/src/main/java/org/keycloak/exportimport/dir/DirImportProviderFactory.java (100%) rename {services => model/legacy-services}/src/main/java/org/keycloak/exportimport/singlefile/SingleFileExportProvider.java (100%) rename {services => model/legacy-services}/src/main/java/org/keycloak/exportimport/singlefile/SingleFileExportProviderFactory.java (100%) rename {services => model/legacy-services}/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProvider.java (100%) rename {services => model/legacy-services}/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProviderFactory.java (100%) rename {services => model/legacy-services}/src/main/java/org/keycloak/exportimport/util/ExportImportSessionTask.java (100%) rename {services => model/legacy-services}/src/main/java/org/keycloak/exportimport/util/ImportUtils.java (98%) rename {services => model/legacy-services}/src/main/java/org/keycloak/exportimport/util/MultipleStepsExportProvider.java (100%) rename {services => model/legacy-services}/src/main/resources/META-INF/services/org.keycloak.exportimport.ExportProviderFactory (100%) rename {services => model/legacy-services}/src/main/resources/META-INF/services/org.keycloak.exportimport.ImportProviderFactory (100%) diff --git a/model/legacy-private/src/main/java/org/keycloak/storage/datastore/LegacyExportImportManager.java b/model/legacy-private/src/main/java/org/keycloak/storage/datastore/LegacyExportImportManager.java index 22993782c4..9c03533cc0 100644 --- a/model/legacy-private/src/main/java/org/keycloak/storage/datastore/LegacyExportImportManager.java +++ b/model/legacy-private/src/main/java/org/keycloak/storage/datastore/LegacyExportImportManager.java @@ -17,6 +17,7 @@ import org.keycloak.models.ClaimMask; import org.keycloak.models.ClientModel; import org.keycloak.models.ClientScopeModel; import org.keycloak.models.Constants; +import org.keycloak.models.FederatedIdentityModel; import org.keycloak.models.GroupModel; import org.keycloak.models.KeycloakSession; import org.keycloak.models.LDAPConstants; @@ -66,6 +67,7 @@ import org.keycloak.representations.idm.UserRepresentation; import org.keycloak.storage.ExportImportManager; import org.keycloak.storage.UserStorageProvider; import org.keycloak.storage.UserStorageProviderModel; +import org.keycloak.storage.federated.UserFederatedStorageProvider; import org.keycloak.userprofile.UserProfileProvider; import org.keycloak.validation.ValidationUtil; @@ -84,7 +86,6 @@ import static org.keycloak.models.utils.RepresentationToModel.createCredentials; import static org.keycloak.models.utils.RepresentationToModel.createFederatedIdentities; import static org.keycloak.models.utils.RepresentationToModel.createGroups; import static org.keycloak.models.utils.RepresentationToModel.createRoleMappings; -import static org.keycloak.models.utils.RepresentationToModel.importFederatedUser; import static org.keycloak.models.utils.RepresentationToModel.importGroup; import static org.keycloak.models.utils.RepresentationToModel.importRoles; @@ -1376,4 +1377,93 @@ public class LegacyExportImportManager implements ExportImportManager { } } + public static void importFederatedUser(KeycloakSession session, RealmModel newRealm, UserRepresentation userRep) { + UserFederatedStorageProvider federatedStorage = session.userFederatedStorage(); + if (userRep.getAttributes() != null) { + for (Map.Entry> entry : userRep.getAttributes().entrySet()) { + String key = entry.getKey(); + List value = entry.getValue(); + if (value != null) { + federatedStorage.setAttribute(newRealm, userRep.getId(), key, new LinkedList<>(value)); + } + } + } + if (userRep.getRequiredActions() != null) { + for (String action : userRep.getRequiredActions()) { + federatedStorage.addRequiredAction(newRealm, userRep.getId(), action); + } + } + if (userRep.getCredentials() != null) { + for (CredentialRepresentation cred : userRep.getCredentials()) { + federatedStorage.createCredential(newRealm, userRep.getId(), RepresentationToModel.toModel(cred)); + } + } + createFederatedRoleMappings(federatedStorage, userRep, newRealm); + + if (userRep.getGroups() != null) { + for (String path : userRep.getGroups()) { + GroupModel group = KeycloakModelUtils.findGroupByPath(newRealm, path); + if (group == null) { + throw new RuntimeException("Unable to find group specified by path: " + path); + + } + federatedStorage.joinGroup(newRealm, userRep.getId(), group); + } + } + + if (userRep.getFederatedIdentities() != null) { + for (FederatedIdentityRepresentation identity : userRep.getFederatedIdentities()) { + FederatedIdentityModel mappingModel = new FederatedIdentityModel(identity.getIdentityProvider(), identity.getUserId(), identity.getUserName()); + federatedStorage.addFederatedIdentity(newRealm, userRep.getId(), mappingModel); + } + } + if (userRep.getClientConsents() != null) { + for (UserConsentRepresentation consentRep : userRep.getClientConsents()) { + UserConsentModel consentModel = RepresentationToModel.toModel(newRealm, consentRep); + federatedStorage.addConsent(newRealm, userRep.getId(), consentModel); + } + } + if (userRep.getNotBefore() != null) { + federatedStorage.setNotBeforeForUser(newRealm, userRep.getId(), userRep.getNotBefore()); + } + + + } + + private static void createFederatedRoleMappings(UserFederatedStorageProvider federatedStorage, UserRepresentation userRep, RealmModel realm) { + if (userRep.getRealmRoles() != null) { + for (String roleString : userRep.getRealmRoles()) { + RoleModel role = realm.getRole(roleString.trim()); + if (role == null) { + role = realm.addRole(roleString.trim()); + } + federatedStorage.grantRole(realm, userRep.getId(), role); + } + } + if (userRep.getClientRoles() != null) { + for (Map.Entry> entry : userRep.getClientRoles().entrySet()) { + ClientModel client = realm.getClientByClientId(entry.getKey()); + if (client == null) { + throw new RuntimeException("Unable to find client role mappings for client: " + entry.getKey()); + } + createFederatedClientRoleMappings(federatedStorage, realm, client, userRep, entry.getValue()); + } + } + } + + private static void createFederatedClientRoleMappings(UserFederatedStorageProvider federatedStorage, RealmModel realm, ClientModel clientModel, UserRepresentation userRep, List roleNames) { + if (userRep == null) { + throw new RuntimeException("User not found"); + } + + for (String roleName : roleNames) { + RoleModel role = clientModel.getRole(roleName.trim()); + if (role == null) { + role = clientModel.addRole(roleName.trim()); + } + federatedStorage.grantRole(realm, userRep.getId(), role); + + } + } + } diff --git a/services/src/main/java/org/keycloak/exportimport/dir/DirExportProvider.java b/model/legacy-services/src/main/java/org/keycloak/exportimport/dir/DirExportProvider.java similarity index 100% rename from services/src/main/java/org/keycloak/exportimport/dir/DirExportProvider.java rename to model/legacy-services/src/main/java/org/keycloak/exportimport/dir/DirExportProvider.java diff --git a/services/src/main/java/org/keycloak/exportimport/dir/DirExportProviderFactory.java b/model/legacy-services/src/main/java/org/keycloak/exportimport/dir/DirExportProviderFactory.java similarity index 100% rename from services/src/main/java/org/keycloak/exportimport/dir/DirExportProviderFactory.java rename to model/legacy-services/src/main/java/org/keycloak/exportimport/dir/DirExportProviderFactory.java diff --git a/services/src/main/java/org/keycloak/exportimport/dir/DirImportProvider.java b/model/legacy-services/src/main/java/org/keycloak/exportimport/dir/DirImportProvider.java similarity index 100% rename from services/src/main/java/org/keycloak/exportimport/dir/DirImportProvider.java rename to model/legacy-services/src/main/java/org/keycloak/exportimport/dir/DirImportProvider.java diff --git a/services/src/main/java/org/keycloak/exportimport/dir/DirImportProviderFactory.java b/model/legacy-services/src/main/java/org/keycloak/exportimport/dir/DirImportProviderFactory.java similarity index 100% rename from services/src/main/java/org/keycloak/exportimport/dir/DirImportProviderFactory.java rename to model/legacy-services/src/main/java/org/keycloak/exportimport/dir/DirImportProviderFactory.java diff --git a/services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileExportProvider.java b/model/legacy-services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileExportProvider.java similarity index 100% rename from services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileExportProvider.java rename to model/legacy-services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileExportProvider.java diff --git a/services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileExportProviderFactory.java b/model/legacy-services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileExportProviderFactory.java similarity index 100% rename from services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileExportProviderFactory.java rename to model/legacy-services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileExportProviderFactory.java diff --git a/services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProvider.java b/model/legacy-services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProvider.java similarity index 100% rename from services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProvider.java rename to model/legacy-services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProvider.java diff --git a/services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProviderFactory.java b/model/legacy-services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProviderFactory.java similarity index 100% rename from services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProviderFactory.java rename to model/legacy-services/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProviderFactory.java diff --git a/services/src/main/java/org/keycloak/exportimport/util/ExportImportSessionTask.java b/model/legacy-services/src/main/java/org/keycloak/exportimport/util/ExportImportSessionTask.java similarity index 100% rename from services/src/main/java/org/keycloak/exportimport/util/ExportImportSessionTask.java rename to model/legacy-services/src/main/java/org/keycloak/exportimport/util/ExportImportSessionTask.java diff --git a/services/src/main/java/org/keycloak/exportimport/util/ImportUtils.java b/model/legacy-services/src/main/java/org/keycloak/exportimport/util/ImportUtils.java similarity index 98% rename from services/src/main/java/org/keycloak/exportimport/util/ImportUtils.java rename to model/legacy-services/src/main/java/org/keycloak/exportimport/util/ImportUtils.java index 62c8fdaede..2de903f87e 100755 --- a/services/src/main/java/org/keycloak/exportimport/util/ImportUtils.java +++ b/model/legacy-services/src/main/java/org/keycloak/exportimport/util/ImportUtils.java @@ -32,6 +32,7 @@ import org.keycloak.models.utils.RepresentationToModel; import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.representations.idm.UserRepresentation; import org.keycloak.services.managers.RealmManager; +import org.keycloak.storage.datastore.LegacyExportImportManager; import java.io.IOException; import java.io.InputStream; @@ -265,9 +266,8 @@ public class ImportUtils { private static void importFederatedUsers(KeycloakSession session, RealmProvider model, String realmName, List userReps) { RealmModel realm = model.getRealmByName(realmName); for (UserRepresentation user : userReps) { - RepresentationToModel.importFederatedUser(session, realm, user); + LegacyExportImportManager.importFederatedUser(session, realm, user); } } - } diff --git a/services/src/main/java/org/keycloak/exportimport/util/MultipleStepsExportProvider.java b/model/legacy-services/src/main/java/org/keycloak/exportimport/util/MultipleStepsExportProvider.java similarity index 100% rename from services/src/main/java/org/keycloak/exportimport/util/MultipleStepsExportProvider.java rename to model/legacy-services/src/main/java/org/keycloak/exportimport/util/MultipleStepsExportProvider.java diff --git a/services/src/main/resources/META-INF/services/org.keycloak.exportimport.ExportProviderFactory b/model/legacy-services/src/main/resources/META-INF/services/org.keycloak.exportimport.ExportProviderFactory similarity index 100% rename from services/src/main/resources/META-INF/services/org.keycloak.exportimport.ExportProviderFactory rename to model/legacy-services/src/main/resources/META-INF/services/org.keycloak.exportimport.ExportProviderFactory diff --git a/services/src/main/resources/META-INF/services/org.keycloak.exportimport.ImportProviderFactory b/model/legacy-services/src/main/resources/META-INF/services/org.keycloak.exportimport.ImportProviderFactory similarity index 100% rename from services/src/main/resources/META-INF/services/org.keycloak.exportimport.ImportProviderFactory rename to model/legacy-services/src/main/resources/META-INF/services/org.keycloak.exportimport.ImportProviderFactory diff --git a/server-spi-private/src/main/java/org/keycloak/models/utils/RepresentationToModel.java b/server-spi-private/src/main/java/org/keycloak/models/utils/RepresentationToModel.java index 4369ea0cd5..a8d06756ad 100755 --- a/server-spi-private/src/main/java/org/keycloak/models/utils/RepresentationToModel.java +++ b/server-spi-private/src/main/java/org/keycloak/models/utils/RepresentationToModel.java @@ -764,7 +764,7 @@ public class RepresentationToModel { } } - public static void createClientRoleMappings(ClientModel clientModel, UserModel user, List roleNames) { + private static void createClientRoleMappings(ClientModel clientModel, UserModel user, List roleNames) { if (user == null) { throw new RuntimeException("User not found"); } @@ -1525,95 +1525,6 @@ public class RepresentationToModel { return ticket; } - public static void importFederatedUser(KeycloakSession session, RealmModel newRealm, UserRepresentation userRep) { - UserFederatedStorageProvider federatedStorage = session.userFederatedStorage(); - if (userRep.getAttributes() != null) { - for (Map.Entry> entry : userRep.getAttributes().entrySet()) { - String key = entry.getKey(); - List value = entry.getValue(); - if (value != null) { - federatedStorage.setAttribute(newRealm, userRep.getId(), key, new LinkedList<>(value)); - } - } - } - if (userRep.getRequiredActions() != null) { - for (String action : userRep.getRequiredActions()) { - federatedStorage.addRequiredAction(newRealm, userRep.getId(), action); - } - } - if (userRep.getCredentials() != null) { - for (CredentialRepresentation cred : userRep.getCredentials()) { - federatedStorage.createCredential(newRealm, userRep.getId(), toModel(cred)); - } - } - createFederatedRoleMappings(federatedStorage, userRep, newRealm); - - if (userRep.getGroups() != null) { - for (String path : userRep.getGroups()) { - GroupModel group = KeycloakModelUtils.findGroupByPath(newRealm, path); - if (group == null) { - throw new RuntimeException("Unable to find group specified by path: " + path); - - } - federatedStorage.joinGroup(newRealm, userRep.getId(), group); - } - } - - if (userRep.getFederatedIdentities() != null) { - for (FederatedIdentityRepresentation identity : userRep.getFederatedIdentities()) { - FederatedIdentityModel mappingModel = new FederatedIdentityModel(identity.getIdentityProvider(), identity.getUserId(), identity.getUserName()); - federatedStorage.addFederatedIdentity(newRealm, userRep.getId(), mappingModel); - } - } - if (userRep.getClientConsents() != null) { - for (UserConsentRepresentation consentRep : userRep.getClientConsents()) { - UserConsentModel consentModel = toModel(newRealm, consentRep); - federatedStorage.addConsent(newRealm, userRep.getId(), consentModel); - } - } - if (userRep.getNotBefore() != null) { - federatedStorage.setNotBeforeForUser(newRealm, userRep.getId(), userRep.getNotBefore()); - } - - - } - - public static void createFederatedRoleMappings(UserFederatedStorageProvider federatedStorage, UserRepresentation userRep, RealmModel realm) { - if (userRep.getRealmRoles() != null) { - for (String roleString : userRep.getRealmRoles()) { - RoleModel role = realm.getRole(roleString.trim()); - if (role == null) { - role = realm.addRole(roleString.trim()); - } - federatedStorage.grantRole(realm, userRep.getId(), role); - } - } - if (userRep.getClientRoles() != null) { - for (Map.Entry> entry : userRep.getClientRoles().entrySet()) { - ClientModel client = realm.getClientByClientId(entry.getKey()); - if (client == null) { - throw new RuntimeException("Unable to find client role mappings for client: " + entry.getKey()); - } - createFederatedClientRoleMappings(federatedStorage, realm, client, userRep, entry.getValue()); - } - } - } - - public static void createFederatedClientRoleMappings(UserFederatedStorageProvider federatedStorage, RealmModel realm, ClientModel clientModel, UserRepresentation userRep, List roleNames) { - if (userRep == null) { - throw new RuntimeException("User not found"); - } - - for (String roleName : roleNames) { - RoleModel role = clientModel.getRole(roleName.trim()); - if (role == null) { - role = clientModel.addRole(roleName.trim()); - } - federatedStorage.grantRole(realm, userRep.getId(), role); - - } - } - public static Map removeEmptyString(Map map) { if (map == null) { return null;