keycloak-aplcache

KEYCLOAK-3625: conform to oidc specs

10/17/2016 10:05:36 AM

Details

diff --git a/adapters/oidc/js/src/main/resources/keycloak.js b/adapters/oidc/js/src/main/resources/keycloak.js
index 2d8f421..9e2e412 100755
--- a/adapters/oidc/js/src/main/resources/keycloak.js
+++ b/adapters/oidc/js/src/main/resources/keycloak.js
@@ -29,7 +29,7 @@
 
         var loginIframe = {
             enable: true,
-            callbackMap: [],
+            callbackList: [],
             interval: 5
         };
 
@@ -830,33 +830,25 @@
             document.body.appendChild(iframe);
 
             var messageCallback = function(event) {
-                if (event.origin !== loginIframe.iframeOrigin) {
-                    return;
-                }
 
-                try {
-                    var data = JSON.parse(event.data);
-                } catch (err) {
-                    return;
-                }
 
-                if (!data.callbackId) {
+                if (event.origin !== loginIframe.iframeOrigin) {
                     return;
                 }
 
-                var promise = loginIframe.callbackMap[data.callbackId];
-                if (!promise) {
-                    return;
+
+                for (i = loginIframe.callbackList.length - 1; i >= 0; --i) {
+                    var promise = loginIframe.callbackList[i];
+                    if (event.data == "unchanged") {
+                        promise.setSuccess();
+                    } else {
+                        kc.clearToken();
+                        promise.setError();
+                    }
+                    loginIframe.callbackList.splice(i, 1);
                 }
 
-                delete loginIframe.callbackMap[data.callbackId];
 
-                if ((!kc.sessionId || kc.sessionId == data.session) && data.loggedIn) {
-                    promise.setSuccess();
-                } else {
-                    kc.clearToken();
-                    promise.setError();
-                }
             };
             window.addEventListener('message', messageCallback, false);
 
@@ -873,10 +865,11 @@
         function checkLoginIframe() {
             var promise = createPromise();
 
-            if (loginIframe.iframe && loginIframe.iframeOrigin) {
+            if (loginIframe.iframe && loginIframe.iframeOrigin && loginIframe.callbackList.length !== 0) {
                 var msg = {};
                 msg.callbackId = createCallbackId();
-                loginIframe.callbackMap[msg.callbackId] = promise;
+                msg.sessionId = kc.sessionId;
+                loginIframe.callbackList.push(promise);
                 var origin = loginIframe.iframeOrigin;
                 loginIframe.iframe.contentWindow.postMessage(JSON.stringify(msg), origin);
             } else {
diff --git a/adapters/oidc/js/src/main/resources/login-status-iframe.html b/adapters/oidc/js/src/main/resources/login-status-iframe.html
index fe7eda1..895f2d7 100755
--- a/adapters/oidc/js/src/main/resources/login-status-iframe.html
+++ b/adapters/oidc/js/src/main/resources/login-status-iframe.html
@@ -35,14 +35,15 @@
 
         }
         var data = JSON.parse(event.data);
-        data.loggedIn = false;
         var cookie = getCookie('KEYCLOAK_SESSION');
-        if (cookie) {
-            data.loggedIn = true;
-            data.session = cookie;
+        var state;
+        if (!data.sessionId || data.sessionId == cookie) {
+            state = "unchanged";
+        } else {
+            state = "changed";
         }
 
-        event.source.postMessage(JSON.stringify(data),
+        event.source.postMessage(state,
                 event.origin);
     }
     window.addEventListener("message", receiveMessage, false);