keycloak-memoizeit

brute force user ui

7/22/2015 3:16:09 PM

Details

diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/users.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/users.js
index e885f7e..373e0cc 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/users.js
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/users.js
@@ -216,7 +216,7 @@ module.controller('UserConsentsCtrl', function($scope, realm, user, userConsents
 });
 
 
-module.controller('UserListCtrl', function($scope, realm, User, UserImpersonation) {
+module.controller('UserListCtrl', function($scope, realm, User, UserImpersonation, BruteForce, Notifications) {
     $scope.realm = realm;
     $scope.page = 0;
 
@@ -236,6 +236,13 @@ module.controller('UserListCtrl', function($scope, realm, User, UserImpersonatio
         });
     };
 
+    $scope.unlockUsers = function() {
+        BruteForce.delete({realm: realm.realm}, function(data) {
+            Notifications.success("Any temporarily locked users are now unlocked.");
+        });
+    }
+
+
     $scope.firstPage = function() {
         $scope.query.first = 0;
         $scope.searchQuery();
@@ -267,7 +274,7 @@ module.controller('UserListCtrl', function($scope, realm, User, UserImpersonatio
 
 
 
-module.controller('UserDetailCtrl', function($scope, realm, user, User, UserFederationInstances, UserImpersonation, RequiredActions, $location, Dialog, Notifications) {
+module.controller('UserDetailCtrl', function($scope, realm, user, BruteForceUser, User, UserFederationInstances, UserImpersonation, RequiredActions, $location, Dialog, Notifications) {
     $scope.realm = realm;
     $scope.create = !user.id;
     $scope.editUsername = $scope.create || $scope.realm.editUsernameAllowed;
@@ -300,6 +307,23 @@ module.controller('UserDetailCtrl', function($scope, realm, user, User, UserFede
         } else {
             console.log("federationLink is null");
         }
+        console.log('realm brute force? ' + realm.bruteForceProtected)
+        $scope.temporarilyDisabled = false;
+        var isDisabled = function () {
+            BruteForceUser.get({realm: realm.realm, username: user.username}, function(data) {
+                console.log('here in isDisabled ' + data.disabled);
+                $scope.temporarilyDisabled = data.disabled;
+            });
+        };
+
+        console.log("check if disabled");
+        isDisabled();
+
+        $scope.unlockUser = function() {
+            BruteForceUser.delete({realm: realm.realm, username: user.username}, function(data) {
+                isDisabled();
+            });
+        }
     }
 
     $scope.changed = false; // $scope.create;
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js
index 5e9fefd..1d6a6be 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js
@@ -186,6 +186,20 @@ module.factory('RealmAdminEvents', function($resource) {
     });
 });
 
+module.factory('BruteForce', function($resource) {
+    return $resource(authUrl + '/admin/realms/:realm/attack-detection/brute-force/usernames', {
+        realm : '@realm'
+    });
+});
+
+module.factory('BruteForceUser', function($resource) {
+    return $resource(authUrl + '/admin/realms/:realm/attack-detection/brute-force/usernames/:username', {
+        realm : '@realm',
+        username : '@username'
+    });
+});
+
+
 module.factory('RequiredActions', function($resource) {
     return $resource(authUrl + '/admin/realms/:id/authentication/required-actions/:alias', {
         realm : '@realm',
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/user-detail.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/user-detail.html
index f3e76f4..1c3953b 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/user-detail.html
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/user-detail.html
@@ -70,6 +70,16 @@
                 </div>
                 <kc-tooltip>A disabled user cannot login.</kc-tooltip>
             </div>
+            <div class="form-group clearfix block" data-ng-show="realm.bruteForceProtected && !create">
+                <label class="col-md-2 control-label" for="temporarilyDisabled">User Temporarily Locked</label>
+                <div class="col-md-1">
+                    <input ng-model="temporarilyDisabled" name="temporarilyDisabled" id="temporarilyDisabled" data-ng-readonly="true" data-ng-disabled="true" onoffswitch />
+                </div>
+                <kc-tooltip>The user may have been locked due to failing to login too many times.</kc-tooltip>
+                <div class="col-sm-2">
+                    <button type="submit" data-ng-click="unlockUser()" data-ng-show="temporarilyDisabled" class="btn btn-default">Unlock User</button>
+                </div>
+            </div>
             <div class="form-group clearfix block" data-ng-show="!create && user.federationLink">
                 <label class="col-md-2 control-label" for="userEnabled">Federation Link</label>
                 <div class="col-md-6">
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/user-list.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/user-list.html
index 67332fa..8ec55ef 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/user-list.html
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/user-list.html
@@ -18,6 +18,7 @@
                     <button id="viewAllUsers" class="btn btn-default" ng-click="query.search = null; firstPage()">View all users</button>
 
                     <div class="pull-right" data-ng-show="access.manageUsers">
+                        <button data-ng-click="unlockUsers()" class="btn btn-default">Unlock Users</button>
                         <a id="createUser" class="btn btn-default" href="#/create/user/{{realm.realm}}">Add User</a>
                     </div>
                 </div>
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/account/AccountTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/account/AccountTest.java
index 7faacda..bbee2f0 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/account/AccountTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/account/AccountTest.java
@@ -167,7 +167,7 @@ public class AccountTest {
         });
     }
 
-    //@Test
+    @Test
     public void ideTesting() throws Exception {
         Thread.sleep(100000000);
     }