From 07bb122d474b8df3ec684378e48e09816a38ff1b Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Thu, 24 Apr 2025 13:45:04 +0100 Subject: [PATCH] drive: metadata: fix error when setting copy-requires-writer-permission on a folder This appears not to be allowed, so this fixes the problem by ignoring that metadata for a folder. Fixes #8517 --- backend/drive/drive.go | 4 ++-- backend/drive/metadata.go | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/backend/drive/drive.go b/backend/drive/drive.go index 4ef3b9bef..12be6cef9 100644 --- a/backend/drive/drive.go +++ b/backend/drive/drive.go @@ -1763,7 +1763,7 @@ func (f *Fs) createDir(ctx context.Context, pathID, leaf string, metadata fs.Met } var updateMetadata updateMetadataFn if len(metadata) > 0 { - updateMetadata, err = f.updateMetadata(ctx, createInfo, metadata, true) + updateMetadata, err = f.updateMetadata(ctx, createInfo, metadata, true, true) if err != nil { return nil, fmt.Errorf("create dir: failed to update metadata: %w", err) } @@ -1794,7 +1794,7 @@ func (f *Fs) updateDir(ctx context.Context, dirID string, metadata fs.Metadata) } dirID = actualID(dirID) updateInfo := &drive.File{} - updateMetadata, err := f.updateMetadata(ctx, updateInfo, metadata, true) + updateMetadata, err := f.updateMetadata(ctx, updateInfo, metadata, true, true) if err != nil { return nil, fmt.Errorf("update dir: failed to update metadata from source object: %w", err) } diff --git a/backend/drive/metadata.go b/backend/drive/metadata.go index c8afa7f8d..fea18f65a 100644 --- a/backend/drive/metadata.go +++ b/backend/drive/metadata.go @@ -508,7 +508,7 @@ type updateMetadataFn func(context.Context, *drive.File) error // // It returns a callback which should be called to finish the updates // after the data is uploaded. -func (f *Fs) updateMetadata(ctx context.Context, updateInfo *drive.File, meta fs.Metadata, update bool) (callback updateMetadataFn, err error) { +func (f *Fs) updateMetadata(ctx context.Context, updateInfo *drive.File, meta fs.Metadata, update, isFolder bool) (callback updateMetadataFn, err error) { callbackFns := []updateMetadataFn{} callback = func(ctx context.Context, info *drive.File) error { for _, fn := range callbackFns { @@ -533,7 +533,9 @@ func (f *Fs) updateMetadata(ctx context.Context, updateInfo *drive.File, meta fs } switch k { case "copy-requires-writer-permission": - if err := parseBool(&updateInfo.CopyRequiresWriterPermission); err != nil { + if isFolder { + fs.Debugf(f, "Ignoring %s=%s as can't set on folders", k, v) + } else if err := parseBool(&updateInfo.CopyRequiresWriterPermission); err != nil { return nil, err } case "writers-can-share": @@ -630,7 +632,7 @@ func (f *Fs) fetchAndUpdateMetadata(ctx context.Context, src fs.ObjectInfo, opti if err != nil { return nil, fmt.Errorf("failed to read metadata from source object: %w", err) } - callback, err = f.updateMetadata(ctx, updateInfo, meta, update) + callback, err = f.updateMetadata(ctx, updateInfo, meta, update, false) if err != nil { return nil, fmt.Errorf("failed to update metadata from source object: %w", err) }