keycloak-memoizeit
Changes
forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/users.js 28(+26 -2)
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);
}