diff --git a/internal/grpc/interceptors/auth/scope.go b/internal/grpc/interceptors/auth/scope.go index 3fa9e7943f..fc7fdbf0ff 100644 --- a/internal/grpc/interceptors/auth/scope.go +++ b/internal/grpc/interceptors/auth/scope.go @@ -142,7 +142,7 @@ func resolveLightweightScope(ctx context.Context, ref *provider.Reference, scope } for _, share := range shares.Shares { - shareKey := "lw:" + user.Id.OpaqueId + scopeDelimiter + storagespace.FormatResourceID(*share.Share.ResourceId) + shareKey := "lw:" + user.Id.OpaqueId + scopeDelimiter + storagespace.FormatResourceID(share.Share.ResourceId) _ = scopeExpansionCache.SetWithExpire(shareKey, nil, scopeCacheExpiration*time.Second) if ref.ResourceId != nil && utils.ResourceIDEqual(share.Share.ResourceId, ref.ResourceId) { @@ -229,7 +229,7 @@ func checkRelativeReference(ctx context.Context, requested *provider.Reference, } } - key := storagespace.FormatResourceID(*sharedResourceID) + scopeDelimiter + getRefKey(requested) + key := storagespace.FormatResourceID(sharedResourceID) + scopeDelimiter + getRefKey(requested) _ = scopeExpansionCache.SetWithExpire(key, nil, scopeCacheExpiration*time.Second) return nil } @@ -246,7 +246,7 @@ func resolveUserShare(ctx context.Context, ref *provider.Reference, scope *authp func checkCacheForNestedResource(ctx context.Context, ref *provider.Reference, resource *provider.ResourceId, client gateway.GatewayAPIClient, mgr token.Manager) error { // Check if this ref is cached - key := storagespace.FormatResourceID(*resource) + scopeDelimiter + getRefKey(ref) + key := storagespace.FormatResourceID(resource) + scopeDelimiter + getRefKey(ref) if _, err := scopeExpansionCache.Get(key); err == nil { return nil } @@ -520,7 +520,7 @@ func getRefKey(ref *provider.Reference) string { } if ref.GetResourceId() != nil { - return storagespace.FormatResourceID(*ref.ResourceId) + return storagespace.FormatResourceID(ref.ResourceId) } // on malicious request both path and rid could be empty diff --git a/internal/grpc/services/gateway/authprovider.go b/internal/grpc/services/gateway/authprovider.go index 59214afffe..5f9ced4017 100644 --- a/internal/grpc/services/gateway/authprovider.go +++ b/internal/grpc/services/gateway/authprovider.go @@ -36,6 +36,7 @@ import ( "github.com/cs3org/reva/v2/pkg/sharedconf" "github.com/pkg/errors" "google.golang.org/grpc/metadata" + "google.golang.org/protobuf/proto" ) func (s *svc) Authenticate(ctx context.Context, req *gateway.AuthenticateRequest) (*gateway.AuthenticateResponse, error) { @@ -92,12 +93,12 @@ func (s *svc) Authenticate(ctx context.Context, req *gateway.AuthenticateRequest }, nil } - u := *res.User + u := proto.Clone(res.User).(*userpb.User) if sharedconf.SkipUserGroupsInToken() { u.Groups = []string{} } - token, err := s.tokenmgr.MintToken(ctx, &u, res.TokenScope) + token, err := s.tokenmgr.MintToken(ctx, u, res.TokenScope) if err != nil { err = errors.Wrap(err, "authsvc: error in MintToken") res := &gateway.AuthenticateResponse{ diff --git a/internal/grpc/services/publicshareprovider/publicshareprovider.go b/internal/grpc/services/publicshareprovider/publicshareprovider.go index 0c740f3668..3202b8c755 100644 --- a/internal/grpc/services/publicshareprovider/publicshareprovider.go +++ b/internal/grpc/services/publicshareprovider/publicshareprovider.go @@ -350,7 +350,7 @@ func (s *service) RemovePublicShare(ctx context.Context, req *link.RemovePublicS Status: status.NewInternal(ctx, "error loading public share"), }, err } - if !publicshare.IsCreatedByUser(*ps, user) { + if !publicshare.IsCreatedByUser(ps, user) { sRes, err := gatewayClient.Stat(ctx, &provider.StatRequest{Ref: &provider.Reference{ResourceId: ps.ResourceId}}) if err != nil { log.Err(err).Interface("resource_id", ps.ResourceId).Msg("failed to stat shared resource") @@ -480,7 +480,7 @@ func (s *service) UpdatePublicShare(ctx context.Context, req *link.UpdatePublicS // users should always be able to downgrade links to internal links // when they are the creator of the link // all other users should have the WritePublicLink permission - if !isInternalLink && !publicshare.IsCreatedByUser(*ps, user) { + if !isInternalLink && !publicshare.IsCreatedByUser(ps, user) { canWriteLink, err := utils.CheckPermission(ctx, permission.WritePublicLink, gatewayClient) if err != nil { return &link.UpdatePublicShareResponse{ @@ -502,7 +502,7 @@ func (s *service) UpdatePublicShare(ctx context.Context, req *link.UpdatePublicS }, err } - if !publicshare.IsCreatedByUser(*ps, user) { + if !publicshare.IsCreatedByUser(ps, user) { if !sRes.GetInfo().GetPermissionSet().UpdateGrant { return &link.UpdatePublicShareResponse{ Status: status.NewPermissionDenied(ctx, nil, "no permission to update public share"), diff --git a/internal/grpc/services/publicstorageprovider/publicstorageprovider.go b/internal/grpc/services/publicstorageprovider/publicstorageprovider.go index a0ef523772..dd685e183a 100644 --- a/internal/grpc/services/publicstorageprovider/publicstorageprovider.go +++ b/internal/grpc/services/publicstorageprovider/publicstorageprovider.go @@ -454,7 +454,7 @@ func (s *service) ListStorageSpaces(ctx context.Context, req *provider.ListStora // we know a grant for this resource space := &provider.StorageSpace{ Id: &provider.StorageSpaceId{ - OpaqueId: storagespace.FormatResourceID(*root), + OpaqueId: storagespace.FormatResourceID(root), }, SpaceType: "grant", Owner: &userv1beta1.User{Id: grantee}, @@ -486,7 +486,7 @@ func (s *service) ListStorageSpaces(ctx context.Context, req *provider.ListStora } space := &provider.StorageSpace{ Id: &provider.StorageSpaceId{ - OpaqueId: storagespace.FormatResourceID(*root), + OpaqueId: storagespace.FormatResourceID(root), }, SpaceType: "mountpoint", Owner: &userv1beta1.User{Id: grantee}, // FIXME actually, the mount point belongs to no one? diff --git a/internal/grpc/services/sharesstorageprovider/sharesstorageprovider.go b/internal/grpc/services/sharesstorageprovider/sharesstorageprovider.go index a480278160..97de593b6d 100644 --- a/internal/grpc/services/sharesstorageprovider/sharesstorageprovider.go +++ b/internal/grpc/services/sharesstorageprovider/sharesstorageprovider.go @@ -433,7 +433,7 @@ func (s *service) ListStorageSpaces(ctx context.Context, req *provider.ListStora space := &provider.StorageSpace{ Opaque: opaque, Id: &provider.StorageSpaceId{ - OpaqueId: storagespace.FormatResourceID(*virtualRootID), + OpaqueId: storagespace.FormatResourceID(virtualRootID), }, SpaceType: "virtual", //Owner: &userv1beta1.User{Id: receivedShare.Share.Owner}, // FIXME actually, the mount point belongs to the recipient @@ -455,7 +455,7 @@ func (s *service) ListStorageSpaces(ctx context.Context, req *provider.ListStora // we know a grant for this resource space := &provider.StorageSpace{ Id: &provider.StorageSpaceId{ - OpaqueId: storagespace.FormatResourceID(*root), + OpaqueId: storagespace.FormatResourceID(root), }, SpaceType: "grant", Owner: &userv1beta1.User{Id: receivedShare.Share.Owner}, @@ -509,7 +509,7 @@ func (s *service) ListStorageSpaces(ctx context.Context, req *provider.ListStora space := &provider.StorageSpace{ Opaque: opaque, Id: &provider.StorageSpaceId{ - OpaqueId: storagespace.FormatResourceID(*root), + OpaqueId: storagespace.FormatResourceID(root), }, SpaceType: "mountpoint", Owner: &userv1beta1.User{Id: receivedShare.Share.Owner}, // FIXME actually, the mount point belongs to the recipient @@ -819,7 +819,7 @@ func (s *service) ListContainer(ctx context.Context, req *provider.ListContainer if receivedShare.GetState() != collaboration.ShareState_SHARE_STATE_ACCEPTED { continue } - rIDStr := storagespace.FormatResourceID(*receivedShare.GetShare().GetResourceId()) + rIDStr := storagespace.FormatResourceID(receivedShare.GetShare().GetResourceId()) if oldest, ok := oldestReceivedSharesByResourceID[rIDStr]; ok { // replace if older than current oldest if utils.TSToTime(receivedShare.GetShare().GetCtime()).Before(utils.TSToTime(oldest.GetShare().GetCtime())) { diff --git a/internal/grpc/services/storageprovider/storageprovider.go b/internal/grpc/services/storageprovider/storageprovider.go index efbadbc69c..7c548db53c 100644 --- a/internal/grpc/services/storageprovider/storageprovider.go +++ b/internal/grpc/services/storageprovider/storageprovider.go @@ -299,7 +299,7 @@ func (s *Service) InitiateFileDownload(ctx context.Context, req *provider.Initia if utils.IsRelativeReference(req.Ref) { s.addMissingStorageProviderID(req.GetRef().GetResourceId(), nil) protocol.Protocol = "spaces" - u.Path = path.Join(u.Path, "spaces", storagespace.FormatResourceID(*req.Ref.ResourceId), req.Ref.Path) + u.Path = path.Join(u.Path, "spaces", storagespace.FormatResourceID(req.Ref.ResourceId), req.Ref.Path) } else { // Currently, we only support the simple protocol for GET requests // Once we have multiple protocols, this would be moved to the fs layer @@ -613,7 +613,7 @@ func (s *Service) DeleteStorageSpace(ctx context.Context, req *provider.DeleteSt // FIXME: why is this string parsing necessary? idraw, _ := storagespace.ParseID(req.Id.GetOpaqueId()) idraw.OpaqueId = idraw.GetSpaceId() - id := &provider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(idraw)} + id := &provider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&idraw)} spaces, err := s.Storage.ListStorageSpaces(ctx, []*provider.ListStorageSpacesRequest_Filter{{Type: provider.ListStorageSpacesRequest_Filter_TYPE_ID, Term: &provider.ListStorageSpacesRequest_Filter_Id{Id: id}}}, true) if err != nil { diff --git a/internal/http/services/appprovider/appprovider.go b/internal/http/services/appprovider/appprovider.go index 5ab334cac6..bf7154e586 100644 --- a/internal/http/services/appprovider/appprovider.go +++ b/internal/http/services/appprovider/appprovider.go @@ -48,6 +48,7 @@ import ( "github.com/mitchellh/mapstructure" "github.com/pkg/errors" "github.com/rs/zerolog" + "google.golang.org/protobuf/proto" ) func init() { @@ -304,7 +305,7 @@ func (s *svc) handleNew(w http.ResponseWriter, r *http.Request) { writeError(w, r, appErrorInvalidParameter, "the given file id does not point to a file", nil) return } - fileid = storagespace.FormatResourceID(*statRes.Info.Id) + fileid = storagespace.FormatResourceID(statRes.Info.Id) } js, err := json.Marshal( @@ -574,7 +575,8 @@ func buildApps(mimeTypes []*appregistry.MimeTypeInfo, userAgent, secureViewAppAd for _, m := range mimeTypes { apps := []*ProviderInfo{} for _, p := range m.AppProviders { - ep := &ProviderInfo{ProviderInfo: *p} + ep := &ProviderInfo{} + proto.Merge(&ep.ProviderInfo, p) if p.Address == secureViewAppAddr { ep.SecureView = true } @@ -586,7 +588,8 @@ func buildApps(mimeTypes []*appregistry.MimeTypeInfo, userAgent, secureViewAppAd } } if len(apps) > 0 { - mt := &MimeTypeInfo{MimeTypeInfo: *m} + mt := &MimeTypeInfo{} + proto.Merge(&mt.MimeTypeInfo, m) mt.AppProviders = apps res = append(res, mt) } diff --git a/internal/http/services/owncloud/ocdav/copy.go b/internal/http/services/owncloud/ocdav/copy.go index 2ebd66ef9b..97b4686420 100644 --- a/internal/http/services/owncloud/ocdav/copy.go +++ b/internal/http/services/owncloud/ocdav/copy.go @@ -214,7 +214,7 @@ func (s *svc) executePathCopy(ctx context.Context, selector pool.Selectable[gate return fmt.Errorf("status code %d", r.GetStatus().GetCode()) } - fileid = storagespace.FormatResourceID(*r.GetInfo().GetId()) + fileid = storagespace.FormatResourceID(r.GetInfo().GetId()) } else { // copy file @@ -438,7 +438,7 @@ func (s *svc) executeSpacesCopy(ctx context.Context, w http.ResponseWriter, sele return fmt.Errorf("stat: status code %d", r.GetStatus().GetCode()) } - fileid = storagespace.FormatResourceID(*r.GetInfo().GetId()) + fileid = storagespace.FormatResourceID(r.GetInfo().GetId()) } else { // copy file // 1. get download url diff --git a/internal/http/services/owncloud/ocdav/dav.go b/internal/http/services/owncloud/ocdav/dav.go index 50fe001667..ba82e15439 100644 --- a/internal/http/services/owncloud/ocdav/dav.go +++ b/internal/http/services/owncloud/ocdav/dav.go @@ -287,7 +287,7 @@ func (h *DavHandler) Handler(s *svc) http.Handler { // If the link is internal then 307 redirect if psRes.Status.Code == rpc.Code_CODE_OK && grants.PermissionsEqual(psRes.Share.Permissions.GetPermissions(), &provider.ResourcePermissions{}) { if psRes.GetShare().GetResourceId() != nil { - rUrl := path.Join("/dav/spaces", storagespace.FormatResourceID(*psRes.GetShare().GetResourceId())) + rUrl := path.Join("/dav/spaces", storagespace.FormatResourceID(psRes.GetShare().GetResourceId())) http.Redirect(w, r, rUrl, http.StatusTemporaryRedirect) return } diff --git a/internal/http/services/owncloud/ocdav/head.go b/internal/http/services/owncloud/ocdav/head.go index f055d18f49..10e2af57f9 100644 --- a/internal/http/services/owncloud/ocdav/head.go +++ b/internal/http/services/owncloud/ocdav/head.go @@ -85,7 +85,7 @@ func (s *svc) handleHead(ctx context.Context, w http.ResponseWriter, r *http.Req info := res.Info w.Header().Set(net.HeaderContentType, info.MimeType) w.Header().Set(net.HeaderETag, info.Etag) - w.Header().Set(net.HeaderOCFileID, storagespace.FormatResourceID(*info.Id)) + w.Header().Set(net.HeaderOCFileID, storagespace.FormatResourceID(info.Id)) w.Header().Set(net.HeaderOCETag, info.Etag) if info.Checksum != nil { w.Header().Set(net.HeaderOCChecksum, fmt.Sprintf("%s:%s", strings.ToUpper(string(storageprovider.GRPC2PKGXS(info.Checksum.Type))), info.Checksum.Sum)) diff --git a/internal/http/services/owncloud/ocdav/meta.go b/internal/http/services/owncloud/ocdav/meta.go index 9bdf2a99e9..1ac28f5b80 100644 --- a/internal/http/services/owncloud/ocdav/meta.go +++ b/internal/http/services/owncloud/ocdav/meta.go @@ -104,7 +104,7 @@ func (h *MetaHandler) handlePathForUser(w http.ResponseWriter, r *http.Request, ctx, span := appctx.GetTracerProvider(r.Context()).Tracer(tracerName).Start(r.Context(), "meta_propfind") defer span.End() - id := storagespace.FormatResourceID(*rid) + id := storagespace.FormatResourceID(rid) sublog := appctx.GetLogger(ctx).With().Str("path", r.URL.Path).Str("resourceid", id).Logger() sublog.Info().Msg("calling get path for user") diff --git a/internal/http/services/owncloud/ocdav/move.go b/internal/http/services/owncloud/ocdav/move.go index 9b1e3c705b..79a6bbd563 100644 --- a/internal/http/services/owncloud/ocdav/move.go +++ b/internal/http/services/owncloud/ocdav/move.go @@ -345,7 +345,7 @@ func (s *svc) handleMove(ctx context.Context, w http.ResponseWriter, r *http.Req info := dstStatRes.Info w.Header().Set(net.HeaderContentType, info.MimeType) w.Header().Set(net.HeaderETag, info.Etag) - w.Header().Set(net.HeaderOCFileID, storagespace.FormatResourceID(*info.Id)) + w.Header().Set(net.HeaderOCFileID, storagespace.FormatResourceID(info.Id)) w.Header().Set(net.HeaderOCETag, info.Etag) w.WriteHeader(successCode) } diff --git a/internal/http/services/owncloud/ocdav/ocdav_blackbox_test.go b/internal/http/services/owncloud/ocdav/ocdav_blackbox_test.go index bbfce7cded..8a97069734 100644 --- a/internal/http/services/owncloud/ocdav/ocdav_blackbox_test.go +++ b/internal/http/services/owncloud/ocdav/ocdav_blackbox_test.go @@ -172,7 +172,7 @@ var _ = Describe("ocdav", func() { }, }, }, - Id: &cs3storageprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(cs3storageprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"})}, + Id: &cs3storageprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&cs3storageprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"})}, Root: &cs3storageprovider.ResourceId{StorageId: "provider-1", SpaceId: "userspace", OpaqueId: "root"}, Name: "username", RootInfo: &cs3storageprovider.ResourceInfo{ @@ -864,7 +864,7 @@ var _ = Describe("ocdav", func() { // setup the request // set the webdav endpoint to test basePath = "/webdav" - userspace.Id = &cs3storageprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(cs3storageprovider.ResourceId{StorageId: "provider-1", SpaceId: "userspace", OpaqueId: "userspace"})} + userspace.Id = &cs3storageprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&cs3storageprovider.ResourceId{StorageId: "provider-1", SpaceId: "userspace", OpaqueId: "userspace"})} userspace.Root = &cs3storageprovider.ResourceId{StorageId: "provider-1", SpaceId: "userspace", OpaqueId: "userspace"} // path based requests at the /webdav endpoint first look up the storage space @@ -938,7 +938,7 @@ var _ = Describe("ocdav", func() { BeforeEach(func() { basePath = "/dav/spaces" - userspace.Id = &cs3storageprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(cs3storageprovider.ResourceId{StorageId: "provider-1", SpaceId: "userspace", OpaqueId: "userspace"})} + userspace.Id = &cs3storageprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&cs3storageprovider.ResourceId{StorageId: "provider-1", SpaceId: "userspace", OpaqueId: "userspace"})} userspace.Root = &cs3storageprovider.ResourceId{StorageId: "provider-1", SpaceId: "userspace", OpaqueId: "userspace"} // path based requests at the /webdav endpoint first look up the storage space client.On("ListStorageSpaces", mock.Anything, mock.MatchedBy(func(req *cs3storageprovider.ListStorageSpacesRequest) bool { diff --git a/internal/http/services/owncloud/ocdav/ocdav_whitebox_test.go b/internal/http/services/owncloud/ocdav/ocdav_whitebox_test.go index 97acf61de7..1529d8fa2e 100644 --- a/internal/http/services/owncloud/ocdav/ocdav_whitebox_test.go +++ b/internal/http/services/owncloud/ocdav/ocdav_whitebox_test.go @@ -28,7 +28,7 @@ import ( func TestWrapResourceID(t *testing.T) { expected := "storageid" + "$" + "spaceid" + "!" + "opaqueid" - wrapped := storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "storageid", SpaceId: "spaceid", OpaqueId: "opaqueid"}) + wrapped := storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "storageid", SpaceId: "spaceid", OpaqueId: "opaqueid"}) if wrapped != expected { t.Errorf("wrapped id doesn't have the expected format: got %s expected %s", wrapped, expected) diff --git a/internal/http/services/owncloud/ocdav/propfind/propfind.go b/internal/http/services/owncloud/ocdav/propfind/propfind.go index 31f11b6ebc..42269f8063 100644 --- a/internal/http/services/owncloud/ocdav/propfind/propfind.go +++ b/internal/http/services/owncloud/ocdav/propfind/propfind.go @@ -1177,7 +1177,7 @@ func mdToPropResponse(ctx context.Context, pf *XML, md *provider.ResourceInfo, p // return all known properties if id != nil { - sid := storagespace.FormatResourceID(*id) + sid := storagespace.FormatResourceID(id) appendToOK( prop.Escaped("oc:id", sid), prop.Escaped("oc:fileid", sid), @@ -1186,7 +1186,7 @@ func mdToPropResponse(ctx context.Context, pf *XML, md *provider.ResourceInfo, p } if md.ParentId != nil { - appendToOK(prop.Escaped("oc:file-parent", storagespace.FormatResourceID(*md.ParentId))) + appendToOK(prop.Escaped("oc:file-parent", storagespace.FormatResourceID(md.ParentId))) } else { appendToNotFound(prop.NotFound("oc:file-parent")) } @@ -1305,19 +1305,19 @@ func mdToPropResponse(ctx context.Context, pf *XML, md *provider.ResourceInfo, p // I tested the desktop client and phoenix to annotate which properties are requestted, see below cases case "fileid": // phoenix only if id != nil { - appendToOK(prop.Escaped("oc:fileid", storagespace.FormatResourceID(*id))) + appendToOK(prop.Escaped("oc:fileid", storagespace.FormatResourceID(id))) } else { appendToNotFound(prop.NotFound("oc:fileid")) } case "id": // desktop client only if id != nil { - appendToOK(prop.Escaped("oc:id", storagespace.FormatResourceID(*id))) + appendToOK(prop.Escaped("oc:id", storagespace.FormatResourceID(id))) } else { appendToNotFound(prop.NotFound("oc:id")) } case "file-parent": if md.ParentId != nil { - appendToOK(prop.Escaped("oc:file-parent", storagespace.FormatResourceID(*md.ParentId))) + appendToOK(prop.Escaped("oc:file-parent", storagespace.FormatResourceID(md.ParentId))) } else { appendToNotFound(prop.NotFound("oc:file-parent")) } @@ -1521,7 +1521,7 @@ func mdToPropResponse(ctx context.Context, pf *XML, md *provider.ResourceInfo, p case "privatelink": privateURL, err := url.Parse(publicURL) if err == nil && id != nil { - privateURL.Path = path.Join(privateURL.Path, "f", storagespace.FormatResourceID(*id)) + privateURL.Path = path.Join(privateURL.Path, "f", storagespace.FormatResourceID(id)) propstatOK.Prop = append(propstatOK.Prop, prop.Escaped("oc:privatelink", privateURL.String())) } else { propstatNotFound.Prop = append(propstatNotFound.Prop, prop.NotFound("oc:privatelink")) diff --git a/internal/http/services/owncloud/ocdav/propfind/propfind_test.go b/internal/http/services/owncloud/ocdav/propfind/propfind_test.go index 07692245f0..7d4dcebbfa 100644 --- a/internal/http/services/owncloud/ocdav/propfind/propfind_test.go +++ b/internal/http/services/owncloud/ocdav/propfind/propfind_test.go @@ -128,7 +128,7 @@ var _ = Describe("PropfindWithDepthInfinity", func() { }, }, }, - Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"})}, + Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"})}, Root: &sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}, Name: "foospace", } @@ -141,7 +141,7 @@ var _ = Describe("PropfindWithDepthInfinity", func() { }, }, }, - Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooquxspace", OpaqueId: "root"})}, + Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooquxspace", OpaqueId: "root"})}, Root: &sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooquxspace", OpaqueId: "root"}, Name: "fooquxspace", } @@ -154,7 +154,7 @@ var _ = Describe("PropfindWithDepthInfinity", func() { }, }, }, - Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooFileShareSpace", OpaqueId: "sharedfile"})}, + Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooFileShareSpace", OpaqueId: "sharedfile"})}, Root: &sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooFileShareSpace", OpaqueId: "sharedfile"}, Name: "fooFileShareSpace", } @@ -167,7 +167,7 @@ var _ = Describe("PropfindWithDepthInfinity", func() { }, }, }, - Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooFileShareSpace2", OpaqueId: "sharedfile2"})}, + Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooFileShareSpace2", OpaqueId: "sharedfile2"})}, Root: &sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooFileShareSpace2", OpaqueId: "sharedfile2"}, Name: "fooFileShareSpace2", } @@ -180,7 +180,7 @@ var _ = Describe("PropfindWithDepthInfinity", func() { }, }, }, - Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooDirShareSpace", OpaqueId: "shareddir"})}, + Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooDirShareSpace", OpaqueId: "shareddir"})}, Root: &sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooDirShareSpace", OpaqueId: "shareddir"}, Name: "fooDirShareSpace", } @@ -787,7 +787,7 @@ var _ = Describe("PropfindWithDepthInfinity", func() { Expect(err).ToNot(HaveOccurred()) req = req.WithContext(ctx) - spaceID := storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) + spaceID := storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) spaceIDUrl := net.EncodePath(spaceID) handler.HandleSpacesPropfind(rr, req, spaceID) Expect(rr.Code).To(Equal(http.StatusMultiStatus)) @@ -822,7 +822,7 @@ var _ = Describe("PropfindWithDepthInfinity", func() { Expect(err).ToNot(HaveOccurred()) req = req.WithContext(ctx) - spaceID := storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) + spaceID := storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) handler.HandleSpacesPropfind(rr, req, spaceID) Expect(rr.Code).To(Equal(http.StatusMultiStatus)) @@ -838,7 +838,7 @@ var _ = Describe("PropfindWithDepthInfinity", func() { Expect(err).ToNot(HaveOccurred()) req = req.WithContext(ctx) - spaceID := storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) + spaceID := storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) handler.HandleSpacesPropfind(rr, req, spaceID) Expect(rr.Code).To(Equal(http.StatusMultiStatus)) @@ -855,7 +855,7 @@ var _ = Describe("PropfindWithDepthInfinity", func() { Expect(err).ToNot(HaveOccurred()) req = req.WithContext(ctx) - spaceID := storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) + spaceID := storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) handler.HandleSpacesPropfind(rr, req, spaceID) Expect(rr.Code).To(Equal(http.StatusMultiStatus)) @@ -873,7 +873,7 @@ var _ = Describe("PropfindWithDepthInfinity", func() { Expect(err).ToNot(HaveOccurred()) req = req.WithContext(ctx) - spaceID := storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) + spaceID := storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) handler.HandleSpacesPropfind(rr, req, spaceID) Expect(rr.Code).To(Equal(http.StatusMultiStatus)) @@ -959,7 +959,7 @@ var _ = Describe("PropfindWithoutDepthInfinity", func() { }, }, }, - Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"})}, + Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"})}, Root: &sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}, Name: "foospace", } @@ -972,7 +972,7 @@ var _ = Describe("PropfindWithoutDepthInfinity", func() { }, }, }, - Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooquxspace", OpaqueId: "root"})}, + Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooquxspace", OpaqueId: "root"})}, Root: &sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooquxspace", OpaqueId: "root"}, Name: "fooquxspace", } @@ -985,7 +985,7 @@ var _ = Describe("PropfindWithoutDepthInfinity", func() { }, }, }, - Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooFileShareSpace", OpaqueId: "sharedfile"})}, + Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooFileShareSpace", OpaqueId: "sharedfile"})}, Root: &sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooFileShareSpace", OpaqueId: "sharedfile"}, Name: "fooFileShareSpace", } @@ -998,7 +998,7 @@ var _ = Describe("PropfindWithoutDepthInfinity", func() { }, }, }, - Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooFileShareSpace2", OpaqueId: "sharedfile2"})}, + Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooFileShareSpace2", OpaqueId: "sharedfile2"})}, Root: &sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooFileShareSpace2", OpaqueId: "sharedfile2"}, Name: "fooFileShareSpace2", } @@ -1011,7 +1011,7 @@ var _ = Describe("PropfindWithoutDepthInfinity", func() { }, }, }, - Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooDirShareSpace", OpaqueId: "shareddir"})}, + Id: &sprovider.StorageSpaceId{OpaqueId: storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooDirShareSpace", OpaqueId: "shareddir"})}, Root: &sprovider.ResourceId{StorageId: "provider-1", SpaceId: "fooDirShareSpace", OpaqueId: "shareddir"}, Name: "fooDirShareSpace", } @@ -1598,7 +1598,7 @@ var _ = Describe("PropfindWithoutDepthInfinity", func() { Expect(err).ToNot(HaveOccurred()) req = req.WithContext(ctx) - spaceID := storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) + spaceID := storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) spaceIDUrl := net.EncodePath(spaceID) handler.HandleSpacesPropfind(rr, req, spaceID) Expect(rr.Code).To(Equal(http.StatusMultiStatus)) @@ -1633,7 +1633,7 @@ var _ = Describe("PropfindWithoutDepthInfinity", func() { Expect(err).ToNot(HaveOccurred()) req = req.WithContext(ctx) - spaceID := storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) + spaceID := storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) handler.HandleSpacesPropfind(rr, req, spaceID) Expect(rr.Code).To(Equal(http.StatusMultiStatus)) @@ -1649,7 +1649,7 @@ var _ = Describe("PropfindWithoutDepthInfinity", func() { Expect(err).ToNot(HaveOccurred()) req = req.WithContext(ctx) - spaceID := storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) + spaceID := storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) handler.HandleSpacesPropfind(rr, req, spaceID) Expect(rr.Code).To(Equal(http.StatusMultiStatus)) @@ -1666,7 +1666,7 @@ var _ = Describe("PropfindWithoutDepthInfinity", func() { Expect(err).ToNot(HaveOccurred()) req = req.WithContext(ctx) - spaceID := storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) + spaceID := storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) handler.HandleSpacesPropfind(rr, req, spaceID) Expect(rr.Code).To(Equal(http.StatusMultiStatus)) @@ -1684,7 +1684,7 @@ var _ = Describe("PropfindWithoutDepthInfinity", func() { Expect(err).ToNot(HaveOccurred()) req = req.WithContext(ctx) - spaceID := storagespace.FormatResourceID(sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) + spaceID := storagespace.FormatResourceID(&sprovider.ResourceId{StorageId: "provider-1", SpaceId: "foospace", OpaqueId: "root"}) handler.HandleSpacesPropfind(rr, req, spaceID) Expect(rr.Code).To(Equal(http.StatusBadRequest)) diff --git a/internal/http/services/owncloud/ocdav/put.go b/internal/http/services/owncloud/ocdav/put.go index 5f931a16f8..9811efd385 100644 --- a/internal/http/services/owncloud/ocdav/put.go +++ b/internal/http/services/owncloud/ocdav/put.go @@ -230,7 +230,7 @@ func (s *svc) handlePut(ctx context.Context, w http.ResponseWriter, r *http.Requ w.Header().Set(net.HeaderETag, sRes.Info.Etag) w.Header().Set(net.HeaderOCETag, sRes.Info.Etag) - w.Header().Set(net.HeaderOCFileID, storagespace.FormatResourceID(*sRes.Info.Id)) + w.Header().Set(net.HeaderOCFileID, storagespace.FormatResourceID(sRes.Info.Id)) w.Header().Set(net.HeaderLastModified, net.RFC1123Z(sRes.Info.Mtime)) w.WriteHeader(http.StatusCreated) diff --git a/internal/http/services/owncloud/ocdav/spaces.go b/internal/http/services/owncloud/ocdav/spaces.go index 158fc569b6..37797d60ad 100644 --- a/internal/http/services/owncloud/ocdav/spaces.go +++ b/internal/http/services/owncloud/ocdav/spaces.go @@ -22,6 +22,7 @@ import ( "net/http" "path" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" "github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/config" "github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/errors" "github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/net" @@ -30,6 +31,7 @@ import ( "github.com/cs3org/reva/v2/pkg/rhttp/router" "github.com/cs3org/reva/v2/pkg/storagespace" "github.com/cs3org/reva/v2/pkg/utils" + "google.golang.org/protobuf/proto" ) // SpacesHandler handles trashbin requests @@ -167,10 +169,10 @@ func (h *SpacesHandler) handleSpacesTrashbin(w http.ResponseWriter, r *http.Requ } log.Debug().Str("key", key).Str("path", r.URL.Path).Str("dst", dst).Msg("spaces restore") - dstRef := ref + dstRef := proto.Clone(&ref).(*provider.Reference) dstRef.Path = utils.MakeRelativePath(dst) - trashbinHandler.restore(w, r, s, &ref, &dstRef, key, r.URL.Path) + trashbinHandler.restore(w, r, s, &ref, dstRef, key, r.URL.Path) case http.MethodDelete: trashbinHandler.delete(w, r, s, &ref, key, r.URL.Path) default: diff --git a/internal/http/services/owncloud/ocdav/trashbin.go b/internal/http/services/owncloud/ocdav/trashbin.go index 0888151f95..ef742c54df 100644 --- a/internal/http/services/owncloud/ocdav/trashbin.go +++ b/internal/http/services/owncloud/ocdav/trashbin.go @@ -601,7 +601,7 @@ func (h *TrashbinHandler) restore(w http.ResponseWriter, r *http.Request, s *svc info := dstStatRes.Info w.Header().Set(net.HeaderContentType, info.MimeType) w.Header().Set(net.HeaderETag, info.Etag) - w.Header().Set(net.HeaderOCFileID, storagespace.FormatResourceID(*info.Id)) + w.Header().Set(net.HeaderOCFileID, storagespace.FormatResourceID(info.Id)) w.Header().Set(net.HeaderOCETag, info.Etag) w.WriteHeader(successCode) diff --git a/internal/http/services/owncloud/ocdav/tus.go b/internal/http/services/owncloud/ocdav/tus.go index 04696eb05a..2b85a1d231 100644 --- a/internal/http/services/owncloud/ocdav/tus.go +++ b/internal/http/services/owncloud/ocdav/tus.go @@ -377,7 +377,7 @@ func (s *svc) handleTusPost(ctx context.Context, w http.ResponseWriter, r *http. ) w.Header().Set(net.HeaderContentType, info.MimeType) - w.Header().Set(net.HeaderOCFileID, storagespace.FormatResourceID(*info.Id)) + w.Header().Set(net.HeaderOCFileID, storagespace.FormatResourceID(info.Id)) w.Header().Set(net.HeaderOCETag, info.Etag) w.Header().Set(net.HeaderETag, info.Etag) w.Header().Set(net.HeaderOCPermissions, permissions) diff --git a/internal/http/services/owncloud/ocdav/versions.go b/internal/http/services/owncloud/ocdav/versions.go index 0c9de36c35..e9b25ac999 100644 --- a/internal/http/services/owncloud/ocdav/versions.go +++ b/internal/http/services/owncloud/ocdav/versions.go @@ -58,7 +58,7 @@ func (h *VersionsHandler) Handler(s *svc, rid *provider.ResourceId) http.Handler } // baseURI is encoded as part of the response payload in href field - baseURI := path.Join(ctx.Value(net.CtxKeyBaseURI).(string), storagespace.FormatResourceID(*rid)) + baseURI := path.Join(ctx.Value(net.CtxKeyBaseURI).(string), storagespace.FormatResourceID(rid)) ctx = context.WithValue(ctx, net.CtxKeyBaseURI, baseURI) r = r.WithContext(ctx) diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/sharees/token.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/sharees/token.go index be0c12e1ca..90774e6187 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/sharees/token.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/sharees/token.go @@ -81,7 +81,7 @@ func handleGetToken(ctx context.Context, tkn string, pw string, c gateway.Gatewa } if protected && !t.PasswordProtected { - space, status, err := spacelookup.LookUpStorageSpaceByID(ctx, c, storagespace.FormatResourceID(provider.ResourceId{StorageId: t.StorageID, SpaceId: t.SpaceID, OpaqueId: t.OpaqueID})) + space, status, err := spacelookup.LookUpStorageSpaceByID(ctx, c, storagespace.FormatResourceID(&provider.ResourceId{StorageId: t.StorageID, SpaceId: t.SpaceID, OpaqueId: t.OpaqueID})) // add info only if user is able to stat if err == nil && status.Code == rpc.Code_CODE_OK { t.SpacePath = utils.ReadPlainFromOpaque(space.Opaque, "path") @@ -111,7 +111,7 @@ func buildTokenInfo(owner *user.User, tkn string, token string, passProtected bo return t, fmt.Errorf("can't stat resource. %+v %s", sRes, err) } - t.ID = storagespace.FormatResourceID(*sRes.Share.GetResourceId()) + t.ID = storagespace.FormatResourceID(sRes.Share.GetResourceId()) t.StorageID = sRes.Share.ResourceId.GetStorageId() t.SpaceID = sRes.Share.ResourceId.GetSpaceId() t.OpaqueID = sRes.Share.ResourceId.GetOpaqueId() diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go index dd636f4b54..25da16b6dc 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go @@ -323,7 +323,7 @@ func (h *Handler) updatePublicShare(w http.ResponseWriter, r *http.Request, shar return } - createdByUser := publicshare.IsCreatedByUser(*share, user) + createdByUser := publicshare.IsCreatedByUser(share, user) // NOTE: you are allowed to update a link TO a public link without the `PublicLink.Write` permission if you created it yourself if (permKey != nil && *permKey != 0) || !createdByUser { @@ -540,7 +540,7 @@ func (h *Handler) removePublicShare(w http.ResponseWriter, r *http.Request, shar } u := ctxpkg.ContextMustGetUser(ctx) - if !publicshare.IsCreatedByUser(*share, u) { + if !publicshare.IsCreatedByUser(share, u) { sRes, err := c.Stat(r.Context(), &provider.StatRequest{Ref: &provider.Reference{ResourceId: share.ResourceId}}) if err != nil { log.Err(err).Interface("resource_id", share.ResourceId).Msg("failed to stat shared resource") diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go index b006d5d528..02d92344f1 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go @@ -179,13 +179,14 @@ func (h *Handler) startCacheWarmup(c sharecache.Warmup) { } } -func (h *Handler) extractReference(r *http.Request) (provider.Reference, error) { - var ref provider.Reference +func (h *Handler) extractReference(r *http.Request) (*provider.Reference, error) { + ref := &provider.Reference{} // NOTE: space_ref is deprecated and will be removed in ~2 weeks (1.6.22) sr := r.FormValue("space_ref") if sr != "" { - return storagespace.ParseReference(sr) + ref, err := storagespace.ParseReference(sr) + return &ref, err } p, id := r.FormValue("path"), r.FormValue("space") @@ -243,7 +244,7 @@ func (h *Handler) CreateShare(w http.ResponseWriter, r *http.Request) { return } - statReq := provider.StatRequest{Ref: &ref, FieldMask: &fieldmaskpb.FieldMask{Paths: []string{"space"}}} + statReq := provider.StatRequest{Ref: ref, FieldMask: &fieldmaskpb.FieldMask{Paths: []string{"space"}}} statRes, err := client.Stat(ctx, &statReq) if err != nil { sublog.Debug().Err(err).Msg("CreateShare: error on stat call") @@ -976,7 +977,7 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { } var status *rpc.Status - pinfo, status, err = h.getResourceInfoByReference(ctx, client, &ref) + pinfo, status, err = h.getResourceInfoByReference(ctx, client, ref) if err != nil { response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc stat request", err) return @@ -1157,7 +1158,7 @@ func (h *Handler) listSharesWithOthers(w http.ResponseWriter, r *http.Request) { response.WriteOCSError(w, r, response.MetaBadRequest.StatusCode, errParsingSpaceReference.Error(), errParsingSpaceReference) return } - filters, linkFilters, e = h.addFilters(w, r, &ref) + filters, linkFilters, e = h.addFilters(w, r, ref) if e != nil { // result has been written as part of addFilters return @@ -1275,7 +1276,7 @@ func (h *Handler) addFileInfo(ctx context.Context, s *conversions.ShareData, inf s.MimeType = parsedMt // TODO STime: &types.Timestamp{Seconds: info.Mtime.Seconds, Nanos: info.Mtime.Nanos}, // TODO Storage: int - s.ItemSource = storagespace.FormatResourceID(*info.Id) + s.ItemSource = storagespace.FormatResourceID(info.Id) s.FileSource = s.ItemSource s.Path = path.Join("/", info.Path) switch { @@ -1317,7 +1318,7 @@ func (h *Handler) addFileInfo(ctx context.Context, s *conversions.ShareData, inf s.StorageID = storageIDPrefix + s.FileTarget if info.ParentId != nil { - s.FileParent = storagespace.FormatResourceID(*info.ParentId) + s.FileParent = storagespace.FormatResourceID(info.ParentId) } // item type s.ItemType = conversions.ResourceType(info.GetType()).String() @@ -1333,7 +1334,7 @@ func (h *Handler) addFileInfo(ctx context.Context, s *conversions.ShareData, inf } if info.GetSpace().GetRoot() != nil { - s.SpaceID = storagespace.FormatResourceID(*info.GetSpace().GetRoot()) + s.SpaceID = storagespace.FormatResourceID(info.GetSpace().GetRoot()) } s.SpaceAlias = utils.ReadPlainFromOpaque(info.GetSpace().GetOpaque(), "spaceAlias") } diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/spaces.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/spaces.go index 35ccf7a65b..aa85d0ae1a 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/spaces.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/spaces.go @@ -150,14 +150,14 @@ func (h *Handler) addSpaceMember(w http.ResponseWriter, r *http.Request, info *p return } - if !isSpaceManagerRemaining(lgRes.Grants, grantee) { + if !isSpaceManagerRemaining(lgRes.Grants, &grantee) { response.WriteOCSError(w, r, http.StatusForbidden, "the space must have at least one manager", nil) return } // we have to send the update request to the gateway to give it a chance to invalidate its cache // TODO the gateway no longer should cache stuff because invalidation is to expensive. The decomposedfs already has a better cache. - if granteeExists(lgRes.Grants, grantee) { + if granteeExists(lgRes.Grants, &grantee) { if permissions != nil { fieldmask = append(fieldmask, "permissions") } @@ -257,7 +257,7 @@ func (h *Handler) removeSpaceMember(w http.ResponseWriter, r *http.Request, spac return } - if len(lgRes.Grants) == 1 || !isSpaceManagerRemaining(lgRes.Grants, grantee) { + if len(lgRes.Grants) == 1 || !isSpaceManagerRemaining(lgRes.Grants, &grantee) { response.WriteOCSError(w, r, http.StatusForbidden, "can't remove the last manager", nil) return } @@ -349,28 +349,28 @@ func (h *Handler) findProvider(ctx context.Context, ref *provider.Reference) (*r return res.Providers[0], nil } -func isSpaceManagerRemaining(grants []*provider.Grant, grantee provider.Grantee) bool { +func isSpaceManagerRemaining(grants []*provider.Grant, grantee *provider.Grantee) bool { for _, g := range grants { // RemoveGrant is currently the way to check for the manager role // If it is not set than the current grant is not for a manager and // we can just continue with the next one. - if g.Permissions.RemoveGrant && !isEqualGrantee(*g.Grantee, grantee) { + if g.Permissions.RemoveGrant && !isEqualGrantee(g.Grantee, grantee) { return true } } return false } -func granteeExists(grants []*provider.Grant, grantee provider.Grantee) bool { +func granteeExists(grants []*provider.Grant, grantee *provider.Grantee) bool { for _, g := range grants { - if isEqualGrantee(*g.Grantee, grantee) { + if isEqualGrantee(g.Grantee, grantee) { return true } } return false } -func isEqualGrantee(a, b provider.Grantee) bool { +func isEqualGrantee(a, b *provider.Grantee) bool { // Ideally we would want to use utils.GranteeEqual() // but the grants stored in the decomposedfs aren't complete (missing usertype and idp) // because of that the check would fail so we can only check the ... for now. diff --git a/pkg/app/provider/demo/demo.go b/pkg/app/provider/demo/demo.go index 9964eb0948..e5a83cf750 100644 --- a/pkg/app/provider/demo/demo.go +++ b/pkg/app/provider/demo/demo.go @@ -40,7 +40,7 @@ type demoProvider struct { } func (p *demoProvider) GetAppURL(ctx context.Context, resource *provider.ResourceInfo, viewMode appprovider.ViewMode, token, language string) (*appprovider.OpenInAppURL, error) { - url := fmt.Sprintf("