From 1e0210510103d5382d67b8d146180891f6ae498e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Thu, 29 Oct 2020 15:19:34 +0100 Subject: [PATCH] ocs: enable/disable users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jörn Friedrich Dreyer --- ocs/pkg/service/v0/service.go | 4 +- ocs/pkg/service/v0/users.go | 81 +++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 2 deletions(-) diff --git a/ocs/pkg/service/v0/service.go b/ocs/pkg/service/v0/service.go index 3b955795a..030f60f7e 100644 --- a/ocs/pkg/service/v0/service.go +++ b/ocs/pkg/service/v0/service.go @@ -97,8 +97,8 @@ func NewService(opts ...Option) Service { r.With(requireSelfOrAdmin).Get("/", svc.GetUser) r.With(requireSelfOrAdmin).Put("/", svc.EditUser) r.With(requireAdmin).Delete("/", svc.DeleteUser) - r.With(requireAdmin).Put("/enable", svc.NotImplementedStub) - r.With(requireAdmin).Put("/disable", svc.NotImplementedStub) + r.With(requireAdmin).Put("/enable", svc.EnableUser) + r.With(requireAdmin).Put("/disable", svc.DisableUser) }) r.Route("/{userid}/groups", func(r chi.Router) { diff --git a/ocs/pkg/service/v0/users.go b/ocs/pkg/service/v0/users.go index 7fb144034..1b1a80bfb 100644 --- a/ocs/pkg/service/v0/users.go +++ b/ocs/pkg/service/v0/users.go @@ -12,6 +12,7 @@ import ( "github.com/cs3org/reva/pkg/user" "github.com/go-chi/chi" "github.com/go-chi/render" + "google.golang.org/genproto/protobuf/field_mask" "google.golang.org/protobuf/types/known/fieldmaskpb" "github.com/micro/go-micro/v2/client/grpc" @@ -323,6 +324,86 @@ func (o Ocs) DeleteUser(w http.ResponseWriter, r *http.Request) { render.Render(w, r, response.DataRender(struct{}{})) } +// EnableUser enables a user +func (o Ocs) EnableUser(w http.ResponseWriter, r *http.Request) { + userid := chi.URLParam(r, "userid") + account, err := o.fetchAccountByUsername(r.Context(), userid) + if err != nil { + merr := merrors.FromError(err) + if merr.Code == http.StatusNotFound { + render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested user could not be found")) + } else { + render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + } + o.logger.Error().Err(err).Str("userid", userid).Msg("could not enable user") + return + } + + account.AccountEnabled = true + + req := accounts.UpdateAccountRequest{ + Account: account, + UpdateMask: &field_mask.FieldMask{ + Paths: []string{"AccountEnabled"}, + }, + } + + _, err = o.getAccountService().UpdateAccount(r.Context(), &req) + if err != nil { + merr := merrors.FromError(err) + if merr.Code == http.StatusNotFound { + render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested account could not be found")) + } else { + render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + } + o.logger.Error().Err(err).Str("account_id", account.Id).Msg("could not enable account") + return + } + + o.logger.Debug().Str("account_id", account.Id).Msg("enabled user") + render.Render(w, r, response.DataRender(struct{}{})) +} + +// DisableUser disables a user +func (o Ocs) DisableUser(w http.ResponseWriter, r *http.Request) { + userid := chi.URLParam(r, "userid") + account, err := o.fetchAccountByUsername(r.Context(), userid) + if err != nil { + merr := merrors.FromError(err) + if merr.Code == http.StatusNotFound { + render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested user could not be found")) + } else { + render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + } + o.logger.Error().Err(err).Str("userid", userid).Msg("could not disable user") + return + } + + account.AccountEnabled = false + + req := accounts.UpdateAccountRequest{ + Account: account, + UpdateMask: &field_mask.FieldMask{ + Paths: []string{"AccountEnabled"}, + }, + } + + _, err = o.getAccountService().UpdateAccount(r.Context(), &req) + if err != nil { + merr := merrors.FromError(err) + if merr.Code == http.StatusNotFound { + render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested account could not be found")) + } else { + render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + } + o.logger.Error().Err(err).Str("account_id", account.Id).Msg("could not disable account") + return + } + + o.logger.Debug().Str("account_id", account.Id).Msg("disabled user") + render.Render(w, r, response.DataRender(struct{}{})) +} + // GetSigningKey returns the signing key for the current user. It will create it on the fly if it does not exist // The signing key is part of the user settings and is used by the proxy to authenticate requests // Currently, the username is used as the OC-Credential