keycloak-aplcache

Details

diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/js/app.js b/admin-ui/src/main/resources/META-INF/resources/admin/js/app.js
index f0e6ddd..56ce438 100755
--- a/admin-ui/src/main/resources/META-INF/resources/admin/js/app.js
+++ b/admin-ui/src/main/resources/META-INF/resources/admin/js/app.js
@@ -113,6 +113,18 @@ module.config([ '$routeProvider', function($routeProvider) {
             },
             controller : 'UserDetailCtrl'
         })
+        .when('/realms/:realm/users/:user/user-credentials', {
+            templateUrl : 'partials/user-credentials.html',
+            resolve : {
+                realm : function(RealmLoader) {
+                    return RealmLoader();
+                },
+                user : function(UserLoader) {
+                    return UserLoader();
+                }
+            },
+            controller : 'UserCredentialsCtrl'
+        })
         .when('/realms/:realm/users/:user/role-mappings', {
             templateUrl : 'partials/role-mappings.html',
             resolve : {
diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/js/controllers/users.js b/admin-ui/src/main/resources/META-INF/resources/admin/js/controllers/users.js
index 0d4f4e8..0ae5b79 100755
--- a/admin-ui/src/main/resources/META-INF/resources/admin/js/controllers/users.js
+++ b/admin-ui/src/main/resources/META-INF/resources/admin/js/controllers/users.js
@@ -225,6 +225,52 @@ module.controller('UserDetailCtrl', function($scope, realm, user, User, $locatio
     };
 });
 
+module.controller('UserCredentialsCtrl', function($scope, realm, user, User, UserCredentials, Notifications) {
+    console.log('UserCredentialsCtrl');
+
+    $scope.realm = realm;
+    $scope.user = angular.copy(user);
+
+    $scope.resetPassword = function() {
+
+        if ($scope.password != $scope.confirmPassword) {
+            Notifications.error("Password and confirmation does not match.");
+            $scope.password = "";
+            $scope.confirmPassword = "";
+            return;
+        }
+
+        if (!$scope.user.hasOwnProperty('requiredActions')){
+            $scope.user.requiredActions = [];
+        }
+        if ($scope.user.requiredActions.indexOf("UPDATE_PASSWORD") < 0){
+            $scope.user.requiredActions.push("UPDATE_PASSWORD");
+        }
+
+        var credentials = [ { type : "password", value : $scope.password } ];
+
+        User.update({
+            realm: realm.id,
+            userId: $scope.user.username
+        }, $scope.user, function () {
+
+            UserCredentials.update({
+                realm: realm.id,
+                userId: $scope.user.username
+            }, credentials, function () {
+                Notifications.success("The user password has been reset. The user is required to change his password on" +
+                    " the next login.");
+            }, function () {
+                Notifications.error("Error while resetting user password. Be aware that the update password required action" +
+                    " was already set.");
+            });
+
+        }, function () {
+            Notifications.error("Error while adding update password required action. Password was not reset.");
+        });
+    };
+});
+
 module.controller('RoleMappingCtrl', function($scope, realm, User, users, role, RoleMapping, Notifications) {
     $scope.realm = realm;
     $scope.realmId = realm.realm || realm.id;
diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/js/services.js b/admin-ui/src/main/resources/META-INF/resources/admin/js/services.js
index 88d4ec3..c9cdc41 100755
--- a/admin-ui/src/main/resources/META-INF/resources/admin/js/services.js
+++ b/admin-ui/src/main/resources/META-INF/resources/admin/js/services.js
@@ -134,6 +134,18 @@ module.factory('User', function($resource) {
 	});
 });
 
+module.factory('UserCredentials', function($resource) {
+    return $resource('/auth-server/rest/saas/admin/realms/:realm/users/:userId/credentials', {
+        realm : '@realm',
+        userId : '@userId'
+    }, {
+        update : {
+            method : 'PUT',
+            isArray : true
+        }
+    });
+});
+
 module.factory('RealmRoleMapping', function($resource) {
     return $resource('/auth-server/rest/saas/admin/realms/:realm/users/:userId/role-mappings/realm', {
         realm : '@realm',
diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/partials/role-mappings.html b/admin-ui/src/main/resources/META-INF/resources/admin/partials/role-mappings.html
index 642808f..78e055d 100755
--- a/admin-ui/src/main/resources/META-INF/resources/admin/partials/role-mappings.html
+++ b/admin-ui/src/main/resources/META-INF/resources/admin/partials/role-mappings.html
@@ -5,7 +5,7 @@
             <div class="top-nav">
                 <ul class="rcue-tabs" >
                     <li><a href="#/realms/{{realm.id}}/users/{{user.username}}">Attributes</a></li>
-                    <li><a href="#">Credentials</a></li>
+                    <li><a href="#/realms/{{realm.id}}/users/{{user.username}}/user-credentials">Credentials</a></li>
                     <li class="active"><a href="#/realms/{{realm.id}}/users/{{user.username}}/role-mappings">Role Mappings</a></li>
                 </ul>
             </div>
diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/partials/user-credentials.html b/admin-ui/src/main/resources/META-INF/resources/admin/partials/user-credentials.html
new file mode 100755
index 0000000..a732945
--- /dev/null
+++ b/admin-ui/src/main/resources/META-INF/resources/admin/partials/user-credentials.html
@@ -0,0 +1,46 @@
+<div id="wrapper" class="container">
+    <div class="row">
+        <div class="bs-sidebar col-md-3 clearfix" data-ng-include data-src="'partials/realm-menu.html'"></div>
+        <div id="content-area" class="col-md-9" role="main">
+            <div class="top-nav">
+                <ul class="rcue-tabs">
+                    <li><a href="#/realms/{{realm.id}}/users/{{user.username}}">Attributes</a></li>
+                    <li class="active"><a href="#/realms/{{realm.id}}/users/{{user.username}}/user-credentials">Credentials</a></li>
+                    <li><a href="#/realms/{{realm.id}}/users/{{user.username}}/role-mappings">Role Mappings</a></li>
+                </ul>
+            </div>
+            <div id="content">
+                <ol class="breadcrumb">
+                    <li><a href="#/realms/{{realm.id}}">{{realm.realm}}</a></li>
+                    <li class="active">Users</li>
+                </ol>
+                <h2><span>{{user.username}}'s</span> Reset Password</h2>
+
+                <form name="userForm" novalidate>
+                    <fieldset class="border-top">
+                        <div class="form-group">
+                            <label for="password">New Password</label>
+                            <div class="controls">
+                                <input type="password" id="password" name="password" data-ng-model="password" autofocus
+                                       required>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="two-lines" for="password">New Password Confirmation</label>
+                            <div class="controls">
+                                <input type="password" id="confirmPassword" name="confirmPassword" data-ng-model="confirmPassword"
+                                       required>
+                            </div>
+                        </div>
+                    </fieldset>
+                    <div class="form-actions">
+                        <button type="submit" class="primary" data-ng-click="resetPassword()"
+                                ng-show="password != null">Reset Password</button>
+                    </div>
+                </form>
+
+            </div>
+        </div>
+        <div id="container-right-bg"></div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/partials/user-detail.html b/admin-ui/src/main/resources/META-INF/resources/admin/partials/user-detail.html
index 6de7582..13b60ce 100755
--- a/admin-ui/src/main/resources/META-INF/resources/admin/partials/user-detail.html
+++ b/admin-ui/src/main/resources/META-INF/resources/admin/partials/user-detail.html
@@ -10,7 +10,7 @@
             <div class="top-nav" data-ng-show="!create">
                 <ul class="rcue-tabs" >
                     <li class="active"><a href="#/realms/{{realm.id}}/users/{{user.username}}">Attributes</a></li>
-                    <li><a href="#">Credentials</a></li>
+                    <li><a href="#/realms/{{realm.id}}/users/{{user.username}}/user-credentials">Credentials</a></li>
                     <li><a href="#/realms/{{realm.id}}/users/{{user.username}}/role-mappings">Role Mappings</a></li>
                 </ul>
             </div>