keycloak-aplcache

Details

diff --git a/testsuite/integration-arquillian/test-apps/spring-boot-adapter/pom.xml b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/pom.xml
index d214a48..b53481b 100644
--- a/testsuite/integration-arquillian/test-apps/spring-boot-adapter/pom.xml
+++ b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/pom.xml
@@ -23,17 +23,27 @@
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 		<java.version>1.8</java.version>
 
-        <keycloak.version>-</keycloak.version>
+        <keycloak.version>3.3.0.CR1-SNAPSHOT</keycloak.version>
 	</properties>
 
 	<dependencies>
+	
+		<dependency>
+		    <groupId>org.springframework.boot</groupId>
+		    <artifactId>spring-boot-starter-thymeleaf</artifactId>
+		</dependency>
 
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-test</artifactId>
 			<scope>test</scope>
 		</dependency>
-
+		 
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+		
 		<dependency>
 			<groupId>org.keycloak</groupId>
 			<artifactId>keycloak-spring-boot-adapter</artifactId>
diff --git a/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/java/org/keycloak/AdminController.java b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/java/org/keycloak/AdminController.java
new file mode 100644
index 0000000..3b9ccc4
--- /dev/null
+++ b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/java/org/keycloak/AdminController.java
@@ -0,0 +1,59 @@
+package org.keycloak;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.keycloak.adapters.RefreshableKeycloakSecurityContext;
+import org.keycloak.common.util.Time;
+import org.keycloak.jose.jws.JWSInput;
+import org.keycloak.jose.jws.JWSInputException;
+import org.keycloak.representations.RefreshToken;
+import org.keycloak.util.JsonSerialization;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.util.NumberUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.context.request.WebRequest;
+
+@Controller
+@RequestMapping(path = "/admin")
+public class AdminController {
+	
+	@RequestMapping(path = "/TokenServlet", method = RequestMethod.GET)
+	public String showTokens(WebRequest req, Model model, @RequestParam Map<String, String> attributes) throws IOException {
+	    String timeOffset = attributes.get("timeOffset");
+	    if (!StringUtils.isEmpty(timeOffset)) {
+	        int offset;
+	        try {
+                offset = Integer.parseInt(timeOffset, 10);
+            }
+            catch (NumberFormatException e) {
+	            offset = 0;
+            }
+
+            Time.setOffset(offset);
+        }
+
+        RefreshableKeycloakSecurityContext ctx =
+        		(RefreshableKeycloakSecurityContext) req.getAttribute(KeycloakSecurityContext.class.getName(), WebRequest.SCOPE_REQUEST);
+        String accessTokenPretty = JsonSerialization.writeValueAsPrettyString(ctx.getToken());
+        RefreshToken refreshToken;
+        try {
+            refreshToken = new JWSInput(ctx.getRefreshToken()).readJsonContent(RefreshToken.class);
+        } catch (JWSInputException e) {
+            throw new IOException(e);
+        }
+        String refreshTokenPretty = JsonSerialization.writeValueAsPrettyString(refreshToken);
+        
+        model.addAttribute("accessToken", accessTokenPretty);
+        model.addAttribute("refreshToken", refreshTokenPretty);
+        model.addAttribute("accessTokenString", ctx.getTokenString());
+        
+        return "tokens";
+	}
+}
diff --git a/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/application.properties b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/application.properties
index d8749d3..84de1bb 100644
--- a/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/application.properties
+++ b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/application.properties
@@ -5,6 +5,7 @@ keycloak.auth-server-url=http://localhost:8180/auth
 keycloak.ssl-required=external
 keycloak.resource=spring-boot-app
 keycloak.credentials.secret=e3789ac5-bde6-4957-a7b0-612823dac101
+keycloak.realm-key=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB
 
 keycloak.security-constraints[0].authRoles[0]=admin
 keycloak.security-constraints[0].securityCollections[0].name=Admin zone
