diff --git a/pkg/api/admin_users.go b/pkg/api/admin_users.go index 9402eb41b20..ec83aa47df1 100644 --- a/pkg/api/admin_users.go +++ b/pkg/api/admin_users.go @@ -5,6 +5,7 @@ import ( "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/middleware" m "github.com/grafana/grafana/pkg/models" + "github.com/grafana/grafana/pkg/util" ) func AdminSearchUsers(c *middleware.Context) { @@ -91,6 +92,36 @@ func AdminUpdateUser(c *middleware.Context, form dtos.AdminUpdateUserForm) { c.JsonOK("User updated") } +func AdminUpdateUserPassword(c *middleware.Context, form dtos.AdminUpdateUserPasswordForm) { + userId := c.ParamsInt64(":id") + + if len(form.Password) < 4 { + c.JsonApiErr(400, "New password too short", nil) + return + } + + userQuery := m.GetUserByIdQuery{Id: userId} + + if err := bus.Dispatch(&userQuery); err != nil { + c.JsonApiErr(500, "Could not read user from database", err) + return + } + + passwordHashed := util.EncodePassword(form.Password, userQuery.Result.Salt) + + cmd := m.ChangeUserPasswordCommand{ + UserId: userId, + NewPassword: passwordHashed, + } + + if err := bus.Dispatch(&cmd); err != nil { + c.JsonApiErr(500, "Failed to update user password", err) + return + } + + c.JsonOK("User password updated") +} + func AdminDeleteUser(c *middleware.Context) { userId := c.ParamsInt64(":id") diff --git a/pkg/api/api.go b/pkg/api/api.go index c6d050547ef..84fee61005f 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -102,7 +102,8 @@ func Register(r *macaron.Macaron) { r.Get("/users", AdminSearchUsers) r.Get("/users/:id", AdminGetUser) r.Post("/users", bind(dtos.AdminCreateUserForm{}), AdminCreateUser) - r.Put("/users/:id", bind(dtos.AdminUpdateUserForm{}), AdminUpdateUser) + r.Put("/users/:id/details", bind(dtos.AdminUpdateUserForm{}), AdminUpdateUser) + r.Put("/users/:id/password", bind(dtos.AdminUpdateUserPasswordForm{}), AdminUpdateUserPassword) r.Delete("/users/:id", AdminDeleteUser) }, reqGrafanaAdmin) diff --git a/pkg/api/dtos/user.go b/pkg/api/dtos/user.go index 69fc3797029..3d671e64654 100644 --- a/pkg/api/dtos/user.go +++ b/pkg/api/dtos/user.go @@ -12,3 +12,7 @@ type AdminUpdateUserForm struct { Login string `json:"login"` Name string `json:"name"` } + +type AdminUpdateUserPasswordForm struct { + Password string `json:"password" binding:"Required"` +} diff --git a/src/app/features/admin/adminEditUserCtrl.js b/src/app/features/admin/adminEditUserCtrl.js index 86b59c4599b..0d473bd950e 100644 --- a/src/app/features/admin/adminEditUserCtrl.js +++ b/src/app/features/admin/adminEditUserCtrl.js @@ -11,10 +11,7 @@ function (angular) { $scope.init = function() { if ($routeParams.id) { - $scope.createMode = false; $scope.getUser($routeParams.id); - } else { - $scope.createMode = true; } }; @@ -25,17 +22,29 @@ function (angular) { }); }; + $scope.setPassword = function () { + if (!$scope.passwordForm.$valid) { return; } + + var payload = { password: $scope.password }; + backendSrv.put('/api/admin/users/' + $scope.user_id + '/password', payload).then(function() { + $location.path('/admin/users'); + }); + }; + + $scope.create = function() { + if (!$scope.userForm.$valid) { return; } + + backendSrv.post('/api/admin/users', $scope.user).then(function() { + $location.path('/admin/users'); + }); + }; + $scope.update = function() { if (!$scope.userForm.$valid) { return; } - if ($scope.createMode) { - backendSrv.post('/api/admin/users', $scope.user).then(function() { - $location.path('/admin/users'); - }); - } else { - backendSrv.put('/api/admin/users/' + $scope.user_id, $scope.user).then(function() { - $location.path('/admin/users'); - }); - } + + backendSrv.put('/api/admin/users/' + $scope.user_id + '/details', $scope.user).then(function() { + $location.path('/admin/users'); + }); }; $scope.init(); diff --git a/src/app/features/admin/partials/edit_user.html b/src/app/features/admin/partials/edit_user.html index ecc03fd1aad..bc060347b86 100644 --- a/src/app/features/admin/partials/edit_user.html +++ b/src/app/features/admin/partials/edit_user.html @@ -2,18 +2,14 @@