From dfbc6759da0abf25f4a96469c5a56b5c96ac260c Mon Sep 17 00:00:00 2001 From: David Christofas Date: Thu, 25 Feb 2021 10:20:57 +0100 Subject: [PATCH] resolve linter issues --- ocs/go.sum | 5 ++ ocs/pkg/middleware/requireadmin.go | 11 ++- ocs/pkg/middleware/requireselforadmin.go | 8 +- ocs/pkg/middleware/requireuser.go | 4 +- ocs/pkg/server/debug/server.go | 8 +- ocs/pkg/server/http/server.go | 4 +- ocs/pkg/server/http/svc_test.go | 13 ++-- ocs/pkg/service/v0/config.go | 4 +- ocs/pkg/service/v0/groups.go | 94 ++++++++++++----------- ocs/pkg/service/v0/response/version.go | 8 +- ocs/pkg/service/v0/service.go | 5 +- ocs/pkg/service/v0/users.go | 96 ++++++++++++------------ 12 files changed, 146 insertions(+), 114 deletions(-) diff --git a/ocs/go.sum b/ocs/go.sum index b547db6798..9af54de0c2 100644 --- a/ocs/go.sum +++ b/ocs/go.sum @@ -163,6 +163,8 @@ github.com/asim/go-micro/plugins/server/http/v3 v3.0.0-20210217182006-0f0ace1a44 github.com/asim/go-micro/plugins/server/http/v3 v3.0.0-20210217182006-0f0ace1a44a9/go.mod h1:Oe0f4zsBx6if1scvMrL/4mNfkD7URaqkvhQWnWogcws= github.com/asim/go-micro/plugins/transport/grpc/v3 v3.0.0-20210202145831-070250155285 h1:3YQx0EQbHNYpp1FwnHrgU0oRFISjZvBGL7UhpA8/Nas= github.com/asim/go-micro/plugins/transport/grpc/v3 v3.0.0-20210202145831-070250155285/go.mod h1:FXWwzJ74gGEIY/gOdDHJqCQuago+tLSkcUPayf9daGM= +github.com/asim/go-micro/plugins/wrapper/breaker/gobreaker/v3 v3.0.0-20210217182006-0f0ace1a44a9 h1:o9Tk3K1WQLOzyEeUBCO+GHO7s9MnzfUT7zLCZ6IzS2g= +github.com/asim/go-micro/plugins/wrapper/breaker/gobreaker/v3 v3.0.0-20210217182006-0f0ace1a44a9/go.mod h1:nAb0ampZ6EieuECEhCoPKjQvGzqRv35uPtvZ/do7dWY= github.com/asim/go-micro/plugins/wrapper/monitoring/prometheus/v3 v3.0.0-20210217182006-0f0ace1a44a9 h1:divSMUzk92mF5yXK11fAqG/wqQ4Pcal2huJSQm3EwPE= github.com/asim/go-micro/plugins/wrapper/monitoring/prometheus/v3 v3.0.0-20210217182006-0f0ace1a44a9/go.mod h1:uyEy7qDUtW2lYTnAA9w4hKH+bzotiO1CIm2HHZFn2pg= github.com/asim/go-micro/plugins/wrapper/trace/opencensus/v3 v3.0.0-20210217182006-0f0ace1a44a9 h1:mX03duCTS0f3et6ZrnKxfh5dNqUIpP8+z+9YSvts8eY= @@ -1372,6 +1374,8 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= @@ -1815,6 +1819,7 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b h1:lAZ0/chPUDWwjqosYR0X4M490zQhMsiJ4K3DbA7o+3g= golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= diff --git a/ocs/pkg/middleware/requireadmin.go b/ocs/pkg/middleware/requireadmin.go index 625ae721fc..eb2333c0ec 100644 --- a/ocs/pkg/middleware/requireadmin.go +++ b/ocs/pkg/middleware/requireadmin.go @@ -20,7 +20,7 @@ func RequireAdmin(opts ...Option) func(next http.Handler) http.Handler { // get roles from context roleIDs, ok := roles.ReadRoleIDsFromContext(r.Context()) if !ok { - render.Render(w, r, response.ErrRender(data.MetaUnauthorized.StatusCode, "Unauthorized")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaUnauthorized.StatusCode, "Unauthorized"))) return } @@ -30,8 +30,13 @@ func RequireAdmin(opts ...Option) func(next http.Handler) http.Handler { return } - render.Render(w, r, response.ErrRender(data.MetaUnauthorized.StatusCode, "Unauthorized")) - + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaUnauthorized.StatusCode, "Unauthorized"))) }) } } + +func mustNotFail(err error) { + if err != nil { + panic(err) + } +} diff --git a/ocs/pkg/middleware/requireselforadmin.go b/ocs/pkg/middleware/requireselforadmin.go index 972dfbaa79..9268e49e11 100644 --- a/ocs/pkg/middleware/requireselforadmin.go +++ b/ocs/pkg/middleware/requireselforadmin.go @@ -21,17 +21,17 @@ func RequireSelfOrAdmin(opts ...Option) func(next http.Handler) http.Handler { u, ok := user.ContextGetUser(r.Context()) if !ok { - render.Render(w, r, response.ErrRender(data.MetaUnauthorized.StatusCode, "Unauthorized")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaUnauthorized.StatusCode, "Unauthorized"))) return } if u.Id == nil || u.Id.OpaqueId == "" { - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "user is missing an id")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "user is missing an id"))) return } // get roles from context roleIDs, ok := roles.ReadRoleIDsFromContext(r.Context()) if !ok { - render.Render(w, r, response.ErrRender(data.MetaUnauthorized.StatusCode, "Unauthorized")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaUnauthorized.StatusCode, "Unauthorized"))) return } @@ -50,7 +50,7 @@ func RequireSelfOrAdmin(opts ...Option) func(next http.Handler) http.Handler { } } - render.Render(w, r, response.ErrRender(data.MetaUnauthorized.StatusCode, "Unauthorized")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaUnauthorized.StatusCode, "Unauthorized"))) }) } diff --git a/ocs/pkg/middleware/requireuser.go b/ocs/pkg/middleware/requireuser.go index 8d3885aac6..995caa7d88 100644 --- a/ocs/pkg/middleware/requireuser.go +++ b/ocs/pkg/middleware/requireuser.go @@ -17,11 +17,11 @@ func RequireUser() func(next http.Handler) http.Handler { u, ok := user.ContextGetUser(r.Context()) if !ok { - render.Render(w, r, response.ErrRender(data.MetaUnauthorized.StatusCode, "Unauthorized")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaUnauthorized.StatusCode, "Unauthorized"))) return } if u.Id == nil || u.Id.OpaqueId == "" { - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "user is missing an id")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "user is missing an id"))) return } diff --git a/ocs/pkg/server/debug/server.go b/ocs/pkg/server/debug/server.go index f3b4eaa1a4..bd1edb68c3 100644 --- a/ocs/pkg/server/debug/server.go +++ b/ocs/pkg/server/debug/server.go @@ -33,7 +33,9 @@ func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { // TODO(tboerger): check if services are up and running - io.WriteString(w, http.StatusText(http.StatusOK)) + if _, err := io.WriteString(w, http.StatusText(http.StatusOK)); err != nil { + panic(err) + } } } @@ -45,6 +47,8 @@ func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { // TODO(tboerger): check if services are up and running - io.WriteString(w, http.StatusText(http.StatusOK)) + if _, err := io.WriteString(w, http.StatusText(http.StatusOK)); err != nil { + panic(err) + } } } diff --git a/ocs/pkg/server/http/server.go b/ocs/pkg/server/http/server.go index aae9ae99ca..75fffac207 100644 --- a/ocs/pkg/server/http/server.go +++ b/ocs/pkg/server/http/server.go @@ -46,7 +46,9 @@ func Server(opts ...Option) (http.Service, error) { handle = svc.NewTracing(handle) } - micro.RegisterHandler(service.Server(), handle) + if err := micro.RegisterHandler(service.Server(), handle); err != nil { + return http.Service{}, err + } service.Init() return service, nil diff --git a/ocs/pkg/server/http/svc_test.go b/ocs/pkg/server/http/svc_test.go index 6f7f7b9922..8e2cf2d428 100644 --- a/ocs/pkg/server/http/svc_test.go +++ b/ocs/pkg/server/http/svc_test.go @@ -35,9 +35,8 @@ import ( ) const ( - ocsV1 string = "v1.php" - ocsV2 string = "v2.php" - adminBasicAuth string = "admin:admin" + ocsV1 string = "v1.php" + ocsV2 string = "v2.php" ) const unsuccessfulResponseText string = "The response was expected to be successful but was not" @@ -604,7 +603,9 @@ func cleanUp(t *testing.T) { } if !found { - deleteAccount(t, f.Name()) + if _, err := deleteAccount(t, f.Name()); err != nil { + panic(err) + } } } @@ -625,7 +626,9 @@ func cleanUp(t *testing.T) { } if !found { - deleteGroup(t, f.Name()) + if _, err := deleteGroup(t, f.Name()); err != nil { + panic(err) + } } } } diff --git a/ocs/pkg/service/v0/config.go b/ocs/pkg/service/v0/config.go index 4b9b2c6fdd..3beae16726 100644 --- a/ocs/pkg/service/v0/config.go +++ b/ocs/pkg/service/v0/config.go @@ -10,11 +10,11 @@ import ( // GetConfig renders the ocs config endpoint func (o Ocs) GetConfig(w http.ResponseWriter, r *http.Request) { - render.Render(w, r, response.DataRender(&data.ConfigData{ + mustNotFail(render.Render(w, r, response.DataRender(&data.ConfigData{ Version: "1.7", // TODO get from env Website: "ocis", // TODO get from env Host: "", // TODO get from FRONTEND config Contact: "", // TODO get from env SSL: "true", // TODO get from env - })) + }))) } diff --git a/ocs/pkg/service/v0/groups.go b/ocs/pkg/service/v0/groups.go index 0ef1610df9..f8fab1f0f1 100644 --- a/ocs/pkg/service/v0/groups.go +++ b/ocs/pkg/service/v0/groups.go @@ -34,16 +34,16 @@ func (o Ocs) ListUserGroups(w http.ResponseWriter, r *http.Request) { 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")) + mustNotFail(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())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(err).Str("userid", userid).Msg("could not get list of user groups") return } } - groups := []string{} + groups := make([]string, 0, len(account.MemberOf)) for i := range account.MemberOf { if account.MemberOf[i].OnPremisesSamAccountName == "" { o.logger.Warn().Str("groupid", account.MemberOf[i].Id).Msg("group on_premises_sam_account_name is empty, trying to lookup by id") @@ -67,26 +67,26 @@ func (o Ocs) ListUserGroups(w http.ResponseWriter, r *http.Request) { } o.logger.Error().Err(err).Int("count", len(groups)).Str("userid", account.Id).Msg("listing groups for user") - render.Render(w, r, response.DataRender(&data.Groups{Groups: groups})) + mustNotFail(render.Render(w, r, response.DataRender(&data.Groups{Groups: groups}))) } // AddToGroup adds a user to a group func (o Ocs) AddToGroup(w http.ResponseWriter, r *http.Request) { - r.ParseForm() + mustNotFail(r.ParseForm()) userid := chi.URLParam(r, "userid") groupid := r.PostForm.Get("groupid") if groupid == "" { - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "empty group assignment: unspecified group")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "empty group assignment: unspecified group"))) return } 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")) + mustNotFail(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())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } return } @@ -96,9 +96,9 @@ func (o Ocs) AddToGroup(w http.ResponseWriter, r *http.Request) { if err != nil { merr := merrors.FromError(err) if merr.Code == http.StatusNotFound { - render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found"))) } else { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } return } @@ -111,16 +111,16 @@ func (o Ocs) AddToGroup(w http.ResponseWriter, r *http.Request) { if err != nil { merr := merrors.FromError(err) if merr.Code == http.StatusNotFound { - render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found"))) } else { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(err).Str("userid", account.Id).Str("groupid", group.Id).Msg("could not add user to group") return } o.logger.Debug().Str("userid", account.Id).Str("groupid", group.Id).Msg("added user to group") - render.Render(w, r, response.DataRender(struct{}{})) + mustNotFail(render.Render(w, r, response.DataRender(struct{}{}))) } // RemoveFromGroup removes a user from a group @@ -134,23 +134,23 @@ func (o Ocs) RemoveFromGroup(w http.ResponseWriter, r *http.Request) { // read it manually body, err := ioutil.ReadAll(r.Body) if err != nil { - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, err.Error()))) return } if err = r.Body.Close(); err != nil { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) return } values, err := url.ParseQuery(string(body)) if err != nil { - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, err.Error()))) return } groupid := values.Get("groupid") if groupid == "" { - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "no group id"))) return } @@ -166,9 +166,9 @@ func (o Ocs) RemoveFromGroup(w http.ResponseWriter, r *http.Request) { if err != nil { merr := merrors.FromError(err) if merr.Code == http.StatusNotFound { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, "The requested user could not be found")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, "The requested user could not be found"))) } else { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(err).Str("userid", userid).Msg("could not get list of user groups") return @@ -180,9 +180,9 @@ func (o Ocs) RemoveFromGroup(w http.ResponseWriter, r *http.Request) { if err != nil { merr := merrors.FromError(err) if merr.Code == http.StatusNotFound { - render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found"))) } else { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } return } @@ -195,16 +195,16 @@ func (o Ocs) RemoveFromGroup(w http.ResponseWriter, r *http.Request) { if err != nil { merr := merrors.FromError(err) if merr.Code == http.StatusNotFound { - render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found"))) } else { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(err).Str("userid", account.Id).Str("groupid", group.Id).Msg("could not remove user from group") return } o.logger.Debug().Str("userid", account.Id).Str("groupid", group.Id).Msg("removed user from group") - render.Render(w, r, response.DataRender(struct{}{})) + mustNotFail(render.Render(w, r, response.DataRender(struct{}{}))) } // ListGroups lists all groups @@ -221,16 +221,16 @@ func (o Ocs) ListGroups(w http.ResponseWriter, r *http.Request) { if err != nil { o.logger.Err(err).Msg("could not list users") - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, "could not list users")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, "could not list users"))) return } - groups := []string{} + groups := make([]string, 0, len(res.Groups)) for i := range res.Groups { groups = append(groups, res.Groups[i].OnPremisesSamAccountName) } - render.Render(w, r, response.DataRender(&data.Groups{Groups: groups})) + mustNotFail(render.Render(w, r, response.DataRender(&data.Groups{Groups: groups}))) } // AddGroup adds a group @@ -245,7 +245,7 @@ func (o Ocs) AddGroup(w http.ResponseWriter, r *http.Request) { if gid != "" { gidNumber, err = strconv.ParseInt(gid, 10, 64) if err != nil { - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "Cannot use the gidnumber provided")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "Cannot use the gidnumber provided"))) o.logger.Error().Err(err).Str("gid", gid).Str("groupid", groupid).Msg("Cannot use the gidnumber provided") return } @@ -268,17 +268,17 @@ func (o Ocs) AddGroup(w http.ResponseWriter, r *http.Request) { merr := merrors.FromError(err) switch merr.Code { case http.StatusBadRequest: - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, merr.Detail)) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, merr.Detail))) case http.StatusConflict: if response.APIVersion(r.Context()) == "2" { // it seems the application framework sets the ocs status code to the httpstatus code, which affects the provisioning api // see https://github.com/owncloud/core/blob/b9ff4c93e051c94adfb301545098ae627e52ef76/lib/public/AppFramework/OCSController.php#L142-L150 - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, merr.Detail)) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, merr.Detail))) } else { - render.Render(w, r, response.ErrRender(data.MetaInvalidInput.StatusCode, merr.Detail)) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaInvalidInput.StatusCode, merr.Detail))) } default: - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(err).Str("groupid", groupid).Msg("could not add group") // TODO check error if group already existed @@ -286,7 +286,7 @@ func (o Ocs) AddGroup(w http.ResponseWriter, r *http.Request) { } o.logger.Debug().Interface("group", group).Msg("added group") - render.Render(w, r, response.DataRender(struct{}{})) + mustNotFail(render.Render(w, r, response.DataRender(struct{}{}))) } // DeleteGroup deletes a group @@ -298,9 +298,9 @@ func (o Ocs) DeleteGroup(w http.ResponseWriter, r *http.Request) { if err != nil { merr := merrors.FromError(err) if merr.Code == http.StatusNotFound { - render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found"))) } else { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } return } @@ -312,16 +312,16 @@ func (o Ocs) DeleteGroup(w http.ResponseWriter, r *http.Request) { if err != nil { merr := merrors.FromError(err) if merr.Code == http.StatusNotFound { - render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found"))) } else { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(err).Str("groupid", group.Id).Msg("could not remove group") return } o.logger.Debug().Str("groupid", group.Id).Msg("removed group") - render.Render(w, r, response.DataRender(struct{}{})) + mustNotFail(render.Render(w, r, response.DataRender(struct{}{}))) } // GetGroupMembers lists all members of a group @@ -334,9 +334,9 @@ func (o Ocs) GetGroupMembers(w http.ResponseWriter, r *http.Request) { if err != nil { merr := merrors.FromError(err) if merr.Code == http.StatusNotFound { - render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found"))) } else { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } return } @@ -346,21 +346,21 @@ func (o Ocs) GetGroupMembers(w http.ResponseWriter, r *http.Request) { if err != nil { merr := merrors.FromError(err) if merr.Code == http.StatusNotFound { - render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested group could not be found"))) } else { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(err).Str("groupid", group.Id).Msg("could not get list of members") return } - members := []string{} + members := make([]string, 0, len(res.Members)) for i := range res.Members { members = append(members, res.Members[i].OnPremisesSamAccountName) } o.logger.Error().Err(err).Int("count", len(members)).Str("groupid", groupid).Msg("listing group members") - render.Render(w, r, response.DataRender(&data.Users{Users: members})) + mustNotFail(render.Render(w, r, response.DataRender(&data.Users{Users: members}))) } func isValidUUID(uuid string) bool { @@ -381,3 +381,9 @@ func (o Ocs) fetchGroupByName(ctx context.Context, name string) (*accounts.Group } return nil, merrors.NotFound("", "The requested group could not be found") } + +func mustNotFail(err error) { + if err != nil { + panic(err) + } +} diff --git a/ocs/pkg/service/v0/response/version.go b/ocs/pkg/service/v0/response/version.go index 8758b6fc65..422c7abe19 100644 --- a/ocs/pkg/service/v0/response/version.go +++ b/ocs/pkg/service/v0/response/version.go @@ -80,7 +80,7 @@ func VersionCtx(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { version := chi.URLParam(r, "version") if version == "" { - render.Render(w, r, ErrRender(data.MetaBadRequest.StatusCode, "unknown ocs api version")) + mustNotFail(render.Render(w, r, ErrRender(data.MetaBadRequest.StatusCode, "unknown ocs api version"))) return } w.Header().Set("Ocs-Api-Version", version) @@ -90,3 +90,9 @@ func VersionCtx(next http.Handler) http.Handler { next.ServeHTTP(w, r.WithContext(ctx)) }) } + +func mustNotFail(err error) { + if err != nil { + panic(err) + } +} diff --git a/ocs/pkg/service/v0/service.go b/ocs/pkg/service/v0/service.go index 1f5fca555e..09d559c9f5 100644 --- a/ocs/pkg/service/v0/service.go +++ b/ocs/pkg/service/v0/service.go @@ -61,6 +61,7 @@ func NewService(opts ...Option) Service { requireAdmin := ocsm.RequireAdmin( ocsm.RoleManager(roleManager), + ocsm.Logger(options.Logger), ) requireSelfOrAdmin := ocsm.RequireSelfOrAdmin( @@ -146,7 +147,7 @@ func (o Ocs) ServeHTTP(w http.ResponseWriter, r *http.Request) { // NotFound uses ErrRender to always return a proper OCS payload func (o Ocs) NotFound(w http.ResponseWriter, r *http.Request) { - render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "not found")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "not found"))) } func (o Ocs) getAccountService() accounts.AccountsService { @@ -159,5 +160,5 @@ func (o Ocs) getGroupsService() accounts.GroupsService { // NotImplementedStub returns a not implemented error func (o Ocs) NotImplementedStub(w http.ResponseWriter, r *http.Request) { - render.Render(w, r, response.ErrRender(data.MetaUnknownError.StatusCode, "Not implemented")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaUnknownError.StatusCode, "Not implemented"))) } diff --git a/ocs/pkg/service/v0/users.go b/ocs/pkg/service/v0/users.go index 151a9eaf37..62da815364 100644 --- a/ocs/pkg/service/v0/users.go +++ b/ocs/pkg/service/v0/users.go @@ -29,7 +29,7 @@ func (o Ocs) GetSelf(w http.ResponseWriter, r *http.Request) { var err error u, ok := user.ContextGetUser(r.Context()) if !ok || u.Id == nil || u.Id.OpaqueId == "" { - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "user is missing an id")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "user is missing an id"))) return } @@ -41,9 +41,9 @@ func (o Ocs) GetSelf(w http.ResponseWriter, r *http.Request) { merr := merrors.FromError(err) if merr.Code == http.StatusNotFound { // if the user was authenticated why was he not found?!? log error? - render.Render(w, r, response.ErrRender(data.MetaNotFound.StatusCode, "The requested user could not be found")) + mustNotFail(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())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(merr).Interface("user", u).Msg("could not get account for user") return @@ -64,7 +64,7 @@ func (o Ocs) GetSelf(w http.ResponseWriter, r *http.Request) { GIDNumber: account.GidNumber, // TODO hide enabled flag or it might get rendered as false } - render.Render(w, r, response.DataRender(d)) + mustNotFail(render.Render(w, r, response.DataRender(d))) } // GetUser returns the user with the given userid @@ -74,16 +74,16 @@ func (o Ocs) GetUser(w http.ResponseWriter, r *http.Request) { var err error if userid == "" { - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "missing user in context")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "missing user in context"))) } else { 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")) + mustNotFail(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())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(merr).Str("userid", userid).Msg("could not get account for user") return @@ -120,7 +120,7 @@ func (o Ocs) GetUser(w http.ResponseWriter, r *http.Request) { Definition: "default", }, } - render.Render(w, r, response.DataRender(d)) + mustNotFail(render.Render(w, r, response.DataRender(d))) } // AddUser creates a new user account @@ -138,7 +138,7 @@ func (o Ocs) AddUser(w http.ResponseWriter, r *http.Request) { if uid != "" { uidNumber, err = strconv.ParseInt(uid, 10, 64) if err != nil { - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "Cannot use the uidnumber provided")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "Cannot use the uidnumber provided"))) o.logger.Error().Err(err).Str("userid", userid).Msg("Cannot use the uidnumber provided") return } @@ -146,7 +146,7 @@ func (o Ocs) AddUser(w http.ResponseWriter, r *http.Request) { if gid != "" { gidNumber, err = strconv.ParseInt(gid, 10, 64) if err != nil { - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "Cannot use the gidnumber provided")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "Cannot use the gidnumber provided"))) o.logger.Error().Err(err).Str("userid", userid).Msg("Cannot use the gidnumber provided") return } @@ -187,17 +187,17 @@ func (o Ocs) AddUser(w http.ResponseWriter, r *http.Request) { merr := merrors.FromError(err) switch merr.Code { case http.StatusBadRequest: - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, merr.Detail)) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, merr.Detail))) case http.StatusConflict: if response.APIVersion(r.Context()) == "2" { // it seems the application framework sets the ocs status code to the httpstatus code, which affects the provisioning api // see https://github.com/owncloud/core/blob/b9ff4c93e051c94adfb301545098ae627e52ef76/lib/public/AppFramework/OCSController.php#L142-L150 - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, merr.Detail)) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, merr.Detail))) } else { - render.Render(w, r, response.ErrRender(data.MetaInvalidInput.StatusCode, merr.Detail)) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaInvalidInput.StatusCode, merr.Detail))) } default: - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(err).Str("userid", userid).Msg("could not add user") // TODO check error if account already existed @@ -217,7 +217,7 @@ func (o Ocs) AddUser(w http.ResponseWriter, r *http.Request) { } else { enabled = "false" } - render.Render(w, r, response.DataRender(&data.User{ + mustNotFail(render.Render(w, r, response.DataRender(&data.User{ UserID: account.OnPremisesSamAccountName, DisplayName: account.DisplayName, LegacyDisplayName: account.DisplayName, @@ -225,7 +225,7 @@ func (o Ocs) AddUser(w http.ResponseWriter, r *http.Request) { UIDNumber: account.UidNumber, GIDNumber: account.GidNumber, Enabled: enabled, - })) + }))) } // EditUser creates a new user account @@ -235,9 +235,9 @@ func (o Ocs) EditUser(w http.ResponseWriter, r *http.Request) { 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")) + mustNotFail(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())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(err).Str("userid", userid).Msg("could not edit user") return @@ -269,7 +269,7 @@ func (o Ocs) EditUser(w http.ResponseWriter, r *http.Request) { req.UpdateMask = &fieldmaskpb.FieldMask{Paths: []string{"DisplayName"}} default: // https://github.com/owncloud/core/blob/24b7fa1d2604a208582055309a5638dbd9bda1d1/apps/provisioning_api/lib/Users.php#L321 - render.Render(w, r, response.ErrRender(103, "unknown key '"+key+"'")) + mustNotFail(render.Render(w, r, response.ErrRender(103, "unknown key '"+key+"'"))) return } @@ -278,9 +278,9 @@ func (o Ocs) EditUser(w http.ResponseWriter, r *http.Request) { merr := merrors.FromError(err) switch merr.Code { case http.StatusBadRequest: - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, merr.Detail)) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, merr.Detail))) default: - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(err).Str("account_id", req.Account.Id).Str("user_id", userid).Msg("could not edit user") return @@ -292,7 +292,7 @@ func (o Ocs) EditUser(w http.ResponseWriter, r *http.Request) { } o.logger.Debug().Interface("account", account).Msg("updated user") - render.Render(w, r, response.DataRender(struct{}{})) + mustNotFail(render.Render(w, r, response.DataRender(struct{}{}))) } // DeleteUser deletes a user @@ -302,9 +302,9 @@ func (o Ocs) DeleteUser(w http.ResponseWriter, r *http.Request) { 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")) + mustNotFail(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())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(err).Str("userid", userid).Msg("could not delete user") return @@ -318,16 +318,16 @@ func (o Ocs) DeleteUser(w http.ResponseWriter, r *http.Request) { 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")) + mustNotFail(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())) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, err.Error()))) } o.logger.Error().Err(err).Str("userid", req.Id).Msg("could not delete user") return } o.logger.Debug().Str("userid", req.Id).Msg("deleted user") - render.Render(w, r, response.DataRender(struct{}{})) + mustNotFail(render.Render(w, r, response.DataRender(struct{}{}))) } // EnableUser enables a user @@ -337,9 +337,9 @@ func (o Ocs) EnableUser(w http.ResponseWriter, r *http.Request) { 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")) + mustNotFail(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())) + mustNotFail(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 @@ -358,16 +358,16 @@ func (o Ocs) EnableUser(w http.ResponseWriter, r *http.Request) { 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")) + mustNotFail(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())) + mustNotFail(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{}{})) + mustNotFail(render.Render(w, r, response.DataRender(struct{}{}))) } // DisableUser disables a user @@ -377,9 +377,9 @@ func (o Ocs) DisableUser(w http.ResponseWriter, r *http.Request) { 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")) + mustNotFail(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())) + mustNotFail(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 @@ -398,16 +398,16 @@ func (o Ocs) DisableUser(w http.ResponseWriter, r *http.Request) { 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")) + mustNotFail(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())) + mustNotFail(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{}{})) + mustNotFail(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 @@ -417,7 +417,7 @@ func (o Ocs) GetSigningKey(w http.ResponseWriter, r *http.Request) { u, ok := user.ContextGetUser(r.Context()) if !ok { //o.logger.Error().Msg("missing user in context") - render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "missing user in context")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaBadRequest.StatusCode, "missing user in context"))) return } @@ -433,10 +433,10 @@ func (o Ocs) GetSigningKey(w http.ResponseWriter, r *http.Request) { Key: userID, }) if err == nil && len(res.Records) > 0 { - render.Render(w, r, response.DataRender(&data.SigningKey{ + mustNotFail(render.Render(w, r, response.DataRender(&data.SigningKey{ User: userID, SigningKey: string(res.Records[0].Value), - })) + }))) return } if err != nil { @@ -444,7 +444,7 @@ func (o Ocs) GetSigningKey(w http.ResponseWriter, r *http.Request) { if e.Code == http.StatusNotFound { // not found is ok, so we can continue and generate the key on the fly } else { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, "error reading from store")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, "error reading from store"))) return } } @@ -453,7 +453,7 @@ func (o Ocs) GetSigningKey(w http.ResponseWriter, r *http.Request) { key := make([]byte, 64) _, err = rand.Read(key[:]) if err != nil { - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, "could not generate signing key")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, "could not generate signing key"))) return } signingKey := hex.EncodeToString(key) @@ -472,14 +472,14 @@ func (o Ocs) GetSigningKey(w http.ResponseWriter, r *http.Request) { if err != nil { //o.logger.Error().Err(err).Msg("error writing key") - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, "could not persist signing key")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, "could not persist signing key"))) return } - render.Render(w, r, response.DataRender(&data.SigningKey{ + mustNotFail(render.Render(w, r, response.DataRender(&data.SigningKey{ User: userID, SigningKey: signingKey, - })) + }))) } // ListUsers lists the users @@ -495,16 +495,16 @@ func (o Ocs) ListUsers(w http.ResponseWriter, r *http.Request) { }) if err != nil { o.logger.Err(err).Msg("could not list users") - render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, "could not list users")) + mustNotFail(render.Render(w, r, response.ErrRender(data.MetaServerError.StatusCode, "could not list users"))) return } - users := []string{} + users := make([]string, 0, len(res.Accounts)) for i := range res.Accounts { users = append(users, res.Accounts[i].OnPremisesSamAccountName) } - render.Render(w, r, response.DataRender(&data.Users{Users: users})) + mustNotFail(render.Render(w, r, response.DataRender(&data.Users{Users: users}))) } // escapeValue escapes all special characters in the value