keycloak-memoizeit

Details

diff --git a/testsuite/performance-web/src/main/java/org/keycloak/testsuite/performance/web/KeycloakPerfServer.java b/testsuite/performance-web/src/main/java/org/keycloak/testsuite/performance/web/KeycloakPerfServer.java
index b151019..9a64680 100644
--- a/testsuite/performance-web/src/main/java/org/keycloak/testsuite/performance/web/KeycloakPerfServer.java
+++ b/testsuite/performance-web/src/main/java/org/keycloak/testsuite/performance/web/KeycloakPerfServer.java
@@ -78,7 +78,7 @@ public class KeycloakPerfServer {
         deploymentInfo.setContextPath("/perf-app");
 
         ServletInfo servlet = new ServletInfo("PerfAppServlet", PerfAppServlet.class);
-        servlet.addMapping("/perf-servlet");
+        servlet.addMapping("/perf-servlet/*");
 
         deploymentInfo.addServlet(servlet);
 
diff --git a/testsuite/performance-web/src/main/java/org/keycloak/testsuite/performance/web/PerfAppServlet.java b/testsuite/performance-web/src/main/java/org/keycloak/testsuite/performance/web/PerfAppServlet.java
index 6de11f9..a781b31 100644
--- a/testsuite/performance-web/src/main/java/org/keycloak/testsuite/performance/web/PerfAppServlet.java
+++ b/testsuite/performance-web/src/main/java/org/keycloak/testsuite/performance/web/PerfAppServlet.java
@@ -15,8 +15,10 @@ import freemarker.cache.ClassTemplateLoader;
 import freemarker.template.Configuration;
 import freemarker.template.Template;
 import freemarker.template.TemplateException;
+import org.keycloak.adapters.AdapterConstants;
 import org.keycloak.representations.AccessToken;
 import org.keycloak.representations.RefreshToken;
+import org.keycloak.util.Time;
 
 /**
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@@ -43,6 +45,7 @@ public class PerfAppServlet extends HttpServlet {
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         resp.setContentType("text/html");
         String action = req.getParameter("action");
+        String actionDone = null;
 
         if (action != null) {
             if (action.equals("code")) {
@@ -50,8 +53,10 @@ public class PerfAppServlet extends HttpServlet {
                 return;
             } else if (action.equals("exchangeCode")) {
                 exchangeCodeForToken(req, resp);
+                actionDone = "Token retrieved";
             } else if (action.equals("refresh")) {
                 refreshToken(req, resp);
+                actionDone = "Token refreshed";
             } else if (action.equals("logout")) {
                 logoutRedirect(req, resp);
                 return;
@@ -61,13 +66,22 @@ public class PerfAppServlet extends HttpServlet {
         String code = req.getParameter("code");
         if (code != null) {
             req.getSession().setAttribute("code", code);
+            actionDone = "Code retrieved";
         }
 
-        String freemarkerRedirect = freemarkerRedirect(req, resp);
+        String freemarkerRedirect = freemarkerRedirect(req, resp, actionDone);
         resp.getWriter().println(freemarkerRedirect);
         resp.getWriter().flush();
     }
 
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        if (req.getRequestURI().endsWith(AdapterConstants.K_LOGOUT)) {
+            // System.out.println("Logout callback triggered");
+            resp.setStatus(204);
+        }
+    }
+
     protected void keycloakLoginRedirect(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         String loginUrl = oauthClient.getLoginFormUrl();
         resp.sendRedirect(loginUrl);
@@ -77,32 +91,60 @@ public class PerfAppServlet extends HttpServlet {
         String code = (String)req.getSession().getAttribute("code");
         OAuthClient.AccessTokenResponse atResponse = oauthClient.doAccessTokenRequest(code, "password");
 
-        String accessToken = atResponse.getAccessToken();
-        String refreshToken = atResponse.getRefreshToken();
-        req.getSession().setAttribute("accessToken", accessToken);
-        req.getSession().setAttribute("refreshToken", refreshToken);
+        updateTokensInSession(req, atResponse);
     }
 
     protected void refreshToken(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         String refreshToken = (String)req.getSession().getAttribute("refreshToken");
         OAuthClient.AccessTokenResponse atResponse = oauthClient.doRefreshTokenRequest(refreshToken, "password");
 
+        updateTokensInSession(req, atResponse);
+    }
+
+    private void updateTokensInSession(HttpServletRequest req, OAuthClient.AccessTokenResponse atResponse) {
         String accessToken = atResponse.getAccessToken();
-        refreshToken = atResponse.getRefreshToken();
+        String refreshToken = atResponse.getRefreshToken();
+        AccessToken accessTokenParsed = oauthClient.verifyToken(accessToken);
+        RefreshToken refreshTokenParsed = oauthClient.verifyRefreshToken(refreshToken);
         req.getSession().setAttribute("accessToken", accessToken);
         req.getSession().setAttribute("refreshToken", refreshToken);
+        req.getSession().setAttribute("accessTokenParsed", accessTokenParsed);
+        req.getSession().setAttribute("refreshTokenParsed", refreshTokenParsed);
     }
 
     protected void logoutRedirect(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        String sessionState = null;
+        AccessToken accessTokenParsed = (AccessToken)req.getSession().getAttribute("accessTokenParsed");
+        if (accessTokenParsed != null) {
+            sessionState = accessTokenParsed.getSessionState();
+        }
+
+        // Invalidate http session
+        req.getSession(false).invalidate();
 
+        String logoutURL = oauthClient.getLogoutUrl(oauthClient.getRedirectUri(), sessionState);
+        resp.sendRedirect(logoutURL);
     }
 
-    private String freemarkerRedirect(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+    private String freemarkerRedirect(HttpServletRequest req, HttpServletResponse resp, String actionDone) throws ServletException, IOException {
+        AccessToken accessTokenParsed = (AccessToken)req.getSession().getAttribute("accessTokenParsed");
+        RefreshToken refreshTokenParsed = (RefreshToken)req.getSession().getAttribute("refreshTokenParsed");
+
         Map<String, Object> attributes = new HashMap<String, Object>();
         attributes.put("requestURI", req.getRequestURI());
         attributes.put("code",  req.getSession().getAttribute("code"));
         attributes.put("accessToken",  req.getSession().getAttribute("accessToken"));
         attributes.put("refreshToken",  req.getSession().getAttribute("refreshToken"));
+        attributes.put("accessTokenParsed",  accessTokenParsed);
+        attributes.put("refreshTokenParsed",  refreshTokenParsed);
+        attributes.put("actionDone", actionDone);
+
+        if (accessTokenParsed != null) {
+            attributes.put("accessTokenExpiration", Time.toDate(accessTokenParsed.getExpiration()).toString());
+        }
+        if (refreshTokenParsed != null) {
+            attributes.put("refreshTokenExpiration", Time.toDate(refreshTokenParsed.getExpiration()).toString());
+        }
 
         try {
             Writer out = new StringWriter();
diff --git a/testsuite/performance-web/src/main/resources/perf-app-resources/index.ftl b/testsuite/performance-web/src/main/resources/perf-app-resources/index.ftl
index b8e92eb..74af2be 100644
--- a/testsuite/performance-web/src/main/resources/perf-app-resources/index.ftl
+++ b/testsuite/performance-web/src/main/resources/perf-app-resources/index.ftl
@@ -19,30 +19,30 @@
 
     <p>
       <#if code??>
-        Code: ${code}
+        <b>Code Available</b><br>
+        Code=${code} <br>
         <hr />
       </#if>
 
       <#if accessToken??>
-        <b>accessToken: </b> ${accessToken}
-        <br />
-        <pre style="background-color: #ddd; border: 1px solid #ccc; padding: 10px;" id="accessTokenParsed"></pre>
+        <b>Access Token Available</b><br>
+        AccessToken=${accessToken} <br>
+        Username=${accessTokenParsed.preferredUsername} <br>
+        SessionState=${accessTokenParsed.sessionState}  <br>
+        Expiration=${accessTokenExpiration} <br>
         <hr />
-
-        <script>
-          updateElementWithToken("${accessToken}", "accessTokenParsed");
-        </script>
       </#if>
 
       <#if refreshToken??>
-        <b>refreshToken:  </b> ${refreshToken}
-        <br />
-        <pre style="background-color: #ddd; border: 1px solid #ccc; padding: 10px;" id="refreshTokenParsed"></pre>
+        <b>Refresh token available</b><br>
+        RefreshToken=${refreshToken} <br>
+        Expiration=${refreshTokenExpiration} <br>
         <hr />
+      </#if>
 
-        <script>
-          updateElementWithToken("${refreshToken}", "refreshTokenParsed");
-        </script>
+      <#if actionDone??>
+        RequestAction=${actionDone}
+        <hr />
       </#if>
 
     </p>
diff --git a/testsuite/performance-web/src/main/resources/perfrealm.json b/testsuite/performance-web/src/main/resources/perfrealm.json
index aaa7fc4..2dadcc2 100644
--- a/testsuite/performance-web/src/main/resources/perfrealm.json
+++ b/testsuite/performance-web/src/main/resources/perfrealm.json
@@ -59,7 +59,7 @@
             "redirectUris": [
                 "http://localhost:8081/perf-app/*"
             ],
-            "adminUrl": "http://localhost:8081/perf-app/logout",
+            "adminUrl": "http://localhost:8081/perf-app/perf-servlet",
             "secret": "password"
          }
     ],