KEYCLOAK-4234: Link to app in acct mgt doesn't use root url (#4285)

* KEYCLOAK-4234: Link to app in acct mgt not use root url

* Add tests.
This commit is contained in:
Stan Silvert 2017-07-04 01:01:58 -04:00 committed by Stian Thorgersen
parent 09ec642543
commit 32b16717a7
5 changed files with 91 additions and 4 deletions

View file

@ -140,7 +140,48 @@ public class ApplicationsBean {
public MultivaluedHashMap<String, ClientRoleEntry> getResourceRolesGranted() {
return resourceRolesGranted;
}
public String getEffectiveUrl() {
String rootUrl = getClient().getRootUrl();
String baseUrl = getClient().getBaseUrl();
if (rootUrl == null) rootUrl = "";
if (baseUrl == null) baseUrl = "";
if (rootUrl.equals("") && baseUrl.equals("")) {
return "";
}
if (rootUrl.equals("") && !baseUrl.equals("")) {
return baseUrl;
}
if (!rootUrl.equals("") && baseUrl.equals("")) {
return rootUrl;
}
if (isBaseUrlRelative() && !rootUrl.equals("")) {
return concatUrls(rootUrl, baseUrl);
}
return baseUrl;
}
private String concatUrls(String u1, String u2) {
if (u1.endsWith("/")) u1 = u1.substring(0, u1.length() - 1);
if (u2.startsWith("/")) u2 = u2.substring(1);
return u1 + "/" + u2;
}
private boolean isBaseUrlRelative() {
String baseUrl = getClient().getBaseUrl();
if (baseUrl.equals("")) return false;
if (baseUrl.startsWith("/")) return true;
if (baseUrl.startsWith("./")) return true;
if (baseUrl.startsWith("../")) return true;
return false;
}
public ClientModel getClient() {
return client;
}

View file

@ -61,6 +61,14 @@ public class AccountApplicationsPage extends AbstractAccountPage {
case 1:
currentEntry = new AppEntry();
String client = col.getText();
WebElement link = null;
try {
link = col.findElement(By.tagName("a"));
String href = link.getAttribute("href");
currentEntry.setHref(href);
} catch (Exception e) {
//ignore
}
table.put(client, currentEntry);
break;
case 2:
@ -111,6 +119,7 @@ public class AccountApplicationsPage extends AbstractAccountPage {
private final List<String> rolesGranted = new ArrayList<String>();
private final List<String> protocolMappersGranted = new ArrayList<String>();
private final List<String> additionalGrants = new ArrayList<>();
private String href = null;
private void addAvailableRole(String role) {
rolesAvailable.add(role);
@ -127,6 +136,14 @@ public class AccountApplicationsPage extends AbstractAccountPage {
private void addAdditionalGrant(String grant) {
additionalGrants.add(grant);
}
public void setHref(String href) {
this.href = href;
}
public String getHref() {
return this.href;
}
public List<String> getRolesGranted() {
return rolesGranted;

View file

@ -880,7 +880,7 @@ public class AccountTest extends AbstractTestRealmKeycloakTest {
Assert.assertTrue(applicationsPage.isCurrent());
Map<String, AccountApplicationsPage.AppEntry> apps = applicationsPage.getApplications();
Assert.assertThat(apps.keySet(), containsInAnyOrder("Account", "test-app", "test-app-scope", "third-party", "test-app-authz", "My Named Test App", "Test App Named - ${client_account}"));
Assert.assertThat(apps.keySet(), containsInAnyOrder("root-url-client", "Account", "test-app", "test-app-scope", "third-party", "test-app-authz", "My Named Test App", "Test App Named - ${client_account}"));
AccountApplicationsPage.AppEntry accountEntry = apps.get("Account");
Assert.assertEquals(3, accountEntry.getRolesAvailable().size());
@ -891,12 +891,14 @@ public class AccountTest extends AbstractTestRealmKeycloakTest {
Assert.assertTrue(accountEntry.getRolesGranted().contains("Full Access"));
Assert.assertEquals(1, accountEntry.getProtocolMappersGranted().size());
Assert.assertTrue(accountEntry.getProtocolMappersGranted().contains("Full Access"));
Assert.assertEquals("http://localhost:8180/auth/realms/test/account", accountEntry.getHref());
AccountApplicationsPage.AppEntry testAppEntry = apps.get("test-app");
Assert.assertEquals(5, testAppEntry.getRolesAvailable().size());
Assert.assertTrue(testAppEntry.getRolesAvailable().contains("Offline access"));
Assert.assertTrue(testAppEntry.getRolesGranted().contains("Full Access"));
Assert.assertTrue(testAppEntry.getProtocolMappersGranted().contains("Full Access"));
Assert.assertEquals("http://localhost:8180/auth/realms/master/app/auth", testAppEntry.getHref());
AccountApplicationsPage.AppEntry thirdPartyEntry = apps.get("third-party");
Assert.assertEquals(2, thirdPartyEntry.getRolesAvailable().size());
@ -904,6 +906,22 @@ public class AccountTest extends AbstractTestRealmKeycloakTest {
Assert.assertTrue(thirdPartyEntry.getRolesAvailable().contains("Have Customer User privileges in test-app"));
Assert.assertEquals(0, thirdPartyEntry.getRolesGranted().size());
Assert.assertEquals(0, thirdPartyEntry.getProtocolMappersGranted().size());
Assert.assertEquals("http://localhost:8180/auth/realms/master/app/auth", thirdPartyEntry.getHref());
AccountApplicationsPage.AppEntry testAppNamed = apps.get("Test App Named - ${client_account}");
Assert.assertEquals("http://localhost:8180/varnamedapp/base", testAppNamed.getHref());
AccountApplicationsPage.AppEntry rootUrlClient = apps.get("root-url-client");
Assert.assertEquals("http://localhost:8180/foo/bar/baz", rootUrlClient.getHref());
AccountApplicationsPage.AppEntry authzApp = apps.get("test-app-authz");
Assert.assertEquals("http://localhost:8180/test-app-authz", authzApp.getHref());
AccountApplicationsPage.AppEntry namedApp = apps.get("My Named Test App");
Assert.assertEquals("http://localhost:8180/namedapp/base", namedApp.getHref());
AccountApplicationsPage.AppEntry testAppScope = apps.get("test-app-scope");
Assert.assertNull(testAppScope.getHref());
}
@Test

View file

@ -147,6 +147,17 @@
"adminUrl": "http://localhost:8180/auth/realms/master/app/admin",
"secret": "password"
},
{
"clientId": "root-url-client",
"enabled": true,
"rootUrl": "http://localhost:8180/foo/bar",
"adminUrl": "http://localhost:8180/foo/bar",
"baseUrl": "/baz",
"redirectUris": [
"http://localhost:8180/foo/bar/*"
],
"secret": "password"
},
{
"clientId" : "test-app-scope",
"enabled": true,

View file

@ -27,9 +27,9 @@
<#list applications.applications as application>
<tr>
<td>
<#if application.client.baseUrl??><a href="${application.client.baseUrl}"></#if>
<#if application.effectiveUrl?has_content><a href="${application.effectiveUrl}"></#if>
<#if application.client.name??>${advancedMsg(application.client.name)}<#else>${application.client.clientId}</#if>
<#if application.client.baseUrl??></a></#if>
<#if application.effectiveUrl?has_content></a></#if>
</td>
<td>