keycloak-uncached

KEYCLOAK-7304

5/3/2018 1:14:14 PM

Details

diff --git a/server-spi-private/src/main/java/org/keycloak/models/utils/RepresentationToModel.java b/server-spi-private/src/main/java/org/keycloak/models/utils/RepresentationToModel.java
index 06545a2..1deada1 100755
--- a/server-spi-private/src/main/java/org/keycloak/models/utils/RepresentationToModel.java
+++ b/server-spi-private/src/main/java/org/keycloak/models/utils/RepresentationToModel.java
@@ -1096,6 +1096,10 @@ public class RepresentationToModel {
                 if (entry.getValue() == null || entry.getValue().trim().equals("")) {
                     continue;
                 } else {
+                    String flowId = entry.getValue();
+                    if (client.getRealm().getAuthenticationFlowById(flowId) == null) {
+                        throw new RuntimeException("Unable to resolve auth flow binding override for: " + entry.getKey());
+                    }
                     client.setAuthenticationFlowBindingOverride(entry.getKey(), entry.getValue());
                 }
             }
@@ -1230,8 +1234,11 @@ public class RepresentationToModel {
                 if (entry.getValue() == null || entry.getValue().trim().equals("")) {
                     resource.removeAuthenticationFlowBindingOverride(entry.getKey());
                 } else {
+                    String flowId = entry.getValue();
+                    if (resource.getRealm().getAuthenticationFlowById(flowId) == null) {
+                        throw new RuntimeException("Unable to resolve auth flow binding override for: " + entry.getKey());
+                    }
                     resource.setAuthenticationFlowBindingOverride(entry.getKey(), entry.getValue());
-
                 }
             }
         }
diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/forms/FlowOverrideTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/forms/FlowOverrideTest.java
index 33bb259..80bff7b 100644
--- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/forms/FlowOverrideTest.java
+++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/forms/FlowOverrideTest.java
@@ -348,6 +348,19 @@ public class FlowOverrideTest extends AbstractTestRealmKeycloakTest {
         clients.get(clientRep.getId()).update(clientRep);
         testWithClientBrowserOverride();
 
+        query = clients.findByClientId(TEST_APP_FLOW);
+        clientRep = query.get(0);
+        clientRep.getAuthenticationFlowBindingOverrides().put(AuthenticationFlowBindings.BROWSER_BINDING, "bad-id");
+        try {
+            clients.get(clientRep.getId()).update(clientRep);
+            Assert.fail();
+        } catch (Exception e) {
+
+        }
+        query = clients.findByClientId(TEST_APP_FLOW);
+        clientRep = query.get(0);
+        Assert.assertEquals(browserFlowId, clientRep.getAuthenticationFlowBindingOverrides().get(AuthenticationFlowBindings.BROWSER_BINDING));
+
     }
 
 }
diff --git a/themes/src/main/resources/theme/base/admin/resources/js/controllers/clients.js b/themes/src/main/resources/theme/base/admin/resources/js/controllers/clients.js
index 381a4c2..038b1dd 100755
--- a/themes/src/main/resources/theme/base/admin/resources/js/controllers/clients.js
+++ b/themes/src/main/resources/theme/base/admin/resources/js/controllers/clients.js
@@ -832,6 +832,10 @@ module.controller('ClientInstallationCtrl', function($scope, realm, client, serv
 module.controller('ClientDetailCtrl', function($scope, realm, client, templates, flows, $route, serverInfo, Client, ClientDescriptionConverter, Components, ClientStorageOperations, $location, $modal, Dialog, Notifications) {
     $scope.flows = [];
     $scope.clientFlows = [];
+    var emptyFlow = {
+        id: "",
+        alias: ""
+    }
     for (var i=0 ; i<flows.length ; i++) {
         if (flows[i].providerId == 'client-flow') {
             $scope.clientFlows.push(flows[i]);
@@ -839,6 +843,8 @@ module.controller('ClientDetailCtrl', function($scope, realm, client, templates,
             $scope.flows.push(flows[i]);
         }
     }
+    $scope.flows.push(emptyFlow)
+    $scope.clientFlows.push(emptyFlow)
 
 
 
diff --git a/themes/src/main/resources/theme/base/admin/resources/partials/client-detail.html b/themes/src/main/resources/theme/base/admin/resources/partials/client-detail.html
index 9352ff1..1993e7b 100755
--- a/themes/src/main/resources/theme/base/admin/resources/partials/client-detail.html
+++ b/themes/src/main/resources/theme/base/admin/resources/partials/client-detail.html
@@ -441,7 +441,7 @@
                 <label for="browser" class="col-md-2 control-label">{{:: 'browser-flow' | translate}}</label>
                 <div class="col-md-2">
                     <div>
-                        <select id="browser" data-ng-model="clientEdit.authenticationFlowBindingOverrides['browser']" class="form-control" ng-options="flow.alias as flow.alias for flow in flows">
+                        <select id="browser" data-ng-model="clientEdit.authenticationFlowBindingOverrides['browser']" class="form-control" ng-options="flow.id as flow.alias for flow in flows">
                         </select>
                     </div>
                 </div>
@@ -451,7 +451,7 @@
                 <label for="grant" class="col-md-2 control-label">{{:: 'direct-grant-flow' | translate}}</label>
                 <div class="col-md-2">
                     <div>
-                        <select id="grant" ng-model="clientEdit.authenticationFlowBindingOverrides['direct_grant']" class="form-control" ng-options="flow.alias as flow.alias for flow in flows">
+                        <select id="grant" ng-model="clientEdit.authenticationFlowBindingOverrides['direct_grant']" class="form-control" ng-options="flow.id as flow.alias for flow in flows">
                         </select>
                     </div>
                 </div>