diff --git a/changelog/unreleased/bump-reva.md b/changelog/unreleased/bump-reva.md new file mode 100644 index 00000000000..c03cffa8463 --- /dev/null +++ b/changelog/unreleased/bump-reva.md @@ -0,0 +1,3 @@ +Enhancement: Bump reva + +https://github.com/owncloud/ocis/pull/9621 diff --git a/go.mod b/go.mod index af348832d0a..d9e3f316934 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/cenkalti/backoff v2.2.1+incompatible github.com/coreos/go-oidc/v3 v3.10.0 github.com/cs3org/go-cs3apis v0.0.0-20240425114016-d2cb31692b4e - github.com/cs3org/reva/v2 v2.21.1-0.20240711153523-f9083e96d2ea + github.com/cs3org/reva/v2 v2.21.1-0.20240716111044-11ee452e19a7 github.com/dhowden/tag v0.0.0-20230630033851-978a0926ee25 github.com/dutchcoders/go-clamd v0.0.0-20170520113014-b970184f4d9e github.com/egirna/icap-client v0.1.1 diff --git a/go.sum b/go.sum index 00a3b13ce28..e78eee350db 100644 --- a/go.sum +++ b/go.sum @@ -1025,8 +1025,8 @@ github.com/crewjam/saml v0.4.14 h1:g9FBNx62osKusnFzs3QTN5L9CVA/Egfgm+stJShzw/c= github.com/crewjam/saml v0.4.14/go.mod h1:UVSZCf18jJkk6GpWNVqcyQJMD5HsRugBPf4I1nl2mME= github.com/cs3org/go-cs3apis v0.0.0-20240425114016-d2cb31692b4e h1:Cm2l8m2riLa79eh7V2wHd1Ra7wR3TbngmeLZBJ9MxTU= github.com/cs3org/go-cs3apis v0.0.0-20240425114016-d2cb31692b4e/go.mod h1:yyP8PRo0EZou3nSH7H4qjlzQwaydPeIRNgX50npQHpE= -github.com/cs3org/reva/v2 v2.21.1-0.20240711153523-f9083e96d2ea h1:fMT9FvEsfR+OLS4SWNNkxgUrCtgAuJABRTK+f+VRETk= -github.com/cs3org/reva/v2 v2.21.1-0.20240711153523-f9083e96d2ea/go.mod h1:+5pteFc4ymQnhYG2cOtg/jzaIZKgxrgIeH0D4fuC6gA= +github.com/cs3org/reva/v2 v2.21.1-0.20240716111044-11ee452e19a7 h1:3iy7UjtZQ0KtkuC0SM0HI7GF4nnwQGUCVzm9Vfrwh50= +github.com/cs3org/reva/v2 v2.21.1-0.20240716111044-11ee452e19a7/go.mod h1:+5pteFc4ymQnhYG2cOtg/jzaIZKgxrgIeH0D4fuC6gA= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= diff --git a/vendor/github.com/cs3org/reva/v2/internal/grpc/services/gateway/storageprovider.go b/vendor/github.com/cs3org/reva/v2/internal/grpc/services/gateway/storageprovider.go index 8f508645ba3..978a687831b 100644 --- a/vendor/github.com/cs3org/reva/v2/internal/grpc/services/gateway/storageprovider.go +++ b/vendor/github.com/cs3org/reva/v2/internal/grpc/services/gateway/storageprovider.go @@ -841,7 +841,7 @@ func (s *svc) Unlock(ctx context.Context, req *provider.UnlockRequest) (*provide // Stat returns the Resoure info for a given resource by forwarding the request to the responsible provider. func (s *svc) Stat(ctx context.Context, req *provider.StatRequest) (*provider.StatResponse, error) { - c, _, ref, err := s.findAndUnwrapUnique(ctx, req.Ref) + c, _, ref, err := s.findAndUnwrap(ctx, req.Ref) if err != nil { return &provider.StatResponse{ Status: status.NewNotFound(ctx, fmt.Sprintf("gateway could not find space for ref=%+v", req.Ref)), @@ -1019,7 +1019,7 @@ func (s *svc) GetQuota(ctx context.Context, req *gateway.GetQuotaRequest) (*prov // - contains the provider path, which is the mount point of the provider // - may contain a list of storage spaces with their id and space path func (s *svc) find(ctx context.Context, ref *provider.Reference) (provider.ProviderAPIClient, *registry.ProviderInfo, error) { - p, err := s.findSpaces(ctx, ref) + p, err := s.findSingleSpace(ctx, ref) if err != nil { return nil, nil, err } @@ -1028,32 +1028,20 @@ func (s *svc) find(ctx context.Context, ref *provider.Reference) (provider.Provi return client, p[0], err } -// findSpacesProvider looks up the provider that is responsible for the given request +// findSpacesProvider looks up the spaces provider that is responsible for the given request // It will return a client that the caller can use to make the call, as well as the ProviderInfo. It: // - contains the provider path, which is the mount point of the provider // - may contain a list of storage spaces with their id and space path func (s *svc) findSpacesProvider(ctx context.Context, ref *provider.Reference) (provider.SpacesAPIClient, *registry.ProviderInfo, error) { - p, err := s.findSpaces(ctx, ref) - if err != nil { - return nil, nil, err - } - - client, err := s.getSpacesProviderClient(ctx, p[0]) - return client, p[0], err -} - -func (s *svc) findUnique(ctx context.Context, ref *provider.Reference) (provider.ProviderAPIClient, *registry.ProviderInfo, error) { p, err := s.findSingleSpace(ctx, ref) if err != nil { return nil, nil, err } - client, err := s.getStorageProviderClient(ctx, p[0]) + client, err := s.getSpacesProviderClient(ctx, p[0]) return client, p[0], err } -// FIXME findAndUnwrap currently just returns the first provider ... which may not be what is needed. -// for the ListRecycle call we need an exact match, for Stat and List we need to query all related providers func (s *svc) findAndUnwrap(ctx context.Context, ref *provider.Reference) (provider.ProviderAPIClient, *registry.ProviderInfo, *provider.Reference, error) { c, p, err := s.find(ctx, ref) if err != nil { @@ -1075,27 +1063,6 @@ func (s *svc) findAndUnwrap(ctx context.Context, ref *provider.Reference) (provi return c, p, relativeReference, nil } -func (s *svc) findAndUnwrapUnique(ctx context.Context, ref *provider.Reference) (provider.ProviderAPIClient, *registry.ProviderInfo, *provider.Reference, error) { - c, p, err := s.findUnique(ctx, ref) - if err != nil { - return nil, nil, nil, err - } - - var ( - root *provider.ResourceId - mountPath string - ) - for _, space := range decodeSpaces(p) { - mountPath = decodePath(space) - root = space.Root - break // TODO can there be more than one space for a path? - } - - relativeReference := unwrap(ref, mountPath, root) - - return c, p, relativeReference, nil -} - func (s *svc) getSpacesProviderClient(_ context.Context, p *registry.ProviderInfo) (provider.SpacesAPIClient, error) { c, err := pool.GetSpacesProviderServiceClient(p.Address) if err != nil { @@ -1131,39 +1098,6 @@ func (s *svc) getStorageRegistryClient(_ context.Context, address string) (regis }, nil } -func (s *svc) findSpaces(ctx context.Context, ref *provider.Reference) ([]*registry.ProviderInfo, error) { - switch { - case ref == nil: - return nil, errtypes.BadRequest("missing reference") - case ref.ResourceId != nil: - if ref.ResourceId.OpaqueId == "" { - ref.ResourceId.OpaqueId = ref.ResourceId.SpaceId - } - case ref.Path != "": // TODO implement a mount path cache in the registry? - // nothing to do here either - default: - return nil, errtypes.BadRequest("invalid reference, at least path or id must be set") - } - - filters := map[string]string{ - "mask": "root", // we only need the root for routing - "path": ref.Path, - } - if ref.ResourceId != nil { - filters["storage_id"] = ref.ResourceId.StorageId - filters["space_id"] = ref.ResourceId.SpaceId - filters["opaque_id"] = ref.ResourceId.OpaqueId - } - - listReq := ®istry.ListStorageProvidersRequest{ - Opaque: &typesv1beta1.Opaque{Map: make(map[string]*typesv1beta1.OpaqueEntry)}, - } - - sdk.EncodeOpaqueMap(listReq.Opaque, filters) - - return s.findProvider(ctx, listReq) -} - func (s *svc) findSingleSpace(ctx context.Context, ref *provider.Reference) ([]*registry.ProviderInfo, error) { switch { case ref == nil: diff --git a/vendor/github.com/cs3org/reva/v2/internal/http/services/archiver/handler.go b/vendor/github.com/cs3org/reva/v2/internal/http/services/archiver/handler.go index 12c58aaebab..d093044e057 100644 --- a/vendor/github.com/cs3org/reva/v2/internal/http/services/archiver/handler.go +++ b/vendor/github.com/cs3org/reva/v2/internal/http/services/archiver/handler.go @@ -41,7 +41,6 @@ import ( "github.com/cs3org/reva/v2/pkg/storage/utils/walker" "github.com/cs3org/reva/v2/pkg/storagespace" "github.com/gdexlab/go-render/render" - ua "github.com/mileusna/useragent" "github.com/mitchellh/mapstructure" "github.com/rs/zerolog" ) @@ -232,6 +231,10 @@ func (s *svc) Handler() http.Handler { if !ok { ids = []string{} } + format := v.Get("output-format") + if format == "" { + format = "zip" + } resources, err := s.getResources(ctx, paths, ids) if err != nil { @@ -248,26 +251,24 @@ func (s *svc) Handler() http.Handler { return } - userAgent := ua.Parse(r.Header.Get("User-Agent")) - archName := s.config.Name - if userAgent.OS == ua.Windows { - archName += ".zip" - } else { + if format == "tar" { archName += ".tar" + } else { + archName += ".zip" } - s.log.Debug().Msg("Requested the following resoucres to archive: " + render.Render(resources)) + s.log.Debug().Msg("Requested the following resources to archive: " + render.Render(resources)) rw.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", archName)) rw.Header().Set("Content-Transfer-Encoding", "binary") // create the archive var closeArchive func() - if userAgent.OS == ua.Windows { - closeArchive, err = arch.CreateZip(ctx, rw) - } else { + if format == "tar" { closeArchive, err = arch.CreateTar(ctx, rw) + } else { + closeArchive, err = arch.CreateZip(ctx, rw) } defer closeArchive() diff --git a/vendor/github.com/cs3org/reva/v2/pkg/storage/registry/spaces/spaces.go b/vendor/github.com/cs3org/reva/v2/pkg/storage/registry/spaces/spaces.go index 79a09e171e8..0e964633225 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/storage/registry/spaces/spaces.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/storage/registry/spaces/spaces.go @@ -264,7 +264,7 @@ func (r *registry) GetProvider(ctx context.Context, space *providerpb.StorageSpa // matches = /foo/bar <=> /foo/bar -> list(spaceid, .) // below = /foo/bar/bif <=> /foo/bar -> list(spaceid, ./bif) func (r *registry) ListProviders(ctx context.Context, filters map[string]string) ([]*registrypb.ProviderInfo, error) { - b, _ := strconv.ParseBool(filters["unique"]) + unique, _ := strconv.ParseBool(filters["unique"]) unrestricted, _ := strconv.ParseBool(filters["unrestricted"]) mask := filters["mask"] switch { @@ -284,7 +284,7 @@ func (r *registry) ListProviders(ctx context.Context, filters map[string]string) return r.findProvidersForResource(ctx, id, findMountpoint, findGrant, unrestricted, mask), nil case filters["path"] != "": - return r.findProvidersForAbsolutePathReference(ctx, filters["path"], b, unrestricted, mask), nil + return r.findProvidersForAbsolutePathReference(ctx, filters["path"], unique, unrestricted, mask), nil case len(filters) == 0: // return all providers return r.findAllProviders(ctx, mask), nil diff --git a/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/upload/store.go b/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/upload/store.go index f30fee224f6..cd5e3a60912 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/upload/store.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/upload/store.go @@ -354,8 +354,31 @@ func (store OcisStore) updateExistingNode(ctx context.Context, session *OcisSess versionPath := session.store.lu.InternalPath(spaceID, n.ID+node.RevisionIDDelimiter+oldNodeMtime.UTC().Format(time.RFC3339Nano)) // create version node - if _, err := os.Create(versionPath); err != nil { - return unlock, err + _, err := os.OpenFile(versionPath, os.O_CREATE|os.O_EXCL, 0600) + if err != nil { + if !errors.Is(err, os.ErrExist) { + return unlock, err + } + + // a revision with this mtime does already exist. + // If the blobs are the same we can just delete the old one + if err := validateChecksums(ctx, old, session, versionPath); err != nil { + return unlock, err + } + + // delete old blob + bID, err := session.store.lu.ReadBlobIDAttr(ctx, versionPath) + if err != nil { + return unlock, err + } + if err := session.store.tp.DeleteBlob(&node.Node{BlobID: bID, SpaceID: n.SpaceID}); err != nil { + return unlock, err + } + + // clean revision file + if _, err := os.Create(versionPath); err != nil { + return unlock, err + } } // copy blob metadata to version node @@ -379,3 +402,29 @@ func (store OcisStore) updateExistingNode(ctx context.Context, session *OcisSess return unlock, nil } + +func validateChecksums(ctx context.Context, n *node.Node, session *OcisSession, versionPath string) error { + for _, t := range []string{"md5", "sha1", "adler32"} { + key := prefixes.ChecksumPrefix + t + + checksum, err := n.Xattr(ctx, key) + if err != nil { + return err + } + + revisionChecksum, err := session.store.lu.MetadataBackend().Get(ctx, versionPath, key) + if err != nil { + return err + } + + if string(checksum) == "" || string(revisionChecksum) == "" { + return errors.New("checksum not found") + } + + if string(checksum) != string(revisionChecksum) { + return errors.New("checksum mismatch") + } + } + + return nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 5eb65ec9178..7fa20163a0e 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -366,7 +366,7 @@ github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1 github.com/cs3org/go-cs3apis/cs3/storage/registry/v1beta1 github.com/cs3org/go-cs3apis/cs3/tx/v1beta1 github.com/cs3org/go-cs3apis/cs3/types/v1beta1 -# github.com/cs3org/reva/v2 v2.21.1-0.20240711153523-f9083e96d2ea +# github.com/cs3org/reva/v2 v2.21.1-0.20240716111044-11ee452e19a7 ## explicit; go 1.21 github.com/cs3org/reva/v2/cmd/revad/internal/grace github.com/cs3org/reva/v2/cmd/revad/runtime