diff --git a/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/templates/tokens.html b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/templates/tokens.html
new file mode 100644
index 0000000..09dee72
--- /dev/null
+++ b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/templates/tokens.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org/">
+	<head>
+		<title>Tokens from spring boot</title>
+	</head>
+	<body>
+		<span id="accessToken" th:text="${accessToken}"></span>
+		<span id="refreshToken" th:text="${refreshToken}"></span>
+		<span id="accessTokenString" th:text="${accessTokenString}"></span>
+	</body>
+</html>
\ No newline at end of file
diff --git a/testsuite/integration-arquillian/tests/other/springboot-tests/src/main/java/org/keycloak/testsuite/springboot/TokenPage.java b/testsuite/integration-arquillian/tests/other/springboot-tests/src/main/java/org/keycloak/testsuite/springboot/TokenPage.java
new file mode 100644
index 0000000..7fc7961
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/springboot-tests/src/main/java/org/keycloak/testsuite/springboot/TokenPage.java
@@ -0,0 +1,19 @@
+package org.keycloak.testsuite.springboot;
+
+import java.net.URL;
+
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.keycloak.testsuite.adapter.page.AbstractShowTokensPage;
+
+public class TokenPage extends AbstractShowTokensPage {
+
+	@Override
+	public boolean isCurrent() {
+		return driver.getTitle().equalsIgnoreCase("tokens from spring boot");
+	}
+
+	@Override
+	public URL getInjectedUrl() {
+		return null;
+	}
+}
diff --git a/testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/BasicSpringBootTest.java b/testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/BasicSpringBootTest.java
new file mode 100644
index 0000000..6aea719
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/BasicSpringBootTest.java
@@ -0,0 +1,61 @@
+package org.keycloak.testsuite.springboot;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class BasicSpringBootTest extends AbstractSpringBootTest {
+    @Test
+    public void testCorrectUser() {
+        driver.navigate().to(APPLICATION_URL + "/index.html");
+
+        Assert.assertTrue("Must be on application page", applicationPage.isCurrent());
+
+        applicationPage.goAdmin();
+
+        Assert.assertTrue("Must be on login page", loginPage.isCurrent());
+
+        loginPage.login(USER_LOGIN, USER_PASSWORD);
+
+        Assert.assertTrue("Must be on admin page", adminPage.isCurrent());
+        Assert.assertTrue("Admin page must contain correct div",
+                driver.getPageSource().contains("You are now admin"));
+
+        driver.navigate().to(logoutPage(BASE_URL));
+
+        Assert.assertTrue("Must be on login page", loginPage.isCurrent());
+
+    }
+
+    @Test
+    public void testIncorrectUser() {
+        driver.navigate().to(APPLICATION_URL + "/index.html");
+
+        Assert.assertTrue("Must be on application page", applicationPage.isCurrent());
+
+        applicationPage.goAdmin();
+
+        Assert.assertTrue("Must be on login page", loginPage.isCurrent());
+
+        loginPage.login(USER_LOGIN_2, USER_PASSWORD_2);
+
+        Assert.assertTrue("Must return 403 because of incorrect role",
+                driver.getPageSource().contains("There was an unexpected error (type=Forbidden, status=403)")
+                || driver.getPageSource().contains("\"status\":403,\"error\":\"Forbidden\""));
+    }
+
+    @Test
+    public void testIncorrectCredentials() {
+        driver.navigate().to(APPLICATION_URL + "/index.html");
+
+        Assert.assertTrue("Must be on application page", applicationPage.isCurrent());
+
+        applicationPage.goAdmin();
+
+        Assert.assertTrue("Must be on login page", loginPage.isCurrent());
+
+        loginPage.login(USER_LOGIN, USER_PASSWORD_2);
+
+        Assert.assertEquals("Error message about password",
+                "Invalid username or password.", loginPage.getError());
+    }
+}
diff --git a/testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/TokenSpringBootTest.java b/testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/TokenSpringBootTest.java
new file mode 100644
index 0000000..9c86e8a
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/TokenSpringBootTest.java
@@ -0,0 +1,42 @@
+package org.keycloak.testsuite.springboot;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.keycloak.OAuth2Constants;
+import org.keycloak.testsuite.util.WaitUtils;
+import org.keycloak.util.TokenUtil;
+import org.openqa.selenium.By;
+
+public class TokenSpringBootTest extends AbstractSpringBootTest {
+    @Test
+    public void testTokens() {
+        String servletUri = APPLICATION_URL + "/admin/TokenServlet";
+
+        driver.navigate().to(servletUri + "?" + OAuth2Constants.SCOPE + "=" + OAuth2Constants.OFFLINE_ACCESS);
+
+        Assert.assertTrue("Must be on login page", loginPage.isCurrent());
+        loginPage.login(USER_LOGIN, USER_PASSWORD);
+
+        WaitUtils.waitUntilElement(By.tagName("body")).is().visible();
+
+        Assert.assertTrue(tokenPage.isCurrent());
+
+        Assert.assertEquals(tokenPage.getRefreshToken().getType(), TokenUtil.TOKEN_TYPE_OFFLINE);
+        Assert.assertEquals(tokenPage.getRefreshToken().getExpiration(), 0);
+
+        String accessTokenId = tokenPage.getAccessToken().getId();
+        String refreshTokenId = tokenPage.getRefreshToken().getId();
+
+        setAdapterAndServerTimeOffset(9999, servletUri);
+
+        driver.navigate().to(servletUri);
+        Assert.assertTrue("Must be on tokens page", tokenPage.isCurrent());
+        Assert.assertNotEquals(tokenPage.getRefreshToken().getId(), refreshTokenId);
+        Assert.assertNotEquals(tokenPage.getAccessToken().getId(), accessTokenId);
+
+        setAdapterAndServerTimeOffset(0, servletUri);
+
+        driver.navigate().to(logoutPage(servletUri));
+        Assert.assertTrue("Must be on login page", loginPage.isCurrent());
+    }
+}