From b0ba7ed188341a2c2274bc5de9fe10cff1e3b234 Mon Sep 17 00:00:00 2001 From: mposolda Date: Thu, 22 May 2014 09:21:31 +0200 Subject: [PATCH 01/15] Fixing location of FolderThemeProvider --- server/src/main/resources/META-INF/keycloak-server.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/src/main/resources/META-INF/keycloak-server.json b/server/src/main/resources/META-INF/keycloak-server.json index aa446763cbb..06efa79534f 100644 --- a/server/src/main/resources/META-INF/keycloak-server.json +++ b/server/src/main/resources/META-INF/keycloak-server.json @@ -20,7 +20,9 @@ "theme": { "default": "keycloak", - "dir": "${jboss.server.config.dir}/themes" + "folder": { + "dir": "${jboss.server.config.dir}/themes" + } }, "login-forms": { From 0c60bd80df8af87e7f622ebe332da0d21ee53ee5 Mon Sep 17 00:00:00 2001 From: mposolda Date: Thu, 22 May 2014 12:04:13 +0200 Subject: [PATCH 02/15] Extract some versions into properties --- pom.xml | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index 0aa3dff11e8..655ed163d59 100755 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,8 @@ pom + 1.46 + 1.9.12 4.1.2 2.3.7.Final 2.3.7.Final @@ -33,6 +35,13 @@ 1.5.10 7.1.1.Final 8.0.0.Final + 1.0.1.Final + 2.2 + 1.14.1-beta + 1.0.1 + 2.3.19 + 3.0.5 + 2.35.0 1.6 @@ -109,12 +118,12 @@ org.bouncycastle bcprov-jdk16 - 1.46 + ${bouncycastle.version} org.bouncycastle bcmail-jdk16 - 1.46 + ${bouncycastle.version} net.iharder @@ -179,27 +188,27 @@ org.codehaus.jackson jackson-core-asl - 1.9.12 + ${jackson.version} org.codehaus.jackson jackson-mapper-asl - 1.9.12 + ${jackson.version} org.codehaus.jackson jackson-xc - 1.9.12 + ${jackson.version} org.codehaus.jackson jackson-jaxrs - 1.9.12 + ${jackson.version} org.jboss.spec.javax.servlet jboss-servlet-api_3.0_spec - 1.0.1.Final + ${servlet.api.30.version} org.jboss.spec.javax.servlet @@ -282,19 +291,19 @@ com.google.api-client google-api-client - 1.14.1-beta + ${google.client.version} org.freemarker freemarker - 2.3.19 + ${freemarker.version} com.google.http-client google-http-client-jackson - 1.14.1-beta + ${google.client.version} com.google.apis @@ -306,19 +315,19 @@ org.twitter4j twitter4j-core - 3.0.5 + ${twitter4j.version} com.google.zxing core - 2.2 + ${google.zxing.version} com.google.zxing javase - 2.2 + ${google.zxing.version} @@ -332,19 +341,19 @@ de.idyl winzipaes - 1.0.1 + ${winzipaes.version} org.seleniumhq.selenium selenium-java - 2.35.0 + ${selenium.version} org.seleniumhq.selenium selenium-chrome-driver - 2.35.0 + ${selenium.version} test From 86ad7292afc25d32e3305867b92582d901f2b686 Mon Sep 17 00:00:00 2001 From: Stian Thorgersen Date: Thu, 22 May 2014 14:51:36 +0100 Subject: [PATCH 03/15] Fix updating sessions after logout session --- .../admin/base/resources/js/controllers/users.js | 6 +++--- .../base/resources/partials/user-sessions.html | 15 +++++++-------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js index 35e4fb01618..e38b4e1802d 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js @@ -107,7 +107,7 @@ module.controller('UserSessionsCtrl', function($scope, realm, user, sessions, Us $scope.logoutAll = function() { UserLogout.save({realm : realm.realm, user: user.username}, function () { Notifications.success('Logged out user in all applications'); - UserSessions.get({realm: realm.realm, user: user.username}, function(updated) { + UserSessions.query({realm: realm.realm, user: user.username}, function(updated) { $scope.sessions = updated; }) }); @@ -116,9 +116,9 @@ module.controller('UserSessionsCtrl', function($scope, realm, user, sessions, Us $scope.logoutSession = function(sessionId) { console.log('here in logoutSession'); UserSessionLogout.delete({realm : realm.realm, session: sessionId}, function() { - Notifications.success('Logged out session'); - UserSessions.get({realm: realm.realm, user: user.username}, function(updated) { + UserSessions.query({realm: realm.realm, user: user.username}, function(updated) { $scope.sessions = updated; + Notifications.success('Logged out session'); }) }); } diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/user-sessions.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/user-sessions.html index 844efc07a3f..e19e8dd33cc 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/user-sessions.html +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/user-sessions.html @@ -38,19 +38,18 @@ {{session.ipAddress}} {{session.start | date:'medium'}} {{session.lastAccess | date:'medium'}} - - + - logout + logout From fad0a7728c68e6023533e81a89f9b4a812dbe1a6 Mon Sep 17 00:00:00 2001 From: Stian Thorgersen Date: Thu, 22 May 2014 15:10:22 +0100 Subject: [PATCH 04/15] Make add redirect-uri and web-origin use same l&f --- .../partials/application-detail.html | 40 ++++++++----------- .../partials/oauth-client-detail.html | 34 ++++++++-------- 2 files changed, 33 insertions(+), 41 deletions(-) diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/application-detail.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/application-detail.html index 600f72e7a15..f8380ed2553 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/application-detail.html +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/application-detail.html @@ -92,30 +92,24 @@
-
-
-
- -
-
- -
+
+
+ + + +
-
-
- -
-
- -
+
+
+
+ + + +
diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-detail.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-detail.html index e5ea613e8a5..f1ed7f81ae1 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-detail.html +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/oauth-client-detail.html @@ -77,26 +77,24 @@
-
-
-
- -
-
- -
+
-
-
- -
-
- -
+
+
+
+ + + +
From 0574302840bead03676162fda59136a0c8ef649b Mon Sep 17 00:00:00 2001 From: Stian Thorgersen Date: Thu, 22 May 2014 15:39:31 +0100 Subject: [PATCH 05/15] Fix dialog for resetting user password --- .../main/resources/theme/admin/base/resources/js/services.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/services.js b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/services.js index b827960997a..3a48af662bf 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/services.js +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/services.js @@ -77,8 +77,6 @@ module.service('Dialog', function($modal) { } dialog.confirm = function(title, message, success, cancel) { - var title = title; - var msg = '' + message + '"'; var btns = { ok: { label: title, @@ -90,7 +88,7 @@ module.service('Dialog', function($modal) { } } - openDialog(title, msg, btns).then(success).reject(cancel); + openDialog(title, message, btns).then(success, cancel); } return dialog From 08b19961498f041f2ce017dfc4b23e2b969aa0f7 Mon Sep 17 00:00:00 2001 From: Stian Thorgersen Date: Thu, 22 May 2014 16:01:05 +0100 Subject: [PATCH 06/15] Removed jboss.as.jpa.managed property from persistence.xml as it's causing problems on AS 7.1 --- server/src/main/resources/META-INF/persistence.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/src/main/resources/META-INF/persistence.xml b/server/src/main/resources/META-INF/persistence.xml index 90b17421acf..a75390a6103 100755 --- a/server/src/main/resources/META-INF/persistence.xml +++ b/server/src/main/resources/META-INF/persistence.xml @@ -25,7 +25,6 @@ - @@ -37,7 +36,6 @@ - From de36973716d62fde7a8c92786b3d4f092e464438 Mon Sep 17 00:00:00 2001 From: Stian Thorgersen Date: Thu, 22 May 2014 16:59:38 +0100 Subject: [PATCH 07/15] Redirect to login form automatically in keycloak.js if login-required is set --- integration/js/src/main/resources/keycloak.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/integration/js/src/main/resources/keycloak.js b/integration/js/src/main/resources/keycloak.js index b05761d850a..84ae29c09a1 100755 --- a/integration/js/src/main/resources/keycloak.js +++ b/integration/js/src/main/resources/keycloak.js @@ -29,6 +29,10 @@ var Keycloak = function (config) { if (initOptions.checkLoginIframeInterval) { loginIframe.interval = initOptions.checkLoginIframeInterval; } + + if (initOptions.onLoad === 'login-required') { + kc.loginRequired = true; + } } var promise = createPromise(); @@ -374,6 +378,9 @@ var Keycloak = function (config) { if (kc.token) { setToken(null, null); kc.onAuthLogout && kc.onAuthLogout(); + if (kc.loginRequired) { + kc.login(); + } } } From 128cc7eadb7abd9757f78af34ce798d6c31ff549 Mon Sep 17 00:00:00 2001 From: Stian Thorgersen Date: Thu, 22 May 2014 17:07:40 +0100 Subject: [PATCH 08/15] Fixes to js-console example --- examples/js-console/example-realm.json | 6 +++--- examples/js-console/src/main/webapp/index.html | 4 ++-- examples/js-console/src/main/webapp/keycloak.json | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/js-console/example-realm.json b/examples/js-console/example-realm.json index 7cb5485af67..42d291e008d 100755 --- a/examples/js-console/example-realm.json +++ b/examples/js-console/example-realm.json @@ -48,12 +48,12 @@ "name": "js-console", "enabled": true, "publicClient": true, - "baseUrl": "http://localhost/js-console", + "baseUrl": "http://localhost:8080/js-console", "redirectUris": [ - "http://localhost/js-console/*" + "http://localhost:8080/js-console/*" ], "webOrigins": [ - "http://localhost" + "http://localhost:8080" ] } ], diff --git a/examples/js-console/src/main/webapp/index.html b/examples/js-console/src/main/webapp/index.html index 499c9286375..45f76650590 100644 --- a/examples/js-console/src/main/webapp/index.html +++ b/examples/js-console/src/main/webapp/index.html @@ -1,13 +1,13 @@ - +
- + diff --git a/examples/js-console/src/main/webapp/keycloak.json b/examples/js-console/src/main/webapp/keycloak.json index 66434b9bf06..286d87b9f67 100644 --- a/examples/js-console/src/main/webapp/keycloak.json +++ b/examples/js-console/src/main/webapp/keycloak.json @@ -1,8 +1,8 @@ { "realm" : "example", "realm-public-key" : "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB", - "auth-server-url" : "http://localhost:8081/auth", + "auth-server-url" : "http://localhost:8080/auth", "ssl-not-required" : true, "resource" : "js-console", "public-client" : true -} \ No newline at end of file +} From 37099f317734b5ed5b19fa38cbb07a67ced96bae Mon Sep 17 00:00:00 2001 From: Stian Thorgersen Date: Thu, 22 May 2014 17:51:51 +0100 Subject: [PATCH 09/15] KEYCLOAK-494 Session state iframe uses first redirect uri for a client --- integration/js/src/main/resources/keycloak.js | 2 +- .../services/resources/RealmsResource.java | 42 ++++++++++--------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/integration/js/src/main/resources/keycloak.js b/integration/js/src/main/resources/keycloak.js index 84ae29c09a1..1cfba8100ac 100755 --- a/integration/js/src/main/resources/keycloak.js +++ b/integration/js/src/main/resources/keycloak.js @@ -538,7 +538,7 @@ var Keycloak = function (config) { loginIframe.iframe = iframe; } - var src = getRealmUrl() + '/login-status-iframe.html?client_id=' + encodeURIComponent(kc.clientId); + var src = getRealmUrl() + '/login-status-iframe.html?client_id=' + encodeURIComponent(kc.clientId) + '&origin=' + window.location.origin; iframe.setAttribute('src', src ); iframe.style.display = 'none'; document.body.appendChild(iframe); diff --git a/services/src/main/java/org/keycloak/services/resources/RealmsResource.java b/services/src/main/java/org/keycloak/services/resources/RealmsResource.java index 18c6caa5217..23359d5e398 100755 --- a/services/src/main/java/org/keycloak/services/resources/RealmsResource.java +++ b/services/src/main/java/org/keycloak/services/resources/RealmsResource.java @@ -2,6 +2,7 @@ package org.keycloak.services.resources; import org.jboss.logging.Logger; import org.jboss.resteasy.annotations.cache.NoCache; +import org.jboss.resteasy.spi.BadRequestException; import org.jboss.resteasy.spi.NotFoundException; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.jboss.resteasy.spi.UnauthorizedException; @@ -98,7 +99,8 @@ public class RealmsResource { @Produces(MediaType.TEXT_HTML) @NoCache public String getLoginStatusIframe(final @PathParam("realm") String name, - @QueryParam("client_id") String client_id) { + @QueryParam("client_id") String client_id, + @QueryParam("origin") String origin) { logger.info("getLoginStatusIframe"); AuthenticationManager auth = new AuthenticationManager(providers); @@ -116,31 +118,33 @@ public class RealmsResource { InputStream is = getClass().getClassLoader().getResourceAsStream("login-status-iframe.html"); if (is == null) throw new NotFoundException("Could not find login-status-iframe.html "); - Set redirectUris = TokenService.resolveValidRedirects(uriInfo, client.getRedirectUris()); - String origin = null; - for (String redirect : redirectUris) { - int index = redirect.indexOf("://"); - if (index == -1) continue; - index = redirect.indexOf('/', index + 3); - if (index == -1) { - origin = redirect; - } else { - origin = redirect.substring(0, index); + boolean valid = false; + for (String o : client.getWebOrigins()) { + if (o.equals("*") || o.equals(origin)) { + valid = true; + break; } - break; - } - String file = null; + + for (String r : TokenService.resolveValidRedirects(uriInfo, client.getRedirectUris())) { + r = r.substring(0, r.indexOf('/', 8)); + if (r.equals(origin)) { + valid = true; + break; + } + } + + if (!valid) { + throw new BadRequestException("Invalid origin"); + } + try { - file = StreamUtil.readString(is); + String file = StreamUtil.readString(is); + return file.replace("ORIGIN", origin); } catch (IOException e) { throw new RuntimeException(e); } - file = file.replace("ORIGIN", origin); - //System.out.println(file); - return file; - } @Path("{realm}/tokens") From 5c378cbd9d672b99cb8463e4407a162d09b3b208 Mon Sep 17 00:00:00 2001 From: mposolda Date: Fri, 23 May 2014 08:51:06 +0200 Subject: [PATCH 10/15] Invalid active tab when on token-settings page --- .../theme/admin/base/resources/partials/realm-menu.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/realm-menu.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/realm-menu.html index 7725e35abe9..1bc9c6bbdab 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/realm-menu.html +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/realm-menu.html @@ -1,5 +1,5 @@ \ No newline at end of file From df06a0c878f8ba9730579bb13929597ea531751d Mon Sep 17 00:00:00 2001 From: mposolda Date: Fri, 23 May 2014 09:46:39 +0200 Subject: [PATCH 11/15] Fix logging typo when importing roles --- .../main/java/org/keycloak/exportimport/ModelImporter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ModelImporter.java b/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ModelImporter.java index 15f9fae027d..be7809923c8 100755 --- a/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ModelImporter.java +++ b/export-import/export-import-impl/src/main/java/org/keycloak/exportimport/ModelImporter.java @@ -151,7 +151,7 @@ public class ModelImporter { } } - logger.infof("%d roles imported: ", roles); + logger.infof("%d roles imported: ", roles.size()); if (logger.isDebugEnabled()) { logger.debug("Imported roles: " + roles); } @@ -225,7 +225,7 @@ public class ModelImporter { addScopes(realm, client, clientEntity); } - logger.infof("OAuth clients imported: " + clients); + logger.info("OAuth clients imported: " + clients); } protected ApplicationModel findApplicationById(KeycloakSession keycloakSession, String applicationId) { From 37327be5210cbc01c67da6da4ed72836999ba1e2 Mon Sep 17 00:00:00 2001 From: Stian Thorgersen Date: Fri, 23 May 2014 09:35:20 +0100 Subject: [PATCH 12/15] KEYCLOAK-482 Cannot read property 'realm' of undefined --- .../theme/admin/base/resources/index.html | 2 +- .../theme/admin/base/resources/js/app.js | 3 - .../base/resources/js/controllers/realm.js | 114 +++++++++--------- .../admin/base/resources/partials/menu.html | 6 +- 4 files changed, 61 insertions(+), 64 deletions(-) diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/index.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/index.html index eca11704ff5..459751c0666 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/index.html +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/index.html @@ -38,7 +38,7 @@ - +
You will be logged off in seconds due to inactivity. diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/app.js b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/app.js index e633dcab133..3438d6b9235 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/app.js +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/app.js @@ -1,6 +1,5 @@ 'use strict'; -var indexUrl = window.location.href; var consoleBaseUrl = window.location.href; consoleBaseUrl = consoleBaseUrl.substring(0, consoleBaseUrl.indexOf("/console")); consoleBaseUrl = consoleBaseUrl + "/console"; @@ -23,14 +22,12 @@ var loadingTimer = -1; angular.element(document).ready(function ($http) { var keycloakAuth = new Keycloak(configUrl); - auth.loggedIn = false; keycloakAuth.onAuthLogout = function() { location.reload(); } keycloakAuth.init({ onLoad: 'login-required' }).success(function () { - auth.loggedIn = true; auth.authz = keycloakAuth; module.factory('Auth', function() { return auth; diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/realm.js b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/realm.js index a3e61c3b615..d1fdc397c28 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/realm.js +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/realm.js @@ -7,69 +7,69 @@ module.controller('GlobalCtrl', function($scope, $http, Auth, WhoAmI, Current, $ $scope.logout = logout; $scope.auth = Auth; - WhoAmI.get(function(data) { - Auth.user = data; - Auth.loggedIn = true; - function getAccess(role) { - if (!Current.realm) { - return false; - } + WhoAmI.get(function(user) { + Auth.user = user; + }); - var realmAccess = Auth.user['realm_access']; - if (realmAccess) { - realmAccess = realmAccess[Current.realm.realm]; - if (realmAccess) { - return realmAccess.indexOf(role) >= 0; - } - } + function getAccess(role) { + if (!Current.realm) { return false; } - $scope.access = { - createRealm: data.createRealm, - - get viewRealm() { - return getAccess('view-realm') || this.manageRealm; - }, - - get viewApplications() { - return getAccess('view-applications') || this.manageApplications; - }, - - get viewClients() { - return getAccess('view-clients') || this.manageClients; - }, - - get viewUsers() { - return getAccess('view-users') || this.manageClients; - }, - - get viewAudit() { - return getAccess('view-audit') || this.manageClients; - }, - - get manageRealm() { - return getAccess('manage-realm'); - }, - - get manageApplications() { - return getAccess('manage-applications'); - }, - - get manageClients() { - return getAccess('manage-clients'); - }, - - get manageUsers() { - return getAccess('manage-users'); - }, - - get manageAudit() { - return getAccess('manage-audit'); + var realmAccess = Auth.user && Auth.user['realm_access']; + if (realmAccess) { + realmAccess = realmAccess[Current.realm.realm]; + if (realmAccess) { + return realmAccess.indexOf(role) >= 0; } } - }); + return false; + } + + $scope.access = { + createRealm: Auth.user && Auth.user.createRealm, + + get viewRealm() { + return getAccess('view-realm') || this.manageRealm; + }, + + get viewApplications() { + return getAccess('view-applications') || this.manageApplications; + }, + + get viewClients() { + return getAccess('view-clients') || this.manageClients; + }, + + get viewUsers() { + return getAccess('view-users') || this.manageClients; + }, + + get viewAudit() { + return getAccess('view-audit') || this.manageClients; + }, + + get manageRealm() { + return getAccess('manage-realm'); + }, + + get manageApplications() { + return getAccess('manage-applications'); + }, + + get manageClients() { + return getAccess('manage-clients'); + }, + + get manageUsers() { + return getAccess('manage-users'); + }, + + get manageAudit() { + return getAccess('manage-audit'); + } + } $scope.$watch(function() { return $location.path(); @@ -114,7 +114,7 @@ module.controller('RealmDropdownCtrl', function($scope, Realm, Current, Auth, $l $scope.showNav = function() { var show = Current.realms.length > 0; - return Auth.loggedIn && show; + return Auth.user && show; } $scope.refresh = function() { Current.refresh(); diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/menu.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/menu.html index 40dc7024a96..03830e9ddc9 100755 --- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/menu.html +++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/menu.html @@ -12,7 +12,7 @@