From 897965f6044cb123bae3fb0cd076e70b95a95fe4 Mon Sep 17 00:00:00 2001 From: todor Date: Fri, 30 Jun 2023 13:00:20 +0300 Subject: [PATCH] KEYCLOAK-20343 Add message bundle to export/import Closes #20343 --- .../representations/idm/RealmRepresentation.java | 9 +++++++++ .../org/keycloak/exportimport/util/ExportUtils.java | 3 +++ .../storage/datastore/LegacyExportImportManager.java | 6 ++++++ .../models/map/datastore/MapExportImportManager.java | 6 ++++++ .../testsuite/exportimport/ExportImportTest.java | 11 +++++++++++ .../testsuite/exportimport/ExportImportUtil.java | 5 +++++ .../base/src/test/resources/model/testrealm.json | 6 ++++++ 7 files changed, 46 insertions(+) diff --git a/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java b/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java index 7a9300ed905..b35f949c7d0 100755 --- a/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java +++ b/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java @@ -123,6 +123,7 @@ public class RealmRepresentation { protected Integer otpPolicyPeriod; protected Boolean otpPolicyCodeReusable; protected List otpSupportedApplications; + protected Map> localizationTexts; // WebAuthn 2-factor properties below @@ -1025,6 +1026,14 @@ public class RealmRepresentation { this.otpSupportedApplications = otpSupportedApplications; } + public Map> getLocalizationTexts() { + return localizationTexts; + } + + public void setLocalizationTexts(Map> localizationTexts) { + this.localizationTexts = localizationTexts; + } + public Boolean isOtpPolicyCodeReusable() { return otpPolicyCodeReusable; } diff --git a/model/legacy-private/src/main/java/org/keycloak/exportimport/util/ExportUtils.java b/model/legacy-private/src/main/java/org/keycloak/exportimport/util/ExportUtils.java index 8ab3fed0f63..255850f2c7e 100755 --- a/model/legacy-private/src/main/java/org/keycloak/exportimport/util/ExportUtils.java +++ b/model/legacy-private/src/main/java/org/keycloak/exportimport/util/ExportUtils.java @@ -252,6 +252,9 @@ public class ExportUtils { MultivaluedHashMap components = exportComponents(realm, realm.getId()); rep.setComponents(components); + // Message Bundle + rep.setLocalizationTexts(realm.getRealmLocalizationTexts()); + return rep; } 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 44f04a3e175..ac6d5986363 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 @@ -276,6 +276,12 @@ public class LegacyExportImportManager implements ExportImportManager { if (rep.getAccountTheme() != null) newRealm.setAccountTheme(rep.getAccountTheme()); if (rep.getAdminTheme() != null) newRealm.setAdminTheme(rep.getAdminTheme()); if (rep.getEmailTheme() != null) newRealm.setEmailTheme(rep.getEmailTheme()); + if (rep.getLocalizationTexts() != null) { + Map> localizationTexts = rep.getLocalizationTexts(); + for (Map.Entry> entry: localizationTexts.entrySet()) { + newRealm.createOrUpdateRealmLocalizationTexts(entry.getKey(), entry.getValue()); + } + } // todo remove this stuff as its all deprecated if (rep.getRequiredCredentials() != null) { diff --git a/model/map/src/main/java/org/keycloak/models/map/datastore/MapExportImportManager.java b/model/map/src/main/java/org/keycloak/models/map/datastore/MapExportImportManager.java index 4a40d7155f1..69e81db5f05 100644 --- a/model/map/src/main/java/org/keycloak/models/map/datastore/MapExportImportManager.java +++ b/model/map/src/main/java/org/keycloak/models/map/datastore/MapExportImportManager.java @@ -283,6 +283,12 @@ public class MapExportImportManager implements ExportImportManager { if (rep.getAccountTheme() != null) newRealm.setAccountTheme(rep.getAccountTheme()); if (rep.getAdminTheme() != null) newRealm.setAdminTheme(rep.getAdminTheme()); if (rep.getEmailTheme() != null) newRealm.setEmailTheme(rep.getEmailTheme()); + if (rep.getLocalizationTexts() != null) { + Map> localizationTexts = rep.getLocalizationTexts(); + for (Map.Entry> entry: localizationTexts.entrySet()) { + newRealm.createOrUpdateRealmLocalizationTexts(entry.getKey(), entry.getValue()); + } + } // todo remove this stuff as its all deprecated if (rep.getRequiredCredentials() != null) { diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/exportimport/ExportImportTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/exportimport/ExportImportTest.java index a01df003563..880e0735f90 100755 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/exportimport/ExportImportTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/exportimport/ExportImportTest.java @@ -105,10 +105,12 @@ public class ExportImportTest extends AbstractKeycloakTest { testRealm1.getSmtpServer().put("password", "secret"); setEventsConfig(testRealm1); + setLocalizationTexts(testRealm1); testRealms.add(testRealm1); RealmRepresentation testRealm2 = loadJson(getClass().getResourceAsStream("/model/testrealm.json"), RealmRepresentation.class); testRealm2.setId("test-realm"); + setLocalizationTexts(testRealm2); testRealms.add(testRealm2); } @@ -146,6 +148,15 @@ public class ExportImportTest extends AbstractKeycloakTest { .build(); } + private void setLocalizationTexts(RealmRepresentation realm) { + Map> localizationTexts = new HashMap<>(); + Map enMap = new HashMap<>(); + enMap.put("key1", "value1"); + enMap.put("key2", "value2"); + localizationTexts.put("en", enMap); + realm.setLocalizationTexts(localizationTexts); + } + @After public void clearExportImportProps() throws LifecycleException { clearExportImportProperties(); diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/exportimport/ExportImportUtil.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/exportimport/ExportImportUtil.java index 19e93809f7b..7721648814b 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/exportimport/ExportImportUtil.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/exportimport/ExportImportUtil.java @@ -430,6 +430,11 @@ public class ExportImportUtil { assertAuthorizationSettingsOtherApp(realmRsc); assertAuthorizationSettingsTestAppAuthz(realmRsc); } + + // Test Message Bundle + Map localizations = adminClient.realm(realm.getRealm()).localization().getRealmLocalizationTexts("en"); + Assert.assertEquals("value1", localizations.get("key1")); + Assert.assertEquals("value2", localizations.get("key2")); } diff --git a/testsuite/integration-arquillian/tests/base/src/test/resources/model/testrealm.json b/testsuite/integration-arquillian/tests/base/src/test/resources/model/testrealm.json index a9d28dbf9be..4f7e24a476a 100755 --- a/testsuite/integration-arquillian/tests/base/src/test/resources/model/testrealm.json +++ b/testsuite/integration-arquillian/tests/base/src/test/resources/model/testrealm.json @@ -13,6 +13,12 @@ "requiredCredentials": [ "password" ], "defaultRoles": [ "foo", "bar" ], "verifyEmail" : "true", + "localizationTexts" : { + "en" : { + "key1" : "value1", + "key2" : "value2" + } + }, "smtpServer": { "from": "auto@keycloak.org", "host": "localhost",