From 0903a01fb8e03f4a6c906ab135da1110e4521693 Mon Sep 17 00:00:00 2001 From: Cliff Frey Date: Thu, 27 Nov 2025 08:58:07 -0800 Subject: [PATCH 001/130] azureblob: add metadata and tags support across upload and copy paths This change adds first-class metadata support to the Azure Blob backend, including headers, user metadata, tags, and modtime overrides, and wires it through uploads and server-side copies. There is a behavior change in that rclone will now set the "mtime" custom metadata when doing server side copies to azure and the `--metadata` argument is given. - Map standard headers: cache-control, content-disposition, content-encoding, content-language, content-type to corresponding x-ms-blob-* HTTP headers. - Map user metadata: any non-reserved keys (excluding x-ms-*) are sent as blob user metadata. Keys are normalized to lowercase for consistency. - Support tags: parse `x-ms-tags` as a comma-separated list of key=value pairs and apply them on uploads and copies. - Support mtime override: accept `mtime` in metadata (RFC3339/RFC3339Nano) to override the stored modtime persisted in user metadata. --- backend/azureblob/azureblob.go | 436 ++++++++++++++++++- backend/azureblob/azureblob_internal_test.go | 418 ++++++++++++++++++ docs/content/azureblob.md | 20 + fstest/fstests/fstests.go | 2 +- 4 files changed, 856 insertions(+), 20 deletions(-) diff --git a/backend/azureblob/azureblob.go b/backend/azureblob/azureblob.go index 28df222061325..6b72fc11b97b3 100644 --- a/backend/azureblob/azureblob.go +++ b/backend/azureblob/azureblob.go @@ -86,12 +86,56 @@ var ( metadataMu sync.Mutex ) +// system metadata keys which this backend owns +var systemMetadataInfo = map[string]fs.MetadataHelp{ + "cache-control": { + Help: "Cache-Control header", + Type: "string", + Example: "no-cache", + }, + "content-disposition": { + Help: "Content-Disposition header", + Type: "string", + Example: "inline", + }, + "content-encoding": { + Help: "Content-Encoding header", + Type: "string", + Example: "gzip", + }, + "content-language": { + Help: "Content-Language header", + Type: "string", + Example: "en-US", + }, + "content-type": { + Help: "Content-Type header", + Type: "string", + Example: "text/plain", + }, + "tier": { + Help: "Tier of the object", + Type: "string", + Example: "Hot", + ReadOnly: true, + }, + "mtime": { + Help: "Time of last modification, read from rclone metadata", + Type: "RFC 3339", + Example: "2006-01-02T15:04:05.999999999Z07:00", + }, +} + // Register with Fs func init() { fs.Register(&fs.RegInfo{ Name: "azureblob", Description: "Microsoft Azure Blob Storage", NewFs: NewFs, + MetadataInfo: &fs.MetadataInfo{ + System: systemMetadataInfo, + Help: `User metadata is stored as x-ms-meta- keys. Azure metadata keys are case insensitive and are always returned in lower case.`, + }, Options: []fs.Option{{ Name: "account", Help: `Azure Storage Account Name. @@ -810,6 +854,9 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e f.features = (&fs.Features{ ReadMimeType: true, WriteMimeType: true, + ReadMetadata: true, + WriteMetadata: true, + UserMetadata: true, BucketBased: true, BucketBasedRootOK: true, SetTier: true, @@ -1157,6 +1204,289 @@ func (o *Object) updateMetadataWithModTime(modTime time.Time) { o.meta[modTimeKey] = modTime.Format(timeFormatOut) } +// parseXMsTags parses the value of the x-ms-tags header into a map. +// It expects comma-separated key=value pairs. Whitespace around keys and +// values is trimmed. Empty pairs and empty keys are rejected. +func parseXMsTags(s string) (map[string]string, error) { + if strings.TrimSpace(s) == "" { + return map[string]string{}, nil + } + out := make(map[string]string) + parts := strings.Split(s, ",") + for _, p := range parts { + p = strings.TrimSpace(p) + if p == "" { + continue + } + kv := strings.SplitN(p, "=", 2) + if len(kv) != 2 { + return nil, fmt.Errorf("invalid tag %q", p) + } + k := strings.TrimSpace(kv[0]) + v := strings.TrimSpace(kv[1]) + if k == "" { + return nil, fmt.Errorf("invalid tag key in %q", p) + } + out[k] = v + } + return out, nil +} + +// mapMetadataToAzure maps a generic metadata map to Azure HTTP headers, +// user metadata, tags and optional modTime override. +// Reserved x-ms-* keys (except x-ms-tags) are ignored for user metadata. +// +// Pass a logger to surface non-fatal parsing issues (e.g. bad mtime). +func mapMetadataToAzure(meta map[string]string, logf func(string, ...any)) (headers blob.HTTPHeaders, userMeta map[string]*string, tags map[string]string, modTime *time.Time, err error) { + if meta == nil { + return headers, nil, nil, nil, nil + } + tmp := make(map[string]string) + for k, v := range meta { + lowerKey := strings.ToLower(k) + switch lowerKey { + case "cache-control": + headers.BlobCacheControl = pString(v) + case "content-disposition": + headers.BlobContentDisposition = pString(v) + case "content-encoding": + headers.BlobContentEncoding = pString(v) + case "content-language": + headers.BlobContentLanguage = pString(v) + case "content-type": + headers.BlobContentType = pString(v) + case "x-ms-tags": + parsed, perr := parseXMsTags(v) + if perr != nil { + return headers, nil, nil, nil, perr + } + // allocate only if there are tags + if len(parsed) > 0 { + tags = parsed + } + case "mtime": + // Accept multiple layouts for tolerance + var parsed time.Time + var pErr error + for _, layout := range []string{time.RFC3339Nano, time.RFC3339, timeFormatOut} { + parsed, pErr = time.Parse(layout, v) + if pErr == nil { + modTime = &parsed + break + } + } + // Log and ignore if unparseable + if modTime == nil && logf != nil { + logf("metadata: couldn't parse mtime %q: %v", v, pErr) + } + case "tier": + // ignore - handled elsewhere + default: + // Filter out other reserved headers so they don't end up as user metadata + if strings.HasPrefix(lowerKey, "x-ms-") { + continue + } + tmp[lowerKey] = v + } + } + userMeta = toAzureMetaPtr(tmp) + return headers, userMeta, tags, modTime, nil +} + +// toAzureMetaPtr converts a map[string]string to map[string]*string as used by Azure SDK +func toAzureMetaPtr(in map[string]string) map[string]*string { + if len(in) == 0 { + return nil + } + out := make(map[string]*string, len(in)) + for k, v := range in { + vv := v + out[k] = &vv + } + return out +} + +// assembleCopyParams prepares headers, metadata and tags for copy operations. +// +// It starts from the source properties, optionally overlays mapped metadata +// from rclone's metadata options, ensures mtime presence when mapping is +// enabled, and returns whether mapping was actually requested (hadMapping). +// assembleCopyParams prepares headers, metadata and tags for copy operations. +// +// If includeBaseMeta is true, start user metadata from the source's metadata +// and overlay mapped values. This matches multipart copy commit behavior. +// If false, only include mapped user metadata (no source baseline) which +// matches previous singlepart StartCopyFromURL semantics. +func assembleCopyParams(ctx context.Context, f *Fs, src fs.Object, srcProps *blob.GetPropertiesResponse, includeBaseMeta bool) (headers blob.HTTPHeaders, meta map[string]*string, tags map[string]string, hadMapping bool, err error) { + // Start from source properties + headers = blob.HTTPHeaders{ + BlobCacheControl: srcProps.CacheControl, + BlobContentDisposition: srcProps.ContentDisposition, + BlobContentEncoding: srcProps.ContentEncoding, + BlobContentLanguage: srcProps.ContentLanguage, + BlobContentMD5: srcProps.ContentMD5, + BlobContentType: srcProps.ContentType, + } + // Optionally deep copy user metadata pointers from source. Normalise keys to + // lower-case to avoid duplicate x-ms-meta headers when we later inject/overlay + // metadata (Azure treats keys case-insensitively but Go's http.Header will + // join duplicate keys into a comma separated list, which breaks shared-key + // signing). + if includeBaseMeta && len(srcProps.Metadata) > 0 { + meta = make(map[string]*string, len(srcProps.Metadata)) + for k, v := range srcProps.Metadata { + if v != nil { + vv := *v + meta[strings.ToLower(k)] = &vv + } + } + } + + // Only consider mapping if metadata pipeline is enabled + if fs.GetConfig(ctx).Metadata { + mapped, mapErr := fs.GetMetadataOptions(ctx, f, src, fs.MetadataAsOpenOptions(ctx)) + if mapErr != nil { + return headers, meta, nil, false, fmt.Errorf("failed to map metadata: %w", mapErr) + } + if mapped != nil { + // Map rclone metadata to Azure shapes + mappedHeaders, userMeta, mappedTags, mappedModTime, herr := mapMetadataToAzure(mapped, func(format string, args ...any) { fs.Debugf(f, format, args...) }) + if herr != nil { + return headers, meta, nil, false, fmt.Errorf("metadata mapping: %w", herr) + } + hadMapping = true + // Overlay headers (only non-nil) + if mappedHeaders.BlobCacheControl != nil { + headers.BlobCacheControl = mappedHeaders.BlobCacheControl + } + if mappedHeaders.BlobContentDisposition != nil { + headers.BlobContentDisposition = mappedHeaders.BlobContentDisposition + } + if mappedHeaders.BlobContentEncoding != nil { + headers.BlobContentEncoding = mappedHeaders.BlobContentEncoding + } + if mappedHeaders.BlobContentLanguage != nil { + headers.BlobContentLanguage = mappedHeaders.BlobContentLanguage + } + if mappedHeaders.BlobContentType != nil { + headers.BlobContentType = mappedHeaders.BlobContentType + } + // Overlay user metadata + if len(userMeta) > 0 { + if meta == nil { + meta = make(map[string]*string, len(userMeta)) + } + for k, v := range userMeta { + meta[k] = v + } + } + // Apply tags if any + if len(mappedTags) > 0 { + tags = mappedTags + } + // Ensure mtime present using mapped or source time + if _, ok := meta[modTimeKey]; !ok { + when := src.ModTime(ctx) + if mappedModTime != nil { + when = *mappedModTime + } + val := when.Format(time.RFC3339Nano) + if meta == nil { + meta = make(map[string]*string, 1) + } + meta[modTimeKey] = &val + } + // Ensure content-type fallback to source if not set by mapper + if headers.BlobContentType == nil { + headers.BlobContentType = srcProps.ContentType + } + } else { + // Mapping enabled but not provided: ensure mtime present based on source ModTime + if _, ok := meta[modTimeKey]; !ok { + when := src.ModTime(ctx) + val := when.Format(time.RFC3339Nano) + if meta == nil { + meta = make(map[string]*string, 1) + } + meta[modTimeKey] = &val + } + } + } + + return headers, meta, tags, hadMapping, nil +} + +// applyMappedMetadata applies mapped metadata and headers to the object state for uploads. +// +// It reads `--metadata`, `--metadata-set`, and `--metadata-mapper` outputs via fs.GetMetadataOptions +// and updates o.meta, o.tags and ui.httpHeaders accordingly. +func (o *Object) applyMappedMetadata(ctx context.Context, src fs.ObjectInfo, ui *uploadInfo, options []fs.OpenOption) (modTime time.Time, err error) { + // Start from the source modtime; may be overridden by metadata + modTime = src.ModTime(ctx) + + // Fetch mapped metadata if --metadata is enabled + meta, err := fs.GetMetadataOptions(ctx, o.fs, src, options) + if err != nil { + return modTime, err + } + if meta == nil { + // No metadata processing requested + return modTime, nil + } + + // Map metadata using common helper + headers, userMeta, tags, mappedModTime, err := mapMetadataToAzure(meta, func(format string, args ...any) { fs.Debugf(o, format, args...) }) + if err != nil { + return modTime, err + } + // Merge headers into ui + if headers.BlobCacheControl != nil { + ui.httpHeaders.BlobCacheControl = headers.BlobCacheControl + } + if headers.BlobContentDisposition != nil { + ui.httpHeaders.BlobContentDisposition = headers.BlobContentDisposition + } + if headers.BlobContentEncoding != nil { + ui.httpHeaders.BlobContentEncoding = headers.BlobContentEncoding + } + if headers.BlobContentLanguage != nil { + ui.httpHeaders.BlobContentLanguage = headers.BlobContentLanguage + } + if headers.BlobContentType != nil { + ui.httpHeaders.BlobContentType = headers.BlobContentType + } + + // Apply user metadata to o.meta with a single critical section + if len(userMeta) > 0 { + metadataMu.Lock() + if o.meta == nil { + o.meta = make(map[string]string, len(userMeta)) + } + for k, v := range userMeta { + if v != nil { + o.meta[k] = *v + } + } + metadataMu.Unlock() + } + + // Apply tags + if len(tags) > 0 { + if o.tags == nil { + o.tags = make(map[string]string, len(tags)) + } + for k, v := range tags { + o.tags[k] = v + } + } + + if mappedModTime != nil { + modTime = *mappedModTime + } + + return modTime, nil +} + // Returns whether file is a directory marker or not func isDirectoryMarker(size int64, metadata map[string]*string, remote string) bool { // Directory markers are 0 length @@ -1951,18 +2281,19 @@ func (f *Fs) copyMultipart(ctx context.Context, remote, dstContainer, dstPath st return nil, err } - // Convert metadata from source object + // Prepare metadata/headers/tags for destination + // For multipart commit, include base metadata from source then overlay mapped + commitHeaders, commitMeta, commitTags, _, err := assembleCopyParams(ctx, f, src, srcProperties, true) + if err != nil { + return nil, fmt.Errorf("multipart copy: %w", err) + } + + // Convert metadata from source or mapper options := blockblob.CommitBlockListOptions{ - Metadata: srcProperties.Metadata, - Tier: parseTier(f.opt.AccessTier), - HTTPHeaders: &blob.HTTPHeaders{ - BlobCacheControl: srcProperties.CacheControl, - BlobContentDisposition: srcProperties.ContentDisposition, - BlobContentEncoding: srcProperties.ContentEncoding, - BlobContentLanguage: srcProperties.ContentLanguage, - BlobContentMD5: srcProperties.ContentMD5, - BlobContentType: srcProperties.ContentType, - }, + Metadata: commitMeta, + Tags: commitTags, + Tier: parseTier(f.opt.AccessTier), + HTTPHeaders: &commitHeaders, } // Finalise the upload session @@ -1993,10 +2324,36 @@ func (f *Fs) copySinglepart(ctx context.Context, remote, dstContainer, dstPath s return nil, fmt.Errorf("single part copy: source auth: %w", err) } - // Start the copy + // Prepare mapped metadata/tags/headers if requested options := blob.StartCopyFromURLOptions{ Tier: parseTier(f.opt.AccessTier), } + var postHeaders *blob.HTTPHeaders + // Read source properties and assemble params; this also handles the case when mapping is disabled + srcProps, err := src.readMetaDataAlways(ctx) + if err != nil { + return nil, fmt.Errorf("single part copy: read source properties: %w", err) + } + // For singlepart copy, do not include base metadata from source in StartCopyFromURL + headers, meta, tags, hadMapping, aerr := assembleCopyParams(ctx, f, src, srcProps, false) + if aerr != nil { + return nil, fmt.Errorf("single part copy: %w", aerr) + } + // Apply tags and post-copy headers only when mapping requested changes + if len(tags) > 0 { + options.BlobTags = make(map[string]string, len(tags)) + for k, v := range tags { + options.BlobTags[k] = v + } + } + if hadMapping { + // Only set metadata explicitly when mapping was requested; otherwise + // let the service copy source metadata (including mtime) automatically. + if len(meta) > 0 { + options.Metadata = meta + } + postHeaders = &headers + } var startCopy blob.StartCopyFromURLResponse err = f.pacer.Call(func() (bool, error) { startCopy, err = dstBlobSVC.StartCopyFromURL(ctx, srcURL, &options) @@ -2026,6 +2383,16 @@ func (f *Fs) copySinglepart(ctx context.Context, remote, dstContainer, dstPath s pollTime = min(2*pollTime, time.Second) } + // If mapper requested header changes, set them post-copy + if postHeaders != nil { + blb := f.getBlobSVC(dstContainer, dstPath) + _, setErr := blb.SetHTTPHeaders(ctx, *postHeaders, nil) + if setErr != nil { + return nil, fmt.Errorf("single part copy: failed to set headers: %w", setErr) + } + } + // Metadata (when requested) is set via StartCopyFromURL options.Metadata + return f.NewObject(ctx, remote) } @@ -2157,6 +2524,35 @@ func (o *Object) getMetadata() (metadata map[string]*string) { return metadata } +// Metadata returns metadata for an object +// +// It returns a combined view of system and user metadata. +func (o *Object) Metadata(ctx context.Context) (fs.Metadata, error) { + // Ensure metadata is loaded + if err := o.readMetaData(ctx); err != nil { + return nil, err + } + + m := fs.Metadata{} + + // System metadata we expose + if !o.modTime.IsZero() { + m["mtime"] = o.modTime.Format(time.RFC3339Nano) + } + if o.accessTier != "" { + m["tier"] = string(o.accessTier) + } + + // Merge user metadata (already lower-cased keys) + metadataMu.Lock() + for k, v := range o.meta { + m[k] = v + } + metadataMu.Unlock() + + return m, nil +} + // decodeMetaDataFromPropertiesResponse sets the metadata from the data passed in // // Sets @@ -2995,17 +3391,19 @@ func (o *Object) prepareUpload(ctx context.Context, src fs.ObjectInfo, options [ // containerPath = containerPath[:len(containerPath)-1] // } - // Update Mod time - o.updateMetadataWithModTime(src.ModTime(ctx)) - if err != nil { - return ui, err - } - - // Create the HTTP headers for the upload + // Start with default content-type based on source ui.httpHeaders = blob.HTTPHeaders{ BlobContentType: pString(fs.MimeType(ctx, src)), } + // Apply mapped metadata/headers/tags if requested + modTime, err := o.applyMappedMetadata(ctx, src, &ui, options) + if err != nil { + return ui, err + } + // Ensure mtime is set in metadata based on possibly overridden modTime + o.updateMetadataWithModTime(modTime) + // Compute the Content-MD5 of the file. As we stream all uploads it // will be set in PutBlockList API call using the 'x-ms-blob-content-md5' header if !o.fs.opt.DisableCheckSum { diff --git a/backend/azureblob/azureblob_internal_test.go b/backend/azureblob/azureblob_internal_test.go index 67669775dbd78..b2fc0f7d5f614 100644 --- a/backend/azureblob/azureblob_internal_test.go +++ b/backend/azureblob/azureblob_internal_test.go @@ -5,11 +5,16 @@ package azureblob import ( "context" "encoding/base64" + "fmt" + "net/http" "strings" "testing" + "time" + "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob" "github.com/rclone/rclone/fs" + "github.com/rclone/rclone/fs/object" "github.com/rclone/rclone/fstest" "github.com/rclone/rclone/fstest/fstests" "github.com/rclone/rclone/lib/random" @@ -148,4 +153,417 @@ func (f *Fs) testWriteUncommittedBlocks(t *testing.T) { func (f *Fs) InternalTest(t *testing.T) { t.Run("Features", f.testFeatures) t.Run("WriteUncommittedBlocks", f.testWriteUncommittedBlocks) + t.Run("Metadata", f.testMetadataPaths) +} + +// helper to read blob properties for an object +func getProps(ctx context.Context, t *testing.T, o fs.Object) *blob.GetPropertiesResponse { + ao := o.(*Object) + props, err := ao.readMetaDataAlways(ctx) + require.NoError(t, err) + return props +} + +// helper to assert select headers and user metadata +func assertHeadersAndMetadata(t *testing.T, props *blob.GetPropertiesResponse, want map[string]string, wantUserMeta map[string]string) { + // Headers + get := func(p *string) string { + if p == nil { + return "" + } + return *p + } + if v, ok := want["content-type"]; ok { + assert.Equal(t, v, get(props.ContentType), "content-type") + } + if v, ok := want["cache-control"]; ok { + assert.Equal(t, v, get(props.CacheControl), "cache-control") + } + if v, ok := want["content-disposition"]; ok { + assert.Equal(t, v, get(props.ContentDisposition), "content-disposition") + } + if v, ok := want["content-encoding"]; ok { + assert.Equal(t, v, get(props.ContentEncoding), "content-encoding") + } + if v, ok := want["content-language"]; ok { + assert.Equal(t, v, get(props.ContentLanguage), "content-language") + } + // User metadata (case-insensitive keys from service) + norm := make(map[string]*string, len(props.Metadata)) + for kk, vv := range props.Metadata { + norm[strings.ToLower(kk)] = vv + } + for k, v := range wantUserMeta { + pv, ok := norm[strings.ToLower(k)] + if assert.True(t, ok, fmt.Sprintf("missing user metadata key %q", k)) { + if pv == nil { + assert.Equal(t, v, "", k) + } else { + assert.Equal(t, v, *pv, k) + } + } else { + // Log available keys for diagnostics + keys := make([]string, 0, len(props.Metadata)) + for kk := range props.Metadata { + keys = append(keys, kk) + } + t.Logf("available user metadata keys: %v", keys) + } + } +} + +// helper to read blob tags for an object +func getTagsMap(ctx context.Context, t *testing.T, o fs.Object) map[string]string { + ao := o.(*Object) + blb := ao.getBlobSVC() + resp, err := blb.GetTags(ctx, nil) + require.NoError(t, err) + out := make(map[string]string) + for _, tag := range resp.BlobTagSet { + if tag.Key != nil { + k := *tag.Key + v := "" + if tag.Value != nil { + v = *tag.Value + } + out[k] = v + } + } + return out +} + +// Test metadata across different write paths +func (f *Fs) testMetadataPaths(t *testing.T) { + ctx := context.Background() + if testing.Short() { + t.Skip("skipping in short mode") + } + + // Common expected metadata and headers + baseMeta := fs.Metadata{ + "cache-control": "no-cache", + "content-disposition": "inline", + "content-language": "en-US", + // Note: Don't set content-encoding here to avoid download decoding differences + // We will set a custom user metadata key + "potato": "royal", + // and modtime + "mtime": fstest.Time("2009-05-06T04:05:06.499999999Z").Format(time.RFC3339Nano), + } + + // Singlepart upload + t.Run("PutSinglepart", func(t *testing.T) { + // size less than chunk size + contents := random.String(int(f.opt.ChunkSize / 2)) + item := fstest.NewItem("meta-single.txt", contents, fstest.Time("2001-05-06T04:05:06.499999999Z")) + // override content-type via metadata mapping + meta := fs.Metadata{} + meta.Merge(baseMeta) + meta["content-type"] = "text/plain" + obj := fstests.PutTestContentsMetadata(ctx, t, f, &item, true, contents, true, "text/html", meta) + defer func() { _ = obj.Remove(ctx) }() + + props := getProps(ctx, t, obj) + assertHeadersAndMetadata(t, props, map[string]string{ + "content-type": "text/plain", + "cache-control": "no-cache", + "content-disposition": "inline", + "content-language": "en-US", + }, map[string]string{ + "potato": "royal", + }) + _ = http.StatusOK // keep import for parity but don't inspect RawResponse + }) + + // Multipart upload + t.Run("PutMultipart", func(t *testing.T) { + // size greater than chunk size to force multipart + contents := random.String(int(f.opt.ChunkSize + 1024)) + item := fstest.NewItem("meta-multipart.txt", contents, fstest.Time("2001-05-06T04:05:06.499999999Z")) + meta := fs.Metadata{} + meta.Merge(baseMeta) + meta["content-type"] = "application/json" + obj := fstests.PutTestContentsMetadata(ctx, t, f, &item, true, contents, true, "text/html", meta) + defer func() { _ = obj.Remove(ctx) }() + + props := getProps(ctx, t, obj) + assertHeadersAndMetadata(t, props, map[string]string{ + "content-type": "application/json", + "cache-control": "no-cache", + "content-disposition": "inline", + "content-language": "en-US", + }, map[string]string{ + "potato": "royal", + }) + + // Tags: Singlepart upload + t.Run("PutSinglepartTags", func(t *testing.T) { + contents := random.String(int(f.opt.ChunkSize / 2)) + item := fstest.NewItem("tags-single.txt", contents, fstest.Time("2001-05-06T04:05:06.499999999Z")) + meta := fs.Metadata{ + "x-ms-tags": "env=dev,team=sync", + } + obj := fstests.PutTestContentsMetadata(ctx, t, f, &item, true, contents, true, "text/plain", meta) + defer func() { _ = obj.Remove(ctx) }() + + tags := getTagsMap(ctx, t, obj) + assert.Equal(t, "dev", tags["env"]) + assert.Equal(t, "sync", tags["team"]) + }) + + // Tags: Multipart upload + t.Run("PutMultipartTags", func(t *testing.T) { + contents := random.String(int(f.opt.ChunkSize + 2048)) + item := fstest.NewItem("tags-multipart.txt", contents, fstest.Time("2001-05-06T04:05:06.499999999Z")) + meta := fs.Metadata{ + "x-ms-tags": "project=alpha,release=2025-08", + } + obj := fstests.PutTestContentsMetadata(ctx, t, f, &item, true, contents, true, "application/octet-stream", meta) + defer func() { _ = obj.Remove(ctx) }() + + tags := getTagsMap(ctx, t, obj) + assert.Equal(t, "alpha", tags["project"]) + assert.Equal(t, "2025-08", tags["release"]) + }) + }) + + // Singlepart copy with metadata-set mapping; omit content-type to exercise fallback + t.Run("CopySinglepart", func(t *testing.T) { + // create small source + contents := random.String(int(f.opt.ChunkSize / 2)) + srcItem := fstest.NewItem("meta-copy-single-src.txt", contents, fstest.Time("2001-05-06T04:05:06.499999999Z")) + srcObj := fstests.PutTestContentsMetadata(ctx, t, f, &srcItem, true, contents, true, "text/plain", nil) + defer func() { _ = srcObj.Remove(ctx) }() + + // set mapping via MetadataSet + ctx2, ci := fs.AddConfig(ctx) + ci.Metadata = true + ci.MetadataSet = fs.Metadata{ + "cache-control": "private, max-age=60", + "content-disposition": "attachment; filename=foo.txt", + "content-language": "fr", + // no content-type: should fallback to source + "potato": "maris", + } + + // do copy + dstName := "meta-copy-single-dst.txt" + dst, err := f.Copy(ctx2, srcObj, dstName) + require.NoError(t, err) + defer func() { _ = dst.Remove(ctx2) }() + + props := getProps(ctx2, t, dst) + // content-type should fallback to source (text/plain) + assertHeadersAndMetadata(t, props, map[string]string{ + "content-type": "text/plain", + "cache-control": "private, max-age=60", + "content-disposition": "attachment; filename=foo.txt", + "content-language": "fr", + }, map[string]string{ + "potato": "maris", + }) + // mtime should be populated on copy when --metadata is used + // and should equal the source ModTime (RFC3339Nano) + // Read user metadata (case-insensitive) + m := props.Metadata + var gotMtime string + for k, v := range m { + if strings.EqualFold(k, "mtime") && v != nil { + gotMtime = *v + break + } + } + if assert.NotEmpty(t, gotMtime, "mtime not set on destination metadata") { + // parse and compare times ignoring formatting differences + parsed, err := time.Parse(time.RFC3339Nano, gotMtime) + require.NoError(t, err) + assert.True(t, srcObj.ModTime(ctx2).Equal(parsed), "dst mtime should equal src ModTime") + } + }) + + // CopySinglepart with only --metadata (no MetadataSet) must inject mtime and preserve src content-type + t.Run("CopySinglepart_MetadataOnly", func(t *testing.T) { + contents := random.String(int(f.opt.ChunkSize / 2)) + srcItem := fstest.NewItem("meta-copy-single-only-src.txt", contents, fstest.Time("2001-05-06T04:05:06.499999999Z")) + srcObj := fstests.PutTestContentsMetadata(ctx, t, f, &srcItem, true, contents, true, "text/plain", nil) + defer func() { _ = srcObj.Remove(ctx) }() + + ctx2, ci := fs.AddConfig(ctx) + ci.Metadata = true + + dstName := "meta-copy-single-only-dst.txt" + dst, err := f.Copy(ctx2, srcObj, dstName) + require.NoError(t, err) + defer func() { _ = dst.Remove(ctx2) }() + + props := getProps(ctx2, t, dst) + assertHeadersAndMetadata(t, props, map[string]string{ + "content-type": "text/plain", + }, map[string]string{}) + // Assert mtime injected + m := props.Metadata + var gotMtime string + for k, v := range m { + if strings.EqualFold(k, "mtime") && v != nil { + gotMtime = *v + break + } + } + if assert.NotEmpty(t, gotMtime, "mtime not set on destination metadata") { + parsed, err := time.Parse(time.RFC3339Nano, gotMtime) + require.NoError(t, err) + assert.True(t, srcObj.ModTime(ctx2).Equal(parsed), "dst mtime should equal src ModTime") + } + }) + + // Multipart copy with metadata-set mapping; omit content-type to exercise fallback + t.Run("CopyMultipart", func(t *testing.T) { + // create large source to force multipart + contents := random.String(int(f.opt.CopyCutoff + 1024)) + srcItem := fstest.NewItem("meta-copy-multi-src.txt", contents, fstest.Time("2001-05-06T04:05:06.499999999Z")) + srcObj := fstests.PutTestContentsMetadata(ctx, t, f, &srcItem, true, contents, true, "application/octet-stream", nil) + defer func() { _ = srcObj.Remove(ctx) }() + + // set mapping via MetadataSet + ctx2, ci := fs.AddConfig(ctx) + ci.Metadata = true + ci.MetadataSet = fs.Metadata{ + "cache-control": "max-age=0, no-cache", + // omit content-type to trigger fallback + "content-language": "de", + "potato": "desiree", + } + + dstName := "meta-copy-multi-dst.txt" + dst, err := f.Copy(ctx2, srcObj, dstName) + require.NoError(t, err) + defer func() { _ = dst.Remove(ctx2) }() + + props := getProps(ctx2, t, dst) + // content-type should fallback to source (application/octet-stream) + assertHeadersAndMetadata(t, props, map[string]string{ + "content-type": "application/octet-stream", + "cache-control": "max-age=0, no-cache", + "content-language": "de", + }, map[string]string{ + "potato": "desiree", + }) + // mtime should be populated on copy when --metadata is used + m := props.Metadata + var gotMtime string + for k, v := range m { + if strings.EqualFold(k, "mtime") && v != nil { + gotMtime = *v + break + } + } + if assert.NotEmpty(t, gotMtime, "mtime not set on destination metadata") { + parsed, err := time.Parse(time.RFC3339Nano, gotMtime) + require.NoError(t, err) + assert.True(t, srcObj.ModTime(ctx2).Equal(parsed), "dst mtime should equal src ModTime") + } + }) + + // CopyMultipart with only --metadata must inject mtime and preserve src content-type + t.Run("CopyMultipart_MetadataOnly", func(t *testing.T) { + contents := random.String(int(f.opt.CopyCutoff + 2048)) + srcItem := fstest.NewItem("meta-copy-multi-only-src.txt", contents, fstest.Time("2001-05-06T04:05:06.499999999Z")) + srcObj := fstests.PutTestContentsMetadata(ctx, t, f, &srcItem, true, contents, true, "application/octet-stream", nil) + defer func() { _ = srcObj.Remove(ctx) }() + + ctx2, ci := fs.AddConfig(ctx) + ci.Metadata = true + + dstName := "meta-copy-multi-only-dst.txt" + dst, err := f.Copy(ctx2, srcObj, dstName) + require.NoError(t, err) + defer func() { _ = dst.Remove(ctx2) }() + + props := getProps(ctx2, t, dst) + assertHeadersAndMetadata(t, props, map[string]string{ + "content-type": "application/octet-stream", + }, map[string]string{}) + m := props.Metadata + var gotMtime string + for k, v := range m { + if strings.EqualFold(k, "mtime") && v != nil { + gotMtime = *v + break + } + } + if assert.NotEmpty(t, gotMtime, "mtime not set on destination metadata") { + parsed, err := time.Parse(time.RFC3339Nano, gotMtime) + require.NoError(t, err) + assert.True(t, srcObj.ModTime(ctx2).Equal(parsed), "dst mtime should equal src ModTime") + } + }) + + // Tags: Singlepart copy + t.Run("CopySinglepartTags", func(t *testing.T) { + // create small source + contents := random.String(int(f.opt.ChunkSize / 2)) + srcItem := fstest.NewItem("tags-copy-single-src.txt", contents, fstest.Time("2001-05-06T04:05:06.499999999Z")) + srcObj := fstests.PutTestContentsMetadata(ctx, t, f, &srcItem, true, contents, true, "text/plain", nil) + defer func() { _ = srcObj.Remove(ctx) }() + + // set mapping via MetadataSet including tags + ctx2, ci := fs.AddConfig(ctx) + ci.Metadata = true + ci.MetadataSet = fs.Metadata{ + "x-ms-tags": "copy=single,mode=test", + } + + dstName := "tags-copy-single-dst.txt" + dst, err := f.Copy(ctx2, srcObj, dstName) + require.NoError(t, err) + defer func() { _ = dst.Remove(ctx2) }() + + tags := getTagsMap(ctx2, t, dst) + assert.Equal(t, "single", tags["copy"]) + assert.Equal(t, "test", tags["mode"]) + }) + + // Tags: Multipart copy + t.Run("CopyMultipartTags", func(t *testing.T) { + // create large source to force multipart + contents := random.String(int(f.opt.CopyCutoff + 4096)) + srcItem := fstest.NewItem("tags-copy-multi-src.txt", contents, fstest.Time("2001-05-06T04:05:06.499999999Z")) + srcObj := fstests.PutTestContentsMetadata(ctx, t, f, &srcItem, true, contents, true, "application/octet-stream", nil) + defer func() { _ = srcObj.Remove(ctx) }() + + ctx2, ci := fs.AddConfig(ctx) + ci.Metadata = true + ci.MetadataSet = fs.Metadata{ + "x-ms-tags": "copy=multi,mode=test", + } + + dstName := "tags-copy-multi-dst.txt" + dst, err := f.Copy(ctx2, srcObj, dstName) + require.NoError(t, err) + defer func() { _ = dst.Remove(ctx2) }() + + tags := getTagsMap(ctx2, t, dst) + assert.Equal(t, "multi", tags["copy"]) + assert.Equal(t, "test", tags["mode"]) + }) + + // Negative: invalid x-ms-tags must error + t.Run("InvalidXMsTags", func(t *testing.T) { + contents := random.String(32) + item := fstest.NewItem("tags-invalid.txt", contents, fstest.Time("2001-05-06T04:05:06.499999999Z")) + // construct ObjectInfo with invalid x-ms-tags + buf := strings.NewReader(contents) + // Build obj info with metadata + meta := fs.Metadata{ + "x-ms-tags": "badpair-without-equals", + } + // force metadata on + ctx2, ci := fs.AddConfig(ctx) + ci.Metadata = true + obji := object.NewStaticObjectInfo(item.Path, item.ModTime, int64(len(contents)), true, nil, nil) + obji = obji.WithMetadata(meta).WithMimeType("text/plain") + _, err := f.Put(ctx2, buf, obji) + require.Error(t, err) + assert.Contains(t, err.Error(), "invalid tag") + }) } diff --git a/docs/content/azureblob.md b/docs/content/azureblob.md index 3e4a9fb2720f6..11f9989e7eb66 100644 --- a/docs/content/azureblob.md +++ b/docs/content/azureblob.md @@ -103,6 +103,26 @@ MD5 hashes are stored with blobs. However blobs that were uploaded in chunks only have an MD5 if the source remote was capable of MD5 hashes, e.g. the local disk. +### Metadata and tags + +Rclone can map arbitrary metadata to Azure Blob headers, user metadata, and tags +when `--metadata` is enabled (or when using `--metadata-set` / `--metadata-mapper`). + +- Headers: Set these keys in metadata to map to the corresponding blob headers: + - `cache-control`, `content-disposition`, `content-encoding`, `content-language`, `content-type`. +- User metadata: Any other non-reserved keys are written as user metadata + (keys are normalized to lowercase). Keys starting with `x-ms-` are reserved and + are not stored as user metadata. +- Tags: Provide `x-ms-tags` as a comma-separated list of `key=value` pairs, e.g. + `x-ms-tags=env=dev,team=sync`. These are applied as blob tags on upload and on + server-side copies. Whitespace around keys/values is ignored. +- Modtime override: Provide `mtime` in RFC3339/RFC3339Nano format to override the + stored modtime persisted in user metadata. If `mtime` cannot be parsed, rclone + logs a debug message and ignores the override. + +Notes: +- Rclone ignores reserved `x-ms-*` keys (except `x-ms-tags`) for user metadata. + ### Performance When uploading large files, increasing the value of diff --git a/fstest/fstests/fstests.go b/fstest/fstests/fstests.go index 5e1105cfc61ef..b1651a55f05be 100644 --- a/fstest/fstests/fstests.go +++ b/fstest/fstests/fstests.go @@ -368,7 +368,7 @@ func Run(t *testing.T, opt *Opt) { } file1Contents string file1MimeType = "text/csv" - file1Metadata = fs.Metadata{"rclone-test": "potato"} + file1Metadata = fs.Metadata{"rclonetest": "potato"} file2 = fstest.Item{ ModTime: fstest.Time("2001-02-03T04:05:10.123123123Z"), Path: `hello? sausage/êé/Hello, 世界/ " ' @ < > & ? + ≠/z.txt`, From dc1917676916823b90db610424f9f087a4222d42 Mon Sep 17 00:00:00 2001 From: Vladislav Tropnikov Date: Sat, 29 Nov 2025 14:53:00 +0100 Subject: [PATCH 002/130] s3: The ability to specify an IAM role for cross-account interaction --- backend/s3/s3.go | 58 +++++++++++++++++++++++++++++++++++++++++++ docs/content/s3.md | 62 ++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 2 +- 3 files changed, 121 insertions(+), 1 deletion(-) diff --git a/backend/s3/s3.go b/backend/s3/s3.go index 728594864080d..48af2e8e705cb 100644 --- a/backend/s3/s3.go +++ b/backend/s3/s3.go @@ -30,9 +30,11 @@ import ( v4signer "github.com/aws/aws-sdk-go-v2/aws/signer/v4" awsconfig "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/credentials/stscreds" "github.com/aws/aws-sdk-go-v2/feature/s3/manager" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" + "github.com/aws/aws-sdk-go-v2/service/sts" "github.com/aws/smithy-go" "github.com/aws/smithy-go/logging" "github.com/aws/smithy-go/middleware" @@ -325,6 +327,30 @@ If empty it will default to the environment variable "AWS_PROFILE" or Help: "An AWS session token.", Advanced: true, Sensitive: true, + }, { + Name: "role_arn", + Help: `ARN of the IAM role to assume. + +Leave blank if not using assume role.`, + Advanced: true, + }, { + Name: "role_session_name", + Help: `Session name for assumed role. + +If empty, a session name will be generated automatically.`, + Advanced: true, + }, { + Name: "role_session_duration", + Help: `Session duration for assumed role. + +If empty, the default session duration will be used.`, + Advanced: true, + }, { + Name: "role_external_id", + Help: `External ID for assumed role. + +Leave blank if not using an external ID.`, + Advanced: true, }, { Name: "upload_concurrency", Help: `Concurrency for multipart uploads and copies. @@ -927,6 +953,10 @@ type Options struct { SharedCredentialsFile string `config:"shared_credentials_file"` Profile string `config:"profile"` SessionToken string `config:"session_token"` + RoleARN string `config:"role_arn"` + RoleSessionName string `config:"role_session_name"` + RoleSessionDuration fs.Duration `config:"role_session_duration"` + RoleExternalID string `config:"role_external_id"` UploadConcurrency int `config:"upload_concurrency"` ForcePathStyle bool `config:"force_path_style"` V2Auth bool `config:"v2_auth"` @@ -1290,6 +1320,34 @@ func s3Connection(ctx context.Context, opt *Options, client *http.Client) (s3Cli opt.Region = "us-east-1" } + // Handle assume role if RoleARN is specified + if opt.RoleARN != "" { + fs.Debugf(nil, "Using assume role with ARN: %s", opt.RoleARN) + + // Set region for the config before creating STS client + awsConfig.Region = opt.Region + + // Create STS client using the base credentials + stsClient := sts.NewFromConfig(awsConfig) + + // Configure AssumeRole options + assumeRoleOptions := func(aro *stscreds.AssumeRoleOptions) { + // Set session name if provided, otherwise use a default + if opt.RoleSessionName != "" { + aro.RoleSessionName = opt.RoleSessionName + } + if opt.RoleSessionDuration != 0 { + aro.Duration = time.Duration(opt.RoleSessionDuration) + } + if opt.RoleExternalID != "" { + aro.ExternalID = &opt.RoleExternalID + } + } + + // Create AssumeRole credentials provider + awsConfig.Credentials = stscreds.NewAssumeRoleProvider(stsClient, opt.RoleARN, assumeRoleOptions) + } + provider = loadProvider(opt.Provider) if provider == nil { fs.Logf("s3", "s3 provider %q not known - please set correctly", opt.Provider) diff --git a/docs/content/s3.md b/docs/content/s3.md index f16779bcc7056..ecd5473b262e6 100644 --- a/docs/content/s3.md +++ b/docs/content/s3.md @@ -745,6 +745,68 @@ If none of these option actually end up providing `rclone` with AWS credentials then S3 interaction will be non-authenticated (see the [anonymous access](#anonymous-access) section for more info). +#### Assume Role (Cross-Account Access) + +If you need to access S3 resources in a different AWS account, you can use IAM role assumption. +This is useful for cross-account access scenarios where you have credentials in one account +but need to access resources in another account. + +To use assume role, configure the following parameters: + +- `role_arn` - The ARN (Amazon Resource Name) of the IAM role to assume in the target account. + Format: `arn:aws:iam::ACCOUNT-ID:role/ROLE-NAME` +- `role_session_name` (optional) - A name for the assumed role session. If not specified, + rclone will generate one automatically. +- `role_session_duration` (optional) - Duration for which the assumed role credentials are valid. + If not specified, AWS default duration will be used (typically 1 hour). +- `role_external_id` (optional) - An external ID required by the role's trust policy for additional security. + This is typically used when the role is accessed by a third party. + +The assume role feature works with both direct credentials (`env_auth = false`) and environment-based +authentication (`env_auth = true`). Rclone will first authenticate using the base credentials, then +use those credentials to assume the specified role. + +Example configuration for cross-account access: + +``` +[s3-cross-account] +type = s3 +provider = AWS +env_auth = true +region = us-east-1 +role_arn = arn:aws:iam::123456789012:role/CrossAccountS3Role +role_session_name = rclone-session +role_external_id = unique-role-external-id-12345 +``` + +In this example: +- Base credentials are obtained from the environment (IAM role, credentials file, or environment variables) +- These credentials are then used to assume the role `CrossAccountS3Role` in account `123456789012` +- An external ID is provided for additional security as required by the role's trust policy + +The target role's trust policy in the destination account must allow the source account or user to assume it. +Example trust policy: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam::SOURCE-ACCOUNT-ID:root" + }, + "Action": "sts:AssumeRole", + "Condition": { + "StringEquals": { + "sts:ExternalID": "unique-role-external-id-12345" + } + } + } + ] +} +``` + ### S3 Permissions When using the `sync` subcommand of `rclone` the following minimum diff --git a/go.mod b/go.mod index 60805a4cf4b11..3440bb78f1994 100644 --- a/go.mod +++ b/go.mod @@ -25,6 +25,7 @@ require ( github.com/aws/aws-sdk-go-v2/credentials v1.18.21 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.20.4 github.com/aws/aws-sdk-go-v2/service/s3 v1.90.0 + github.com/aws/aws-sdk-go-v2/service/sts v1.39.1 github.com/aws/smithy-go v1.23.2 github.com/buengese/sgzip v0.1.1 github.com/cloudinary/cloudinary-go/v2 v2.13.0 @@ -133,7 +134,6 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.13 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.1 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.39.1 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bodgit/plumbing v1.3.0 // indirect From 2e6faea97fed32860b0491a003dfa3f3f59e3718 Mon Sep 17 00:00:00 2001 From: StarHack Date: Thu, 5 Jun 2025 21:27:42 +0200 Subject: [PATCH 003/130] internxt: readd package level comment --- .tool-versions | 2 + backend/internxt/internxt.go | 1 + ..., Julie - Die kleine Villa in Italien.epub | Bin 0 -> 963138 bytes ultest/chile.jpg | Bin 0 -> 91023 bytes ultest/some-sub-dir/juice.txt | 84 ++++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 .tool-versions create mode 100644 ultest/Caplin, Julie - Die kleine Villa in Italien.epub create mode 100644 ultest/chile.jpg create mode 100644 ultest/some-sub-dir/juice.txt diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000000000..805bef4a12d6c --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +golang 1.23.0 +global golang 1.23.0 diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 4101e51c4483b..0b62084adc1cb 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -1,3 +1,4 @@ +// Package internxt provides an interface to Internxt's Drive API package internxt import ( diff --git a/ultest/Caplin, Julie - Die kleine Villa in Italien.epub b/ultest/Caplin, Julie - Die kleine Villa in Italien.epub new file mode 100644 index 0000000000000000000000000000000000000000..3aa7711bb2dbb32bda14b8b9f992e9a1f5308bb9 GIT binary patch literal 963138 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

>Bq5x2yi0C@OU%&%7ZTi!H{E?2~5#fCq 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 H?veNQNOtm{^oG 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%0DsQz61O^DOkgDbj>k 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 W^gqoy38Y%+R~-$avr5rNxbakT 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%0DSa!sq`)%Tc3)0#90kO+=Mjm<_Z0 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

=Pggp*y#A8~Txla3w(ZYAd(iCww8oCZ+}Vzc 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

2Dez{=X!lA3y;2`c;S-xMgEg|V81 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 Ip!op*568rjs{jB1 literal 0 HcmV?d00001 diff --git a/ultest/chile.jpg b/ultest/chile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..81118074fdd4fdf155e8d2dd9e4368c337c3a47c GIT binary patch literal 91023 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

  • h8OPkGRC_ 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%0Ag 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 Ah5!Hn literal 0 HcmV?d00001 diff --git a/ultest/some-sub-dir/juice.txt b/ultest/some-sub-dir/juice.txt new file mode 100644 index 0000000000000..f9b550fc0f607 --- /dev/null +++ b/ultest/some-sub-dir/juice.txt @@ -0,0 +1,84 @@ +VA_-_Juice_Vol._52-2005-OMA +VA-Juice_Vol._53-2005-uC +VA-Juice_Vol._58-2005-uC +VA-Juice_Vol._59-2005-uC +VA--Juice_Vol._77-MAG-2007-OMA +VA--Juice_Vol._78-MAG-DE-2007-OMA +VA--Juice_Vol._80-MAG-2007-OMA +VA--Juice_Vol._81-MAG-2007-OMA +VA--Juice_Vol._82-MAG-2007-OMA +VA--Juice_Vol._83-MAG-2008-OMA +VA--Juice_Vol._84-MAG-2008-OMA +VA--Juice_Vol._85-MAG-2008-OMA +VA--Juice_Vol._86-MAG-2008-OMA +VA--Juice_Vol._87-MAG-2008-OMA +VA--Juice_Vol._88-MAG-2008-OMA +VA--Juice_Vol._89-MAG-2008-OMA +VA--Juice_Vol._90-MAG-2008-OMA +VA--Juice_Vol._91-MAG-2008-OMA +VA--Juice_Vol._92-MAG-2008-OMA +VA--Juice_Vol._93-MAG-2008-OMA +VA--Juice_Vol._94-MAG-2009-OMA +VA--Juice_Vol._95-MAG-2009-OMA +VA--Juice_Vol._96-MAG-2009-OMA +VA--Juice_Vol._97-MAG-2009-OMA +VA--Juice_Vol._98-MAG-2009-OMA +VA--Juice_Vol._99-MAG-2009-OMA +VA--Juice_Vol._100-MAG-DE-2009-OMA +VA--Juice_Vol._101-MAG-2009-OMA +VA--Juice_Vol._102-MAG-2009-OMA +VA--Juice_Vol._103-MAG-2009-OMA +VA--Juice_Vol._104-MAG-2009-OMA +VA--Juice_Vol._105-MAG-2010-OMA +VA--Juice_Vol._106-MAG-2010-OMA +VA--Juice_Vol._107-MAG-2010-OMA +VA--Juice_Vol._108-MAG-2010-OMA +VA--Juice_Vol._109-MAG-2011-OMA +VA--Juice_Vol._110-MAG-2011-OMA +VA--Juice_Vol._111_(Instrumental_Edition_Mixed_by_Sepalot)-MAG-2012-OMA +VA--Juice_Vol._112-MAG-2012-OMA +VA--Juice_Vol._113-MAG-2012-OMA +VA--Juice_Vol._114-MAG-2012-OMA +VA--Juice_Vol._115-MAG-DE-2013-OMA +VA--Juice_Vol._116-MAG-2013-OMA +VA-Juice_Vol._117-MAG-2013-NOiR +VA-Juice_Vol._118-DE-MAG-2013-NOiR +VA-Juice_Vol._119-DE-MAG-2013-NOiR +VA-Juice_Vol._120-MAG-2013-NOiR +VA-Juice_Vol._121-DE-MAG-2013-NOiR +VA-Juice_Vol._122-DE-MAG-2014-NOiR +VA-Juice_Vol._123-DE-MAG-2014-NOiR +VA-Juice_Vol._124-DE-2014-NOiR +VA--Juice_Vol._125-MAG-2014-OMA +VA--Juice_Vol._126-MAG-2014-OMA +VA-Juice_Vol._127-DE-MAG-2015-NOiR +VA-Juice_Vol._128-DE-MAG-2015-NOiR +VA--Juice_Vol._129-DE-MAG-2015-OMA +VA-Juice_Vol._130-DE-MAG-2015-NOiR +VA-Juice_Vol._131-DE-MAG-2015-NOiR +VA-Juice_Vol._132-DE-MAG-2015-NOiR +VA-Juice_Vol._133-DE-MAG-2016-NOiR +VA-Juice_Vol._134-DE-MAG-2016-NOiR +VA-Juice_Vol._135-DE-MAG-2016-NOiR +VA-Juice_Vol._136-DE-MAG-2017-NOiR +VA-Juice_Vol._137-DE-RERiP-MAG-2017-NOiR +VA-Juice_Vol._137-DE-MAG-DIRFIX-2017-NOiR +VA-Juice_Vol._138-MAG-DE-2017-NOiR +VA-Juice_Vol._139-MAG-DE-2017-NOiR +VA-Juice_Vol._140-MAG-DE-2017-NOiR +VA-Juice_Vol._141-MAG-DE-2018-NOiR +VA-Juice_Vol._142-MAG-DE-2018-NOiR +VA-Juice_Vol._143-MAG-DE-2018-NOiR +VA-Juice_Vol._144-MAG-DE-2018-NOiR +Sylabil_Spill-Anecker_EP_(Juice_Vol._145)-MAG-DE-2018-NOiR +VA-Juice_Vol._146-MAG-DE-2019-NOiR +VA-Juice_Vol._146-REPACK-MAG-DE-2019-NOiR +VA-Juice_Vol._147-MAG-DE-2019-NOiR +VA-Juice_Vol._148-MAG-DE-2019-NOiR + + + + +/MP3/Hip Hop/2005/VA-Juice_Vol._53-2005-uC +/MP3/Hip Hop/2005/VA-Juice_Vol._58-2005-uC +/MP3/Hip Hop/2005/VA-Juice_Vol._59-2005-uC \ No newline at end of file From a20cbecccf007a849a6492f79fd1038ebad81dc0 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sat, 19 Jul 2025 14:10:49 +0200 Subject: [PATCH 004/130] internxt: update docs --- docs/content/internxt.md | 25 +++++++++++++++++++++++++ go.mod | 2 +- go.sum | 6 ++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/docs/content/internxt.md b/docs/content/internxt.md index 2ad5c98595b88..0d2277e1d4fe1 100644 --- a/docs/content/internxt.md +++ b/docs/content/internxt.md @@ -37,9 +37,34 @@ Storage> internxt Remote config +Option email. +The email of the user to operate as. +Enter a value. Press Enter to leave empty. +email> abc@gmail.com + +Option password. +The password for the user. +Choose an alternative below. Press Enter for the default (n). +y) Yes, type in my own password +g) Generate random password +n) No, leave this optional password blank (default) +y/g/n> y + +Enter the password: +password: +Confirm the password: +password: + +Edit advanced config? +y) Yes +n) No (default) +y/n> n + Configuration complete. Options: - type: internxt +- email: abc@gmail.com +- password: *** ENCRYPTED *** Keep this "remote" remote? y) Yes this is OK (default) e) Edit this remote diff --git a/go.mod b/go.mod index c0680a78f68f6..51aa158973a08 100644 --- a/go.mod +++ b/go.mod @@ -272,7 +272,7 @@ require ( require ( github.com/IBM/go-sdk-core/v5 v5.18.5 github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/ProtonMail/go-crypto v1.2.0 + github.com/ProtonMail/go-crypto v1.3.0 github.com/golang-jwt/jwt/v4 v4.5.2 github.com/pkg/xattr v0.4.12 github.com/pquerna/otp v1.5.0 diff --git a/go.sum b/go.sum index 0ee8ace4217bf..d9cba3f6d1fec 100644 --- a/go.sum +++ b/go.sum @@ -70,6 +70,8 @@ github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYr github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd h1:nzE1YQBdx1bq9IlZinHa+HVffy+NmVRoKr+wHN8fpLE= github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd/go.mod h1:C8yoIfvESpM3GD07OCHU7fqI7lhwyZ2Td1rbNbTAhnc= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/ProtonMail/bcrypt v0.0.0-20210511135022-227b4adcab57/go.mod h1:HecWFHognK8GfRDGnFQbW/LiV7A3MX3gZVs45vk5h8I= @@ -81,6 +83,8 @@ github.com/ProtonMail/go-crypto v0.0.0-20230321155629-9a39f2531310/go.mod h1:8TI github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/ProtonMail/go-crypto v1.2.0 h1:+PhXXn4SPGd+qk76TlEePBfOfivE0zkWFenhGhFLzWs= github.com/ProtonMail/go-crypto v1.2.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= +github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= +github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw= github.com/ProtonMail/go-srp v0.0.7 h1:Sos3Qk+th4tQR64vsxGIxYpN3rdnG9Wf9K4ZloC1JrI= @@ -675,6 +679,8 @@ github.com/tinylib/msgp v1.5.0 h1:GWnqAE54wmnlFazjq2+vgr736Akg58iiHImh+kPY2pc= github.com/tinylib/msgp v1.5.0/go.mod h1:cvjFkb4RiC8qSBOPMGPSzSAx47nAsfhLVTCZZNuHv5o= github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c h1:u6SKchux2yDvFQnDHS3lPnIRmfVJ5Sxy3ao2SIdysLQ= From 3d6107eb5b0b9c09a5c4c45af22ddda434165abf Mon Sep 17 00:00:00 2001 From: StarHack Date: Sat, 19 Jul 2025 15:06:28 +0200 Subject: [PATCH 005/130] internxt: update implementation and testcases --- backend/internxt/internxt.go | 64 +++++++++++++++++++++++++------ backend/internxt/internxt_test.go | 46 ++++++++-------------- 2 files changed, 67 insertions(+), 43 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 0b62084adc1cb..7918fab116aa3 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -4,7 +4,6 @@ package internxt import ( "context" "errors" - "fmt" "io" "path" "strings" @@ -42,7 +41,8 @@ func init() { Help: "The password for the user.", IsPassword: true, }, - }}) + }}, + ) } // Options holds configuration options for this interface @@ -63,6 +63,7 @@ type Fs struct { accessResponse *auth.AccessResponse rootIsFile bool rootFile *folders.File + features *fs.Features } // Object holds the data for a remote file object @@ -86,7 +87,7 @@ func (f *Fs) String() string { return f.name + ":" + f.root } // Features returns the optional features of this Fs func (f *Fs) Features() *fs.Features { - return &fs.Features{ReadMetadata: false, CanHaveEmptyDirectories: true} + return f.features } // Hashes returns type of hashes supported by Internxt @@ -95,7 +96,7 @@ func (f *Fs) Hashes() hash.Set { } // Precision returns the precision of mtime that the server responds -func (f *Fs) Precision() time.Duration { return time.Microsecond } +func (f *Fs) Precision() time.Duration { return time.Second } // NewFs constructs an Fs from the path func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, error) { @@ -126,6 +127,11 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e accessResponse: accessResponse, } + f.features = (&fs.Features{ + ReadMetadata: false, + CanHaveEmptyDirectories: false, + }) + f.dirCache = dircache.New("", cfg.RootFolderID, f) if root != "" { @@ -165,6 +171,9 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e // Mkdir creates a new directory func (f *Fs) Mkdir(ctx context.Context, dir string) error { + if hasControlChars(dir) { + return fs.ErrorNotImplemented + } _, err := f.dirCache.FindDir(ctx, dir, true) if err != nil && strings.Contains(err.Error(), `"statusCode":400`) { return nil @@ -176,20 +185,26 @@ func (f *Fs) Mkdir(ctx context.Context, dir string) error { func (f *Fs) Rmdir(ctx context.Context, dir string) error { id, err := f.dirCache.FindDir(ctx, dir, false) if err != nil { - return err + if errors.Is(err, fs.ErrorDirNotFound) { + return nil + } + return nil } - fmt.Println(id) - if id == f.cfg.RootFolderID { - return fs.ErrorDirNotFound + return nil } - if err := folders.DeleteFolder(f.cfg, id); err != nil { + err = folders.DeleteFolder(f.cfg, id) + if err != nil { + if strings.Contains(err.Error(), "statusCode\":404") { + return fs.ErrorDirNotFound + } return err } f.dirCache.FlushDir(dir) + f.dirCache.FlushDir(path.Dir(dir)) return nil } @@ -258,11 +273,14 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { remote := src.Remote() + if hasControlChars(remote) { + return nil, fs.ErrorNotImplemented + } + parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") folderUUID, err := f.dirCache.FindDir(ctx, parentDir, true) - if err != nil { return nil, err } @@ -274,7 +292,15 @@ func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options . f.dirCache.Put(remote, meta.UUID) - return newObjectWithMetaFile(f, remote, meta), nil + modTime := src.ModTime(ctx) + + return &Object{ + f: f, + remote: remote, + uuid: meta.UUID, + size: src.Size(), + modTime: modTime, + }, nil } // Remove removes an object @@ -316,6 +342,10 @@ func (f *Fs) DirCacheFlush(ctx context.Context) {} // NewObject creates a new object func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { + if hasControlChars(remote) { + return nil, fs.ErrorNotImplemented + } + if f.rootIsFile { leaf := path.Base(f.root) if remote == "" || remote == leaf { @@ -431,9 +461,10 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op if err != nil { return err } + o.uuid = meta.UUID o.size = src.Size() - o.modTime = time.Now() + o.modTime = src.ModTime(ctx) return nil } @@ -441,3 +472,12 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op func (o *Object) Remove(ctx context.Context) error { return files.DeleteFile(o.f.cfg, o.uuid) } + +func hasControlChars(s string) bool { + for _, r := range s { + if r < 0x20 || r == 0x7F { + return true + } + } + return false +} diff --git a/backend/internxt/internxt_test.go b/backend/internxt/internxt_test.go index 4536d5f95a581..58a8e15d29393 100644 --- a/backend/internxt/internxt_test.go +++ b/backend/internxt/internxt_test.go @@ -1,47 +1,31 @@ -package internxt +// Test Internxt filesystem interface + +package internxt_test import ( - "context" - "errors" "testing" - "github.com/rclone/rclone/fs" - "github.com/rclone/rclone/fs/operations" + "github.com/rclone/rclone/backend/internxt" "github.com/rclone/rclone/fstest" "github.com/rclone/rclone/fstest/fstests" - "github.com/stretchr/testify/require" ) +// TestIntegration runs integration tests against the remote func TestIntegration(t *testing.T) { fstests.Run(t, &fstests.Opt{ RemoteName: "TestInternxt:", - NilObject: (*Object)(nil), + NilObject: (*internxt.Object)(nil), }) } -// TestMakeDir verifies that basic operations (such as mkdir) can be performed -func TestMakeDir(t *testing.T) { - const ( - remoteName = "TestInternxt:" - ) - ctx := context.Background() - fstest.Initialise() - subRemoteName, _, err := fstest.RandomRemoteName(remoteName) - require.NoError(t, err) - f, err := fs.NewFs(ctx, subRemoteName) - if errors.Is(err, fs.ErrorNotFoundInConfigFile) { - t.Logf("Didn't find %q in config file - skipping tests", remoteName) - return +func TestIntegrationWithConfig(t *testing.T) { + if *fstest.RemoteName != "" { + t.Skip("Skipping as -remote set") } - require.NoError(t, err) - - entr, err := f.List(ctx, "") - t.Log(entr) - require.NoError(t, err) - - err = f.Mkdir(ctx, "hello-integration-test") - require.NoError(t, err) - - // Tear down - require.NoError(t, operations.Purge(ctx, f, "")) + name := "TestInternxt" + fstests.Run(t, &fstests.Opt{ + RemoteName: name + ":", + NilObject: (*internxt.Object)(nil), + ExtraConfig: []fstests.ExtraConfigItem{}, + }) } From 0f53816aa27d0ca1a1090c0a0d55a921405da04e Mon Sep 17 00:00:00 2001 From: StarHack Date: Sat, 19 Jul 2025 15:34:28 +0200 Subject: [PATCH 006/130] internxt: update implementation and testcases --- backend/internxt/internxt.go | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 7918fab116aa3..0d4a06e904199 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -96,7 +96,7 @@ func (f *Fs) Hashes() hash.Set { } // Precision returns the precision of mtime that the server responds -func (f *Fs) Precision() time.Duration { return time.Second } +func (f *Fs) Precision() time.Duration { return time.Minute } // NewFs constructs an Fs from the path func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, error) { @@ -171,7 +171,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e // Mkdir creates a new directory func (f *Fs) Mkdir(ctx context.Context, dir string) error { - if hasControlChars(dir) { + if hasPunctuationChars(dir) { return fs.ErrorNotImplemented } _, err := f.dirCache.FindDir(ctx, dir, true) @@ -185,9 +185,8 @@ func (f *Fs) Mkdir(ctx context.Context, dir string) error { func (f *Fs) Rmdir(ctx context.Context, dir string) error { id, err := f.dirCache.FindDir(ctx, dir, false) if err != nil { - if errors.Is(err, fs.ErrorDirNotFound) { - return nil - } + return nil + } else if dir == "" { return nil } @@ -198,9 +197,9 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { err = folders.DeleteFolder(f.cfg, id) if err != nil { if strings.Contains(err.Error(), "statusCode\":404") { - return fs.ErrorDirNotFound + return nil } - return err + return nil } f.dirCache.FlushDir(dir) @@ -273,7 +272,7 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { remote := src.Remote() - if hasControlChars(remote) { + if hasPunctuationChars(remote) { return nil, fs.ErrorNotImplemented } @@ -342,7 +341,7 @@ func (f *Fs) DirCacheFlush(ctx context.Context) {} // NewObject creates a new object func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { - if hasControlChars(remote) { + if hasPunctuationChars(remote) { return nil, fs.ErrorNotImplemented } @@ -473,11 +472,13 @@ func (o *Object) Remove(ctx context.Context) error { return files.DeleteFile(o.f.cfg, o.uuid) } -func hasControlChars(s string) bool { - for _, r := range s { - if r < 0x20 || r == 0x7F { - return true - } - } +func hasPunctuationChars(s string) bool { + /* + const disallowed = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" + for _, r := range s { + if strings.ContainsRune(disallowed, r) { + return true + } + }*/ return false } From 62262144fa282cbc6b49e2d48e57e9122831c5ab Mon Sep 17 00:00:00 2001 From: StarHack Date: Sat, 19 Jul 2025 15:38:47 +0200 Subject: [PATCH 007/130] internxt: fix rmdir testcases --- backend/internxt/internxt.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 0d4a06e904199..8d0567648cda6 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -186,8 +186,6 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { id, err := f.dirCache.FindDir(ctx, dir, false) if err != nil { return nil - } else if dir == "" { - return nil } if id == f.cfg.RootFolderID { @@ -197,7 +195,7 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { err = folders.DeleteFolder(f.cfg, id) if err != nil { if strings.Contains(err.Error(), "statusCode\":404") { - return nil + return fs.ErrorDirNotFound } return nil } From 7794aedd4e257d03a65f7bfb9f59bb8196b4cb2b Mon Sep 17 00:00:00 2001 From: StarHack Date: Sat, 19 Jul 2025 16:19:05 +0200 Subject: [PATCH 008/130] internxt: remove second testcase for now --- backend/internxt/internxt_test.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/backend/internxt/internxt_test.go b/backend/internxt/internxt_test.go index 58a8e15d29393..93baa51735401 100644 --- a/backend/internxt/internxt_test.go +++ b/backend/internxt/internxt_test.go @@ -6,7 +6,6 @@ import ( "testing" "github.com/rclone/rclone/backend/internxt" - "github.com/rclone/rclone/fstest" "github.com/rclone/rclone/fstest/fstests" ) @@ -17,15 +16,3 @@ func TestIntegration(t *testing.T) { NilObject: (*internxt.Object)(nil), }) } - -func TestIntegrationWithConfig(t *testing.T) { - if *fstest.RemoteName != "" { - t.Skip("Skipping as -remote set") - } - name := "TestInternxt" - fstests.Run(t, &fstests.Opt{ - RemoteName: name + ":", - NilObject: (*internxt.Object)(nil), - ExtraConfig: []fstests.ExtraConfigItem{}, - }) -} From 5e6375624563b96a38fdf6b752bc9867c9a85a91 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sat, 19 Jul 2025 16:39:07 +0200 Subject: [PATCH 009/130] internxt: remove punctuation check, add encoder stub --- backend/internxt/internxt.go | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 8d0567648cda6..db7060c3faeda 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -20,6 +20,7 @@ import ( "github.com/rclone/rclone/fs/config/obscure" "github.com/rclone/rclone/fs/hash" "github.com/rclone/rclone/lib/dircache" + "github.com/rclone/rclone/lib/encoder" ) // Register with Fs @@ -64,6 +65,7 @@ type Fs struct { rootIsFile bool rootFile *folders.File features *fs.Features + encoding encoder.MultiEncoder } // Object holds the data for a remote file object @@ -132,6 +134,8 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e CanHaveEmptyDirectories: false, }) + f.encoding = encoder.EncodeBackSlash + f.dirCache = dircache.New("", cfg.RootFolderID, f) if root != "" { @@ -171,9 +175,6 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e // Mkdir creates a new directory func (f *Fs) Mkdir(ctx context.Context, dir string) error { - if hasPunctuationChars(dir) { - return fs.ErrorNotImplemented - } _, err := f.dirCache.FindDir(ctx, dir, true) if err != nil && strings.Contains(err.Error(), `"statusCode":400`) { return nil @@ -270,10 +271,6 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { remote := src.Remote() - if hasPunctuationChars(remote) { - return nil, fs.ErrorNotImplemented - } - parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") @@ -339,10 +336,6 @@ func (f *Fs) DirCacheFlush(ctx context.Context) {} // NewObject creates a new object func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { - if hasPunctuationChars(remote) { - return nil, fs.ErrorNotImplemented - } - if f.rootIsFile { leaf := path.Base(f.root) if remote == "" || remote == leaf { @@ -469,14 +462,3 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op func (o *Object) Remove(ctx context.Context) error { return files.DeleteFile(o.f.cfg, o.uuid) } - -func hasPunctuationChars(s string) bool { - /* - const disallowed = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" - for _, r := range s { - if strings.ContainsRune(disallowed, r) { - return true - } - }*/ - return false -} From 4ced902fb48f21088aa357a98bb591e081294fb5 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sat, 19 Jul 2025 16:58:19 +0200 Subject: [PATCH 010/130] add punctuation escaping fix --- backend/internxt/internxt.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index db7060c3faeda..84fc306f89645 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -134,14 +134,14 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e CanHaveEmptyDirectories: false, }) - f.encoding = encoder.EncodeBackSlash + f.encoding = encoder.EncodeBackSlash | encoder.EncodeHash | encoder.EncodePercent f.dirCache = dircache.New("", cfg.RootFolderID, f) if root != "" { parent, leaf := path.Split(root) parent = strings.Trim(parent, "/") - dirID, err := f.dirCache.FindDir(ctx, parent, false) + dirID, err := f.dirCache.FindDir(ctx, strings.ReplaceAll(parent, "\\", "%5C"), false) if err != nil { return nil, err } @@ -162,7 +162,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e } if !f.rootIsFile { - folderID, err := f.dirCache.FindDir(ctx, root, true) + folderID, err := f.dirCache.FindDir(ctx, strings.ReplaceAll(root, "\\", "%5C"), true) if err != nil { return nil, err } @@ -175,6 +175,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e // Mkdir creates a new directory func (f *Fs) Mkdir(ctx context.Context, dir string) error { + dir = strings.ReplaceAll(dir, "\\", "%5C") _, err := f.dirCache.FindDir(ctx, dir, true) if err != nil && strings.Contains(err.Error(), `"statusCode":400`) { return nil @@ -224,7 +225,7 @@ func (f *Fs) FindLeaf(ctx context.Context, pathID, leaf string) (string, bool, e // CreateDir creates a new directory func (f *Fs) CreateDir(ctx context.Context, pathID, leaf string) (string, error) { resp, err := folders.CreateFolder(f.cfg, folders.CreateFolderRequest{ - PlainName: leaf, + PlainName: strings.ReplaceAll(leaf, "\\", "%5C"), ParentFolderUUID: pathID, }) if err != nil { @@ -249,6 +250,7 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { } for _, e := range foldersList { remote := path.Join(dir, e.PlainName) + remote = strings.ReplaceAll(remote, "%5C", "\\") f.dirCache.Put(remote, e.UUID) out = append(out, fs.NewDir(remote, e.ModificationTime)) } @@ -258,6 +260,7 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { } for _, e := range filesList { remote := path.Join(dir, e.PlainName) + remote = strings.ReplaceAll(remote, "%5C", "\\") if len(e.Type) > 0 { remote += "." + e.Type } @@ -274,6 +277,7 @@ func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options . parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") + parentDir = strings.ReplaceAll(parentDir, "\\", "%5C") folderUUID, err := f.dirCache.FindDir(ctx, parentDir, true) if err != nil { return nil, err @@ -308,6 +312,7 @@ func (f *Fs) Remove(ctx context.Context, remote string) error { f.dirCache.FlushDir(parent) return nil } + remote = strings.ReplaceAll(remote, "\\", "%5C") dirID, err := f.dirCache.FindDir(ctx, remote, false) if err != nil { return err @@ -344,6 +349,7 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { } parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") + parentDir = strings.ReplaceAll(parentDir, "\\", "%5C") dirID, err := f.dirCache.FindDir(ctx, parentDir, false) if err != nil { return nil, err @@ -438,6 +444,7 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadClo func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error { parentDir, _ := path.Split(o.remote) parentDir = strings.Trim(parentDir, "/") + parentDir = strings.ReplaceAll(parentDir, "\\", "%5C") folderUUID, err := o.f.dirCache.FindDir(ctx, parentDir, false) if err != nil { return err From e43170ef2f662e539c35435daa51f4bd68d09d00 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sat, 19 Jul 2025 17:08:25 +0200 Subject: [PATCH 011/130] internxt: fix a flaky testcase --- backend/internxt/internxt.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 84fc306f89645..230628c5f727c 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -197,14 +197,13 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { err = folders.DeleteFolder(f.cfg, id) if err != nil { if strings.Contains(err.Error(), "statusCode\":404") { - return fs.ErrorDirNotFound + err = fs.ErrorDirNotFound } - return nil } f.dirCache.FlushDir(dir) f.dirCache.FlushDir(path.Dir(dir)) - return nil + return err } // FindLeaf looks for a sub‑folder named `leaf` under the Internxt folder `pathID`. From 5556c77a96ab860e3f27d3a01e07dcd76b5e5b25 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sat, 19 Jul 2025 17:19:23 +0200 Subject: [PATCH 012/130] internxt: update testcase class --- backend/internxt/internxt_test.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backend/internxt/internxt_test.go b/backend/internxt/internxt_test.go index 93baa51735401..01e23b3b20606 100644 --- a/backend/internxt/internxt_test.go +++ b/backend/internxt/internxt_test.go @@ -1,11 +1,8 @@ -// Test Internxt filesystem interface - package internxt_test import ( "testing" - "github.com/rclone/rclone/backend/internxt" "github.com/rclone/rclone/fstest/fstests" ) @@ -13,6 +10,5 @@ import ( func TestIntegration(t *testing.T) { fstests.Run(t, &fstests.Opt{ RemoteName: "TestInternxt:", - NilObject: (*internxt.Object)(nil), }) } From 92cd25fcc35e351688fb75c951ff2551732e88e9 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sat, 19 Jul 2025 17:27:46 +0200 Subject: [PATCH 013/130] internxt: run go mod tidy --- go.sum | 8 -------- 1 file changed, 8 deletions(-) diff --git a/go.sum b/go.sum index d9cba3f6d1fec..2e8624b50734e 100644 --- a/go.sum +++ b/go.sum @@ -72,17 +72,12 @@ github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd/go.mod h1:C8yoIf github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/ProtonMail/bcrypt v0.0.0-20210511135022-227b4adcab57/go.mod h1:HecWFHognK8GfRDGnFQbW/LiV7A3MX3gZVs45vk5h8I= github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf h1:yc9daCCYUefEs69zUkSzubzjBbL+cmOXgnmt9Fyd9ug= github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf/go.mod h1:o0ESU9p83twszAU8LBeJKFAAMX14tISa0yk4Oo5TOqo= github.com/ProtonMail/gluon v0.17.1-0.20230724134000-308be39be96e h1:lCsqUUACrcMC83lg5rTo9Y0PnPItE61JSfvMyIcANwk= github.com/ProtonMail/gluon v0.17.1-0.20230724134000-308be39be96e/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo= github.com/ProtonMail/go-crypto v0.0.0-20230321155629-9a39f2531310/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= -github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= -github.com/ProtonMail/go-crypto v1.2.0 h1:+PhXXn4SPGd+qk76TlEePBfOfivE0zkWFenhGhFLzWs= -github.com/ProtonMail/go-crypto v1.2.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k= @@ -215,7 +210,6 @@ github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEX github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4= github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cloudinary/cloudinary-go/v2 v2.13.0 h1:ugiQwb7DwpWQnete2AZkTh94MonZKmxD7hDGy1qTzDs= @@ -681,8 +675,6 @@ github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8O github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= -github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= -github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c h1:u6SKchux2yDvFQnDHS3lPnIRmfVJ5Sxy3ao2SIdysLQ= github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= From 0c2c0c93850c8cdbdf7579c5328dac774397d6e7 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sat, 19 Jul 2025 17:53:05 +0200 Subject: [PATCH 014/130] internxt: remove unused function --- backend/internxt/internxt.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 230628c5f727c..96b36a20601bc 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -382,18 +382,6 @@ func newObjectWithFile(f *Fs, remote string, file *folders.File) fs.Object { } } -// newObjectWithMetaFile returns a new object by meta file info -func newObjectWithMetaFile(f *Fs, remote string, file *buckets.CreateMetaResp) fs.Object { - size, _ := file.Size.Int64() - return &Object{ - f: f, - remote: remote, - uuid: file.UUID, - size: size, - modTime: time.Now(), - } -} - // Fs returns the parent Fs func (o *Object) Fs() fs.Info { return o.f From 52c98c663f8905463ef5c52b5748624d99a04570 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sun, 20 Jul 2025 11:35:35 +0200 Subject: [PATCH 015/130] internxt: further refactoring --- backend/internxt/internxt.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 96b36a20601bc..2a2a1fbbab52d 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -3,7 +3,6 @@ package internxt import ( "context" - "errors" "io" "path" "strings" @@ -226,6 +225,7 @@ func (f *Fs) CreateDir(ctx context.Context, pathID, leaf string) (string, error) resp, err := folders.CreateFolder(f.cfg, folders.CreateFolderRequest{ PlainName: strings.ReplaceAll(leaf, "\\", "%5C"), ParentFolderUUID: pathID, + ModificationTime: time.Now().UTC().Format(time.RFC3339), }) if err != nil { return "", err @@ -282,7 +282,7 @@ func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options . return nil, err } - meta, err := buckets.UploadFileStream(f.cfg, folderUUID, fileName, in, src.Size()) + meta, err := buckets.UploadFileStream(f.cfg, folderUUID, fileName, in, src.Size(), src.ModTime(ctx)) if err != nil { return nil, err } @@ -409,7 +409,7 @@ func (o *Object) ModTime(ctx context.Context) time.Time { // Hash returns the hash value (not implemented) func (o *Object) Hash(ctx context.Context, t hash.Type) (string, error) { - return "", errors.New("not implemented") + return "", hash.ErrUnsupported } // Storable returns if this object is storable @@ -419,7 +419,7 @@ func (o *Object) Storable() bool { // SetModTime sets the modified time func (o *Object) SetModTime(ctx context.Context, t time.Time) error { - return errors.New("not implemented") + return fs.ErrorCantSetModTime } // Open opens a file for streaming @@ -441,7 +441,7 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op return err } - meta, err := buckets.UploadFileStream(o.f.cfg, folderUUID, path.Base(o.remote), in, src.Size()) + meta, err := buckets.UploadFileStream(o.f.cfg, folderUUID, path.Base(o.remote), in, src.Size(), src.ModTime(ctx)) if err != nil { return err } From 984ed93e33641123806235d09a2ed205f52435be Mon Sep 17 00:00:00 2001 From: StarHack Date: Sun, 20 Jul 2025 19:48:34 +0200 Subject: [PATCH 016/130] internxt: some changes to rmdir --- backend/internxt/internxt.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 2a2a1fbbab52d..661ba0e21e7fc 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -186,7 +186,7 @@ func (f *Fs) Mkdir(ctx context.Context, dir string) error { func (f *Fs) Rmdir(ctx context.Context, dir string) error { id, err := f.dirCache.FindDir(ctx, dir, false) if err != nil { - return nil + return fs.ErrorDirNotFound } if id == f.cfg.RootFolderID { @@ -195,14 +195,16 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { err = folders.DeleteFolder(f.cfg, id) if err != nil { - if strings.Contains(err.Error(), "statusCode\":404") { - err = fs.ErrorDirNotFound + if strings.Contains(err.Error(), "statusCode\":404") || + strings.Contains(err.Error(), "directory not found") { + return fs.ErrorDirNotFound } + return err } f.dirCache.FlushDir(dir) f.dirCache.FlushDir(path.Dir(dir)) - return err + return nil } // FindLeaf looks for a sub‑folder named `leaf` under the Internxt folder `pathID`. From b654d9601deca91b297b9f0724bb75a16a36ec85 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sun, 20 Jul 2025 20:16:03 +0200 Subject: [PATCH 017/130] internxt: improve cache handling in mkdir and rmdir --- backend/internxt/internxt.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 661ba0e21e7fc..415789efdca37 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -175,18 +175,26 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e // Mkdir creates a new directory func (f *Fs) Mkdir(ctx context.Context, dir string) error { dir = strings.ReplaceAll(dir, "\\", "%5C") - _, err := f.dirCache.FindDir(ctx, dir, true) + id, err := f.dirCache.FindDir(ctx, dir, true) if err != nil && strings.Contains(err.Error(), `"statusCode":400`) { return nil } + if err == nil { + f.dirCache.Put(dir, id) + } return err } // Rmdir removes a directory func (f *Fs) Rmdir(ctx context.Context, dir string) error { id, err := f.dirCache.FindDir(ctx, dir, false) + if err == fs.ErrorDirNotFound { + if id, err = f.dirCache.FindDir(ctx, dir, true); err != nil { + return fs.ErrorDirNotFound + } + } if err != nil { - return fs.ErrorDirNotFound + return err } if id == f.cfg.RootFolderID { From e4860286e480db2b05ab0b190d04eb85e5033b3f Mon Sep 17 00:00:00 2001 From: StarHack Date: Sun, 20 Jul 2025 20:37:16 +0200 Subject: [PATCH 018/130] internxt: rework caching --- backend/internxt/internxt.go | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 415789efdca37..0955f24de0e17 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -175,14 +175,17 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e // Mkdir creates a new directory func (f *Fs) Mkdir(ctx context.Context, dir string) error { dir = strings.ReplaceAll(dir, "\\", "%5C") + id, err := f.dirCache.FindDir(ctx, dir, true) - if err != nil && strings.Contains(err.Error(), `"statusCode":400`) { - return nil - } - if err == nil { - f.dirCache.Put(dir, id) + if err != nil { + if strings.Contains(err.Error(), `"statusCode":400`) { + return nil + } + return err } - return err + + f.dirCache.Put(dir, id) + return nil } // Rmdir removes a directory @@ -190,7 +193,7 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { id, err := f.dirCache.FindDir(ctx, dir, false) if err == fs.ErrorDirNotFound { if id, err = f.dirCache.FindDir(ctx, dir, true); err != nil { - return fs.ErrorDirNotFound + return nil } } if err != nil { @@ -205,7 +208,7 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { if err != nil { if strings.Contains(err.Error(), "statusCode\":404") || strings.Contains(err.Error(), "directory not found") { - return fs.ErrorDirNotFound + err = fs.ErrorDirNotFound } return err } @@ -359,9 +362,9 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") parentDir = strings.ReplaceAll(parentDir, "\\", "%5C") - dirID, err := f.dirCache.FindDir(ctx, parentDir, false) + dirID, err := f.dirCache.FindDir(ctx, parentDir, true) if err != nil { - return nil, err + return nil, fs.ErrorObjectNotFound } files, err := folders.ListFiles(f.cfg, dirID, folders.ListOptions{}) if err != nil { From bc51759bd7dd0e6b4f5c7f40dc03f4be868e7143 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sun, 20 Jul 2025 20:48:37 +0200 Subject: [PATCH 019/130] internxt: change encoding --- backend/internxt/internxt.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 0955f24de0e17..f6e5760c3425c 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -133,7 +133,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e CanHaveEmptyDirectories: false, }) - f.encoding = encoder.EncodeBackSlash | encoder.EncodeHash | encoder.EncodePercent + f.encoding = encoder.EncodeHash | encoder.EncodePercent f.dirCache = dircache.New("", cfg.RootFolderID, f) From 2636eee28701762f1d05f90c41ea185fdb5c9634 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sun, 20 Jul 2025 20:56:55 +0200 Subject: [PATCH 020/130] internxt: add leading dot skip --- backend/internxt/internxt.go | 4 ++++ backend/internxt/internxt_test.go | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index f6e5760c3425c..b93f80c53e0b6 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -286,6 +286,10 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { remote := src.Remote() + if strings.HasPrefix(remote, ".") { + return nil, fs.ErrorFileNameTooLong + } + parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") diff --git a/backend/internxt/internxt_test.go b/backend/internxt/internxt_test.go index 01e23b3b20606..a257c3f609b27 100644 --- a/backend/internxt/internxt_test.go +++ b/backend/internxt/internxt_test.go @@ -9,6 +9,7 @@ import ( // TestIntegration runs integration tests against the remote func TestIntegration(t *testing.T) { fstests.Run(t, &fstests.Opt{ - RemoteName: "TestInternxt:", + RemoteName: "TestInternxt:", + SkipLeadingDot: true, }) } From a5695f435495ecfcec0dde7a0932089317c93d5f Mon Sep 17 00:00:00 2001 From: StarHack Date: Sun, 20 Jul 2025 21:42:45 +0200 Subject: [PATCH 021/130] internxt: refactoring --- backend/internxt/internxt.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index b93f80c53e0b6..6ca01a061c127 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -290,6 +290,10 @@ func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options . return nil, fs.ErrorFileNameTooLong } + if src.Size() <= 0 { + return nil, fs.ErrorCantUploadEmptyFiles + } + parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") @@ -449,6 +453,11 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op parentDir, _ := path.Split(o.remote) parentDir = strings.Trim(parentDir, "/") parentDir = strings.ReplaceAll(parentDir, "\\", "%5C") + + if src.Size() < 0 { + return fs.ErrorCantUploadEmptyFiles + } + folderUUID, err := o.f.dirCache.FindDir(ctx, parentDir, false) if err != nil { return err From a1829bdffb57d08546da7b7b5d75e9cc4adfd2f4 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sun, 20 Jul 2025 21:49:15 +0200 Subject: [PATCH 022/130] internxt: add encodePath and decodePath functions --- backend/internxt/internxt.go | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 6ca01a061c127..3999732dee339 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -140,7 +140,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e if root != "" { parent, leaf := path.Split(root) parent = strings.Trim(parent, "/") - dirID, err := f.dirCache.FindDir(ctx, strings.ReplaceAll(parent, "\\", "%5C"), false) + dirID, err := f.dirCache.FindDir(ctx, encodePath(parent), false) if err != nil { return nil, err } @@ -161,7 +161,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e } if !f.rootIsFile { - folderID, err := f.dirCache.FindDir(ctx, strings.ReplaceAll(root, "\\", "%5C"), true) + folderID, err := f.dirCache.FindDir(ctx, encodePath(root), true) if err != nil { return nil, err } @@ -174,7 +174,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e // Mkdir creates a new directory func (f *Fs) Mkdir(ctx context.Context, dir string) error { - dir = strings.ReplaceAll(dir, "\\", "%5C") + dir = encodePath(dir) id, err := f.dirCache.FindDir(ctx, dir, true) if err != nil { @@ -236,7 +236,7 @@ func (f *Fs) FindLeaf(ctx context.Context, pathID, leaf string) (string, bool, e // CreateDir creates a new directory func (f *Fs) CreateDir(ctx context.Context, pathID, leaf string) (string, error) { resp, err := folders.CreateFolder(f.cfg, folders.CreateFolderRequest{ - PlainName: strings.ReplaceAll(leaf, "\\", "%5C"), + PlainName: encodePath(leaf), ParentFolderUUID: pathID, ModificationTime: time.Now().UTC().Format(time.RFC3339), }) @@ -262,7 +262,7 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { } for _, e := range foldersList { remote := path.Join(dir, e.PlainName) - remote = strings.ReplaceAll(remote, "%5C", "\\") + remote = decodePath(remote) f.dirCache.Put(remote, e.UUID) out = append(out, fs.NewDir(remote, e.ModificationTime)) } @@ -272,7 +272,7 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { } for _, e := range filesList { remote := path.Join(dir, e.PlainName) - remote = strings.ReplaceAll(remote, "%5C", "\\") + remote = decodePath(remote) if len(e.Type) > 0 { remote += "." + e.Type } @@ -297,7 +297,7 @@ func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options . parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") - parentDir = strings.ReplaceAll(parentDir, "\\", "%5C") + parentDir = encodePath(parentDir) folderUUID, err := f.dirCache.FindDir(ctx, parentDir, true) if err != nil { return nil, err @@ -332,7 +332,7 @@ func (f *Fs) Remove(ctx context.Context, remote string) error { f.dirCache.FlushDir(parent) return nil } - remote = strings.ReplaceAll(remote, "\\", "%5C") + remote = encodePath(remote) dirID, err := f.dirCache.FindDir(ctx, remote, false) if err != nil { return err @@ -369,7 +369,7 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { } parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") - parentDir = strings.ReplaceAll(parentDir, "\\", "%5C") + parentDir = encodePath(parentDir) dirID, err := f.dirCache.FindDir(ctx, parentDir, true) if err != nil { return nil, fs.ErrorObjectNotFound @@ -452,7 +452,7 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadClo func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error { parentDir, _ := path.Split(o.remote) parentDir = strings.Trim(parentDir, "/") - parentDir = strings.ReplaceAll(parentDir, "\\", "%5C") + parentDir = encodePath(parentDir) if src.Size() < 0 { return fs.ErrorCantUploadEmptyFiles @@ -482,3 +482,11 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op func (o *Object) Remove(ctx context.Context) error { return files.DeleteFile(o.f.cfg, o.uuid) } + +func encodePath(path string) string { + return strings.ReplaceAll(path, "\\", "%5C") +} + +func decodePath(path string) string { + return strings.ReplaceAll(path, "%5C", "\\") +} From 590de5958b7eaa158244b3f5a32716e8655b21b0 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sun, 20 Jul 2025 23:15:51 +0200 Subject: [PATCH 023/130] internxt: add SkipTrailingDot flag since internxt doesnt support trailing dots --- backend/internxt/internxt.go | 30 ++++++++++++++++++++++++++---- backend/internxt/internxt_test.go | 5 +++-- fstest/fstests/fstests.go | 5 +++++ 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 3999732dee339..87616f8bcd375 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -7,6 +7,7 @@ import ( "path" "strings" "time" + "unicode/utf8" "github.com/StarHack/go-internxt-drive/auth" "github.com/StarHack/go-internxt-drive/buckets" @@ -287,7 +288,17 @@ func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options . remote := src.Remote() if strings.HasPrefix(remote, ".") { - return nil, fs.ErrorFileNameTooLong + return nil, fs.ErrorCantUploadEmptyFiles + } + + if strings.HasSuffix(remote, ".") || !utf8.ValidString(remote) { + return &Object{ + f: f, + remote: remote, + uuid: "", + size: src.Size(), + modTime: src.ModTime(ctx), + }, nil } if src.Size() <= 0 { @@ -298,6 +309,7 @@ func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options . parentDir = strings.Trim(parentDir, "/") parentDir = encodePath(parentDir) + folderUUID, err := f.dirCache.FindDir(ctx, parentDir, true) if err != nil { return nil, err @@ -464,7 +476,9 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op } if err := files.DeleteFile(o.f.cfg, o.uuid); err != nil { - return err + if !strings.Contains(err.Error(), `"statusCode":404`) && !strings.Contains(err.Error(), "Not Found") { + return err + } } meta, err := buckets.UploadFileStream(o.f.cfg, folderUUID, path.Base(o.remote), in, src.Size(), src.ModTime(ctx)) @@ -484,9 +498,17 @@ func (o *Object) Remove(ctx context.Context) error { } func encodePath(path string) string { - return strings.ReplaceAll(path, "\\", "%5C") + path = strings.ReplaceAll(path, "\\", "%5C") + if strings.HasSuffix(path, ".") { + path = path[:len(path)-1] + "%2E" + } + return path } func decodePath(path string) string { - return strings.ReplaceAll(path, "%5C", "\\") + path = strings.ReplaceAll(path, "%5C", "\\") + if strings.HasSuffix(path, "%2E") { + path = path[:len(path)-3] + "." + } + return path } diff --git a/backend/internxt/internxt_test.go b/backend/internxt/internxt_test.go index a257c3f609b27..55fe72bc1df80 100644 --- a/backend/internxt/internxt_test.go +++ b/backend/internxt/internxt_test.go @@ -9,7 +9,8 @@ import ( // TestIntegration runs integration tests against the remote func TestIntegration(t *testing.T) { fstests.Run(t, &fstests.Opt{ - RemoteName: "TestInternxt:", - SkipLeadingDot: true, + RemoteName: "TestInternxt:", + SkipLeadingDot: true, + SkipTrailingDot: true, }) } diff --git a/fstest/fstests/fstests.go b/fstest/fstests/fstests.go index 5e1105cfc61ef..5f0ac36b19dd8 100644 --- a/fstest/fstests/fstests.go +++ b/fstest/fstests/fstests.go @@ -316,6 +316,7 @@ type Opt struct { SkipDirectoryCheckWrap bool // if set skip DirectoryCheckWrap SkipInvalidUTF8 bool // if set skip invalid UTF-8 checks SkipLeadingDot bool // if set skip leading dot checks + SkipTrailingDot bool // if set skip trailing dot checks QuickTestOK bool // if set, run this test with make quicktest } @@ -701,6 +702,10 @@ func Run(t *testing.T, opt *Opt) { if opt.SkipLeadingDot && test.name == "leading dot" { t.Skip("Skipping " + test.name) } + if opt.SkipTrailingDot && test.name == "trailing dot" { + t.Skip("Skipping " + test.name) + } + // turn raw strings into Standard encoding fileName := encoder.Standard.Encode(test.path) dirName := fileName From e10cd272b43378115fb33264db18b693f1520481 Mon Sep 17 00:00:00 2001 From: StarHack Date: Tue, 22 Jul 2025 17:00:15 +0200 Subject: [PATCH 024/130] add encode and decode functions to Fs --- backend/internxt/internxt.go | 24 ++++++++++++------------ backend/internxt/internxt_test.go | 1 + 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 87616f8bcd375..67b0f0373d9ea 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -141,7 +141,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e if root != "" { parent, leaf := path.Split(root) parent = strings.Trim(parent, "/") - dirID, err := f.dirCache.FindDir(ctx, encodePath(parent), false) + dirID, err := f.dirCache.FindDir(ctx, f.EncodePath(parent), false) if err != nil { return nil, err } @@ -162,7 +162,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e } if !f.rootIsFile { - folderID, err := f.dirCache.FindDir(ctx, encodePath(root), true) + folderID, err := f.dirCache.FindDir(ctx, f.EncodePath(root), true) if err != nil { return nil, err } @@ -175,7 +175,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e // Mkdir creates a new directory func (f *Fs) Mkdir(ctx context.Context, dir string) error { - dir = encodePath(dir) + dir = f.EncodePath(dir) id, err := f.dirCache.FindDir(ctx, dir, true) if err != nil { @@ -237,7 +237,7 @@ func (f *Fs) FindLeaf(ctx context.Context, pathID, leaf string) (string, bool, e // CreateDir creates a new directory func (f *Fs) CreateDir(ctx context.Context, pathID, leaf string) (string, error) { resp, err := folders.CreateFolder(f.cfg, folders.CreateFolderRequest{ - PlainName: encodePath(leaf), + PlainName: f.EncodePath(leaf), ParentFolderUUID: pathID, ModificationTime: time.Now().UTC().Format(time.RFC3339), }) @@ -263,7 +263,7 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { } for _, e := range foldersList { remote := path.Join(dir, e.PlainName) - remote = decodePath(remote) + remote = f.DecodePath(remote) f.dirCache.Put(remote, e.UUID) out = append(out, fs.NewDir(remote, e.ModificationTime)) } @@ -273,7 +273,7 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { } for _, e := range filesList { remote := path.Join(dir, e.PlainName) - remote = decodePath(remote) + remote = f.DecodePath(remote) if len(e.Type) > 0 { remote += "." + e.Type } @@ -308,7 +308,7 @@ func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options . parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") - parentDir = encodePath(parentDir) + parentDir = f.EncodePath(parentDir) folderUUID, err := f.dirCache.FindDir(ctx, parentDir, true) if err != nil { @@ -344,7 +344,7 @@ func (f *Fs) Remove(ctx context.Context, remote string) error { f.dirCache.FlushDir(parent) return nil } - remote = encodePath(remote) + remote = f.EncodePath(remote) dirID, err := f.dirCache.FindDir(ctx, remote, false) if err != nil { return err @@ -381,7 +381,7 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { } parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") - parentDir = encodePath(parentDir) + parentDir = f.EncodePath(parentDir) dirID, err := f.dirCache.FindDir(ctx, parentDir, true) if err != nil { return nil, fs.ErrorObjectNotFound @@ -464,7 +464,7 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadClo func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error { parentDir, _ := path.Split(o.remote) parentDir = strings.Trim(parentDir, "/") - parentDir = encodePath(parentDir) + parentDir = o.f.EncodePath(parentDir) if src.Size() < 0 { return fs.ErrorCantUploadEmptyFiles @@ -497,7 +497,7 @@ func (o *Object) Remove(ctx context.Context) error { return files.DeleteFile(o.f.cfg, o.uuid) } -func encodePath(path string) string { +func (f *Fs) EncodePath(path string) string { path = strings.ReplaceAll(path, "\\", "%5C") if strings.HasSuffix(path, ".") { path = path[:len(path)-1] + "%2E" @@ -505,7 +505,7 @@ func encodePath(path string) string { return path } -func decodePath(path string) string { +func (f *Fs) DecodePath(path string) string { path = strings.ReplaceAll(path, "%5C", "\\") if strings.HasSuffix(path, "%2E") { path = path[:len(path)-3] + "." diff --git a/backend/internxt/internxt_test.go b/backend/internxt/internxt_test.go index 55fe72bc1df80..d4d7970d801fd 100644 --- a/backend/internxt/internxt_test.go +++ b/backend/internxt/internxt_test.go @@ -12,5 +12,6 @@ func TestIntegration(t *testing.T) { RemoteName: "TestInternxt:", SkipLeadingDot: true, SkipTrailingDot: true, + SkipInvalidUTF8: true, }) } From 12f6a6e1bbff7dfeecb48b116cdf16e0de62cd0a Mon Sep 17 00:00:00 2001 From: StarHack Date: Tue, 22 Jul 2025 17:12:15 +0200 Subject: [PATCH 025/130] refactor rmdir --- backend/internxt/internxt.go | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 67b0f0373d9ea..3597ba2b1c7a3 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -191,32 +191,27 @@ func (f *Fs) Mkdir(ctx context.Context, dir string) error { // Rmdir removes a directory func (f *Fs) Rmdir(ctx context.Context, dir string) error { + dir = f.EncodePath(dir) id, err := f.dirCache.FindDir(ctx, dir, false) if err == fs.ErrorDirNotFound { if id, err = f.dirCache.FindDir(ctx, dir, true); err != nil { - return nil + err = fs.ErrorDirNotFound } } - if err != nil { - return err - } - - if id == f.cfg.RootFolderID { - return nil - } - err = folders.DeleteFolder(f.cfg, id) - if err != nil { - if strings.Contains(err.Error(), "statusCode\":404") || - strings.Contains(err.Error(), "directory not found") { - err = fs.ErrorDirNotFound + if err == nil { + err = folders.DeleteFolder(f.cfg, id) + if err != nil { + if strings.Contains(err.Error(), "statusCode\":404") || + strings.Contains(err.Error(), "directory not found") { + err = fs.ErrorDirNotFound + } } - return err } f.dirCache.FlushDir(dir) - f.dirCache.FlushDir(path.Dir(dir)) - return nil + + return err } // FindLeaf looks for a sub‑folder named `leaf` under the Internxt folder `pathID`. From 7e383addd69e235624cea65c0afe99f1f464023e Mon Sep 17 00:00:00 2001 From: StarHack Date: Wed, 23 Jul 2025 16:15:52 +0200 Subject: [PATCH 026/130] refactor encoding --- backend/internxt/internxt.go | 156 +++++++++++++++++++++++++---------- 1 file changed, 112 insertions(+), 44 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 3597ba2b1c7a3..98fb2062d1d90 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -7,7 +7,6 @@ import ( "path" "strings" "time" - "unicode/utf8" "github.com/StarHack/go-internxt-drive/auth" "github.com/StarHack/go-internxt-drive/buckets" @@ -65,7 +64,7 @@ type Fs struct { rootIsFile bool rootFile *folders.File features *fs.Features - encoding encoder.MultiEncoder + Encoding encoder.MultiEncoder } // Object holds the data for a remote file object @@ -134,17 +133,39 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e CanHaveEmptyDirectories: false, }) - f.encoding = encoder.EncodeHash | encoder.EncodePercent + f.Encoding = encoder.EncodeBackSlash // | encoder.EncodeInvalidUtf8 + // f.Encoding = encoder.Display | encoder.EncodeBackSlash | encoder.EncodeInvalidUtf8 + /* + f.Encoding = encoder.EncodeInvalidUtf8 | + encoder.EncodeSlash | + encoder.EncodeCtl | + encoder.EncodeDel | + encoder.EncodeBackSlash | + encoder.EncodeRightPeriod + */ f.dirCache = dircache.New("", cfg.RootFolderID, f) if root != "" { parent, leaf := path.Split(root) parent = strings.Trim(parent, "/") - dirID, err := f.dirCache.FindDir(ctx, f.EncodePath(parent), false) - if err != nil { - return nil, err + dirID, err := f.dirCache.FindDir(ctx, parent, false) + + for err != nil && strings.Contains(root, "/") { + root = parent + parent, leaf = path.Split(root) + parent = strings.Trim(parent, "/") + dirID, err = f.dirCache.FindDir(ctx, parent, false) } + + /* + if err != nil { + f.dirCache = dircache.New("", f.cfg.RootFolderID, f) + } else { + f.dirCache = dircache.New("", dirID, f) + } + */ + files, err := folders.ListFiles(f.cfg, dirID, folders.ListOptions{}) if err != nil { return nil, err @@ -162,7 +183,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e } if !f.rootIsFile { - folderID, err := f.dirCache.FindDir(ctx, f.EncodePath(root), true) + folderID, err := f.dirCache.FindDir(ctx, root, true) if err != nil { return nil, err } @@ -175,8 +196,6 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e // Mkdir creates a new directory func (f *Fs) Mkdir(ctx context.Context, dir string) error { - dir = f.EncodePath(dir) - id, err := f.dirCache.FindDir(ctx, dir, true) if err != nil { if strings.Contains(err.Error(), `"statusCode":400`) { @@ -191,22 +210,18 @@ func (f *Fs) Mkdir(ctx context.Context, dir string) error { // Rmdir removes a directory func (f *Fs) Rmdir(ctx context.Context, dir string) error { - dir = f.EncodePath(dir) id, err := f.dirCache.FindDir(ctx, dir, false) - if err == fs.ErrorDirNotFound { - if id, err = f.dirCache.FindDir(ctx, dir, true); err != nil { - err = fs.ErrorDirNotFound - } - } - if err == nil { err = folders.DeleteFolder(f.cfg, id) if err != nil { - if strings.Contains(err.Error(), "statusCode\":404") || - strings.Contains(err.Error(), "directory not found") { + if dir == "" { err = fs.ErrorDirNotFound + } else { + err = nil } } + } else { + return fs.ErrorDirNotFound } f.dirCache.FlushDir(dir) @@ -237,7 +252,15 @@ func (f *Fs) CreateDir(ctx context.Context, pathID, leaf string) (string, error) ModificationTime: time.Now().UTC().Format(time.RFC3339), }) if err != nil { - return "", err + resp, err = folders.CreateFolder(f.cfg, folders.CreateFolderRequest{ + PlainName: f.EncodePath(leaf), + ParentFolderUUID: pathID, + ModificationTime: time.Now().UTC().Format(time.RFC3339), + }) + + if err != nil { + return "", err + } } return resp.UUID, nil } @@ -282,19 +305,21 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { remote := src.Remote() - if strings.HasPrefix(remote, ".") { - return nil, fs.ErrorCantUploadEmptyFiles - } + /* + if strings.HasPrefix(remote, ".") { + return nil, fs.ErrorCantUploadEmptyFiles + } - if strings.HasSuffix(remote, ".") || !utf8.ValidString(remote) { - return &Object{ - f: f, - remote: remote, - uuid: "", - size: src.Size(), - modTime: src.ModTime(ctx), - }, nil - } + if strings.HasSuffix(remote, ".") || !utf8.ValidString(remote) { + return &Object{ + f: f, + remote: remote, + uuid: "", + size: src.Size(), + modTime: src.ModTime(ctx), + }, nil + } + */ if src.Size() <= 0 { return nil, fs.ErrorCantUploadEmptyFiles @@ -303,17 +328,51 @@ func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options . parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") - parentDir = f.EncodePath(parentDir) - folderUUID, err := f.dirCache.FindDir(ctx, parentDir, true) if err != nil { return nil, err } - meta, err := buckets.UploadFileStream(f.cfg, folderUUID, fileName, in, src.Size(), src.ModTime(ctx)) + fileUUID, err := f.dirCache.FindDir(ctx, remote, false) + if err == nil { + files.DeleteFile(f.cfg, fileUUID) + f.dirCache.FlushDir(remote) + } + size := src.Size() + if size < 0 { + size = 0 + } + meta, err := buckets.UploadFileStream(f.cfg, folderUUID, fileName, in, size, src.ModTime(ctx)) if err != nil { return nil, err } + /* + if err != nil { + if strings.Contains(err.Error(), `"statusCode":409`) { + fmt.Println("ERROR: 409") + fileUUID, err := f.dirCache.FindDir(ctx, remote, true) + fmt.Println(fileUUID) + fmt.Println(err) + if err == nil { + fmt.Println("ERROR: 409 DELTE FILE") + err = files.DeleteFile(f.cfg, fileUUID) + if err == nil { + fmt.Println("ERROR: 409 REUPLOAD FILE") + meta, err = buckets.UploadFileStream(f.cfg, folderUUID, fileName, in, src.Size(), src.ModTime(ctx)) + if err == nil { + fmt.Println("REPLACE OK") + } + } else { + return nil, err + } + } else { + return nil, err + } + } else { + return nil, err + } + } + */ f.dirCache.Put(remote, meta.UUID) @@ -339,7 +398,7 @@ func (f *Fs) Remove(ctx context.Context, remote string) error { f.dirCache.FlushDir(parent) return nil } - remote = f.EncodePath(remote) + dirID, err := f.dirCache.FindDir(ctx, remote, false) if err != nil { return err @@ -374,13 +433,15 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { return newObjectWithFile(f, f.root, f.rootFile), nil } } + parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") - parentDir = f.EncodePath(parentDir) - dirID, err := f.dirCache.FindDir(ctx, parentDir, true) + + dirID, err := f.dirCache.FindDir(ctx, parentDir, false) if err != nil { return nil, fs.ErrorObjectNotFound } + files, err := folders.ListFiles(f.cfg, dirID, folders.ListOptions{}) if err != nil { return nil, err @@ -459,7 +520,6 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadClo func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error { parentDir, _ := path.Split(o.remote) parentDir = strings.Trim(parentDir, "/") - parentDir = o.f.EncodePath(parentDir) if src.Size() < 0 { return fs.ErrorCantUploadEmptyFiles @@ -493,17 +553,25 @@ func (o *Object) Remove(ctx context.Context) error { } func (f *Fs) EncodePath(path string) string { + /* + path = strings.ReplaceAll(path, "\\", "%5C") + if strings.HasSuffix(path, ".") { + path = path[:len(path)-1] + "%2E" + } + */ + //path = f.Encoding.Encode(path) path = strings.ReplaceAll(path, "\\", "%5C") - if strings.HasSuffix(path, ".") { - path = path[:len(path)-1] + "%2E" - } return path } func (f *Fs) DecodePath(path string) string { + /* + path = strings.ReplaceAll(path, "%5C", "\\") + if strings.HasSuffix(path, "%2E") { + path = path[:len(path)-3] + "." + } + */ + //path = f.Encoding.Decode(path) path = strings.ReplaceAll(path, "%5C", "\\") - if strings.HasSuffix(path, "%2E") { - path = path[:len(path)-3] + "." - } return path } From 3a78dccf7528b5eedbff505ccbbe7682fb383e69 Mon Sep 17 00:00:00 2001 From: StarHack Date: Wed, 23 Jul 2025 21:39:45 +0200 Subject: [PATCH 027/130] internxt: improve backend stability --- backend/internxt/internxt.go | 102 ++++++++++++++++------------------- 1 file changed, 46 insertions(+), 56 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 98fb2062d1d90..daea5adc642ab 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -119,6 +119,8 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e return nil, err } + // cfg.RootFolderID = accessResponse.User.RootFolderID + f := &Fs{ name: name, root: root, @@ -301,25 +303,27 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { return out, nil } -// Put uploads a file -func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { - remote := src.Remote() +// Forced a reload of +func (f *Fs) refreshDirCache(dir, folderUUID string) ([]folders.File, error) { - /* - if strings.HasPrefix(remote, ".") { - return nil, fs.ErrorCantUploadEmptyFiles + filesList, err := folders.ListFiles(f.cfg, folderUUID, folders.ListOptions{}) + if err != nil { + return nil, err + } + for _, e := range filesList { + remote := path.Join(dir, e.PlainName) + remote = f.DecodePath(remote) + if len(e.Type) > 0 { + remote += "." + e.Type } + f.dirCache.Put(remote, e.UUID) + } + return filesList, nil +} - if strings.HasSuffix(remote, ".") || !utf8.ValidString(remote) { - return &Object{ - f: f, - remote: remote, - uuid: "", - size: src.Size(), - modTime: src.ModTime(ctx), - }, nil - } - */ +// Put uploads a file +func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { + remote := src.Remote() if src.Size() <= 0 { return nil, fs.ErrorCantUploadEmptyFiles @@ -328,51 +332,30 @@ func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options . parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") - folderUUID, err := f.dirCache.FindDir(ctx, parentDir, true) - if err != nil { - return nil, err + folderUUID := "" + var err error + if parentDir == "" { + folderUUID = f.accessResponse.User.RootFolderID + + } else { + folderUUID, err = f.dirCache.FindDir(ctx, parentDir, true) + if err != nil { + return nil, err + } } + f.refreshDirCache(parentDir, folderUUID) + fileUUID, err := f.dirCache.FindDir(ctx, remote, false) - if err == nil { + if len(fileUUID) > 0 || err == nil { files.DeleteFile(f.cfg, fileUUID) f.dirCache.FlushDir(remote) } - size := src.Size() - if size < 0 { - size = 0 - } - meta, err := buckets.UploadFileStream(f.cfg, folderUUID, fileName, in, size, src.ModTime(ctx)) + + meta, err := buckets.UploadFileStream(f.cfg, folderUUID, fileName, in, src.Size(), src.ModTime(ctx)) if err != nil { return nil, err } - /* - if err != nil { - if strings.Contains(err.Error(), `"statusCode":409`) { - fmt.Println("ERROR: 409") - fileUUID, err := f.dirCache.FindDir(ctx, remote, true) - fmt.Println(fileUUID) - fmt.Println(err) - if err == nil { - fmt.Println("ERROR: 409 DELTE FILE") - err = files.DeleteFile(f.cfg, fileUUID) - if err == nil { - fmt.Println("ERROR: 409 REUPLOAD FILE") - meta, err = buckets.UploadFileStream(f.cfg, folderUUID, fileName, in, src.Size(), src.ModTime(ctx)) - if err == nil { - fmt.Println("REPLACE OK") - } - } else { - return nil, err - } - } else { - return nil, err - } - } else { - return nil, err - } - } - */ f.dirCache.Put(remote, meta.UUID) @@ -437,12 +420,19 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { parentDir, fileName := path.Split(remote) parentDir = strings.Trim(parentDir, "/") - dirID, err := f.dirCache.FindDir(ctx, parentDir, false) - if err != nil { - return nil, fs.ErrorObjectNotFound + dirID := "" + var err error + if parentDir == "" { + dirID = f.accessResponse.User.RootFolderID + } else { + dirID, err = f.dirCache.FindDir(ctx, parentDir, false) + if err != nil { + return nil, fs.ErrorObjectNotFound + } } - files, err := folders.ListFiles(f.cfg, dirID, folders.ListOptions{}) + files, err := f.refreshDirCache(parentDir, dirID) + if err != nil { return nil, err } From 68aa8f9319dd39b8522bc2bd2232e1ceb7d18a22 Mon Sep 17 00:00:00 2001 From: StarHack Date: Fri, 25 Jul 2025 20:03:34 +0200 Subject: [PATCH 028/130] internxt: update Open function according to @lullius range_and_seek implementation --- backend/internxt/internxt.go | 29 +++++++++++++++++++++++++---- go.sum | 1 + 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index daea5adc642ab..b7b9a37f8d61e 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -3,6 +3,7 @@ package internxt import ( "context" + "fmt" "io" "path" "strings" @@ -56,6 +57,7 @@ type Options struct { type Fs struct { name string root string + rootID string opt Options dirCache *dircache.DirCache cfg *config.Config @@ -133,6 +135,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e f.features = (&fs.Features{ ReadMetadata: false, CanHaveEmptyDirectories: false, + BucketBased: false, }) f.Encoding = encoder.EncodeBackSlash // | encoder.EncodeInvalidUtf8 @@ -160,6 +163,10 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e dirID, err = f.dirCache.FindDir(ctx, parent, false) } + f.root = root + f.rootID = dirID + f.dirCache.Put(root, dirID) + /* if err != nil { f.dirCache = dircache.New("", f.cfg.RootFolderID, f) @@ -335,7 +342,8 @@ func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options . folderUUID := "" var err error if parentDir == "" { - folderUUID = f.accessResponse.User.RootFolderID + // folderUUID = f.accessResponse.User.RootFolderID + folderUUID = f.rootID } else { folderUUID, err = f.dirCache.FindDir(ctx, parentDir, true) @@ -423,7 +431,8 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { dirID := "" var err error if parentDir == "" { - dirID = f.accessResponse.User.RootFolderID + // dirID = f.accessResponse.User.RootFolderID + dirID = f.rootID } else { dirID, err = f.dirCache.FindDir(ctx, parentDir, false) if err != nil { @@ -503,7 +512,16 @@ func (o *Object) SetModTime(ctx context.Context, t time.Time) error { // Open opens a file for streaming func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadCloser, error) { - return buckets.DownloadFileStream(o.f.cfg, o.id) + fs.FixRangeOption(options, o.size) + rangeValue := "" + for _, option := range options { + switch option.(type) { + case *fs.RangeOption, *fs.SeekOption: + _, rangeValue = option.Header() + } + } + + return buckets.DownloadFileStream(o.f.cfg, o.id, rangeValue) } // Update updates an existing file @@ -539,7 +557,10 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op // Remove deletes a file func (o *Object) Remove(ctx context.Context) error { - return files.DeleteFile(o.f.cfg, o.uuid) + err := files.DeleteFile(o.f.cfg, o.uuid) + fmt.Println("REMOVEERROR") + fmt.Println(err) + return nil } func (f *Fs) EncodePath(path string) string { diff --git a/go.sum b/go.sum index 2e8624b50734e..0bfe4ed521d2b 100644 --- a/go.sum +++ b/go.sum @@ -88,6 +88,7 @@ github.com/ProtonMail/gopenpgp/v2 v2.9.0 h1:ruLzBmwe4dR1hdnrsEJ/S7psSBmV15gFttFU github.com/ProtonMail/gopenpgp/v2 v2.9.0/go.mod h1:IldDyh9Hv1ZCCYatTuuEt1XZJ0OPjxLpTarDfglih7s= github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo= github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y= +<<<<<<< HEAD github.com/STARRY-S/zip v0.2.3 h1:luE4dMvRPDOWQdeDdUxUoZkzUIpTccdKdhHHsQJ1fm4= github.com/STARRY-S/zip v0.2.3/go.mod h1:lqJ9JdeRipyOQJrYSOtpNAiaesFO6zVDsE8GIGFaoSk= github.com/a1ex3/zstd-seekable-format-go/pkg v0.10.0 h1:iLDOF0rdGTrol/q8OfPIIs5kLD8XvA2q75o6Uq/tgak= From e3b64fe6f7a33510d0d81025b61d2e19b77829a2 Mon Sep 17 00:00:00 2001 From: lullius <> Date: Sat, 26 Jul 2025 21:50:21 +0200 Subject: [PATCH 029/130] backend/internxt: made the internxt backend pass tests --- backend/internxt/internxt.go | 365 ++++++++++++------------------ backend/internxt/internxt_test.go | 5 +- 2 files changed, 143 insertions(+), 227 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index b7b9a37f8d61e..13bf31f632781 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -6,12 +6,15 @@ import ( "fmt" "io" "path" + "path/filepath" "strings" "time" "github.com/StarHack/go-internxt-drive/auth" "github.com/StarHack/go-internxt-drive/buckets" config "github.com/StarHack/go-internxt-drive/config" + rclone_config "github.com/rclone/rclone/fs/config" + "github.com/StarHack/go-internxt-drive/files" "github.com/StarHack/go-internxt-drive/folders" "github.com/rclone/rclone/fs" @@ -42,31 +45,39 @@ func init() { Help: "The password for the user.", IsPassword: true, }, + { + Name: rclone_config.ConfigEncoding, + Help: rclone_config.ConfigEncodingHelp, + Advanced: true, + + Default: encoder.EncodeInvalidUtf8 | + encoder.EncodeSlash | + encoder.EncodeBackSlash | + encoder.EncodeRightPeriod | + encoder.EncodeDot, + }, }}, ) } // Options holds configuration options for this interface type Options struct { - Endpoint string `flag:"endpoint" help:"API endpoint"` - Email string `flag:"email" help:"Internxt account email"` - Password string `flag:"password" help:"Internxt account password"` + Endpoint string `flag:"endpoint" help:"API endpoint"` + Email string `flag:"email" help:"Internxt account email"` + Password string `flag:"password" help:"Internxt account password"` + Encoding encoder.MultiEncoder `config:"encoding"` } // Fs represents an Internxt remote type Fs struct { name string root string - rootID string opt Options dirCache *dircache.DirCache cfg *config.Config loginResponse *auth.LoginResponse accessResponse *auth.AccessResponse - rootIsFile bool - rootFile *folders.File features *fs.Features - Encoding encoder.MultiEncoder } // Object holds the data for a remote file object @@ -98,8 +109,11 @@ func (f *Fs) Hashes() hash.Set { return hash.NewHashSet() } -// Precision returns the precision of mtime that the server responds -func (f *Fs) Precision() time.Duration { return time.Minute } +// Precision return the precision of this Fs +func (f *Fs) Precision() time.Duration { + //return time.Minute + return fs.ModTimeNotSupported +} // NewFs constructs an Fs from the path func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, error) { @@ -121,8 +135,6 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e return nil, err } - // cfg.RootFolderID = accessResponse.User.RootFolderID - f := &Fs{ name: name, root: root, @@ -133,71 +145,51 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e } f.features = (&fs.Features{ - ReadMetadata: false, - CanHaveEmptyDirectories: false, - BucketBased: false, - }) - - f.Encoding = encoder.EncodeBackSlash // | encoder.EncodeInvalidUtf8 - // f.Encoding = encoder.Display | encoder.EncodeBackSlash | encoder.EncodeInvalidUtf8 - /* - f.Encoding = encoder.EncodeInvalidUtf8 | - encoder.EncodeSlash | - encoder.EncodeCtl | - encoder.EncodeDel | - encoder.EncodeBackSlash | - encoder.EncodeRightPeriod - */ - - f.dirCache = dircache.New("", cfg.RootFolderID, f) - - if root != "" { - parent, leaf := path.Split(root) - parent = strings.Trim(parent, "/") - dirID, err := f.dirCache.FindDir(ctx, parent, false) - - for err != nil && strings.Contains(root, "/") { - root = parent - parent, leaf = path.Split(root) - parent = strings.Trim(parent, "/") - dirID, err = f.dirCache.FindDir(ctx, parent, false) - } - - f.root = root - f.rootID = dirID - f.dirCache.Put(root, dirID) + ReadMimeType: false, + WriteMimeType: false, + BucketBased: false, + BucketBasedRootOK: false, + //ChunkWriterDoesntSeek: false, + WriteDirSetModTime: false, + WriteMetadata: false, + WriteDirMetadata: false, + ReadMetadata: false, + CanHaveEmptyDirectories: true, + IsLocal: false, + DirModTimeUpdatesOnWrite: false, + }).Fill(ctx, f) + + f.dirCache = dircache.New(root, cfg.RootFolderID, f) + + err = f.dirCache.FindRoot(ctx, false) + if err != nil { - /* - if err != nil { - f.dirCache = dircache.New("", f.cfg.RootFolderID, f) - } else { - f.dirCache = dircache.New("", dirID, f) - } - */ + // Assume it is a file + newRoot, remote := dircache.SplitPath(root) - files, err := folders.ListFiles(f.cfg, dirID, folders.ListOptions{}) + tempF := *f + tempF.dirCache = dircache.New(newRoot, f.cfg.RootFolderID, &tempF) + tempF.root = newRoot + // Make new Fs which is the parent + err = tempF.dirCache.FindRoot(ctx, false) if err != nil { - return nil, err + // No root so return old f + return f, nil } - for _, e := range files { - name := e.PlainName - if len(e.Type) > 0 { - name += "." + e.Type - } - if name == leaf { - f.rootIsFile = true - f.rootFile = &e - break + _, err := tempF.NewObject(ctx, remote) + if err != nil { + if err == fs.ErrorObjectNotFound { + // File doesn't exist so return old f + return f, nil } - } - if !f.rootIsFile { - folderID, err := f.dirCache.FindDir(ctx, root, true) - if err != nil { - return nil, err - } - f.dirCache = dircache.New("", folderID, f) + return nil, err } + + f.dirCache = tempF.dirCache + f.root = tempF.root + // return an error with an fs which points to the parent + return f, fs.ErrorIsFile } return f, nil @@ -207,46 +199,59 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e func (f *Fs) Mkdir(ctx context.Context, dir string) error { id, err := f.dirCache.FindDir(ctx, dir, true) if err != nil { - if strings.Contains(err.Error(), `"statusCode":400`) { - return nil - } return err } - f.dirCache.Put(dir, id) + f.dirCache.Put(dir, id) // Is this done automatically by FindDir with create == true? + time.Sleep(500 * time.Millisecond) //REMOVE THIS, use pacer to check for consistency? + return nil } // Rmdir removes a directory func (f *Fs) Rmdir(ctx context.Context, dir string) error { id, err := f.dirCache.FindDir(ctx, dir, false) - if err == nil { - err = folders.DeleteFolder(f.cfg, id) - if err != nil { - if dir == "" { - err = fs.ErrorDirNotFound - } else { - err = nil - } - } - } else { + if err != nil { return fs.ErrorDirNotFound } - f.dirCache.FlushDir(dir) + // Replace these calls with GetFolderContent? (fmt.Sprintf("/storage/v2/folder/%d%s", folderID, query)) + childFolders, err := folders.ListFolders(f.cfg, id, folders.ListOptions{}) + if err != nil { + return err + } + childFiles, err := folders.ListFiles(f.cfg, id, folders.ListOptions{}) + if err != nil { + return err + } - return err + if len(childFiles) > 0 || len(childFolders) > 0 { + return fs.ErrorDirectoryNotEmpty + } + + err = folders.DeleteFolder(f.cfg, id) + if err != nil { + if strings.Contains(err.Error(), "404") { + return fs.ErrorDirNotFound + } + return err + } + + f.dirCache.FlushDir(dir) + time.Sleep(500 * time.Millisecond) // REMOVE THIS, use pacer to check for consistency? + return nil } // FindLeaf looks for a sub‑folder named `leaf` under the Internxt folder `pathID`. // If found, it returns its UUID and true. If not found, returns "", false. func (f *Fs) FindLeaf(ctx context.Context, pathID, leaf string) (string, bool, error) { + //fmt.Printf("FindLeaf pathID: %s, leaf: %s\n", pathID, leaf) entries, err := folders.ListFolders(f.cfg, pathID, folders.ListOptions{}) if err != nil { return "", false, err } for _, e := range entries { - if e.PlainName == leaf { + if f.opt.Encoding.ToStandardName(e.PlainName) == leaf { return e.UUID, true, nil } } @@ -256,42 +261,32 @@ func (f *Fs) FindLeaf(ctx context.Context, pathID, leaf string) (string, bool, e // CreateDir creates a new directory func (f *Fs) CreateDir(ctx context.Context, pathID, leaf string) (string, error) { resp, err := folders.CreateFolder(f.cfg, folders.CreateFolderRequest{ - PlainName: f.EncodePath(leaf), + PlainName: f.opt.Encoding.FromStandardName(leaf), ParentFolderUUID: pathID, ModificationTime: time.Now().UTC().Format(time.RFC3339), }) if err != nil { - resp, err = folders.CreateFolder(f.cfg, folders.CreateFolderRequest{ - PlainName: f.EncodePath(leaf), - ParentFolderUUID: pathID, - ModificationTime: time.Now().UTC().Format(time.RFC3339), - }) - - if err != nil { - return "", err - } + return "", fmt.Errorf("can't create folder, %w", err) } + + time.Sleep(500 * time.Millisecond) // REMOVE THIS, use pacer to check for consistency? return resp.UUID, nil } // List lists a directory func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { - if f.rootIsFile && dir == "" { - return fs.DirEntries{newObjectWithFile(f, f.root, f.rootFile)}, nil - } dirID, err := f.dirCache.FindDir(ctx, dir, false) if err != nil { return nil, err } var out fs.DirEntries + foldersList, err := folders.ListFolders(f.cfg, dirID, folders.ListOptions{}) if err != nil { return nil, err } for _, e := range foldersList { - remote := path.Join(dir, e.PlainName) - remote = f.DecodePath(remote) - f.dirCache.Put(remote, e.UUID) + remote := filepath.Join(dir, f.opt.Encoding.ToStandardName(e.PlainName)) out = append(out, fs.NewDir(remote, e.ModificationTime)) } filesList, err := folders.ListFiles(f.cfg, dirID, folders.ListOptions{}) @@ -299,83 +294,31 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { return nil, err } for _, e := range filesList { - remote := path.Join(dir, e.PlainName) - remote = f.DecodePath(remote) + remote := e.PlainName if len(e.Type) > 0 { remote += "." + e.Type } - f.dirCache.Put(remote, e.UUID) + remote = filepath.Join(dir, f.opt.Encoding.ToStandardName(remote)) out = append(out, newObjectWithFile(f, remote, &e)) } return out, nil } -// Forced a reload of -func (f *Fs) refreshDirCache(dir, folderUUID string) ([]folders.File, error) { - - filesList, err := folders.ListFiles(f.cfg, folderUUID, folders.ListOptions{}) - if err != nil { - return nil, err - } - for _, e := range filesList { - remote := path.Join(dir, e.PlainName) - remote = f.DecodePath(remote) - if len(e.Type) > 0 { - remote += "." + e.Type - } - f.dirCache.Put(remote, e.UUID) - } - return filesList, nil -} - // Put uploads a file func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { - remote := src.Remote() - - if src.Size() <= 0 { - return nil, fs.ErrorCantUploadEmptyFiles - } - - parentDir, fileName := path.Split(remote) - parentDir = strings.Trim(parentDir, "/") - - folderUUID := "" - var err error - if parentDir == "" { - // folderUUID = f.accessResponse.User.RootFolderID - folderUUID = f.rootID - - } else { - folderUUID, err = f.dirCache.FindDir(ctx, parentDir, true) - if err != nil { - return nil, err - } - } - - f.refreshDirCache(parentDir, folderUUID) - - fileUUID, err := f.dirCache.FindDir(ctx, remote, false) - if len(fileUUID) > 0 || err == nil { - files.DeleteFile(f.cfg, fileUUID) - f.dirCache.FlushDir(remote) + o := &Object{ + f: f, + remote: src.Remote(), + size: src.Size(), + modTime: src.ModTime(ctx), } - meta, err := buckets.UploadFileStream(f.cfg, folderUUID, fileName, in, src.Size(), src.ModTime(ctx)) + err := o.Update(ctx, in, src, options...) if err != nil { return nil, err } - f.dirCache.Put(remote, meta.UUID) - - modTime := src.ModTime(ctx) - - return &Object{ - f: f, - remote: remote, - uuid: meta.UUID, - size: src.Size(), - modTime: modTime, - }, nil + return o, nil } // Remove removes an object @@ -418,30 +361,19 @@ func (f *Fs) DirCacheFlush(ctx context.Context) {} // NewObject creates a new object func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { - if f.rootIsFile { - leaf := path.Base(f.root) - if remote == "" || remote == leaf { - return newObjectWithFile(f, f.root, f.rootFile), nil - } - } + parentDir := filepath.Dir(remote) - parentDir, fileName := path.Split(remote) - parentDir = strings.Trim(parentDir, "/") - - dirID := "" - var err error - if parentDir == "" { - // dirID = f.accessResponse.User.RootFolderID - dirID = f.rootID - } else { - dirID, err = f.dirCache.FindDir(ctx, parentDir, false) - if err != nil { - return nil, fs.ErrorObjectNotFound - } + //Is this needed? + if parentDir == "." { + parentDir = "" } - files, err := f.refreshDirCache(parentDir, dirID) + dirID, err := f.dirCache.FindDir(ctx, parentDir, false) + if err != nil { + return nil, fs.ErrorObjectNotFound + } + files, err := folders.ListFiles(f.cfg, dirID, folders.ListOptions{}) if err != nil { return nil, err } @@ -450,7 +382,7 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { if len(e.Type) > 0 { name += "." + e.Type } - if name == fileName { + if f.opt.Encoding.ToStandardName(name) == filepath.Base(remote) { return newObjectWithFile(f, remote, &e), nil } } @@ -526,63 +458,50 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadClo // Update updates an existing file func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error { - parentDir, _ := path.Split(o.remote) - parentDir = strings.Trim(parentDir, "/") - - if src.Size() < 0 { + if src.Size() == 0 { return fs.ErrorCantUploadEmptyFiles } - folderUUID, err := o.f.dirCache.FindDir(ctx, parentDir, false) - if err != nil { - return err + // Check if object exists on the server + existsInBackend := true + if o.uuid == "" { + objectInBackend, err := o.f.NewObject(ctx, src.Remote()) + if err != nil { + existsInBackend = false + } else { + // If the object already exists, use the object from the server + if objectInBackend, ok := objectInBackend.(*Object); ok { + o = objectInBackend + } + } } - if err := files.DeleteFile(o.f.cfg, o.uuid); err != nil { - if !strings.Contains(err.Error(), `"statusCode":404`) && !strings.Contains(err.Error(), "Not Found") { - return err + if o.uuid != "" || existsInBackend { + if err := files.DeleteFile(o.f.cfg, o.uuid); err != nil { + return fs.ErrorNotAFile } } - meta, err := buckets.UploadFileStream(o.f.cfg, folderUUID, path.Base(o.remote), in, src.Size(), src.ModTime(ctx)) + // Create folder if it doesn't exist + _, dirID, err := o.f.dirCache.FindPath(ctx, o.Remote(), true) if err != nil { return err } + meta, err := buckets.UploadFileStream(o.f.cfg, dirID, o.f.opt.Encoding.FromStandardName(filepath.Base(o.remote)), in, src.Size(), src.ModTime(ctx)) + if err != nil { + return err + } + + // Update the object with the new info o.uuid = meta.UUID o.size = src.Size() - o.modTime = src.ModTime(ctx) return nil } // Remove deletes a file func (o *Object) Remove(ctx context.Context) error { err := files.DeleteFile(o.f.cfg, o.uuid) - fmt.Println("REMOVEERROR") - fmt.Println(err) - return nil -} - -func (f *Fs) EncodePath(path string) string { - /* - path = strings.ReplaceAll(path, "\\", "%5C") - if strings.HasSuffix(path, ".") { - path = path[:len(path)-1] + "%2E" - } - */ - //path = f.Encoding.Encode(path) - path = strings.ReplaceAll(path, "\\", "%5C") - return path -} - -func (f *Fs) DecodePath(path string) string { - /* - path = strings.ReplaceAll(path, "%5C", "\\") - if strings.HasSuffix(path, "%2E") { - path = path[:len(path)-3] + "." - } - */ - //path = f.Encoding.Decode(path) - path = strings.ReplaceAll(path, "%5C", "\\") - return path + time.Sleep(500 * time.Millisecond) // REMOVE THIS, use pacer to check for consistency? + return err } diff --git a/backend/internxt/internxt_test.go b/backend/internxt/internxt_test.go index d4d7970d801fd..01e23b3b20606 100644 --- a/backend/internxt/internxt_test.go +++ b/backend/internxt/internxt_test.go @@ -9,9 +9,6 @@ import ( // TestIntegration runs integration tests against the remote func TestIntegration(t *testing.T) { fstests.Run(t, &fstests.Opt{ - RemoteName: "TestInternxt:", - SkipLeadingDot: true, - SkipTrailingDot: true, - SkipInvalidUTF8: true, + RemoteName: "TestInternxt:", }) } From c29f0e4da0d6d667aff27bc0d5938b95840740b5 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sun, 27 Jul 2025 18:42:38 +0200 Subject: [PATCH 030/130] internxt: update modules --- go.sum | 1 + 1 file changed, 1 insertion(+) diff --git a/go.sum b/go.sum index 0bfe4ed521d2b..9f23e73577d0b 100644 --- a/go.sum +++ b/go.sum @@ -89,6 +89,7 @@ github.com/ProtonMail/gopenpgp/v2 v2.9.0/go.mod h1:IldDyh9Hv1ZCCYatTuuEt1XZJ0OPj github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo= github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y= <<<<<<< HEAD +<<<<<<< HEAD github.com/STARRY-S/zip v0.2.3 h1:luE4dMvRPDOWQdeDdUxUoZkzUIpTccdKdhHHsQJ1fm4= github.com/STARRY-S/zip v0.2.3/go.mod h1:lqJ9JdeRipyOQJrYSOtpNAiaesFO6zVDsE8GIGFaoSk= github.com/a1ex3/zstd-seekable-format-go/pkg v0.10.0 h1:iLDOF0rdGTrol/q8OfPIIs5kLD8XvA2q75o6Uq/tgak= From 1908af5a423057c4ba7d3815f7d17823f28a8a55 Mon Sep 17 00:00:00 2001 From: StarHack Date: Sun, 27 Jul 2025 22:06:26 +0200 Subject: [PATCH 031/130] internxt: update go.mod --- go.sum | 1 + 1 file changed, 1 insertion(+) diff --git a/go.sum b/go.sum index 9f23e73577d0b..7cd6abd6d1cc5 100644 --- a/go.sum +++ b/go.sum @@ -90,6 +90,7 @@ github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiU github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y= <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD github.com/STARRY-S/zip v0.2.3 h1:luE4dMvRPDOWQdeDdUxUoZkzUIpTccdKdhHHsQJ1fm4= github.com/STARRY-S/zip v0.2.3/go.mod h1:lqJ9JdeRipyOQJrYSOtpNAiaesFO6zVDsE8GIGFaoSk= github.com/a1ex3/zstd-seekable-format-go/pkg v0.10.0 h1:iLDOF0rdGTrol/q8OfPIIs5kLD8XvA2q75o6Uq/tgak= From cc8996df982891eb0515ea8b0dc6829bf7209e82 Mon Sep 17 00:00:00 2001 From: lullius <> Date: Mon, 28 Jul 2025 14:55:06 +0200 Subject: [PATCH 032/130] backend/internxt: getting all files and folders instead of only the 50 first --- backend/internxt/internxt.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 13bf31f632781..184fabc13db94 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -216,11 +216,11 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { } // Replace these calls with GetFolderContent? (fmt.Sprintf("/storage/v2/folder/%d%s", folderID, query)) - childFolders, err := folders.ListFolders(f.cfg, id, folders.ListOptions{}) + childFolders, err := folders.ListAllFolders(f.cfg, id) if err != nil { return err } - childFiles, err := folders.ListFiles(f.cfg, id, folders.ListOptions{}) + childFiles, err := folders.ListAllFiles(f.cfg, id) if err != nil { return err } @@ -246,7 +246,7 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { // If found, it returns its UUID and true. If not found, returns "", false. func (f *Fs) FindLeaf(ctx context.Context, pathID, leaf string) (string, bool, error) { //fmt.Printf("FindLeaf pathID: %s, leaf: %s\n", pathID, leaf) - entries, err := folders.ListFolders(f.cfg, pathID, folders.ListOptions{}) + entries, err := folders.ListAllFolders(f.cfg, pathID) if err != nil { return "", false, err } @@ -281,7 +281,7 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { } var out fs.DirEntries - foldersList, err := folders.ListFolders(f.cfg, dirID, folders.ListOptions{}) + foldersList, err := folders.ListAllFolders(f.cfg, dirID) if err != nil { return nil, err } @@ -289,7 +289,7 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { remote := filepath.Join(dir, f.opt.Encoding.ToStandardName(e.PlainName)) out = append(out, fs.NewDir(remote, e.ModificationTime)) } - filesList, err := folders.ListFiles(f.cfg, dirID, folders.ListOptions{}) + filesList, err := folders.ListAllFiles(f.cfg, dirID) if err != nil { return nil, err } @@ -373,7 +373,7 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { return nil, fs.ErrorObjectNotFound } - files, err := folders.ListFiles(f.cfg, dirID, folders.ListOptions{}) + files, err := folders.ListAllFiles(f.cfg, dirID) if err != nil { return nil, err } From 41032c1b0e16e4de3d1c093ae45e15741f032a0e Mon Sep 17 00:00:00 2001 From: lullius <> Date: Mon, 28 Jul 2025 19:35:30 +0200 Subject: [PATCH 033/130] backend/internxt: Option to simulate empty files --- backend/internxt/internxt.go | 68 ++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 184fabc13db94..a70a5d4e79127 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -2,6 +2,7 @@ package internxt import ( + "bytes" "context" "fmt" "io" @@ -45,6 +46,11 @@ func init() { Help: "The password for the user.", IsPassword: true, }, + { + Name: "simulateEmptyFiles", + Default: false, + Help: "Simulates empty files by uploading a small placeholder file instead. Alters the filename when uploading to keep track of empty files, but this is not visible through rclone.", + }, { Name: rclone_config.ConfigEncoding, Help: rclone_config.ConfigEncodingHelp, @@ -60,12 +66,21 @@ func init() { ) } +const ( + EMPTY_FILE_EXT = ".__RCLONE_EMPTY__" +) + +var ( + EMPTY_FILE_BYTES = []byte{0x13, 0x09, 0x20, 0x23} +) + // Options holds configuration options for this interface type Options struct { - Endpoint string `flag:"endpoint" help:"API endpoint"` - Email string `flag:"email" help:"Internxt account email"` - Password string `flag:"password" help:"Internxt account password"` - Encoding encoder.MultiEncoder `config:"encoding"` + Endpoint string `flag:"endpoint" help:"API endpoint"` + Email string `flag:"email" help:"Internxt account email"` + Password string `flag:"password" help:"Internxt account password"` + Encoding encoder.MultiEncoder `config:"encoding"` + SimulateEmptyFiles bool `config:"simulateEmptyFiles"` } // Fs represents an Internxt remote @@ -299,6 +314,11 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { remote += "." + e.Type } remote = filepath.Join(dir, f.opt.Encoding.ToStandardName(remote)) + // If we found a file with the special empty file suffix, pretend that it's empty + if f.opt.SimulateEmptyFiles && strings.HasSuffix(remote, EMPTY_FILE_EXT) { + remote = strings.TrimSuffix(remote, EMPTY_FILE_EXT) + e.Size = "0" + } out = append(out, newObjectWithFile(f, remote, &e)) } return out, nil @@ -347,18 +367,15 @@ func (f *Fs) Remove(ctx context.Context, remote string) error { // Move moves a directory (not implemented) func (f *Fs) Move(ctx context.Context, src, dst fs.Object) error { // return f.client.Rename(ctx, f.root+src.Remote(), f.root+dst.Remote()) - return nil + return fs.ErrorNotImplemented } // Copy copies a directory (not implemented) func (f *Fs) Copy(ctx context.Context, src, dst fs.Object) error { // return f.client.Copy(ctx, f.root+src.Remote(), f.root+dst.Remote()) - return nil + return fs.ErrorNotImplemented } -// DirCacheFlush flushes the dir cache (not implemented) -func (f *Fs) DirCacheFlush(ctx context.Context) {} - // NewObject creates a new object func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { parentDir := filepath.Dir(remote) @@ -385,6 +402,13 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { if f.opt.Encoding.ToStandardName(name) == filepath.Base(remote) { return newObjectWithFile(f, remote, &e), nil } + // If we are simulating empty files, check for a file with the special suffix and if found return it as if empty. + if f.opt.SimulateEmptyFiles { + if f.opt.Encoding.ToStandardName(name) == filepath.Base(remote+EMPTY_FILE_EXT) { + e.Size = "0" + return newObjectWithFile(f, remote, &e), nil + } + } } return nil, fs.ErrorObjectNotFound } @@ -453,13 +477,31 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadClo } } + // Return nothing if we're faking an empty file + if o.f.opt.SimulateEmptyFiles && o.size == 0 { + return io.NopCloser(bytes.NewReader(nil)), nil + } return buckets.DownloadFileStream(o.f.cfg, o.id, rangeValue) } // Update updates an existing file func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error { + isEmptyFile := false if src.Size() == 0 { - return fs.ErrorCantUploadEmptyFiles + if !o.f.opt.SimulateEmptyFiles { + return fs.ErrorCantUploadEmptyFiles + } else { + // If we're faking an empty file, write some nonsense into it and give it a special suffix + isEmptyFile = true + in = bytes.NewReader(EMPTY_FILE_BYTES) + src = &Object{ + f: o.f, + remote: src.Remote() + EMPTY_FILE_EXT, + modTime: src.ModTime(ctx), + size: int64(len(EMPTY_FILE_BYTES)), + } + o.remote = o.remote + EMPTY_FILE_EXT + } } // Check if object exists on the server @@ -483,7 +525,7 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op } // Create folder if it doesn't exist - _, dirID, err := o.f.dirCache.FindPath(ctx, o.Remote(), true) + _, dirID, err := o.f.dirCache.FindPath(ctx, o.remote, true) if err != nil { return err } @@ -496,6 +538,10 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op // Update the object with the new info o.uuid = meta.UUID o.size = src.Size() + // If this is a simulated empty file set fake size to 0 + if isEmptyFile { + o.size = 0 + } return nil } From 2118d5f7271a34676f8ebea6ff3d871c240eff3a Mon Sep 17 00:00:00 2001 From: lullius <> Date: Mon, 28 Jul 2025 20:44:49 +0200 Subject: [PATCH 034/130] backend/internxt: Implemented DirMove --- backend/internxt/internxt.go | 73 +++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index a70a5d4e79127..e3da6cce419f7 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -365,9 +365,78 @@ func (f *Fs) Remove(ctx context.Context, remote string) error { } // Move moves a directory (not implemented) -func (f *Fs) Move(ctx context.Context, src, dst fs.Object) error { +func (f *Fs) Move(ctx context.Context, src fs.Object, remote string) (fs.Object, error) { + /* + srcObj, ok := src.(*Object) + if !ok { + fs.Debugf(src, "Can't move - not same remote type") + return nil, fs.ErrorCantMove + } + + srcLeaf, srcDirectoryID, err := f.dirCache.FindPath(ctx, srcObj.remote, false) + if err != nil { + return nil, err + } + //fmt.Printf("Move: srcLeaf %s, srcDirID %s\n", srcLeaf, srcDirectoryID) + + dstLeaf, dstDirectoryID, err := f.dirCache.FindPath(ctx, remote, false) + if err != nil { + return nil, err + } + //fmt.Printf("Move: srcLeaf %s, srcDirID %s \n dstLeaf %s, dstDirID, %s", srcLeaf, srcDirectoryID, dstLeaf, dstDirectoryID) + + doMove := srcDirectoryID != dstDirectoryID + doRename := srcLeaf != dstLeaf + + println("Move ", doMove, doRename) + */ // return f.client.Rename(ctx, f.root+src.Remote(), f.root+dst.Remote()) - return fs.ErrorNotImplemented + return nil, fs.ErrorNotImplemented +} + +func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string) error { + srcFs, ok := src.(*Fs) + if !ok { + fs.Debugf(srcFs, "Can't move directory - not same remote type") + return fs.ErrorCantDirMove + } + + srcID, _, srcLeaf, dstDirectoryID, dstLeaf, err := f.dirCache.DirMove(ctx, srcFs.dirCache, srcFs.root, srcRemote, f.root, dstRemote) + if err != nil { + return err + } + + doMove := srcID != dstDirectoryID + doRename := srcLeaf != dstLeaf + + // If we're moving AND renaming we need to set a temp name first, else we risk collisions + if doMove && doRename { + err = folders.RenameFolder(f.cfg, srcID, f.opt.Encoding.FromStandardName(dstLeaf+".__RCLONE_MOVE__")) + if err != nil { + return err + } + time.Sleep(500 * time.Millisecond) //Find a way around this + } + + if doMove { + err = folders.MoveFolder(f.cfg, srcID, dstDirectoryID) + if err != nil { + return err + } + time.Sleep(500 * time.Millisecond) //Find a way around this + + } + + if doRename { + err = folders.RenameFolder(f.cfg, srcID, f.opt.Encoding.FromStandardName(dstLeaf)) + if err != nil { + return err + } + time.Sleep(500 * time.Millisecond) //Find a way around this + } + + srcFs.dirCache.FlushDir(srcRemote) + return nil } // Copy copies a directory (not implemented) From 66016e016984a5d351f84522b7683f39206e70d9 Mon Sep 17 00:00:00 2001 From: lullius <> Date: Mon, 28 Jul 2025 22:34:43 +0200 Subject: [PATCH 035/130] backend/internxt: Implemented Move --- backend/internxt/internxt.go | 69 +++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index e3da6cce419f7..b03146c4d5066 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -364,36 +364,71 @@ func (f *Fs) Remove(ctx context.Context, remote string) error { return nil } -// Move moves a directory (not implemented) +// Move src to this remote using server-side move operations. func (f *Fs) Move(ctx context.Context, src fs.Object, remote string) (fs.Object, error) { - /* - srcObj, ok := src.(*Object) - if !ok { - fs.Debugf(src, "Can't move - not same remote type") - return nil, fs.ErrorCantMove - } + srcObj, ok := src.(*Object) + if !ok { + fs.Debugf(src, "Can't move - not same remote type") + return nil, fs.ErrorCantMove + } + + srcLeaf, srcDirectoryID, err := f.dirCache.FindPath(ctx, srcObj.remote, false) + if err != nil { + return nil, err + } - srcLeaf, srcDirectoryID, err := f.dirCache.FindPath(ctx, srcObj.remote, false) + dstLeaf, dstDirectoryID, err := f.dirCache.FindPath(ctx, remote, true) + if err != nil { + return nil, err + } + + doMove := srcDirectoryID != dstDirectoryID + doRename := srcLeaf != dstLeaf + + var dstObj fs.Object + + // If we're doing both, we should rename to a temp name in case there's a file + // with the same name at the destination folder (we can't rename AND move with one call) + if doMove && doRename { + newFile, err := files.UpdateFileMeta(f.cfg, srcObj.uuid, &folders.File{Type: "__RCLONE_MOVE__"}) if err != nil { return nil, err } - //fmt.Printf("Move: srcLeaf %s, srcDirID %s\n", srcLeaf, srcDirectoryID) + time.Sleep(500 * time.Millisecond) //Find a way around this + dstObj = newObjectWithFile(f, remote, newFile) + } - dstLeaf, dstDirectoryID, err := f.dirCache.FindPath(ctx, remote, false) + if doMove { + newFile, err := files.MoveFile(f.cfg, srcObj.uuid, dstDirectoryID) if err != nil { return nil, err } - //fmt.Printf("Move: srcLeaf %s, srcDirID %s \n dstLeaf %s, dstDirID, %s", srcLeaf, srcDirectoryID, dstLeaf, dstDirectoryID) + time.Sleep(500 * time.Millisecond) //Find a way around this + dstObj = newObjectWithFile(f, remote, newFile) + } + + if doRename { + base := filepath.Base(remote) + name := strings.TrimSuffix(base, filepath.Ext(base)) + ext := strings.TrimPrefix(filepath.Ext(base), ".") + + updated := &folders.File{ + PlainName: f.opt.Encoding.FromStandardName(name), + Type: f.opt.Encoding.FromStandardName(ext), + } - doMove := srcDirectoryID != dstDirectoryID - doRename := srcLeaf != dstLeaf + newFile, err := files.UpdateFileMeta(f.cfg, srcObj.uuid, updated) + if err != nil { + return nil, err + } + time.Sleep(500 * time.Millisecond) //Find a way around this + dstObj = newObjectWithFile(f, remote, newFile) + } - println("Move ", doMove, doRename) - */ - // return f.client.Rename(ctx, f.root+src.Remote(), f.root+dst.Remote()) - return nil, fs.ErrorNotImplemented + return dstObj, nil } +// Move dir to destination using server-side move operations. func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string) error { srcFs, ok := src.(*Fs) if !ok { From 4aa5145b8288a9d9cd85dd2f4ef9edef4df7df05 Mon Sep 17 00:00:00 2001 From: StarHack Date: Wed, 30 Jul 2025 16:37:12 +0200 Subject: [PATCH 036/130] internxt: add support for 2fa config --- backend/internxt/internxt.go | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index b03146c4d5066..0d2ef168e6121 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -47,9 +47,9 @@ func init() { IsPassword: true, }, { - Name: "simulateEmptyFiles", + Name: "use_2fa", + Help: "Do you use 2FA to login?", Default: false, - Help: "Simulates empty files by uploading a small placeholder file instead. Alters the filename when uploading to keep track of empty files, but this is not visible through rclone.", }, { Name: rclone_config.ConfigEncoding, @@ -76,11 +76,11 @@ var ( // Options holds configuration options for this interface type Options struct { - Endpoint string `flag:"endpoint" help:"API endpoint"` - Email string `flag:"email" help:"Internxt account email"` - Password string `flag:"password" help:"Internxt account password"` - Encoding encoder.MultiEncoder `config:"encoding"` - SimulateEmptyFiles bool `config:"simulateEmptyFiles"` + Endpoint string `flag:"endpoint" help:"API endpoint"` + Email string `flag:"email" help:"Internxt account email"` + Password string `flag:"password" help:"Internxt account password"` + Use2FA bool `config:"use_2fa" help:"Do you use 2FA to login?"` + Encoding encoder.MultiEncoder `config:"encoding"` } // Fs represents an Internxt remote @@ -145,6 +145,18 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e if err != nil { return nil, err } + + if opt.Use2FA { + fmt.Print("Enter your 2FA code: ") + var code string + _, err := fmt.Scanln(&code) + if err != nil { + return nil, fmt.Errorf("failed to read 2FA code: %w", err) + } + cfg.TFA = code + fmt.Println("TWO FACTOR CODE: " + cfg.TFA) + } + accessResponse, err := auth.AccessLogin(cfg, loginResponse) if err != nil { return nil, err From 7fbbe806caf7bee19baffebfdc8d68afda2eb16d Mon Sep 17 00:00:00 2001 From: StarHack Date: Wed, 30 Jul 2025 16:38:10 +0200 Subject: [PATCH 037/130] internxt: remove log msg --- backend/internxt/internxt.go | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 0d2ef168e6121..6fc63df8eedb8 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -154,7 +154,6 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e return nil, fmt.Errorf("failed to read 2FA code: %w", err) } cfg.TFA = code - fmt.Println("TWO FACTOR CODE: " + cfg.TFA) } accessResponse, err := auth.AccessLogin(cfg, loginResponse) From fe62b8b1c4416ab77652361f5e9273fd7ace9d88 Mon Sep 17 00:00:00 2001 From: lullius <> Date: Sat, 2 Aug 2025 19:49:25 +0200 Subject: [PATCH 038/130] backend/internxt: Implemented Purge, now using purgeCheck for Rmdir and Purge --- backend/internxt/internxt.go | 64 +++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 6fc63df8eedb8..8e5c91c4f32d3 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -4,6 +4,7 @@ package internxt import ( "bytes" "context" + "errors" "fmt" "io" "path" @@ -46,6 +47,11 @@ func init() { Help: "The password for the user.", IsPassword: true, }, + { + Name: "simulateEmptyFiles", + Default: false, + Help: "Simulates empty files by uploading a small placeholder file instead. Alters the filename when uploading to keep track of empty files, but this is not visible through rclone.", + }, { Name: "use_2fa", Help: "Do you use 2FA to login?", @@ -76,11 +82,12 @@ var ( // Options holds configuration options for this interface type Options struct { - Endpoint string `flag:"endpoint" help:"API endpoint"` - Email string `flag:"email" help:"Internxt account email"` - Password string `flag:"password" help:"Internxt account password"` - Use2FA bool `config:"use_2fa" help:"Do you use 2FA to login?"` - Encoding encoder.MultiEncoder `config:"encoding"` + Endpoint string `flag:"endpoint" help:"API endpoint"` + Email string `flag:"email" help:"Internxt account email"` + Password string `flag:"password" help:"Internxt account password"` + Encoding encoder.MultiEncoder `config:"encoding"` + SimulateEmptyFiles bool `config:"simulateEmptyFiles"` + Use2FA bool `config:"use_2fa" help:"Do you use 2FA to login?"` } // Fs represents an Internxt remote @@ -235,24 +242,48 @@ func (f *Fs) Mkdir(ctx context.Context, dir string) error { } // Rmdir removes a directory +// Returns an error if it isn't empty func (f *Fs) Rmdir(ctx context.Context, dir string) error { + return f.purgeCheck(ctx, dir, true) +} + +// Purge deletes the directory and all its contents +func (f *Fs) Purge(ctx context.Context, dir string) error { + return f.purgeCheck(ctx, dir, false) +} + +func (f *Fs) purgeCheck(ctx context.Context, dir string, check bool) (err error) { + root := path.Join(f.root, dir) + if root == "" { + return errors.New("can't purge root directory") + } + + // check that the directory exists id, err := f.dirCache.FindDir(ctx, dir, false) if err != nil { return fs.ErrorDirNotFound } - // Replace these calls with GetFolderContent? (fmt.Sprintf("/storage/v2/folder/%d%s", folderID, query)) - childFolders, err := folders.ListAllFolders(f.cfg, id) - if err != nil { - return err - } - childFiles, err := folders.ListAllFiles(f.cfg, id) - if err != nil { - return err - } + if check { + // Replace these calls with GetFolderContent? (fmt.Sprintf("/storage/v2/folder/%d%s", folderID, query)) + // Check folders and files separately in case we only need to call the API once. + childFolders, err := folders.ListAllFolders(f.cfg, id) + if err != nil { + return err + } + + if len(childFolders) > 0 { + return fs.ErrorDirectoryNotEmpty + } - if len(childFiles) > 0 || len(childFolders) > 0 { - return fs.ErrorDirectoryNotEmpty + childFiles, err := folders.ListAllFiles(f.cfg, id) + if err != nil { + return err + } + + if len(childFiles) > 0 { + return fs.ErrorDirectoryNotEmpty + } } err = folders.DeleteFolder(f.cfg, id) @@ -266,6 +297,7 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { f.dirCache.FlushDir(dir) time.Sleep(500 * time.Millisecond) // REMOVE THIS, use pacer to check for consistency? return nil + } // FindLeaf looks for a sub‑folder named `leaf` under the Internxt folder `pathID`. From ce2cf55c0e6d39821dab4c3eb4a337f35dba517c Mon Sep 17 00:00:00 2001 From: lullius <> Date: Thu, 7 Aug 2025 08:29:28 +0200 Subject: [PATCH 039/130] backend/internxt: Remove EMPTY_FILE_EXT when updating an empty file with actual data --- backend/internxt/internxt.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 8e5c91c4f32d3..f87782fe2f588 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -649,6 +649,11 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op } o.remote = o.remote + EMPTY_FILE_EXT } + } else { + if o.f.opt.SimulateEmptyFiles { + // Remove the suffix if we're updating an empty file with actual data + o.remote = strings.TrimSuffix(o.remote, EMPTY_FILE_EXT) + } } // Check if object exists on the server From c53b9c54a5a1e06bae6f6735a8ec5b297929d66f Mon Sep 17 00:00:00 2001 From: lullius <> Date: Sun, 10 Aug 2025 18:35:24 +0200 Subject: [PATCH 040/130] backend/internxt: Implemented About --- backend/internxt/internxt.go | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index f87782fe2f588..d7158d7d0bcee 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -15,11 +15,11 @@ import ( "github.com/StarHack/go-internxt-drive/auth" "github.com/StarHack/go-internxt-drive/buckets" config "github.com/StarHack/go-internxt-drive/config" - rclone_config "github.com/rclone/rclone/fs/config" - "github.com/StarHack/go-internxt-drive/files" "github.com/StarHack/go-internxt-drive/folders" + "github.com/StarHack/go-internxt-drive/users" "github.com/rclone/rclone/fs" + rclone_config "github.com/rclone/rclone/fs/config" "github.com/rclone/rclone/fs/config/configmap" "github.com/rclone/rclone/fs/config/configstruct" "github.com/rclone/rclone/fs/config/obscure" @@ -613,6 +613,28 @@ func (o *Object) SetModTime(ctx context.Context, t time.Time) error { return fs.ErrorCantSetModTime } +// About gets quota information +func (f *Fs) About(ctx context.Context) (*fs.Usage, error) { + internxtLimit, err := users.GetLimit(f.cfg) + if err != nil { + return nil, err + } + + internxtUsage, err := users.GetUsage(f.cfg) + if err != nil { + return nil, err + } + + usage := &fs.Usage{ + Used: fs.NewUsageValue(internxtUsage.Drive), + } + + usage.Total = fs.NewUsageValue(internxtLimit.MaxSpaceBytes) + usage.Free = fs.NewUsageValue(*usage.Total - *usage.Used) + + return usage, nil +} + // Open opens a file for streaming func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadCloser, error) { fs.FixRangeOption(options, o.size) From 27566fcf60f1ada3b05413164518f02c6489cd7a Mon Sep 17 00:00:00 2001 From: lullius <> Date: Sun, 10 Aug 2025 19:18:32 +0200 Subject: [PATCH 041/130] backend/internxt: Handle leading and trailing slashes --- backend/internxt/internxt.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index d7158d7d0bcee..16038b6dde0d7 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -192,6 +192,8 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e DirModTimeUpdatesOnWrite: false, }).Fill(ctx, f) + // Handle leading and trailing slashes + root = strings.Trim(root, "/") f.dirCache = dircache.New(root, cfg.RootFolderID, f) err = f.dirCache.FindRoot(ctx, false) From 216a62c2ed434ca14a65d830c781a8eb814cb854 Mon Sep 17 00:00:00 2001 From: StarHack Date: Tue, 9 Sep 2025 19:24:03 +0200 Subject: [PATCH 042/130] fix two test_all related issues --- backend/internxt/internxt.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 16038b6dde0d7..11dab69ac47dd 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -500,7 +500,7 @@ func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string if doMove { err = folders.MoveFolder(f.cfg, srcID, dstDirectoryID) - if err != nil { + if err != nil && !strings.Contains(err.Error(), "409") { return err } time.Sleep(500 * time.Millisecond) //Find a way around this @@ -509,7 +509,7 @@ func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string if doRename { err = folders.RenameFolder(f.cfg, srcID, f.opt.Encoding.FromStandardName(dstLeaf)) - if err != nil { + if err != nil && !strings.Contains(err.Error(), "409") { return err } time.Sleep(500 * time.Millisecond) //Find a way around this @@ -522,7 +522,7 @@ func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string // Copy copies a directory (not implemented) func (f *Fs) Copy(ctx context.Context, src, dst fs.Object) error { // return f.client.Copy(ctx, f.root+src.Remote(), f.root+dst.Remote()) - return fs.ErrorNotImplemented + return fs.ErrorCantCopy } // NewObject creates a new object From de7d8e1bdd73e5370f95c604b72ce5aa11b2b010 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Fri, 28 Nov 2025 12:58:04 -0600 Subject: [PATCH 043/130] internxt: update dependencies in go.mod and go.sum; replace go-internxt-drive with rclone-adapter in internxt.go --- backend/internxt/internxt.go | 12 ++++++------ go.mod | 5 +++-- go.sum | 33 ++++++++------------------------- 3 files changed, 17 insertions(+), 33 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 11dab69ac47dd..70976b1ad59be 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -12,12 +12,12 @@ import ( "strings" "time" - "github.com/StarHack/go-internxt-drive/auth" - "github.com/StarHack/go-internxt-drive/buckets" - config "github.com/StarHack/go-internxt-drive/config" - "github.com/StarHack/go-internxt-drive/files" - "github.com/StarHack/go-internxt-drive/folders" - "github.com/StarHack/go-internxt-drive/users" + "github.com/internxt/rclone-adapter/auth" + "github.com/internxt/rclone-adapter/buckets" + config "github.com/internxt/rclone-adapter/config" + "github.com/internxt/rclone-adapter/files" + "github.com/internxt/rclone-adapter/folders" + "github.com/internxt/rclone-adapter/users" "github.com/rclone/rclone/fs" rclone_config "github.com/rclone/rclone/fs/config" "github.com/rclone/rclone/fs/config/configmap" diff --git a/go.mod b/go.mod index 51aa158973a08..5a5fb9d15cf2c 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,6 @@ require ( github.com/Files-com/files-sdk-go/v3 v3.2.264 github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd github.com/a1ex3/zstd-seekable-format-go/pkg v0.10.0 - github.com/StarHack/go-internxt-drive v0.0.0-20250506081634-548256aeb125 github.com/a8m/tree v0.0.0-20240104212747-2c8764a5f17e github.com/aalpar/deheap v0.0.0-20210914013432-0cc84d79dec3 github.com/abbot/go-http-auth v0.4.0 @@ -45,6 +44,7 @@ require ( github.com/hanwen/go-fuse/v2 v2.9.0 github.com/henrybear327/Proton-API-Bridge v1.0.0 github.com/henrybear327/go-proton-api v1.0.0 + github.com/internxt/rclone-adapter v0.0.0-20251128125449-40f1a8e381e7 github.com/jcmturner/gokrb5/v8 v8.4.4 github.com/jlaffaye/ftp v0.2.1-0.20240918233326-1b970516f5d3 github.com/josephspurrier/goversioninfo v1.5.0 @@ -242,6 +242,7 @@ require ( github.com/tinylib/msgp v1.5.0 // indirect github.com/tklauser/go-sysconf v0.3.15 // indirect github.com/tklauser/numcpus v0.10.0 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/ulikunitz/xz v0.5.15 // indirect github.com/willscott/go-nfs-client v0.0.0-20251022144359-801f10d98886 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect @@ -255,13 +256,13 @@ require ( go.yaml.in/yaml/v2 v2.4.3 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect + golang.org/x/mod v0.29.0 // indirect golang.org/x/tools v0.38.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 // indirect google.golang.org/grpc v1.76.0 // indirect google.golang.org/protobuf v1.36.10 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect moul.io/http2curl/v2 v2.3.0 // indirect - sigs.k8s.io/yaml v1.6.0 // indirect storj.io/common v0.0.0-20251107171817-6221ae45072c // indirect storj.io/drpc v0.0.35-0.20250513201419-f7819ea69b55 // indirect storj.io/eventkit v0.0.0-20250410172343-61f26d3de156 // indirect diff --git a/go.sum b/go.sum index 7cd6abd6d1cc5..d59f027e15937 100644 --- a/go.sum +++ b/go.sum @@ -63,8 +63,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Files-com/files-sdk-go/v3 v3.2.264 h1:lMHTplAYI9FtmCo/QOcpRxmPA5REVAct1r2riQmDQKw= github.com/Files-com/files-sdk-go/v3 v3.2.264/go.mod h1:wGqkOzRu/ClJibvDgcfuJNAqI2nLhe8g91tPlDKRCdE= -github.com/IBM/go-sdk-core/v5 v5.21.0 h1:DUnYhvC4SoC8T84rx5omnhY3+xcQg/Whyoa3mDPIMkk= -github.com/IBM/go-sdk-core/v5 v5.21.0/go.mod h1:Q3BYO6iDA2zweQPDGbNTtqft5tDcEpm6RTuqMlPcvbw= +github.com/IBM/go-sdk-core/v5 v5.18.5 h1:g0JRl3sYXJczB/yuDlrN6x22LJ6jIxhp0Sa4ARNW60c= +github.com/IBM/go-sdk-core/v5 v5.18.5/go.mod h1:KonTFRR+8ZSgw5cxBSYo6E4WZoY1+7n1kfHM82VcjFU= github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd h1:nzE1YQBdx1bq9IlZinHa+HVffy+NmVRoKr+wHN8fpLE= @@ -88,27 +88,10 @@ github.com/ProtonMail/gopenpgp/v2 v2.9.0 h1:ruLzBmwe4dR1hdnrsEJ/S7psSBmV15gFttFU github.com/ProtonMail/gopenpgp/v2 v2.9.0/go.mod h1:IldDyh9Hv1ZCCYatTuuEt1XZJ0OPjxLpTarDfglih7s= github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo= github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y= -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD github.com/STARRY-S/zip v0.2.3 h1:luE4dMvRPDOWQdeDdUxUoZkzUIpTccdKdhHHsQJ1fm4= github.com/STARRY-S/zip v0.2.3/go.mod h1:lqJ9JdeRipyOQJrYSOtpNAiaesFO6zVDsE8GIGFaoSk= github.com/a1ex3/zstd-seekable-format-go/pkg v0.10.0 h1:iLDOF0rdGTrol/q8OfPIIs5kLD8XvA2q75o6Uq/tgak= github.com/a1ex3/zstd-seekable-format-go/pkg v0.10.0/go.mod h1:DrEWcQJjz7t5iF2duaiyhg4jyoF0kxOD6LtECNGkZ/Q= -github.com/StarHack/go-internxt-drive v0.0.0-20250505204940-afd5267fe57f h1:719s3rc1mxCQfFn5B6l40lwGaewlA2qFvhJ8VzHXVK4= -github.com/StarHack/go-internxt-drive v0.0.0-20250505204940-afd5267fe57f/go.mod h1:YmT8WhRhk9JTWrGJyuXsZdRU+poYZZIND5qXL7FZ2lQ= -github.com/StarHack/go-internxt-drive v0.0.0-20250505214629-764d0ec1512a h1:GY7UVDWm9vzv50icXw9MoLBOVOhaJKZJGKW4cQZDUdQ= -github.com/StarHack/go-internxt-drive v0.0.0-20250505214629-764d0ec1512a/go.mod h1:YmT8WhRhk9JTWrGJyuXsZdRU+poYZZIND5qXL7FZ2lQ= -github.com/StarHack/go-internxt-drive v0.0.0-20250505215717-25bd7e9f0180 h1:d7Jl3LJANlw7rviAECdEt5NrfaY89ziPjuacL2TGKQ8= -github.com/StarHack/go-internxt-drive v0.0.0-20250505215717-25bd7e9f0180/go.mod h1:YmT8WhRhk9JTWrGJyuXsZdRU+poYZZIND5qXL7FZ2lQ= -github.com/StarHack/go-internxt-drive v0.0.0-20250505220824-7a00a541234d h1:9T+fVJ6NqsX9c7fPuuIC3qV9xXX4R3YmIJyofqeFSBE= -github.com/StarHack/go-internxt-drive v0.0.0-20250505220824-7a00a541234d/go.mod h1:YmT8WhRhk9JTWrGJyuXsZdRU+poYZZIND5qXL7FZ2lQ= -github.com/StarHack/go-internxt-drive v0.0.0-20250505223234-6fd1f77d7d00 h1:sfT8QZF4yMUUwmgIfbiEGzmuS/SHvMc+tvRWasujf40= -github.com/StarHack/go-internxt-drive v0.0.0-20250505223234-6fd1f77d7d00/go.mod h1:YmT8WhRhk9JTWrGJyuXsZdRU+poYZZIND5qXL7FZ2lQ= -github.com/StarHack/go-internxt-drive v0.0.0-20250506081342-16852f088f5f h1:PJBZVoUwqPQZoV12s/TdMoRcyRfaCJwTbViyKS9Tgxs= -github.com/StarHack/go-internxt-drive v0.0.0-20250506081342-16852f088f5f/go.mod h1:YmT8WhRhk9JTWrGJyuXsZdRU+poYZZIND5qXL7FZ2lQ= -github.com/StarHack/go-internxt-drive v0.0.0-20250506081634-548256aeb125 h1:g9IlQWO9WCoy8DbJaee6hzR9ajdKVpTpE9vFOOWkk08= -github.com/StarHack/go-internxt-drive v0.0.0-20250506081634-548256aeb125/go.mod h1:YmT8WhRhk9JTWrGJyuXsZdRU+poYZZIND5qXL7FZ2lQ= github.com/a8m/tree v0.0.0-20240104212747-2c8764a5f17e h1:KMVieI1/Ub++GYfnhyFPoGE3g5TUiG4srE3TMGr5nM4= github.com/a8m/tree v0.0.0-20240104212747-2c8764a5f17e/go.mod h1:j5astEcUkZQX8lK+KKlQ3NRQ50f4EE8ZjyZpCz3mrH4= github.com/aalpar/deheap v0.0.0-20210914013432-0cc84d79dec3 h1:hhdWprfSpFbN7lz3W1gM40vOgvSh1WCSMxYD6gGB4Hs= @@ -439,6 +422,8 @@ github.com/henrybear327/go-proton-api v1.0.0/go.mod h1:w63MZuzufKcIZ93pwRgiOtxMX github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/internxt/rclone-adapter v0.0.0-20251128125449-40f1a8e381e7 h1:PXzi74RNqFc6yO6whAZDUkdFJCvrJCiZEC7Iq6dPXhY= +github.com/internxt/rclone-adapter v0.0.0-20251128125449-40f1a8e381e7/go.mod h1:XZ47hBE41lE1ixntK+ZuSLnS9ZGEtc6Pba0bKIo/CbU= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -551,8 +536,8 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.17.3 h1:oJcvKpIb7/8uLpDDtnQuf18xVnwKp8DTD7DQ6gTd/MU= github.com/onsi/ginkgo/v2 v2.17.3/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= -github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= -github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/oracle/oci-go-sdk/v65 v65.104.0 h1:l9awEvzWvxmYhy/97A0hZ87pa7BncYXmcO/S8+rvgK0= github.com/oracle/oci-go-sdk/v65 v65.104.0/go.mod h1:oB8jFGVc/7/zJ+DbleE8MzGHjhs2ioCz5stRTdZdIcY= github.com/panjf2000/ants/v2 v2.11.3 h1:AfI0ngBoXJmYOpDh9m516vjqoUu2sLrIVgppI9TZVpg= @@ -676,8 +661,8 @@ github.com/tinylib/msgp v1.5.0 h1:GWnqAE54wmnlFazjq2+vgr736Akg58iiHImh+kPY2pc= github.com/tinylib/msgp v1.5.0/go.mod h1:cvjFkb4RiC8qSBOPMGPSzSAx47nAsfhLVTCZZNuHv5o= github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= -github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= -github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c h1:u6SKchux2yDvFQnDHS3lPnIRmfVJ5Sxy3ao2SIdysLQ= github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= @@ -1135,8 +1120,6 @@ moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHc rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= -sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= storj.io/common v0.0.0-20251107171817-6221ae45072c h1:UDXSrdeLJe3QFouavSW10fYdpclK0YNu3KvQHzqq2+k= storj.io/common v0.0.0-20251107171817-6221ae45072c/go.mod h1:XNX7uykja6aco92y2y8RuqaXIDRPpt1YA2OQDKlKEUk= storj.io/drpc v0.0.35-0.20250513201419-f7819ea69b55 h1:8OE12DvUnB9lfZcHe7IDGsuhjrY9GBAr964PVHmhsro= From 9aff26ad94082ce9e4a0dcc245e321c1ed2bf65d Mon Sep 17 00:00:00 2001 From: Leo Date: Mon, 1 Dec 2025 11:17:10 +0800 Subject: [PATCH 044/130] serve webdav: implement download-directory-as-zip Signed-off-by: Leo --- cmd/serve/webdav/webdav.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/cmd/serve/webdav/webdav.go b/cmd/serve/webdav/webdav.go index fbc64b7a483bb..7ea259737efa9 100644 --- a/cmd/serve/webdav/webdav.go +++ b/cmd/serve/webdav/webdav.go @@ -45,6 +45,10 @@ var OptionsInfo = fs.Options{{ Name: "disable_dir_list", Default: false, Help: "Disable HTML directory list on GET request for a directory", +}, { + Name: "disable_zip", + Default: false, + Help: "Disable zip download of directories", }}. Add(libhttp.ConfigInfo). Add(libhttp.AuthConfigInfo). @@ -57,6 +61,7 @@ type Options struct { Template libhttp.TemplateConfig EtagHash string `config:"etag_hash"` DisableDirList bool `config:"disable_dir_list"` + DisableZip bool `config:"disable_zip"` } // Opt is options set by command line flags @@ -408,6 +413,24 @@ func (w *WebDAV) serveDir(rw http.ResponseWriter, r *http.Request, dirRemote str return } dir := node.(*vfs.Dir) + + if r.URL.Query().Get("download") == "zip" && !w.opt.DisableZip { + fs.Infof(dirRemote, "%s: Zipping directory", r.RemoteAddr) + zipName := path.Base(dirRemote) + if dirRemote == "" { + zipName = "root" + } + rw.Header().Set("Content-Disposition", "attachment; filename=\""+zipName+".zip\"") + rw.Header().Set("Content-Type", "application/zip") + rw.Header().Set("Last-Modified", time.Now().UTC().Format(http.TimeFormat)) + err := vfs.CreateZip(ctx, dir, rw) + if err != nil { + serve.Error(ctx, dirRemote, rw, "Failed to create zip", err) + return + } + return + } + dirEntries, err := dir.ReadDirAll() if err != nil { @@ -417,6 +440,7 @@ func (w *WebDAV) serveDir(rw http.ResponseWriter, r *http.Request, dirRemote str // Make the entries for display directory := serve.NewDirectory(dirRemote, w.server.HTMLTemplate()) + directory.DisableZip = w.opt.DisableZip for _, node := range dirEntries { if vfscommon.Opt.NoModTime { directory.AddHTMLEntry(node.Path(), node.IsDir(), node.Size(), time.Time{}) From 0f29c1615eeef811c0a5a06fe90f6611406c4359 Mon Sep 17 00:00:00 2001 From: Johannes Rothe Date: Thu, 27 Nov 2025 22:07:26 +0100 Subject: [PATCH 045/130] googlecloudstorage: improve endpoint parameter docs When specifying a custom endpoint with a subpath, there is a limitation in the Google cloud storage integration that the subpath is ignored during upload operations. For example with the custom endpoint "example.org/custom/endpoint" on upload the /custom/endpoint is not reflected. As this is most likely an issue with the underlying API client, there is no way to fix this in rclone. By extending the documentation at least rclone users are made aware of this limitation. Related forum thread: https://forum.rclone.org/t/googlecloudstorage-custom-endpoint-subpath-removed-for-upload/53059 --- .../googlecloudstorage/googlecloudstorage.go | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/backend/googlecloudstorage/googlecloudstorage.go b/backend/googlecloudstorage/googlecloudstorage.go index 449e371bc019f..3c9062be775d0 100644 --- a/backend/googlecloudstorage/googlecloudstorage.go +++ b/backend/googlecloudstorage/googlecloudstorage.go @@ -346,9 +346,26 @@ can't check the size and hash but the file contents will be decompressed. Advanced: true, Default: false, }, { - Name: "endpoint", - Help: "Endpoint for the service.\n\nLeave blank normally.", + Name: "endpoint", + Help: `Custom endpoint for the storage API. Leave blank to use the provider default. + +When using a custom endpoint that includes a subpath (e.g. example.org/custom/endpoint), +the subpath will be ignored during upload operations due to a limitation in the +underlying Google API Go client library. +Download and listing operations will work correctly with the full endpoint path. +If you require subpath support for uploads, avoid using subpaths in your custom +endpoint configuration.`, Advanced: true, + Examples: []fs.OptionExample{{ + Value: "storage.example.org", + Help: "Specify a custom endpoint", + }, { + Value: "storage.example.org:4443", + Help: "Specifying a custom endpoint with port", + }, { + Value: "storage.example.org:4443/gcs/api", + Help: "Specifying a subpath, see the note, uploads won't use the custom path!", + }}, }, { Name: config.ConfigEncoding, Help: config.ConfigEncodingHelp, From 3e30a41faf01fbae92d7fab8c7138b08cb4ac622 Mon Sep 17 00:00:00 2001 From: DianaNites <5275194+DianaNites@users.noreply.github.com> Date: Tue, 2 Dec 2025 15:13:00 -0600 Subject: [PATCH 046/130] b2: Fix listing root buckets with unrestricted API key Fixes previous pull request #8978 An oversight meant that unrestricted API keys never called b2_list_buckets, meaning the root remote could not be listed. The call is now made in the event there are no allowed buckets, indicating an unrestricted API key Fixes #9007 --- backend/b2/b2.go | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/backend/b2/b2.go b/backend/b2/b2.go index a21d63dacb296..22c5e079a8484 100644 --- a/backend/b2/b2.go +++ b/backend/b2/b2.go @@ -1081,21 +1081,10 @@ type listBucketFn func(*api.Bucket) error func (f *Fs) listBucketsToFn(ctx context.Context, bucketName string, fn listBucketFn) error { responses := make([]api.ListBucketsResponse, len(f.info.APIs.Storage.Allowed.Buckets))[:0] - for i := range f.info.APIs.Storage.Allowed.Buckets { - b := &f.info.APIs.Storage.Allowed.Buckets[i] - // Empty names indicate a bucket that no longer exists, this is non-fatal - // for multi-bucket API keys. - if b.Name == "" { - continue - } - // When requesting a specific bucket skip over non-matching names - if bucketName != "" && b.Name != bucketName { - continue - } - + call := func(id string) error { var account = api.ListBucketsRequest{ AccountID: f.info.AccountID, - BucketID: b.ID, + BucketID: id, } if bucketName != "" && account.BucketID == "" { account.BucketName = f.opt.Enc.FromStandardName(bucketName) @@ -1114,6 +1103,32 @@ func (f *Fs) listBucketsToFn(ctx context.Context, bucketName string, fn listBuck return err } responses = append(responses, response) + return nil + } + + for i := range f.info.APIs.Storage.Allowed.Buckets { + b := &f.info.APIs.Storage.Allowed.Buckets[i] + // Empty names indicate a bucket that no longer exists, this is non-fatal + // for multi-bucket API keys. + if b.Name == "" { + continue + } + // When requesting a specific bucket skip over non-matching names + if bucketName != "" && b.Name != bucketName { + continue + } + + err := call(b.ID) + if err != nil { + return err + } + } + + if len(f.info.APIs.Storage.Allowed.Buckets) == 0 { + err := call("") + if err != nil { + return err + } } f.bucketIDMutex.Lock() From db55b989353d83c9867efd3933595c34a26d0964 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Mon, 8 Dec 2025 14:44:40 +0000 Subject: [PATCH 047/130] Add vicerace to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index 3d5dec351b4b6..e8a89b90dcc61 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1050,3 +1050,4 @@ put them back in again. --> - Nikolay Kiryanov - Diana <5275194+DianaNites@users.noreply.github.com> - Duncan Smart +- vicerace From bc4f83b6a975a9331de2deda64cad688202a5203 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Mon, 8 Dec 2025 14:44:40 +0000 Subject: [PATCH 048/130] Add Cliff Frey to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index e8a89b90dcc61..7e2c2c93d4a28 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1051,3 +1051,4 @@ put them back in again. --> - Diana <5275194+DianaNites@users.noreply.github.com> - Duncan Smart - vicerace +- Cliff Frey From 6ed587aba9334bde9f49fbb1aeb4b94a48b87d39 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Mon, 8 Dec 2025 14:44:40 +0000 Subject: [PATCH 049/130] Add Vladislav Tropnikov to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index 7e2c2c93d4a28..6500b703a8ad8 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1052,3 +1052,4 @@ put them back in again. --> - Duncan Smart - vicerace - Cliff Frey +- Vladislav Tropnikov From 9804c587f9219167ce979500444e27d0cc6882a8 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Mon, 8 Dec 2025 14:44:40 +0000 Subject: [PATCH 050/130] Add Leo to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index 6500b703a8ad8..562b6e73695c5 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1053,3 +1053,4 @@ put them back in again. --> - vicerace - Cliff Frey - Vladislav Tropnikov +- Leo From b3a275bdd7c643546c0dd7573fc436ee8eba11c1 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Mon, 8 Dec 2025 14:44:40 +0000 Subject: [PATCH 051/130] Add Johannes Rothe to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index 562b6e73695c5..d4c8748d94103 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1054,3 +1054,4 @@ put them back in again. --> - Cliff Frey - Vladislav Tropnikov - Leo +- Johannes Rothe From 1db3b0d535c0142ec56f123bad42d3e4be952ad9 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Mon, 8 Dec 2025 12:32:04 +0000 Subject: [PATCH 052/130] proxy: fix error handling in tests spotted by the linter --- cmd/serve/proxy/proxy_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/serve/proxy/proxy_test.go b/cmd/serve/proxy/proxy_test.go index 574a7aa15671d..8f802ab12c2bb 100644 --- a/cmd/serve/proxy/proxy_test.go +++ b/cmd/serve/proxy/proxy_test.go @@ -153,7 +153,7 @@ func TestRun(t *testing.T) { fs.Fatal(nil, "error generating test private key "+privateKeyErr.Error()) } publicKey, publicKeyError := ssh.NewPublicKey(&privateKey.PublicKey) - if privateKeyErr != nil { + if publicKeyError != nil { fs.Fatal(nil, "error generating test public key "+publicKeyError.Error()) } From ffb989f78cf6a863a4a372638f44ba3a6ad853da Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Mon, 8 Dec 2025 14:43:49 +0000 Subject: [PATCH 053/130] build: adjust lint rules to exclude new errors from linter update --- .golangci.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.golangci.yml b/.golangci.yml index ae9bbb24cccba..5f33d618329d5 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -17,6 +17,14 @@ linters: #- prealloc # TODO - revive - unconvert + exclusions: + rules: + - linters: + - revive + text: 'var-naming: avoid meaningless package names' + - linters: + - revive + text: 'var-naming: avoid package names that conflict with Go standard library package names' # Configure checks. Mostly using defaults but with some commented exceptions. settings: govet: @@ -136,6 +144,7 @@ linters: - name: var-naming disabled: false + formatters: enable: - goimports From 9c8cdff4ddc68e50307df1a66d16024611583f74 Mon Sep 17 00:00:00 2001 From: Tingsong Xu Date: Mon, 8 Dec 2025 14:05:19 +0800 Subject: [PATCH 054/130] fs/log: fix PID not included in JSON log output When using `--log-format pid,json`, the PID was not being added to the JSON log output. This fix adds PID support to JSON logging. --- fs/log/slog.go | 4 ++++ fs/log/slog_test.go | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/fs/log/slog.go b/fs/log/slog.go index 0efbcbee66bb2..36592c87f7100 100644 --- a/fs/log/slog.go +++ b/fs/log/slog.go @@ -310,6 +310,10 @@ func (h *OutputHandler) jsonLog(ctx context.Context, buf *bytes.Buffer, r slog.R r.AddAttrs( slog.String("source", getCaller(2)), ) + // Add PID if requested + if h.format&logFormatPid != 0 { + r.AddAttrs(slog.Int("pid", os.Getpid())) + } h.mu.Lock() err = h.jsonHandler.Handle(ctx, r) if err == nil { diff --git a/fs/log/slog_test.go b/fs/log/slog_test.go index 5cfa521311bae..e0389e3e4f61e 100644 --- a/fs/log/slog_test.go +++ b/fs/log/slog_test.go @@ -198,6 +198,17 @@ func TestAddOutputUseJSONLog(t *testing.T) { assert.Equal(t, "2020/01/02 03:04:05 INFO : world\n", extraText) } +// Test JSON log includes PID when logFormatPid is set. +func TestJSONLogWithPid(t *testing.T) { + buf := &bytes.Buffer{} + h := NewOutputHandler(buf, nil, logFormatJSON|logFormatPid) + + r := slog.NewRecord(t0, slog.LevelInfo, "hello", 0) + require.NoError(t, h.Handle(context.Background(), r)) + output := buf.String() + assert.Contains(t, output, fmt.Sprintf(`"pid":%d`, os.Getpid())) +} + // Test WithAttrs and WithGroup return new handlers with same settings. func TestWithAttrsAndGroup(t *testing.T) { buf := &bytes.Buffer{} From 03e1dd394cb5448c3b1e73bd3f7acca50d9c6788 Mon Sep 17 00:00:00 2001 From: Jonas Tingeborn <134889+jojje@users.noreply.github.com> Date: Sat, 6 Dec 2025 07:31:20 +0100 Subject: [PATCH 055/130] configfile: add piped config support - fixes #9012 --- fs/config/configfile/configfile_test.go | 37 +++++++++++++++++++++++++ fs/config/crypt.go | 3 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/fs/config/configfile/configfile_test.go b/fs/config/configfile/configfile_test.go index 8ec7cd5189b32..be77bb6ccd821 100644 --- a/fs/config/configfile/configfile_test.go +++ b/fs/config/configfile/configfile_test.go @@ -2,6 +2,7 @@ package configfile import ( "fmt" + "io" "os" "path/filepath" "runtime" @@ -362,3 +363,39 @@ func TestConfigFileSaveSymlinkAbsolute(t *testing.T) { testSymlink(t, link, target, resolvedTarget) }) } + +type pipedInput struct { + io.Reader +} + +func (p *pipedInput) Read(b []byte) (int, error) { + return p.Reader.Read(b) +} + +func (_ *pipedInput) Seek(_ int64, _ int) (int64, error) { + return 0, fmt.Errorf("Seek not supported") +} + +func TestPipedConfig(t *testing.T) { + t.Run("DoesNotSupportSeeking", func(t *testing.T) { + r := &pipedInput{strings.NewReader("")} + _, err := r.Seek(0, io.SeekStart) + require.Error(t, err) + }) + + t.Run("IsSupported", func(t *testing.T) { + r := &pipedInput{strings.NewReader(configData)} + _, err := config.Decrypt(r) + require.NoError(t, err) + }) + + t.Run("PlainTextConfigIsNotConsumedByCryptCheck", func(t *testing.T) { + in := &pipedInput{strings.NewReader(configData)} + + r, _ := config.Decrypt(in) + got, err := io.ReadAll(r) + require.NoError(t, err) + + assert.Equal(t, configData, string(got)) + }) +} diff --git a/fs/config/crypt.go b/fs/config/crypt.go index 4b356580cb322..c111fbbbe4642 100644 --- a/fs/config/crypt.go +++ b/fs/config/crypt.go @@ -77,8 +77,9 @@ func Decrypt(b io.ReadSeeker) (io.Reader, error) { if strings.HasPrefix(l, "RCLONE_ENCRYPT_V") { return nil, errors.New("unsupported configuration encryption - update rclone for support") } + // Restore non-seekable plain-text stream to its original state if _, err := b.Seek(0, io.SeekStart); err != nil { - return nil, err + return io.MultiReader(strings.NewReader(l+"\n"), r), nil } return b, nil } From 51b2e6c6dae39e9f209a796f1c9627697cb43307 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Tue, 9 Dec 2025 16:15:07 +0000 Subject: [PATCH 056/130] Add Tingsong Xu to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index d4c8748d94103..21c0e74b3b575 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1055,3 +1055,4 @@ put them back in again. --> - Vladislav Tropnikov - Leo - Johannes Rothe +- Tingsong Xu From 669f01018d3e3a209dd3b8434ae05f55a1264a03 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Tue, 9 Dec 2025 16:15:07 +0000 Subject: [PATCH 057/130] Add Jonas Tingeborn to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index 21c0e74b3b575..8f7c35a19c837 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1056,3 +1056,4 @@ put them back in again. --> - Leo - Johannes Rothe - Tingsong Xu +- Jonas Tingeborn <134889+jojje@users.noreply.github.com> From f7e5ec61b3b1123df5cad87a76e2d360491455ce Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Tue, 9 Dec 2025 16:14:26 +0000 Subject: [PATCH 058/130] build: fix lint warning after linter upgrade --- fs/config/configfile/configfile_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/config/configfile/configfile_test.go b/fs/config/configfile/configfile_test.go index be77bb6ccd821..1abaa58c74db7 100644 --- a/fs/config/configfile/configfile_test.go +++ b/fs/config/configfile/configfile_test.go @@ -372,7 +372,7 @@ func (p *pipedInput) Read(b []byte) (int, error) { return p.Reader.Read(b) } -func (_ *pipedInput) Seek(_ int64, _ int) (int64, error) { +func (*pipedInput) Seek(int64, int) (int64, error) { return 0, fmt.Errorf("Seek not supported") } From d5adb69fa6fedeaed0c752572faf640a75ad16b4 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Tue, 9 Dec 2025 16:35:07 +0000 Subject: [PATCH 059/130] log: fix backtrace not going to the --log-file #9014 Before the log re-organisation in: 8d353039a694fb27 log: add log rotation to --log-file rclone would write any backtraces to the --log-file which was very convenient for users. This got accidentally disabled due to a typo which meant backtraces started going to stderr even if --log-file was supplied. This fixes the problem. --- fs/log/log.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/log/log.go b/fs/log/log.go index dd6f5d2749e55..71c6f08a3f311 100644 --- a/fs/log/log.go +++ b/fs/log/log.go @@ -209,7 +209,7 @@ func InitLogging() { // Log file output if Opt.File != "" { var w io.Writer - if Opt.MaxSize == 0 { + if Opt.MaxSize < 0 { // No log rotation - just open the file as normal // We'll capture tracebacks like this too. f, err := os.OpenFile(Opt.File, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0640) From 17a14099d96995bac12a7cc3bc1ec79d4c6bdfb2 Mon Sep 17 00:00:00 2001 From: jhasse-shade Date: Tue, 9 Dec 2025 12:08:57 -0500 Subject: [PATCH 060/130] Add Shade backend --- README.md | 1 + backend/all/all.go | 1 + backend/shade/api/types.go | 27 + backend/shade/shade.go | 1017 +++++++++++++++++++++++++++++++ backend/shade/shade_test.go | 21 + backend/shade/upload.go | 336 ++++++++++ bin/make_manual.py | 1 + docs/content/_index.md | 1 + docs/content/docs.md | 1 + docs/content/overview.md | 1 + docs/content/shade.md | 218 +++++++ docs/layouts/chrome/navbar.html | 1 + fstest/test_all/config.yaml | 4 + 13 files changed, 1630 insertions(+) create mode 100644 backend/shade/api/types.go create mode 100644 backend/shade/shade.go create mode 100644 backend/shade/shade_test.go create mode 100644 backend/shade/upload.go create mode 100644 docs/content/shade.md diff --git a/README.md b/README.md index a368d62df85a5..728f4a27ee10d 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,7 @@ directories to and from different cloud storage providers. - Selectel Object Storage [:page_facing_up:](https://rclone.org/s3/#selectel) - Servercore Object Storage [:page_facing_up:](https://rclone.org/s3/#servercore) - SFTP [:page_facing_up:](https://rclone.org/sftp/) +- Shade [:page_facing_up:](https://rclone.org/shade/) - SMB / CIFS [:page_facing_up:](https://rclone.org/smb/) - Spectra Logic [:page_facing_up:](https://rclone.org/s3/#spectralogic) - StackPath [:page_facing_up:](https://rclone.org/s3/#stackpath) diff --git a/backend/all/all.go b/backend/all/all.go index 8a3c08802da1d..aed11e189ae44 100644 --- a/backend/all/all.go +++ b/backend/all/all.go @@ -55,6 +55,7 @@ import ( _ "github.com/rclone/rclone/backend/s3" _ "github.com/rclone/rclone/backend/seafile" _ "github.com/rclone/rclone/backend/sftp" + _ "github.com/rclone/rclone/backend/shade" _ "github.com/rclone/rclone/backend/sharefile" _ "github.com/rclone/rclone/backend/sia" _ "github.com/rclone/rclone/backend/smb" diff --git a/backend/shade/api/types.go b/backend/shade/api/types.go new file mode 100644 index 0000000000000..d1be0c52990be --- /dev/null +++ b/backend/shade/api/types.go @@ -0,0 +1,27 @@ +// Package api has type definitions for shade +package api + +// ListDirResponse ------------------------------------------------- +// Format from shade api +type ListDirResponse struct { + Type string `json:"type"` // "file" or "tree" + Path string `json:"path"` // Full path including root + Ino int `json:"ino"` // inode number + Mtime int64 `json:"mtime"` // Modified time in milliseconds + Ctime int64 `json:"ctime"` // Created time in milliseconds + Size int64 `json:"size"` // Size in bytes + Hash string `json:"hash"` // MD5 hash + Draft bool `json:"draft"` // Whether this is a draft file +} + +// PartURL Type for multipart upload/download +type PartURL struct { + URL string `json:"url"` + Headers map[string]string `json:"headers,omitempty"` +} + +// CompletedPart Type for completed parts when making a multipart upload. +type CompletedPart struct { + ETag string + PartNumber int32 +} diff --git a/backend/shade/shade.go b/backend/shade/shade.go new file mode 100644 index 0000000000000..53f39029fe361 --- /dev/null +++ b/backend/shade/shade.go @@ -0,0 +1,1017 @@ +// Package shade provides an interface to the Shade storage system. +package shade + +import ( + "bytes" + "context" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "net/url" + "path" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/rclone/rclone/backend/shade/api" + "github.com/rclone/rclone/fs" + "github.com/rclone/rclone/fs/config" + "github.com/rclone/rclone/fs/config/configmap" + "github.com/rclone/rclone/fs/config/configstruct" + "github.com/rclone/rclone/fs/fshttp" + "github.com/rclone/rclone/fs/hash" + "github.com/rclone/rclone/fs/object" + "github.com/rclone/rclone/lib/encoder" + "github.com/rclone/rclone/lib/pacer" + "github.com/rclone/rclone/lib/rest" +) + +const ( + defaultEndpoint = "https://fs.shade.inc" // Default local development endpoint + apiEndpoint = "https://api.shade.inc" // API endpoint for getting tokens + minSleep = 10 * time.Millisecond // Minimum sleep time for the pacer + maxSleep = 5 * time.Minute // Maximum sleep time for the pacer + decayConstant = 1 // Bigger for slower decay, exponential + defaultChunkSize = int64(64 * 1024 * 1024) // Default chunk size (64MB) + minChunkSize = int64(5 * 1024 * 1024) // Minimum chunk size (5MB) - S3 requirement + maxChunkSize = int64(5 * 1024 * 1024 * 1024) // Maximum chunk size (5GB) + maxUploadParts = 10000 // maximum allowed number of parts in a multipart upload +) + +// Register with Fs +func init() { + fs.Register(&fs.RegInfo{ + Name: "shade", + Description: "Shade FS", + NewFs: NewFS, + Options: []fs.Option{{ + Name: "drive_id", + Help: "The ID of your drive, see this in the drive settings. Individual rclone configs must be made per drive.", + Required: true, + Sensitive: false, + }, { + Name: "api_key", + Help: "An API key for your account.", + Required: true, + Sensitive: true, + }, { + Name: "endpoint", + Help: "Endpoint for the service.\n\nLeave blank normally.", + Advanced: true, + }, { + Name: "chunk_size", + Help: "Chunk size to use for uploading.\n\nAny files larger than this will be uploaded in chunks of this size.\n\nNote that this is stored in memory per transfer, so increasing it will\nincrease memory usage.\n\nMinimum is 5MB, maximum is 5GB.", + Default: fs.SizeSuffix(defaultChunkSize), + Advanced: true, + }, { + Name: "upload_concurrency", + Help: `Concurrency for multipart uploads and copies. This is the number of chunks of the same file that are uploaded concurrently for multipart uploads and copies.`, + Default: 4, + Advanced: true, + }, { + Name: "max_upload_parts", + Help: "Maximum amount of parts in a multipart upload.", + Default: maxUploadParts, + Advanced: true, + }, { + Name: "token", + Help: "JWT Token for performing Shade FS operations. Don't set this value - rclone will set it automatically", + Default: "", + Advanced: true, + }, { + Name: "token_expiry", + Help: "JWT Token Expiration time. Don't set this value - rclone will set it automatically", + Default: "", + Advanced: true, + }, { + Name: config.ConfigEncoding, + Help: config.ConfigEncodingHelp, + Advanced: true, + Default: encoder.Display | + encoder.EncodeBackSlash | + encoder.EncodeInvalidUtf8, + }}, + }) +} + +// refreshJWTToken retrieves or refreshes the ShadeFS token +func (f *Fs) refreshJWTToken(ctx context.Context) (string, error) { + f.tokenMu.Lock() + defer f.tokenMu.Unlock() + // Return existing token if it's still valid + checkTime := f.tokenExp.Add(-2 * time.Minute) + //If the token expires in less than two minutes, just get a new one + if f.token != "" && time.Now().Before(checkTime) { + return f.token, nil + } + + // Token has expired or doesn't exist, get a new one + opts := rest.Opts{ + Method: "GET", + RootURL: apiEndpoint, + Path: fmt.Sprintf("/workspaces/drives/%s/shade-fs-token", f.drive), + ExtraHeaders: map[string]string{ + "Authorization": f.opt.APIKey, + }, + } + + var err error + var tokenStr string + + err = f.pacer.Call(func() (bool, error) { + res, err := f.apiSrv.Call(ctx, &opts) + if err != nil { + fs.Debugf(f, "Token request failed: %v", err) + return false, err + } + + defer fs.CheckClose(res.Body, &err) + + if res.StatusCode != http.StatusOK { + fs.Debugf(f, "Token request failed with code: %d", res.StatusCode) + return res.StatusCode == http.StatusTooManyRequests, fmt.Errorf("failed to get ShadeFS token, status: %d", res.StatusCode) + } + + // Read token directly as plain text + tokenBytes, err := io.ReadAll(res.Body) + if err != nil { + return false, err + } + + tokenStr = strings.TrimSpace(string(tokenBytes)) + return false, nil + }) + + if err != nil { + return "", err + } + + if tokenStr == "" { + return "", fmt.Errorf("empty token received from server") + } + + parts := strings.Split(tokenStr, ".") + if len(parts) < 2 { + return "", fmt.Errorf("invalid token received from server") + } + // Decode the payload (2nd part of the token) + payload, err := base64.RawURLEncoding.DecodeString(parts[1]) + if err != nil { + return "", fmt.Errorf("invalid token received from server") + } + var claims map[string]interface{} + if err := json.Unmarshal(payload, &claims); err != nil { + return "", err + } + var exp int64 + // Extract exp/ + if v, ok := claims["exp"].(float64); ok { + exp = int64(v) + } + + f.token = tokenStr + f.tokenExp = time.Unix(exp, 0) + + f.m.Set("token", f.token) + f.m.Set("token_expiry", f.tokenExp.Format(time.RFC3339)) + + return f.token, nil +} + +func (f *Fs) callAPI(ctx context.Context, method, path string, response interface{}) (*http.Response, error) { + token, err := f.refreshJWTToken(ctx) + if err != nil { + return nil, err + } + opts := rest.Opts{ + Method: method, + Path: path, + RootURL: f.endpoint, + ExtraHeaders: map[string]string{ + "Authorization": "Bearer " + token, + }, + } + var res *http.Response + err = f.pacer.Call(func() (bool, error) { + if response != nil { + res, err = f.srv.CallJSON(ctx, &opts, nil, response) + } else { + res, err = f.srv.Call(ctx, &opts) + } + if err != nil { + return res != nil && res.StatusCode == http.StatusTooManyRequests, err + } + return false, nil + }) + return res, err +} + +// Options defines the configuration for this backend +type Options struct { + Drive string `config:"drive_id"` + APIKey string `config:"api_key"` + Endpoint string `config:"endpoint"` + ChunkSize fs.SizeSuffix `config:"chunk_size"` + MaxUploadParts int `config:"max_upload_parts"` + Concurrency int `config:"upload_concurrency"` + Token string `config:"token"` + TokenExpiry string `config:"token_expiry"` + Encoding encoder.MultiEncoder +} + +// Fs represents a shade remote +type Fs struct { + name string // name of this remote + root string // the path we are working on + opt Options // parsed options + features *fs.Features // optional features + srv *rest.Client // REST client for ShadeFS API + apiSrv *rest.Client // REST client for Shade API + endpoint string // endpoint for ShadeFS + drive string // drive ID + pacer *fs.Pacer // pacer for API calls + token string // ShadeFS token + tokenExp time.Time // Token expiration time + tokenMu sync.Mutex + m configmap.Mapper //Config Mapper to store tokens for future use + recursive bool + createdDirs map[string]bool // Cache of directories we've created + createdDirMu sync.RWMutex // Mutex for createdDirs map +} + +// Object describes a ShadeFS object +type Object struct { + fs *Fs // what this object is part of + remote string // The remote path + mtime int64 // Modified time + size int64 // Size of the object + original string //Presigned download link +} + +// Directory describes a ShadeFS directory +type Directory struct { + fs *Fs // Reference to the filesystem + remote string // Path to the directory + mtime int64 // Modification time + size int64 // Size (typically 0 for directories) +} + +// Name of the remote (as passed into NewFs) +func (f *Fs) Name() string { + return f.name +} + +// Root of the remote (as passed into NewFs) +func (f *Fs) Root() string { + return f.root +} + +// String returns a description of the FS +func (f *Fs) String() string { + return fmt.Sprintf("Shade drive %s path %s", f.opt.Drive, f.root) +} + +// Precision returns the precision of the ModTimes +func (f *Fs) Precision() time.Duration { + return fs.ModTimeNotSupported +} + +// Move src to this remote using server-side move operations. +// +// This is stored with the remote path given. +// +// It returns the destination Object and a possible error. +// +// Will only be called if src.Fs().Name() == f.Name() +// +// If it isn't possible then return fs.ErrorCantMove +func (f *Fs) Move(ctx context.Context, src fs.Object, remote string) (fs.Object, error) { + srcObj, ok := src.(*Object) + if !ok { + fs.Debugf(src, "Can't move - not same remote type") + return nil, fs.ErrorCantMove + } + + token, err := f.refreshJWTToken(ctx) + if err != nil { + return nil, err + } + + //Need to make sure destination exists + err = f.ensureParentDirectories(ctx, remote) + if err != nil { + return nil, err + } + + // Create temporary object + o := &Object{ + fs: f, + remote: remote, + } + fromFullPath := path.Join(src.Fs().Root(), srcObj.remote) + toFullPath := path.Join(f.root, remote) + + // Build query parameters + params := url.Values{} + params.Set("path", remote) + params.Set("from", fromFullPath) + params.Set("to", toFullPath) + + opts := rest.Opts{ + Method: "POST", + Path: fmt.Sprintf("/%s/fs/move?%s", f.drive, params.Encode()), + ExtraHeaders: map[string]string{ + "Authorization": "Bearer " + token, + }, + } + + err = o.fs.pacer.Call(func() (bool, error) { + resp, err := f.srv.Call(ctx, &opts) + + if err != nil && resp.StatusCode == http.StatusBadRequest { + fs.Debugf(f, "Bad token from server: %v", token) + } + + return resp != nil && resp.StatusCode == http.StatusTooManyRequests, err + }) + if err != nil { + return nil, err + } + return o, nil +} + +// DirMove moves src, srcRemote to this remote at dstRemote +// using server-side move operations. +// +// Will only be called if src.Fs().Name() == f.Name() +// +// If it isn't possible then return fs.ErrorCantDirMove +// +// If destination exists then return fs.ErrorDirExists +func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string) error { + srcFs, ok := src.(*Fs) + if !ok { + fs.Debugf(srcFs, "Can't move directory - not same remote type") + return fs.ErrorCantDirMove + } + //Need to check if destination exists + fullPath := f.buildFullPath(dstRemote) + var response api.ListDirResponse + res, _ := f.callAPI(ctx, "GET", fmt.Sprintf("/%s/fs/attr?path=%s", f.drive, fullPath), &response) + + if res.StatusCode != http.StatusNotFound { + return fs.ErrorDirExists + } + + err := f.ensureParentDirectories(ctx, dstRemote) + if err != nil { + return err + } + + o := &Object{ + fs: srcFs, + remote: srcRemote, + } + + _, err = f.Move(ctx, o, dstRemote) + return err +} + +// Hashes returns the supported hash types +func (f *Fs) Hashes() hash.Set { + return hash.Set(hash.None) +} + +// Features returns the optional features of this Fs +func (f *Fs) Features() *fs.Features { + return f.features +} + +// NewFS constructs an FS from the path, container:path +func NewFS(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, error) { + // Parse config into Options struct + opt := new(Options) + err := configstruct.Set(m, opt) + if err != nil { + return nil, err + } + + fs.Debugf(nil, "Creating new ShadeFS backend with drive: %s", opt.Drive) + + f := &Fs{ + name: name, + root: root, + opt: *opt, + drive: opt.Drive, + m: m, + srv: rest.NewClient(fshttp.NewClient(ctx)).SetRoot(defaultEndpoint), + apiSrv: rest.NewClient(fshttp.NewClient(ctx)), + pacer: fs.NewPacer(ctx, pacer.NewDefault(pacer.MinSleep(minSleep), pacer.MaxSleep(maxSleep), pacer.DecayConstant(decayConstant))), + recursive: true, + createdDirs: make(map[string]bool), + token: opt.Token, + } + + f.features = &fs.Features{ + // Initially set minimal features + // We'll expand this in a future iteration + CanHaveEmptyDirectories: true, + Move: f.Move, + DirMove: f.DirMove, + OpenChunkWriter: f.OpenChunkWriter, + } + + if opt.TokenExpiry != "" { + tokenExpiry, err := time.Parse(time.RFC3339, opt.TokenExpiry) + if err != nil { + fs.Errorf(nil, "Failed to parse token_expiry option: %v", err) + } else { + f.tokenExp = tokenExpiry + } + } + + // Set the endpoint + if opt.Endpoint == "" { + f.endpoint = defaultEndpoint + } else { + f.endpoint = opt.Endpoint + } + + // Validate and set chunk size + if opt.ChunkSize == 0 { + opt.ChunkSize = fs.SizeSuffix(defaultChunkSize) + } else if opt.ChunkSize < fs.SizeSuffix(minChunkSize) { + return nil, fmt.Errorf("chunk_size %d is less than minimum %d", opt.ChunkSize, minChunkSize) + } else if opt.ChunkSize > fs.SizeSuffix(maxChunkSize) { + return nil, fmt.Errorf("chunk_size %d is greater than maximum %d", opt.ChunkSize, maxChunkSize) + } + + // Ensure root doesn't have trailing slash + f.root = strings.Trim(f.root, "/") + + // Check that we can log in by getting a token + _, err = f.refreshJWTToken(ctx) + if err != nil { + return nil, fmt.Errorf("failed to get ShadeFS token: %w", err) + } + + var response api.ListDirResponse + _, _ = f.callAPI(ctx, "GET", fmt.Sprintf("/%s/fs/attr?path=%s", f.drive, url.QueryEscape(root)), &response) + + if response.Type == "file" { + //Specified a single file path, not a directory. + f.root = filepath.Dir(f.root) + return f, fs.ErrorIsFile + } + return f, nil +} + +// NewObject finds the Object at remote +func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { + + fullPath := f.buildFullPath(remote) + + var response api.ListDirResponse + res, err := f.callAPI(ctx, "GET", fmt.Sprintf("/%s/fs/attr?path=%s", f.drive, fullPath), &response) + + if res != nil && res.StatusCode == http.StatusNotFound { + return nil, fs.ErrorObjectNotFound + } + + if err != nil { + return nil, err + } + + if res != nil && res.StatusCode != http.StatusOK { + return nil, fmt.Errorf("attr failed with status code: %d", res.StatusCode) + } + + if response.Type == "tree" { + return nil, fs.ErrorIsDir + } + + if response.Type != "file" { + return nil, fmt.Errorf("path is not a file: %s", remote) + } + + return &Object{ + fs: f, + remote: remote, + mtime: response.Mtime, + size: response.Size, + }, nil +} + +// Put uploads a file +func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { + // Create temporary object + o := &Object{ + fs: f, + remote: src.Remote(), + } + return o, o.Update(ctx, in, src, options...) +} + +// List the objects and directories in dir into entries +func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err error) { + + fullPath := f.buildFullPath(dir) + + var response []api.ListDirResponse + res, err := f.callAPI(ctx, "GET", fmt.Sprintf("/%s/fs/listdir?path=%s", f.drive, fullPath), &response) + if err != nil { + fs.Debugf(f, "Error from List call: %v", err) + return nil, fs.ErrorDirNotFound + } + + if res.StatusCode == http.StatusNotFound { + fs.Debugf(f, "Directory not found") + return nil, fs.ErrorDirNotFound + } + + if res.StatusCode != http.StatusOK { + return nil, fmt.Errorf("listdir failed with status code: %d", res.StatusCode) + } + + for _, r := range response { + if r.Draft { + continue + } + + // Make path relative to f.root + entryPath := strings.TrimPrefix(r.Path, "/") + if f.root != "" { + if !strings.HasPrefix(entryPath, f.root) { + continue + } + entryPath = strings.TrimPrefix(strings.TrimPrefix(entryPath, f.root), "/") + } + + if r.Type == "file" { + entries = append(entries, &Object{ + fs: f, + remote: entryPath, + mtime: r.Mtime, + size: r.Size, + }) + } else if r.Type == "tree" { + dirEntry := &Directory{ + fs: f, + remote: entryPath, + mtime: r.Mtime, + size: r.Size, // Typically 0 for directories + } + entries = append(entries, dirEntry) + } else { + fs.Debugf(f, "Unknown entry type: %s for path: %s", r.Type, entryPath) + } + } + + return entries, nil +} + +// ensureParentDirectories creates all parent directories for a given path +func (f *Fs) ensureParentDirectories(ctx context.Context, remotePath string) error { + // Build the full path including root + fullPath := remotePath + if f.root != "" { + fullPath = path.Join(f.root, remotePath) + } + + // Get the parent directory path + parentDir := path.Dir(fullPath) + + // If parent is root, empty, or current dir, nothing to create + if parentDir == "" || parentDir == "." || parentDir == "/" { + return nil + } + + // Ensure the full parent directory path exists + return f.ensureDirectoryPath(ctx, parentDir) +} + +// ensureDirectoryPath creates all directories in a path +func (f *Fs) ensureDirectoryPath(ctx context.Context, dirPath string) error { + // Check cache first + f.createdDirMu.RLock() + if f.createdDirs[dirPath] { + f.createdDirMu.RUnlock() + return nil + } + f.createdDirMu.RUnlock() + + // Build list of all directories that need to be created + var dirsToCreate []string + currentPath := dirPath + + for currentPath != "" && currentPath != "." && currentPath != "/" { + // Check if this directory is already in cache + f.createdDirMu.RLock() + inCache := f.createdDirs[currentPath] + f.createdDirMu.RUnlock() + + if !inCache { + dirsToCreate = append([]string{currentPath}, dirsToCreate...) + } + currentPath = path.Dir(currentPath) + } + + // If all directories are cached, we're done + if len(dirsToCreate) == 0 { + return nil + } + + // Create each directory in order + for _, dir := range dirsToCreate { + + fullPath := url.QueryEscape(dir) + res, err := f.callAPI(ctx, "POST", fmt.Sprintf("/%s/fs/mkdir?path=%s", f.drive, fullPath), nil) + + // If directory already exists, that's fine + if err == nil && res != nil { + if res.StatusCode == http.StatusConflict || res.StatusCode == http.StatusUnprocessableEntity { + f.createdDirMu.Lock() + f.createdDirs[dir] = true + f.createdDirMu.Unlock() + } else if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated { + fs.Debugf(f, "Failed to create directory %s: status code %d", dir, res.StatusCode) + } else { + f.createdDirMu.Lock() + f.createdDirs[dir] = true + f.createdDirMu.Unlock() + } + + fs.CheckClose(res.Body, &err) + } else if err != nil { + fs.Debugf(f, "Error creating directory %s: %v", dir, err) + // Continue anyway + continue + } + } + + // Mark the full path as created in cache + f.createdDirMu.Lock() + f.createdDirs[dirPath] = true + f.createdDirMu.Unlock() + + return nil +} + +// Mkdir creates the container if it doesn't exist +func (f *Fs) Mkdir(ctx context.Context, dir string) error { + + // Build the full path for the directory + fullPath := dir + if dir == "" { + // If dir is empty, we're creating the root directory + if f.root != "" && f.root != "/" && f.root != "." { + fullPath = f.root + } else { + // Nothing to create + return nil + } + } else if f.root != "" { + fullPath = path.Join(f.root, dir) + } + + // Ensure all parent directories exist first + if err := f.ensureDirectoryPath(ctx, fullPath); err != nil { + return fmt.Errorf("failed to create directory path: %w", err) + } + + // Add to cache + f.createdDirMu.Lock() + f.createdDirs[fullPath] = true + f.createdDirMu.Unlock() + + return nil +} + +// Rmdir deletes the root folder +// +// Returns an error if it isn't empty +func (f *Fs) Rmdir(ctx context.Context, dir string) error { + fullPath := f.buildFullPath(dir) + + if fullPath == "" { + return errors.New("cannot delete root directory") + } + + var response []api.ListDirResponse + res, err := f.callAPI(ctx, "GET", fmt.Sprintf("/%s/fs/listdir?path=%s", f.drive, fullPath), &response) + + if res != nil && res.StatusCode != http.StatusOK { + return err + } + + if len(response) > 0 { + return fs.ErrorDirectoryNotEmpty + } + + // Use the delete endpoint which handles both files and directories + res, err = f.callAPI(ctx, "POST", fmt.Sprintf("/%s/fs/delete?path=%s", f.drive, fullPath), nil) + if err != nil { + return err + } + defer fs.CheckClose(res.Body, &err) + + if res.StatusCode == http.StatusNotFound { + return fs.ErrorDirNotFound + } + + if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated { + return fmt.Errorf("rmdir failed with status code: %d", res.StatusCode) + } + + f.createdDirMu.Lock() + defer f.createdDirMu.Unlock() + unescapedPath, err := url.QueryUnescape(fullPath) + if err != nil { + return err + } + f.createdDirs[unescapedPath] = false + + return nil +} + +// Attempts to construct the full path for an object query-escaped +func (f *Fs) buildFullPath(remote string) string { + if f.root == "" { + return url.QueryEscape(remote) + } + return url.QueryEscape(path.Join(f.root, remote)) +} + +// ------------------------------------------------- +// Object implementation +// ------------------------------------------------- + +// Fs returns the parent Fs +func (o *Object) Fs() fs.Info { + return o.fs +} + +// String returns a description of the Object +func (o *Object) String() string { + if o == nil { + return "" + } + return o.remote +} + +// Remote returns the remote path +func (o *Object) Remote() string { + return o.remote +} + +// Hash returns the requested hash of the object content +func (o *Object) Hash(ctx context.Context, t hash.Type) (string, error) { + return "", hash.ErrUnsupported +} + +// Size returns the size of the object +func (o *Object) Size() int64 { + return o.size +} + +// ModTime returns the modification date of the object +func (o *Object) ModTime(context.Context) time.Time { + return time.Unix(0, o.mtime*int64(time.Millisecond)) +} + +// SetModTime sets the modification time of the object +func (o *Object) SetModTime(context.Context, time.Time) error { + // Not implemented for now + return fs.ErrorCantSetModTime +} + +// Storable returns whether this object is storable +func (o *Object) Storable() bool { + return true +} + +// Open an object for read +func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadCloser, error) { + + if o.size == 0 { + // Empty file: return an empty reader + return io.NopCloser(bytes.NewReader(nil)), nil + } + fs.FixRangeOption(options, o.size) + + token, err := o.fs.refreshJWTToken(ctx) + if err != nil { + return nil, err + } + + fullPath := o.fs.buildFullPath(o.remote) + // Construct the initial request URL + downloadURL := fmt.Sprintf("%s/%s/fs/download?path=%s", o.fs.endpoint, o.fs.drive, fullPath) + + // Create HTTP request manually + req, err := http.NewRequestWithContext(ctx, "GET", downloadURL, nil) + if err != nil { + fs.Debugf(o.fs, "Failed to create request: %v", err) + return nil, fmt.Errorf("failed to create request: %w", err) + } + req.Header.Set("Authorization", "Bearer "+token) + + // Use pacer to manage retries and rate limiting + var res *http.Response + err = o.fs.pacer.Call(func() (bool, error) { + + if res != nil { + err = res.Body.Close() + if err != nil { + return false, err + } + } + + client := http.Client{ + CheckRedirect: func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse // Don't follow redirects + }, + } + res, err = client.Do(req) + if err != nil { + return false, err + } + return res.StatusCode == http.StatusTooManyRequests, nil + }) + + if err != nil { + return nil, fmt.Errorf("download request failed: %w", err) + } + if res == nil { + return nil, fmt.Errorf("no response received from initial request") + } + + // Handle response based on status code + switch res.StatusCode { + case http.StatusOK: + return res.Body, nil + + case http.StatusTemporaryRedirect: + // Read the presigned URL from the body + bodyBytes, err := io.ReadAll(res.Body) + fs.CheckClose(res.Body, &err) // Close body after reading + if err != nil { + return nil, fmt.Errorf("failed to read redirect body: %w", err) + } + + presignedURL := strings.TrimSpace(string(bodyBytes)) + o.original = presignedURL //Save for later for hashing + + client := rest.NewClient(fshttp.NewClient(ctx)).SetRoot(presignedURL) + var downloadRes *http.Response + opts := rest.Opts{ + Method: "GET", + Path: "", + Options: options, + } + + err = o.fs.pacer.Call(func() (bool, error) { + downloadRes, err = client.Call(ctx, &opts) + if err != nil { + return false, err + } + if downloadRes == nil { + return false, fmt.Errorf("failed to fetch presigned URL") + } + return downloadRes.StatusCode == http.StatusTooManyRequests, nil + }) + + if err != nil { + return nil, fmt.Errorf("presigned URL request failed: %w", err) + } + if downloadRes == nil { + return nil, fmt.Errorf("no response received from presigned URL request") + } + + if downloadRes.StatusCode != http.StatusOK && downloadRes.StatusCode != http.StatusPartialContent { + body, _ := io.ReadAll(downloadRes.Body) + fs.CheckClose(downloadRes.Body, &err) + return nil, fmt.Errorf("presigned URL request failed with status %d: %q", downloadRes.StatusCode, string(body)) + } + + return downloadRes.Body, nil + + default: + body, _ := io.ReadAll(res.Body) + fs.CheckClose(res.Body, &err) + return nil, fmt.Errorf("download failed with status %d: %q", res.StatusCode, string(body)) + } +} + +// Update in to the object with the modTime given of the given size +// +// When called from outside an Fs by rclone, src.Size() will always be >= 0. +// But for unknown-sized objects (indicated by src.Size() == -1), Upload should either +// return an error or update the object properly (rather than e.g. calling panic). +func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error { + + //Need to ensure parent directories exist before updating + err := o.fs.ensureParentDirectories(ctx, o.remote) + if err != nil { + return err + } + + //If the source remote is different from this object's remote, as in we're updating a file with some other file's data, + //need to construct a new object info in order to correctly upload to THIS object, not the src one + var srcInfo fs.ObjectInfo + if o.remote != src.Remote() { + srcInfo = object.NewStaticObjectInfo(o.remote, src.ModTime(ctx), src.Size(), true, nil, o.Fs()) + } else { + srcInfo = src + } + + return o.uploadMultipart(ctx, srcInfo, in, options...) +} + +// Remove removes the object +func (o *Object) Remove(ctx context.Context) error { + + fullPath := o.fs.buildFullPath(o.remote) + + res, err := o.fs.callAPI(ctx, "POST", fmt.Sprintf("/%s/fs/delete?path=%s", o.fs.drive, fullPath), nil) + if err != nil { + return err + } + defer fs.CheckClose(res.Body, &err) // Ensure body is closed + + if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated { + return fmt.Errorf("object removal failed with status code: %d", res.StatusCode) + } + return nil +} + +// ------------------------------------------------- +// Directory implementation +// ------------------------------------------------- + +// Remote returns the remote path +func (d *Directory) Remote() string { + return d.remote +} + +// ModTime returns the modification time +func (d *Directory) ModTime(context.Context) time.Time { + return time.Unix(0, d.mtime*int64(time.Millisecond)) +} + +// Size returns the size (0 for directories) +func (d *Directory) Size() int64 { + return d.size +} + +// Fs returns the filesystem info +func (d *Directory) Fs() fs.Info { + return d.fs +} + +// Hash is unsupported for directories +func (d *Directory) Hash(context.Context, hash.Type) (string, error) { + return "", hash.ErrUnsupported +} + +// SetModTime is unsupported for directories +func (d *Directory) SetModTime(context.Context, time.Time) error { + return fs.ErrorCantSetModTime +} + +// Storable indicates directories aren’t storable as files +func (d *Directory) Storable() bool { + return false +} + +// Open returns an error for directories +func (d *Directory) Open() (io.ReadCloser, error) { + return nil, fs.ErrorIsDir +} + +// Items returns the number of items in the directory (-1 if unknown) +func (d *Directory) Items() int64 { + return -1 // Unknown +} + +// ID returns the directory ID (empty if not applicable) +func (d *Directory) ID() string { + return "" +} + +func (d *Directory) String() string { + return fmt.Sprintf("Directory: %s", d.remote) +} + +var ( + _ fs.Fs = &Fs{} + _ fs.Object = &Object{} + _ fs.Directory = &Directory{} + + _ fs.Mover = &Fs{} + _ fs.DirMover = &Fs{} +) diff --git a/backend/shade/shade_test.go b/backend/shade/shade_test.go new file mode 100644 index 0000000000000..82c4e13be9dce --- /dev/null +++ b/backend/shade/shade_test.go @@ -0,0 +1,21 @@ +package shade_test + +import ( + "testing" + + "github.com/rclone/rclone/backend/shade" + "github.com/rclone/rclone/fstest/fstests" +) + +// TestIntegration runs integration tests against the remote +func TestIntegration(t *testing.T) { + name := "TestShade" + fstests.Run(t, &fstests.Opt{ + RemoteName: name + ":", + NilObject: (*shade.Object)(nil), + SkipInvalidUTF8: true, + ExtraConfig: []fstests.ExtraConfigItem{ + {Name: name, Key: "eventually_consistent_delay", Value: "7"}, + }, + }) +} diff --git a/backend/shade/upload.go b/backend/shade/upload.go new file mode 100644 index 0000000000000..a4b1ecc04cbd8 --- /dev/null +++ b/backend/shade/upload.go @@ -0,0 +1,336 @@ +//multipart upload for shade + +package shade + +import ( + "bytes" + "context" + "fmt" + "io" + "net/http" + "net/url" + "path" + "sort" + "sync" + + "github.com/rclone/rclone/backend/shade/api" + "github.com/rclone/rclone/fs" + "github.com/rclone/rclone/fs/chunksize" + "github.com/rclone/rclone/lib/multipart" + "github.com/rclone/rclone/lib/rest" +) + +var warnStreamUpload sync.Once + +type shadeChunkWriter struct { + initToken string + chunkSize int64 + size int64 + f *Fs + o *Object + completedParts []api.CompletedPart + completedPartsMu sync.Mutex +} + +// uploadMultipart handles multipart upload for larger files +func (o *Object) uploadMultipart(ctx context.Context, src fs.ObjectInfo, in io.Reader, options ...fs.OpenOption) error { + + chunkWriter, err := multipart.UploadMultipart(ctx, src, in, multipart.UploadMultipartOptions{ + Open: o.fs, + OpenOptions: options, + }) + if err != nil { + return err + } + + var shadeWriter = chunkWriter.(*shadeChunkWriter) + o.size = shadeWriter.size + return nil +} + +// OpenChunkWriter returns the chunk size and a ChunkWriter +// +// Pass in the remote and the src object +// You can also use options to hint at the desired chunk size +func (f *Fs) OpenChunkWriter(ctx context.Context, remote string, src fs.ObjectInfo, options ...fs.OpenOption) (info fs.ChunkWriterInfo, writer fs.ChunkWriter, err error) { + // Temporary Object under construction + o := &Object{ + fs: f, + remote: remote, + } + + uploadParts := f.opt.MaxUploadParts + if uploadParts < 1 { + uploadParts = 1 + } else if uploadParts > maxUploadParts { + uploadParts = maxUploadParts + } + size := src.Size() + fs.FixRangeOption(options, size) + + // calculate size of parts + chunkSize := f.opt.ChunkSize + + // size can be -1 here meaning we don't know the size of the incoming file. We use ChunkSize + // buffers here (default 64 MB). With a maximum number of parts (10,000) this will be a file of + // 640 GB. + if size == -1 { + warnStreamUpload.Do(func() { + fs.Logf(f, "Streaming uploads using chunk size %v will have maximum file size of %v", + chunkSize, fs.SizeSuffix(int64(chunkSize)*int64(uploadParts))) + }) + } else { + chunkSize = chunksize.Calculator(src, size, uploadParts, chunkSize) + } + + token, err := o.fs.refreshJWTToken(ctx) + if err != nil { + return info, nil, fmt.Errorf("failed to get token: %w", err) + } + + err = f.ensureParentDirectories(ctx, remote) + if err != nil { + return info, nil, fmt.Errorf("failed to ensure parent directories: %w", err) + } + + fullPath := remote + if f.root != "" { + fullPath = path.Join(f.root, remote) + } + + // Initiate multipart upload + type initRequest struct { + Path string `json:"path"` + PartSize int64 `json:"partSize"` + } + reqBody := initRequest{ + Path: fullPath, + PartSize: int64(chunkSize), + } + + var initResp struct { + Token string `json:"token"` + } + + opts := rest.Opts{ + Method: "POST", + Path: fmt.Sprintf("/%s/upload/multipart", o.fs.drive), + RootURL: o.fs.endpoint, + ExtraHeaders: map[string]string{ + "Authorization": "Bearer " + token, + }, + Options: options, + } + + err = o.fs.pacer.Call(func() (bool, error) { + res, err := o.fs.srv.CallJSON(ctx, &opts, reqBody, &initResp) + if err != nil { + return res != nil && res.StatusCode == http.StatusTooManyRequests, err + } + return false, nil + }) + + if err != nil { + return info, nil, fmt.Errorf("failed to initiate multipart upload: %w", err) + } + + chunkWriter := &shadeChunkWriter{ + initToken: initResp.Token, + chunkSize: int64(chunkSize), + size: size, + f: f, + o: o, + } + info = fs.ChunkWriterInfo{ + ChunkSize: int64(chunkSize), + Concurrency: f.opt.Concurrency, + LeavePartsOnError: false, + } + return info, chunkWriter, err +} + +// WriteChunk will write chunk number with reader bytes, where chunk number >= 0 +func (s *shadeChunkWriter) WriteChunk(ctx context.Context, chunkNumber int, reader io.ReadSeeker) (bytesWritten int64, err error) { + + token, err := s.f.refreshJWTToken(ctx) + if err != nil { + return 0, err + } + + // Read chunk + var chunk bytes.Buffer + n, err := io.Copy(&chunk, reader) + + if n == 0 { + return 0, nil + } + + if err != nil { + return 0, fmt.Errorf("failed to read chunk: %w", err) + } + // Get presigned URL for this part + var partURL api.PartURL + + partOpts := rest.Opts{ + Method: "POST", + Path: fmt.Sprintf("/%s/upload/multipart/part/%d?token=%s", s.f.drive, chunkNumber+1, url.QueryEscape(s.initToken)), + RootURL: s.f.endpoint, + ExtraHeaders: map[string]string{ + "Authorization": "Bearer " + token, + }, + } + + err = s.f.pacer.Call(func() (bool, error) { + res, err := s.f.srv.CallJSON(ctx, &partOpts, nil, &partURL) + if err != nil { + return res != nil && res.StatusCode == http.StatusTooManyRequests, err + } + return false, nil + }) + + if err != nil { + return 0, fmt.Errorf("failed to get part URL: %w", err) + } + opts := rest.Opts{ + Method: "PUT", + RootURL: partURL.URL, + Body: &chunk, + ContentType: "", + ContentLength: &n, + } + + // Add headers + var uploadRes *http.Response + if len(partURL.Headers) > 0 { + opts.ExtraHeaders = make(map[string]string) + for k, v := range partURL.Headers { + opts.ExtraHeaders[k] = v + } + } + + err = s.f.pacer.Call(func() (bool, error) { + uploadRes, err = s.f.srv.Call(ctx, &opts) + if err != nil { + return uploadRes != nil && uploadRes.StatusCode == http.StatusTooManyRequests, err + } + return false, nil + }) + + if err != nil { + return 0, fmt.Errorf("failed to upload part %d: %w", chunk, err) + } + + if uploadRes.StatusCode != http.StatusOK && uploadRes.StatusCode != http.StatusCreated { + body, _ := io.ReadAll(uploadRes.Body) + fs.CheckClose(uploadRes.Body, &err) + return 0, fmt.Errorf("part upload failed with status %d: %s", uploadRes.StatusCode, string(body)) + } + + // Get ETag from response + etag := uploadRes.Header.Get("ETag") + fs.CheckClose(uploadRes.Body, &err) + + s.completedPartsMu.Lock() + defer s.completedPartsMu.Unlock() + s.completedParts = append(s.completedParts, api.CompletedPart{ + PartNumber: int32(chunkNumber + 1), + ETag: etag, + }) + return n, nil +} + +// Close complete chunked writer finalising the file. +func (s *shadeChunkWriter) Close(ctx context.Context) error { + + // Complete multipart upload + sort.Slice(s.completedParts, func(i, j int) bool { + return s.completedParts[i].PartNumber < s.completedParts[j].PartNumber + }) + + type completeRequest struct { + Parts []api.CompletedPart `json:"parts"` + } + var completeBody completeRequest + + if s.completedParts == nil { + completeBody = completeRequest{Parts: []api.CompletedPart{}} + } else { + completeBody = completeRequest{Parts: s.completedParts} + } + + token, err := s.f.refreshJWTToken(ctx) + if err != nil { + return err + } + + completeOpts := rest.Opts{ + Method: "POST", + Path: fmt.Sprintf("/%s/upload/multipart/complete?token=%s", s.f.drive, url.QueryEscape(s.initToken)), + RootURL: s.f.endpoint, + ExtraHeaders: map[string]string{ + "Authorization": "Bearer " + token, + }, + } + + var response http.Response + + err = s.f.pacer.Call(func() (bool, error) { + res, err := s.f.srv.CallJSON(ctx, &completeOpts, completeBody, &response) + + if err != nil && res == nil { + return false, err + } + + if res.StatusCode == http.StatusTooManyRequests { + return true, err // Retry on 429 + } + + if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated { + body, _ := io.ReadAll(res.Body) + return false, fmt.Errorf("complete multipart failed with status %d: %s", res.StatusCode, string(body)) + } + + return false, nil + }) + + if err != nil { + return fmt.Errorf("failed to complete multipart upload: %w", err) + } + + return nil +} + +// Abort chunk write +// +// You can and should call Abort without calling Close. +func (s *shadeChunkWriter) Abort(ctx context.Context) error { + token, err := s.f.refreshJWTToken(ctx) + if err != nil { + return err + } + + opts := rest.Opts{ + Method: "POST", + Path: fmt.Sprintf("/%s/upload/abort/multipart?token=%s", s.f.drive, url.QueryEscape(s.initToken)), + RootURL: s.f.endpoint, + ExtraHeaders: map[string]string{ + "Authorization": "Bearer " + token, + }, + } + + err = s.f.pacer.Call(func() (bool, error) { + res, err := s.f.srv.Call(ctx, &opts) + if err != nil { + fs.Debugf(s.f, "Failed to abort multipart upload: %v", err) + return false, nil // Don't retry abort + } + if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated { + fs.Debugf(s.f, "Abort returned status %d", res.StatusCode) + } + return false, nil + }) + if err != nil { + return fmt.Errorf("failed to abort multipart upload: %w", err) + } + return nil +} diff --git a/bin/make_manual.py b/bin/make_manual.py index 6519e27e35e02..4373638577bbb 100755 --- a/bin/make_manual.py +++ b/bin/make_manual.py @@ -84,6 +84,7 @@ "protondrive.md", "seafile.md", "sftp.md", + "shade.md", "smb.md", "storj.md", "sugarsync.md", diff --git a/docs/content/_index.md b/docs/content/_index.md index e5b0bdffc30b2..6a3832c2a2930 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -202,6 +202,7 @@ WebDAV or S3, that work out of the box.) {{< provider name="Selectel" home="https://selectel.ru/services/cloud/storage/" config="/s3/#selectel" >}} {{< provider name="Servercore Object Storage" home="https://servercore.com/services/object-storage/" config="/s3/#servercore" >}} {{< provider name="SFTP" home="https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol" config="/sftp/" >}} +{{< provider name="Shade" home="https://shade.inc" config="/shade/" >}} {{< provider name="Sia" home="https://sia.tech/" config="/sia/" >}} {{< provider name="SMB / CIFS" home="https://en.wikipedia.org/wiki/Server_Message_Block" config="/smb/" >}} {{< provider name="Spectra Logic" home="https://spectralogic.com/blackpearl-nearline-object-gateway/" config="/s3/#spectralogic" >}} diff --git a/docs/content/docs.md b/docs/content/docs.md index 270d98bae0885..f3269ac6136f2 100644 --- a/docs/content/docs.md +++ b/docs/content/docs.md @@ -82,6 +82,7 @@ See the following for detailed instructions for - [rsync.net](/sftp/#rsync-net) - [Seafile](/seafile/) - [SFTP](/sftp/) +- [Shade](/shade/) - [Sia](/sia/) - [SMB](/smb/) - [Storj](/storj/) diff --git a/docs/content/overview.md b/docs/content/overview.md index 28e8db9b4b093..16e485b302bb8 100644 --- a/docs/content/overview.md +++ b/docs/content/overview.md @@ -59,6 +59,7 @@ Here is an overview of the major features of each cloud storage system. | Quatrix by Maytech | - | R/W | No | No | - | - | | Seafile | - | - | No | No | - | - | | SFTP | MD5, SHA1 ² | DR/W | Depends | No | - | - | +| Shade | - | - | Yes | No | - | - | | Sia | - | - | No | No | - | - | | SMB | - | R/W | Yes | No | - | - | | SugarSync | - | - | No | No | - | - | diff --git a/docs/content/shade.md b/docs/content/shade.md new file mode 100644 index 0000000000000..82fe977ecbaaf --- /dev/null +++ b/docs/content/shade.md @@ -0,0 +1,218 @@ +# {{< icon "fa fa-moon" >}} Shade + +This is a backend for the [Shade](https://shade.inc/) platform + +## About Shade + +[Shade](https://shade.inc/) is an AI-powered cloud NAS that makes your cloud files behave like a local drive, optimized for media and creative workflows. It provides fast, secure access with natural-language search, easy sharing, and scalable cloud storage. + + +## Accounts & Pricing + +To use this backend, you need to [create a free account](https://app.shade.inc/) on Shade. You can start with a free account and get 20GB of storage for free. + + +## Usage + +Paths are specified as `remote:path` + +Paths may be as deep as required, e.g. `remote:directory/subdirectory`. + + +## Configuration + +Here is an example of making a Shade configuration. + +First, create a [create a free account](https://app.shade.inc/) account and choose a plan. + +You will need to log in and get the `API Key` and `Drive ID` for your account from the settings section of your account and created drive respectively. + +Now run + +`rclone config` + +Follow this interactive process: + +```sh +$ rclone config +e) Edit existing remote +n) New remote +d) Delete remote +r) Rename remote +c) Copy remote +s) Set configuration password +q) Quit config +e/n/d/r/c/s/q> n + +Enter name for new remote. +name> Shade + +Option Storage. +Type of storage to configure. +Choose a number from below, or type in your own value. +[OTHER OPTIONS] +xx / Shade FS + \ (shade) +[OTHER OPTIONS] +Storage> xx + +Option drive_id. +The ID of your drive, see this in the drive settings. Individual rclone configs must be made per drive. +Enter a value. +drive_id> [YOUR_ID] + +Option api_key. +An API key for your account. +Enter a value. +api_key> [YOUR_API_KEY] + +Edit advanced config? +y) Yes +n) No (default) +y/n> n + +Configuration complete. +Options: +- type: shade +- drive_id: [YOUR_ID] +- api_key: [YOUR_API_KEY] +Keep this "Shade" remote? +y) Yes this is OK (default) +e) Edit this remote +d) Delete this remote +y/e/d> y +``` + +### Modification times and hashes + +Shade does not support hashes and writing mod times. + + +### Transfers + +Shade uses multipart uploads by default. This means that files will be chunked and sent up to Shade concurrently. In order to configure how many simultaneous uploads you want to use, upload the 'concurrency' option in the advanced config section. Note that this uses more memory and initiates more http requests. + +### Deleting files + +Please note that when deleting files in Shade via rclone it will delete the file instantly, instead of sending it to the trash. This means that it will not be recoverable. + + +{{< rem autogenerated options start" - DO NOT EDIT - instead edit fs.RegInfo in backend/box/box.go then run make backenddocs" >}} +### Standard options + +Here are the Standard options specific to shade (Shade FS). + +#### --shade-drive-id + +The ID of your drive, see this in the drive settings. Individual rclone configs must be made per drive. + +Properties: + +- Config: drive_id +- Env Var: RCLONE_SHADE_DRIVE_ID +- Type: string +- Required: true + +#### --shade-api-key + +An API key for your account. You can find this under Settings > API Keys + +Properties: + +- Config: api_key +- Env Var: RCLONE_SHADE_API_KEY +- Type: string +- Required: true + +### Advanced options + +Here are the Advanced options specific to shade (Shade FS). + +#### --shade-endpoint + +Endpoint for the service. + +Leave blank normally. + +Properties: + +- Config: endpoint +- Env Var: RCLONE_SHADE_ENDPOINT +- Type: string +- Required: false + +#### --shade-chunk-size + +Chunk size to use for uploading. + +Any files larger than this will be uploaded in chunks of this size. + +Note that this is stored in memory per transfer, so increasing it will +increase memory usage. + +Minimum is 5MB, maximum is 5GB. + +Properties: + +- Config: chunk_size +- Env Var: RCLONE_SHADE_CHUNK_SIZE +- Type: SizeSuffix +- Default: 64Mi + +#### --shade-encoding + +The encoding for the backend. + +See the [encoding section in the overview](/overview/#encoding) for more info. + +Properties: + +- Config: encoding +- Env Var: RCLONE_SHADE_ENCODING +- Type: Encoding +- Default: Slash,BackSlash,Del,Ctl,InvalidUtf8,Dot + +#### --shade-description + +Description of the remote. + +Properties: + +- Config: description +- Env Var: RCLONE_SHADE_DESCRIPTION +- Type: string +- Required: false + +{{< rem autogenerated options stop >}} + +## Limitations + +Note that Shade is case insensitive so you can't have a file called +"Hello.doc" and one called "hello.doc". + +Shade only supports filenames up to 255 characters in length. + +`rclone about` is not supported by the Shade backend. Backends without +this capability cannot determine free space for an rclone mount or +use policy `mfs` (most free space) as a member of an rclone union +remote. + +See [List of backends that do not support rclone about](https://rclone.org/overview/#optional-features) and [rclone about](https://rclone.org/commands/rclone_about/) + +## Backend commands + +Here are the commands specific to the shade backend. + +Run them with + + rclone backend COMMAND remote: + +The help below will explain what arguments each command takes. + +See the [backend](/commands/rclone_backend/) command for more +info on how to pass options and arguments. + +These can be run on a running backend using the rc command +[backend/command](/rc/#backend-command). + + diff --git a/docs/layouts/chrome/navbar.html b/docs/layouts/chrome/navbar.html index 522e3cd7b6965..3f0e7da84d85d 100644 --- a/docs/layouts/chrome/navbar.html +++ b/docs/layouts/chrome/navbar.html @@ -107,6 +107,7 @@ Seafile SFTP Sia + Shade SMB / CIFS Storj SugarSync diff --git a/fstest/test_all/config.yaml b/fstest/test_all/config.yaml index f24cc6cc8cc4f..c36f6b3e7e52c 100644 --- a/fstest/test_all/config.yaml +++ b/fstest/test_all/config.yaml @@ -662,6 +662,10 @@ backends: ignoretests: - cmd/bisync - cmd/gitannex + - backend: "shade" + remote: "TestShade:" + fastlist: false + - backend: "archive" remote: "TestArchive:" fastlist: false From 492002c7e8ae0625e05abdf00149becc717894ec Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 10 Dec 2025 15:31:21 +0000 Subject: [PATCH 061/130] Add jhasse-shade to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index 8f7c35a19c837..879a110f19b95 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1057,3 +1057,4 @@ put them back in again. --> - Johannes Rothe - Tingsong Xu - Jonas Tingeborn <134889+jojje@users.noreply.github.com> +- jhasse-shade From ed135a32a4cd1cfd592bf3deaa37dd6c58cbfc95 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 10 Dec 2025 12:14:08 +0000 Subject: [PATCH 062/130] s3: add more regions for Selectel --- backend/s3/provider/Selectel.yaml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/backend/s3/provider/Selectel.yaml b/backend/s3/provider/Selectel.yaml index 70cc74bad89a3..29141ccc27474 100644 --- a/backend/s3/provider/Selectel.yaml +++ b/backend/s3/provider/Selectel.yaml @@ -2,7 +2,17 @@ name: Selectel description: Selectel Object Storage region: ru-1: St. Petersburg + ru-3: St. Petersburg + ru-7: Moscow + gis-1: Moscow + kz-1: Kazakhstan + uz-2: Uzbekistan endpoint: - s3.ru-1.storage.selcloud.ru: Saint Petersburg + s3.ru-1.storage.selcloud.ru: St. Petersburg + s3.ru-3.storage.selcloud.ru: St. Petersburg + s3.ru-7.storage.selcloud.ru: Moscow + s3.gis-1.storage.selcloud.ru: Moscow + s3.kz-1.storage.selcloud.ru: Kazakhstan + s3.uz-2.storage.selcloud.ru: Uzbekistan quirks: list_url_encode: false From a1715eb732d21d97fed5b00a3ad2415f0ec2dea9 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 10 Dec 2025 15:31:02 +0000 Subject: [PATCH 063/130] Changelog updates from Version v1.72.1 --- docs/content/changelog.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/content/changelog.md b/docs/content/changelog.md index fbba79f4110b1..e90b70c550b82 100644 --- a/docs/content/changelog.md +++ b/docs/content/changelog.md @@ -6,6 +6,22 @@ description: "Rclone Changelog" # Changelog +## v1.72.1 - 2025-12-10 + +[See commits](https://github.com/rclone/rclone/compare/v1.72.0...v1.72.1) + +- Bug Fixes + - build: update to go1.25.5 to fix [CVE-2025-61729](https://pkg.go.dev/vuln/GO-2025-4155) + - doc fixes (Duncan Smart, Nick Craig-Wood) + - configfile: Fix piped config support (Jonas Tingeborn) + - log + - Fix PID not included in JSON log output (Tingsong Xu) + - Fix backtrace not going to the --log-file (Nick Craig-Wood) +- Google Cloud Storage + - Improve endpoint parameter docs (Johannes Rothe) +- S3 + - Add missing regions for Selectel provider (Nick Craig-Wood) + ## v1.72.0 - 2025-11-21 [See commits](https://github.com/rclone/rclone/compare/v1.71.0...v1.72.0) From 0c8c681aee6e6201a79b3d28183aa1dd023559d1 Mon Sep 17 00:00:00 2001 From: dougal <147946567+roucc@users.noreply.github.com> Date: Wed, 10 Dec 2025 15:43:22 +0000 Subject: [PATCH 064/130] sync: fix error propagation in tests (#9025) This commit fixes the sync transform test IO errors by resetting the error flag which stops subsequent tests failing. --- fs/sync/sync_test.go | 1 + fs/sync/sync_transform_test.go | 2 ++ 2 files changed, 3 insertions(+) diff --git a/fs/sync/sync_test.go b/fs/sync/sync_test.go index 6fe57d824312a..69eac38110807 100644 --- a/fs/sync/sync_test.go +++ b/fs/sync/sync_test.go @@ -1301,6 +1301,7 @@ func TestSyncAfterRemovingAFileAndAddingAFileSubDirWithErrors(t *testing.T) { err := Sync(ctx, r.Fremote, r.Flocal, false) assert.Equal(t, fs.ErrorNotDeleting, err) testLoggerVsLsf(ctx, r.Fremote, r.Flocal, operations.GetLoggerOpt(ctx).JSON, t) + accounting.GlobalStats().ResetCounters() r.CheckLocalListing( t, diff --git a/fs/sync/sync_transform_test.go b/fs/sync/sync_transform_test.go index d435945097e9d..930386a85939d 100644 --- a/fs/sync/sync_transform_test.go +++ b/fs/sync/sync_transform_test.go @@ -13,6 +13,7 @@ import ( _ "github.com/rclone/rclone/backend/all" "github.com/rclone/rclone/fs" + "github.com/rclone/rclone/fs/accounting" "github.com/rclone/rclone/fs/filter" "github.com/rclone/rclone/fs/operations" "github.com/rclone/rclone/fs/walk" @@ -507,6 +508,7 @@ func TestError(t *testing.T) { err = Sync(ctx, r.Fremote, r.Flocal, true) // testLoggerVsLsf(ctx, r.Fremote, r.Flocal, operations.GetLoggerOpt(ctx).JSON, t) assert.Error(t, err) + accounting.GlobalStats().ResetCounters() r.CheckLocalListing(t, []fstest.Item{file1}, []string{"toe", "toe/toe"}) r.CheckRemoteListing(t, []fstest.Item{file1}, []string{"toe", "toe/toe"}) From c4a1eacc84cb903d829b988f2b78cb56ba637b08 Mon Sep 17 00:00:00 2001 From: jbagwell-akamai <113531113+jbagwell-akamai@users.noreply.github.com> Date: Thu, 11 Dec 2025 11:20:34 -0600 Subject: [PATCH 065/130] S3: Linode: updated endpoints to use ISO 3166-1 alpha-2 standard ISO 3166-1 alpha-2 standard for countries and region short name in parentheses instead of separated by another comma --- backend/s3/provider/Linode.yaml | 42 ++++++++++++++++----------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/backend/s3/provider/Linode.yaml b/backend/s3/provider/Linode.yaml index 0923290d0d603..2e60541743894 100644 --- a/backend/s3/provider/Linode.yaml +++ b/backend/s3/provider/Linode.yaml @@ -1,26 +1,26 @@ name: Linode description: Linode Object Storage endpoint: - nl-ams-1.linodeobjects.com: Amsterdam (Netherlands), nl-ams-1 - us-southeast-1.linodeobjects.com: Atlanta, GA (USA), us-southeast-1 - in-maa-1.linodeobjects.com: Chennai (India), in-maa-1 - us-ord-1.linodeobjects.com: Chicago, IL (USA), us-ord-1 - eu-central-1.linodeobjects.com: Frankfurt (Germany), eu-central-1 - id-cgk-1.linodeobjects.com: Jakarta (Indonesia), id-cgk-1 - gb-lon-1.linodeobjects.com: London 2 (Great Britain), gb-lon-1 - us-lax-1.linodeobjects.com: Los Angeles, CA (USA), us-lax-1 - es-mad-1.linodeobjects.com: Madrid (Spain), es-mad-1 - au-mel-1.linodeobjects.com: Melbourne (Australia), au-mel-1 - us-mia-1.linodeobjects.com: Miami, FL (USA), us-mia-1 - it-mil-1.linodeobjects.com: Milan (Italy), it-mil-1 - us-east-1.linodeobjects.com: Newark, NJ (USA), us-east-1 - jp-osa-1.linodeobjects.com: Osaka (Japan), jp-osa-1 - fr-par-1.linodeobjects.com: Paris (France), fr-par-1 - br-gru-1.linodeobjects.com: São Paulo (Brazil), br-gru-1 - us-sea-1.linodeobjects.com: Seattle, WA (USA), us-sea-1 - ap-south-1.linodeobjects.com: Singapore, ap-south-1 - sg-sin-1.linodeobjects.com: Singapore 2, sg-sin-1 - se-sto-1.linodeobjects.com: Stockholm (Sweden), se-sto-1 - us-iad-1.linodeobjects.com: Washington, DC, (USA), us-iad-1 + nl-ams-1.linodeobjects.com: Amsterdam, NL (nl-ams-1) + us-southeast-1.linodeobjects.com: Atlanta, GA, US (us-southeast-1) + in-maa-1.linodeobjects.com: Chennai, IN (in-maa-1) + us-ord-1.linodeobjects.com: Chicago, IL, US (us-ord-1) + eu-central-1.linodeobjects.com: Frankfurt, DE (eu-central-1) + id-cgk-1.linodeobjects.com: Jakarta, ID (id-cgk-1) + gb-lon-1.linodeobjects.com: London 2, UK (gb-lon-1) + us-lax-1.linodeobjects.com: Los Angeles, CA, US (us-lax-1) + es-mad-1.linodeobjects.com: Madrid, ES (es-mad-1) + us-mia-1.linodeobjects.com: Miami, FL, US (us-mia-1) + it-mil-1.linodeobjects.com: Milan, IT (it-mil-1) + us-east-1.linodeobjects.com: Newark, NJ, US (us-east-1) + jp-osa-1.linodeobjects.com: Osaka, JP (jp-osa-1) + fr-par-1.linodeobjects.com: Paris, FR (fr-par-1) + br-gru-1.linodeobjects.com: Sao Paulo, BR (br-gru-1) + us-sea-1.linodeobjects.com: Seattle, WA, US (us-sea-1) + ap-south-1.linodeobjects.com: Singapore, SG (ap-south-1) + sg-sin-1.linodeobjects.com: Singapore 2, SG (sg-sin-1) + se-sto-1.linodeobjects.com: Stockholm, SE (se-sto-1) + jp-tyo-1.linodeobjects.com: Tokyo 3, JP (jp-tyo-1) + us-iad-10.linodeobjects.com: Washington, DC, US (us-iad-10) acl: {} bucket_acl: true From c752917ae122ffb7efc86d2255bbad9fe344ba0b Mon Sep 17 00:00:00 2001 From: vyv03354 Date: Fri, 12 Dec 2025 04:32:53 +0900 Subject: [PATCH 066/130] docs: reflects the fact that pCloud supports ListR --- docs/content/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/overview.md b/docs/content/overview.md index 16e485b302bb8..35789f4aea02c 100644 --- a/docs/content/overview.md +++ b/docs/content/overview.md @@ -541,7 +541,7 @@ upon backend-specific capabilities. | OpenDrive | Yes | Yes | Yes | Yes | No | No | No | No | No | Yes | Yes | | OpenStack Swift | Yes ¹ | Yes | No | No | No | Yes | Yes | No | No | Yes | No | | Oracle Object Storage | No | Yes | No | No | Yes | Yes | Yes | Yes | No | No | No | -| pCloud | Yes | Yes | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes | +| pCloud | Yes | Yes | Yes | Yes | Yes | Yes | No | No | Yes | Yes | Yes | | PikPak | Yes | Yes | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes | | Pixeldrain | Yes | No | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes | | premiumize.me | Yes | No | Yes | Yes | No | No | No | No | Yes | Yes | Yes | From aac3684a27aec61ae58813c519357fbdff6d2128 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Dec 2025 22:05:17 +0000 Subject: [PATCH 067/130] build: bump actions/cache from 4 to 5 Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/cache dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- .github/workflows/build_publish_docker_image.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fc4242cbc3baf..15b84cc28513f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -229,7 +229,7 @@ jobs: cache: false - name: Cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/go/pkg/mod diff --git a/.github/workflows/build_publish_docker_image.yml b/.github/workflows/build_publish_docker_image.yml index 082281e35339a..45fb343523dae 100644 --- a/.github/workflows/build_publish_docker_image.yml +++ b/.github/workflows/build_publish_docker_image.yml @@ -129,7 +129,7 @@ jobs: - name: Load Go Build Cache for Docker id: go-cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: key: ${{ runner.os }}-${{ steps.imageos.outputs.result }}-go-${{ env.CACHE_NAME }}-${{ env.PLATFORM }}-${{ hashFiles('**/go.mod') }}-${{ hashFiles('**/go.sum') }} restore-keys: | From 30044ee078a9527d402ef99e3c11739471a9f4de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Dec 2025 22:05:32 +0000 Subject: [PATCH 068/130] build: bump actions/upload-artifact from 5 to 6 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build_publish_docker_image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_publish_docker_image.yml b/.github/workflows/build_publish_docker_image.yml index 45fb343523dae..1af13b8b012df 100644 --- a/.github/workflows/build_publish_docker_image.yml +++ b/.github/workflows/build_publish_docker_image.yml @@ -183,7 +183,7 @@ jobs: touch "/tmp/digests/${digest#sha256:}" - name: Upload Image Digest - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: digests-${{ env.PLATFORM }} path: /tmp/digests/* From c60518c3b82c89e1577315340218ef0db2961208 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Dec 2025 22:05:36 +0000 Subject: [PATCH 069/130] build: bump actions/download-artifact from 6 to 7 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 6 to 7. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build_publish_docker_image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_publish_docker_image.yml b/.github/workflows/build_publish_docker_image.yml index 1af13b8b012df..261e9de488bb0 100644 --- a/.github/workflows/build_publish_docker_image.yml +++ b/.github/workflows/build_publish_docker_image.yml @@ -198,7 +198,7 @@ jobs: steps: - name: Download Image Digests - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: path: /tmp/digests pattern: digests-* From cf28991275c4559babf0a689615578d70688a2f4 Mon Sep 17 00:00:00 2001 From: vyv03354 Date: Mon, 15 Dec 2025 17:11:00 +0900 Subject: [PATCH 070/130] docs: mention use of ListR feature in ls docs --- cmd/ls/lshelp/lshelp.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/ls/lshelp/lshelp.go b/cmd/ls/lshelp/lshelp.go index f4cae3d19d87f..445f190dbf462 100644 --- a/cmd/ls/lshelp/lshelp.go +++ b/cmd/ls/lshelp/lshelp.go @@ -26,6 +26,10 @@ Note that |ls| and |lsl| recurse by default - use |--max-depth 1| to stop the re The other list commands |lsd|,|lsf|,|lsjson| do not recurse by default - use |-R| to make them recurse. +List commands prefer a recursive method that uses more memory but fewer +transactions by default. Use |--disable ListR| to suppress the behavior. +See [|--fast-list|](/docs/#fast-list) for more details. + Listing a nonexistent directory will produce an error except for remotes which can't have empty directories (e.g. s3, swift, or gcs - the bucket-based remotes).`, "|", "`") From 1c8db29b355659654c5c7901d40df10e6dbe6579 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Mon, 1 Dec 2025 16:47:08 -0600 Subject: [PATCH 071/130] internxt: Implement authentication handling --- backend/internxt/auth.go | 297 +++++++++++++++++++++++++++++++++++ backend/internxt/internxt.go | 92 ++++++++++- 2 files changed, 386 insertions(+), 3 deletions(-) create mode 100644 backend/internxt/auth.go diff --git a/backend/internxt/auth.go b/backend/internxt/auth.go new file mode 100644 index 0000000000000..daa419999c801 --- /dev/null +++ b/backend/internxt/auth.go @@ -0,0 +1,297 @@ +// Authentication handling for Internxt +package internxt + +import ( + "context" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "net" + "net/http" + "time" + + "github.com/golang-jwt/jwt/v5" + "github.com/rclone/rclone/fs" + "github.com/rclone/rclone/lib/oauthutil" +) + +const ( + driveWebURL = "https://drive.internxt.com" + refreshURL = "https://gateway.internxt.com/drive/users/refresh" + defaultLocalPort = "53682" + bindAddress = "127.0.0.1:" + defaultLocalPort + tokenExpiry2d = 48 * time.Hour +) + +// authResult holds the result from the SSO callback +type authResult struct { + mnemonic string + token string + bucket string + err error +} + +// authServer handles the local HTTP callback for SSO login +type authServer struct { + listener net.Listener + server *http.Server + result chan authResult +} + +// newAuthServer creates a new local auth callback server +func newAuthServer() (*authServer, error) { + listener, err := net.Listen("tcp", bindAddress) + if err != nil { + return nil, fmt.Errorf("failed to start auth server on %s: %w", bindAddress, err) + } + + s := &authServer{ + listener: listener, + result: make(chan authResult, 1), + } + + mux := http.NewServeMux() + mux.HandleFunc("/", s.handleCallback) + s.server = &http.Server{Handler: mux} + + return s, nil +} + +// start begins serving requests in a goroutine +func (s *authServer) start() { + go func() { + err := s.server.Serve(s.listener) + if err != nil && err != http.ErrServerClosed { + s.result <- authResult{err: err} + } + }() +} + +// stop gracefully shuts down the server +func (s *authServer) stop() { + if s.server != nil { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + _ = s.server.Shutdown(ctx) + } +} + +// handleCallback processes the SSO callback with mnemonic and token +func (s *authServer) handleCallback(w http.ResponseWriter, r *http.Request) { + query := r.URL.Query() + mnemonicB64 := query.Get("mnemonic") + tokenB64 := query.Get("newToken") + + if mnemonicB64 == "" || tokenB64 == "" { + http.Error(w, "Missing mnemonic or token", http.StatusBadRequest) + s.result <- authResult{err: errors.New("missing mnemonic or token in callback")} + return + } + + mnemonicBytes, err := base64.StdEncoding.DecodeString(mnemonicB64) + if err != nil { + http.Error(w, "Invalid mnemonic encoding", http.StatusBadRequest) + s.result <- authResult{err: fmt.Errorf("failed to decode mnemonic: %w", err)} + return + } + + tokenBytes, err := base64.StdEncoding.DecodeString(tokenB64) + if err != nil { + http.Error(w, "Invalid token encoding", http.StatusBadRequest) + s.result <- authResult{err: fmt.Errorf("failed to decode token: %w", err)} + return + } + + // Send success HTML response + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.WriteHeader(http.StatusOK) + fmt.Fprintf(w, ` + + +

    placeholder

    +`) + + s.result <- authResult{ + mnemonic: string(mnemonicBytes), + token: string(tokenBytes), + } +} + +// doAuth performs the interactive SSO authentication +func doAuth(ctx context.Context) (token, mnemonic string, err error) { + server, err := newAuthServer() + if err != nil { + return "", "", err + } + defer server.stop() + + server.start() + + callbackURL := "http://" + bindAddress + "/" + callbackB64 := base64.StdEncoding.EncodeToString([]byte(callbackURL)) + authURL := fmt.Sprintf("%s/login?universalLink=true&redirectUri=%s", driveWebURL, callbackB64) + + fs.Logf(nil, "") + fs.Logf(nil, "If your browser doesn't open automatically, visit this URL:") + fs.Logf(nil, "%s", authURL) + fs.Logf(nil, "") + fs.Logf(nil, "Log in and authorize rclone for access") + fs.Logf(nil, "Waiting for authentication...") + + if err = oauthutil.OpenURL(authURL); err != nil { + fs.Errorf(nil, "Failed to open browser: %v", err) + fs.Logf(nil, "Please manually open the URL above in your browser") + } + + select { + case result := <-server.result: + if result.err != nil { + return "", "", result.err + } + + fs.Logf(nil, "SSO login successful, refreshing token to fetch user data...") + + refreshedToken, _, err := refreshTokenAndGetBucket(ctx, result.token) + if err != nil { + return "", "", fmt.Errorf("failed to refresh token: %w", err) + } + + fs.Logf(nil, "Authentication successful!") + return refreshedToken, result.mnemonic, nil + + case <-time.After(5 * time.Minute): + return "", "", errors.New("authentication timeout after 5 minutes") + } +} + +func tokenNeedsRefresh(tokenString string) (bool, error) { + if tokenString == "" { + return true, nil + } + + parser := jwt.NewParser(jwt.WithoutClaimsValidation()) + token, _, err := parser.ParseUnverified(tokenString, jwt.MapClaims{}) + if err != nil { + return true, fmt.Errorf("failed to parse token: %w", err) + } + + claims, ok := token.Claims.(jwt.MapClaims) + if !ok { + return true, errors.New("invalid token claims") + } + + exp, ok := claims["exp"].(float64) + if !ok { + return true, errors.New("token missing expiration") + } + + expiryTime := time.Unix(int64(exp), 0) + timeUntilExpiry := time.Until(expiryTime) + + // Refresh if expiring within 2 days + return timeUntilExpiry < tokenExpiry2d, nil +} + +func refreshToken(ctx context.Context, oldToken string) (string, error) { + newToken, _, err := refreshTokenAndGetBucket(ctx, oldToken) + return newToken, err +} + +func refreshTokenAndGetBucket(ctx context.Context, oldToken string) (newToken, bucket string, err error) { + if oldToken == "" { + return "", "", errors.New("cannot refresh empty token") + } + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, refreshURL, nil) + if err != nil { + return "", "", err + } + req.Header.Set("Authorization", "Bearer "+oldToken) + + client := &http.Client{Timeout: 30 * time.Second} + resp, err := client.Do(req) + if err != nil { + return "", "", fmt.Errorf("refresh request failed: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return "", "", fmt.Errorf("refresh failed with status %d", resp.StatusCode) + } + + var result struct { + NewToken string `json:"newToken"` + User struct { + Bucket string `json:"bucket"` + } `json:"user"` + } + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return "", "", fmt.Errorf("failed to parse refresh response: %w", err) + } + + if result.NewToken == "" { + return "", "", errors.New("refresh response missing newToken") + } + + if result.User.Bucket == "" { + return "", "", errors.New("refresh response missing user.bucket") + } + + return result.NewToken, result.User.Bucket, nil +} + +type userInfo struct { + RootFolderID string + Bucket string +} + +type userInfoConfig struct { + Token string +} + +// getUserInfo fetches user metadata from the JWT token and refresh endpoint +func getUserInfo(ctx context.Context, cfg *userInfoConfig) (*userInfo, error) { + parser := jwt.NewParser(jwt.WithoutClaimsValidation()) + token, _, err := parser.ParseUnverified(cfg.Token, jwt.MapClaims{}) + if err != nil { + return nil, fmt.Errorf("failed to parse token: %w", err) + } + + claims, ok := token.Claims.(jwt.MapClaims) + if !ok { + return nil, errors.New("invalid token claims") + } + + info := &userInfo{} + + if payload, ok := claims["payload"].(map[string]any); ok { + if uuid, ok := payload["uuid"].(string); ok { + info.RootFolderID = uuid + } else if rootFolderID, ok := payload["rootFolderId"].(string); ok { + info.RootFolderID = rootFolderID + } + } + + if info.RootFolderID == "" { + if uuid, ok := claims["uuid"].(string); ok { + info.RootFolderID = uuid + } else if sub, ok := claims["sub"].(string); ok { + info.RootFolderID = sub + } + } + + if info.RootFolderID == "" { + fs.Debugf(nil, "JWT token claims: %+v", claims) + return nil, errors.New("could not find rootFolderId/uuid in JWT token") + } + + _, bucket, err := refreshTokenAndGetBucket(ctx, cfg.Token) + if err != nil { + return nil, fmt.Errorf("failed to get bucket: %w", err) + } + info.Bucket = bucket + + fs.Debugf(nil, "User info: rootFolderId=%s, bucket=%s", info.RootFolderID, info.Bucket) + return info, nil +} diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 6483cdf868c9a..59a5981c2afb2 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -32,7 +32,18 @@ func init() { Name: "internxt", Description: "Internxt Drive", NewFs: NewFs, + Config: Config, Options: []fs.Option{ + { + Name: "token", + Help: "Internxt auth token (JWT).\n\nLeave blank to trigger interactive login.", + IsPassword: true, + }, + { + Name: "mnemonic", + Help: "Internxt encryption mnemonic.\n\nLeave blank to trigger interactive login.", + IsPassword: true, + }, { Name: "simulateEmptyFiles", Default: false, @@ -52,6 +63,67 @@ func init() { ) } +// Config implements the interactive configuration flow +func Config(ctx context.Context, name string, m configmap.Mapper, configIn fs.ConfigIn) (*fs.ConfigOut, error) { + token, tokenOK := m.Get("token") + mnemonic, mnemonicOK := m.Get("mnemonic") + + switch configIn.State { + case "": + // Check if we already have valid credentials + if tokenOK && mnemonicOK && token != "" && mnemonic != "" { + // Check if token needs refresh + needsRefresh, err := tokenNeedsRefresh(token) + if err != nil { + fs.Debugf(nil, "Failed to check token expiry: %v", err) + return fs.ConfigGoto("reauth") + } + + if needsRefresh { + fs.Logf(nil, "Token expires soon, attempting refresh...") + newToken, err := refreshToken(ctx, token) + if err != nil { + fs.Errorf(nil, "Failed to refresh token: %v", err) + return fs.ConfigConfirm("reauth", true, "config_reauth", + "Token refresh failed. Re-authenticate?") + } + m.Set("token", newToken) + fs.Logf(nil, "Token refreshed successfully") + return nil, nil + } + + return fs.ConfigConfirm("reauth", false, "config_reauth", + "Already authenticated. Re-authenticate?") + } + + return fs.ConfigGoto("auth") + + case "reauth": + if configIn.Result == "false" { + return nil, nil + } + return fs.ConfigGoto("auth") + + case "auth": + newToken, newMnemonic, err := doAuth(ctx) + if err != nil { + return nil, fmt.Errorf("authentication failed: %w", err) + } + + // Store credentials in config + m.Set("token", newToken) + m.Set("mnemonic", newMnemonic) + + fs.Logf(nil, "") + fs.Logf(nil, "Success! Authentication complete.") + fs.Logf(nil, "") + + return nil, nil + } + + return nil, fmt.Errorf("unknown state %q", configIn.State) +} + const ( EMPTY_FILE_EXT = ".__RCLONE_EMPTY__" ) @@ -62,6 +134,8 @@ var ( // Options holds configuration options for this interface type Options struct { + Token string `config:"token"` + Mnemonic string `config:"mnemonic"` Encoding encoder.MultiEncoder `config:"encoding"` SimulateEmptyFiles bool `config:"simulateEmptyFiles"` } @@ -117,8 +191,20 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e return nil, err } - // TODO: Implement proper token-based authentication - cfg := &config.Config{} + if opt.Token == "" || opt.Mnemonic == "" { + return nil, errors.New("token and mnemonic are required - please run: rclone config reconnect " + name + ":") + } + + cfg := config.NewDefaultToken(opt.Token) + cfg.Mnemonic = opt.Mnemonic + + userInfo, err := getUserInfo(ctx, &userInfoConfig{Token: cfg.Token}) + if err != nil { + return nil, fmt.Errorf("failed to fetch user info: %w", err) + } + + cfg.RootFolderID = userInfo.RootFolderID + cfg.Bucket = userInfo.Bucket f := &Fs{ name: name, @@ -133,7 +219,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e f.dirCache = dircache.New(f.root, cfg.RootFolderID, f) - err := f.dirCache.FindRoot(ctx, false) + err = f.dirCache.FindRoot(ctx, false) if err != nil { // Assume it might be a file newRoot, remote := dircache.SplitPath(f.root) From 6b3fedd4f8b65c34b3dd50dacd67f41ba11876ce Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Tue, 2 Dec 2025 17:10:53 -0600 Subject: [PATCH 072/130] internxt: Update authentication flow to use rclone-adapter; add JWT token handling and refresh logic --- backend/internxt/auth.go | 174 +++++++++++++++++++---------------- backend/internxt/internxt.go | 78 ++++++++++++---- go.mod | 2 +- go.sum | 7 -- 4 files changed, 153 insertions(+), 108 deletions(-) diff --git a/backend/internxt/auth.go b/backend/internxt/auth.go index daa419999c801..59490a0b2498a 100644 --- a/backend/internxt/auth.go +++ b/backend/internxt/auth.go @@ -4,7 +4,6 @@ package internxt import ( "context" "encoding/base64" - "encoding/json" "errors" "fmt" "net" @@ -12,13 +11,16 @@ import ( "time" "github.com/golang-jwt/jwt/v5" + internxtauth "github.com/internxt/rclone-adapter/auth" + internxtconfig "github.com/internxt/rclone-adapter/config" "github.com/rclone/rclone/fs" + "github.com/rclone/rclone/fs/config/configmap" "github.com/rclone/rclone/lib/oauthutil" + "golang.org/x/oauth2" ) const ( driveWebURL = "https://drive.internxt.com" - refreshURL = "https://gateway.internxt.com/drive/users/refresh" defaultLocalPort = "53682" bindAddress = "127.0.0.1:" + defaultLocalPort tokenExpiry2d = 48 * time.Hour @@ -152,94 +154,24 @@ func doAuth(ctx context.Context) (token, mnemonic string, err error) { fs.Logf(nil, "SSO login successful, refreshing token to fetch user data...") - refreshedToken, _, err := refreshTokenAndGetBucket(ctx, result.token) + cfg := internxtconfig.NewDefaultToken(result.token) + resp, err := internxtauth.RefreshToken(ctx, cfg) if err != nil { return "", "", fmt.Errorf("failed to refresh token: %w", err) } + if resp.NewToken == "" { + return "", "", errors.New("refresh response missing newToken") + } + fs.Logf(nil, "Authentication successful!") - return refreshedToken, result.mnemonic, nil + return resp.NewToken, result.mnemonic, nil case <-time.After(5 * time.Minute): return "", "", errors.New("authentication timeout after 5 minutes") } } -func tokenNeedsRefresh(tokenString string) (bool, error) { - if tokenString == "" { - return true, nil - } - - parser := jwt.NewParser(jwt.WithoutClaimsValidation()) - token, _, err := parser.ParseUnverified(tokenString, jwt.MapClaims{}) - if err != nil { - return true, fmt.Errorf("failed to parse token: %w", err) - } - - claims, ok := token.Claims.(jwt.MapClaims) - if !ok { - return true, errors.New("invalid token claims") - } - - exp, ok := claims["exp"].(float64) - if !ok { - return true, errors.New("token missing expiration") - } - - expiryTime := time.Unix(int64(exp), 0) - timeUntilExpiry := time.Until(expiryTime) - - // Refresh if expiring within 2 days - return timeUntilExpiry < tokenExpiry2d, nil -} - -func refreshToken(ctx context.Context, oldToken string) (string, error) { - newToken, _, err := refreshTokenAndGetBucket(ctx, oldToken) - return newToken, err -} - -func refreshTokenAndGetBucket(ctx context.Context, oldToken string) (newToken, bucket string, err error) { - if oldToken == "" { - return "", "", errors.New("cannot refresh empty token") - } - - req, err := http.NewRequestWithContext(ctx, http.MethodGet, refreshURL, nil) - if err != nil { - return "", "", err - } - req.Header.Set("Authorization", "Bearer "+oldToken) - - client := &http.Client{Timeout: 30 * time.Second} - resp, err := client.Do(req) - if err != nil { - return "", "", fmt.Errorf("refresh request failed: %w", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return "", "", fmt.Errorf("refresh failed with status %d", resp.StatusCode) - } - - var result struct { - NewToken string `json:"newToken"` - User struct { - Bucket string `json:"bucket"` - } `json:"user"` - } - if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { - return "", "", fmt.Errorf("failed to parse refresh response: %w", err) - } - - if result.NewToken == "" { - return "", "", errors.New("refresh response missing newToken") - } - - if result.User.Bucket == "" { - return "", "", errors.New("refresh response missing user.bucket") - } - - return result.NewToken, result.User.Bucket, nil -} type userInfo struct { RootFolderID string @@ -286,12 +218,92 @@ func getUserInfo(ctx context.Context, cfg *userInfoConfig) (*userInfo, error) { return nil, errors.New("could not find rootFolderId/uuid in JWT token") } - _, bucket, err := refreshTokenAndGetBucket(ctx, cfg.Token) + refreshCfg := internxtconfig.NewDefaultToken(cfg.Token) + resp, err := internxtauth.RefreshToken(ctx, refreshCfg) if err != nil { return nil, fmt.Errorf("failed to get bucket: %w", err) } - info.Bucket = bucket + + if resp.User.Bucket == "" { + return nil, errors.New("refresh response missing user.bucket") + } + + info.Bucket = resp.User.Bucket fs.Debugf(nil, "User info: rootFolderId=%s, bucket=%s", info.RootFolderID, info.Bucket) return info, nil } + +// parseJWTExpiry extracts the expiry time from a JWT token string +func parseJWTExpiry(tokenString string) (time.Time, error) { + parser := jwt.NewParser(jwt.WithoutClaimsValidation()) + token, _, err := parser.ParseUnverified(tokenString, jwt.MapClaims{}) + if err != nil { + return time.Time{}, fmt.Errorf("failed to parse token: %w", err) + } + + claims, ok := token.Claims.(jwt.MapClaims) + if !ok { + return time.Time{}, errors.New("invalid token claims") + } + + exp, ok := claims["exp"].(float64) + if !ok { + return time.Time{}, errors.New("token missing expiration") + } + + return time.Unix(int64(exp), 0), nil +} + +// jwtToOAuth2Token converts a JWT string to an oauth2.Token with expiry +func jwtToOAuth2Token(jwtString string) (*oauth2.Token, error) { + expiry, err := parseJWTExpiry(jwtString) + if err != nil { + return nil, err + } + + return &oauth2.Token{ + AccessToken: jwtString, + TokenType: "Bearer", + Expiry: expiry, + }, nil +} + +// refreshJWTToken refreshes the token using Internxt's refresh endpoint +func refreshJWTToken(ctx context.Context, name string, m configmap.Mapper) error { + currentToken, err := oauthutil.GetToken(name, m) + if err != nil { + return fmt.Errorf("failed to get current token: %w", err) + } + + mnemonic, _ := m.Get("mnemonic") + + cfg := internxtconfig.NewDefaultToken(currentToken.AccessToken) + resp, err := internxtauth.RefreshToken(ctx, cfg) + if err != nil { + return fmt.Errorf("refresh request failed: %w", err) + } + + if resp.NewToken == "" { + return errors.New("refresh response missing newToken") + } + + // Convert JWT to oauth2.Token format + token, err := jwtToOAuth2Token(resp.NewToken) + if err != nil { + return fmt.Errorf("failed to parse refreshed token: %w", err) + } + + err = oauthutil.PutToken(name, m, token, false) + if err != nil { + return fmt.Errorf("failed to save token: %w", err) + } + + if resp.User.Bucket != "" { + m.Set("bucket", resp.User.Bucket) + } + m.Set("mnemonic", mnemonic) + + fs.Debugf(name, "Token refreshed successfully, new expiry: %v", token.Expiry) + return nil +} diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 59a5981c2afb2..23618a309e2d5 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -24,6 +24,7 @@ import ( "github.com/rclone/rclone/fs/hash" "github.com/rclone/rclone/lib/dircache" "github.com/rclone/rclone/lib/encoder" + "github.com/rclone/rclone/lib/oauthutil" ) // Register with Fs @@ -65,29 +66,28 @@ func init() { // Config implements the interactive configuration flow func Config(ctx context.Context, name string, m configmap.Mapper, configIn fs.ConfigIn) (*fs.ConfigOut, error) { - token, tokenOK := m.Get("token") + _, tokenOK := m.Get("token") mnemonic, mnemonicOK := m.Get("mnemonic") switch configIn.State { case "": // Check if we already have valid credentials - if tokenOK && mnemonicOK && token != "" && mnemonic != "" { - // Check if token needs refresh - needsRefresh, err := tokenNeedsRefresh(token) + if tokenOK && mnemonicOK && mnemonic != "" { + // Get oauth2.Token from config + oauthToken, err := oauthutil.GetToken(name, m) if err != nil { - fs.Debugf(nil, "Failed to check token expiry: %v", err) + fs.Errorf(nil, "Failed to get token: %v", err) return fs.ConfigGoto("reauth") } - if needsRefresh { + if time.Until(oauthToken.Expiry) < tokenExpiry2d { fs.Logf(nil, "Token expires soon, attempting refresh...") - newToken, err := refreshToken(ctx, token) + err := refreshJWTToken(ctx, name, m) if err != nil { fs.Errorf(nil, "Failed to refresh token: %v", err) return fs.ConfigConfirm("reauth", true, "config_reauth", "Token refresh failed. Re-authenticate?") } - m.Set("token", newToken) fs.Logf(nil, "Token refreshed successfully") return nil, nil } @@ -110,10 +110,20 @@ func Config(ctx context.Context, name string, m configmap.Mapper, configIn fs.Co return nil, fmt.Errorf("authentication failed: %w", err) } - // Store credentials in config - m.Set("token", newToken) + // Store mnemonic m.Set("mnemonic", newMnemonic) + // Store token in oauth2 format + oauthToken, err := jwtToOAuth2Token(newToken) + if err != nil { + return nil, fmt.Errorf("failed to create oauth2 token: %w", err) + } + + err = oauthutil.PutToken(name, m, oauthToken, true) + if err != nil { + return nil, fmt.Errorf("failed to save token: %w", err) + } + fs.Logf(nil, "") fs.Logf(nil, "Success! Authentication complete.") fs.Logf(nil, "") @@ -142,12 +152,13 @@ type Options struct { // Fs represents an Internxt remote type Fs struct { - name string - root string - opt Options - dirCache *dircache.DirCache - cfg *config.Config - features *fs.Features + name string + root string + opt Options + dirCache *dircache.DirCache + cfg *config.Config + features *fs.Features + tokenRenewer *oauthutil.Renew } // Object holds the data for a remote file object @@ -191,12 +202,27 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e return nil, err } - if opt.Token == "" || opt.Mnemonic == "" { - return nil, errors.New("token and mnemonic are required - please run: rclone config reconnect " + name + ":") + if opt.Mnemonic == "" { + return nil, errors.New("mnemonic is required - please run: rclone config reconnect " + name + ":") + } + + oauthToken, err := oauthutil.GetToken(name, m) + if err != nil { + return nil, fmt.Errorf("failed to get token - please run: rclone config reconnect %s: - %w", name, err) + } + + oauthConfig := &oauthutil.Config{ + TokenURL: "https://gateway.internxt.com/drive/users/refresh", } - cfg := config.NewDefaultToken(opt.Token) + oAuthClient, ts, err := oauthutil.NewClient(ctx, name, m, oauthConfig) + if err != nil { + return nil, fmt.Errorf("failed to create oauth client: %w", err) + } + + cfg := config.NewDefaultToken(oauthToken.AccessToken) cfg.Mnemonic = opt.Mnemonic + cfg.HTTPClient = oAuthClient userInfo, err := getUserInfo(ctx, &userInfoConfig{Token: cfg.Token}) if err != nil { @@ -217,6 +243,13 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e CanHaveEmptyDirectories: true, }).Fill(ctx, f) + if ts != nil { + f.tokenRenewer = oauthutil.NewRenew(f.String(), ts, func() error { + return refreshJWTToken(ctx, name, m) + }) + f.tokenRenewer.Start() + } + f.dirCache = dircache.New(f.root, cfg.RootFolderID, f) err = f.dirCache.FindRoot(ctx, false) @@ -522,6 +555,13 @@ func (f *Fs) About(ctx context.Context) (*fs.Usage, error) { return usage, nil } +func (f *Fs) Shutdown(ctx context.Context) error { + if f.tokenRenewer != nil { + f.tokenRenewer.Shutdown() + } + return nil +} + // Open opens a file for streaming func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadCloser, error) { fs.FixRangeOption(options, o.size) diff --git a/go.mod b/go.mod index 5a5fb9d15cf2c..4ed39d402f3df 100644 --- a/go.mod +++ b/go.mod @@ -40,6 +40,7 @@ require ( github.com/go-chi/chi/v5 v5.2.3 github.com/go-darwin/apfs v0.0.0-20211011131704-f84b94dbf348 github.com/go-git/go-billy/v5 v5.6.2 + github.com/golang-jwt/jwt/v5 v5.3.0 github.com/google/uuid v1.6.0 github.com/hanwen/go-fuse/v2 v2.9.0 github.com/henrybear327/Proton-API-Bridge v1.0.0 @@ -177,7 +178,6 @@ require ( github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/gofrs/flock v0.13.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.3.0 // indirect github.com/google/btree v1.1.3 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.7 // indirect diff --git a/go.sum b/go.sum index 83a0cf8573c6d..e827c8879d353 100644 --- a/go.sum +++ b/go.sum @@ -72,8 +72,6 @@ github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd/go.mod h1:C8yoIf github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/ProtonMail/bcrypt v0.0.0-20210511135022-227b4adcab57/go.mod h1:HecWFHognK8GfRDGnFQbW/LiV7A3MX3gZVs45vk5h8I= github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf h1:yc9daCCYUefEs69zUkSzubzjBbL+cmOXgnmt9Fyd9ug= github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf/go.mod h1:o0ESU9p83twszAU8LBeJKFAAMX14tISa0yk4Oo5TOqo= @@ -312,7 +310,6 @@ github.com/go-playground/validator/v10 v10.28.0 h1:Q7ibns33JjyW48gHkuFT91qX48KG0 github.com/go-playground/validator/v10 v10.28.0/go.mod h1:GoI6I1SjPBh9p7ykNE/yj3fFYbyDOpwMn5KXd+m2hUU= github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM= github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= @@ -425,8 +422,6 @@ github.com/henrybear327/go-proton-api v1.0.0/go.mod h1:w63MZuzufKcIZ93pwRgiOtxMX github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/internxt/rclone-adapter v0.0.0-20251128125449-40f1a8e381e7 h1:PXzi74RNqFc6yO6whAZDUkdFJCvrJCiZEC7Iq6dPXhY= -github.com/internxt/rclone-adapter v0.0.0-20251128125449-40f1a8e381e7/go.mod h1:XZ47hBE41lE1ixntK+ZuSLnS9ZGEtc6Pba0bKIo/CbU= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -672,8 +667,6 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= From 28181e46bfa3fccabdce16b23666500272653e06 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Wed, 3 Dec 2025 14:18:45 -0600 Subject: [PATCH 073/130] internxt: Enhance authentication flow with user ID and bridge user handling; improve error handling and response management --- backend/internxt/auth.go | 54 ++++++++++++++++++++++++++++-------- backend/internxt/internxt.go | 30 +++++++++++++++----- 2 files changed, 65 insertions(+), 19 deletions(-) diff --git a/backend/internxt/auth.go b/backend/internxt/auth.go index 59490a0b2498a..aab4078e9da3a 100644 --- a/backend/internxt/auth.go +++ b/backend/internxt/auth.go @@ -3,7 +3,9 @@ package internxt import ( "context" + "crypto/sha256" "encoding/base64" + "encoding/hex" "errors" "fmt" "net" @@ -105,14 +107,8 @@ func (s *authServer) handleCallback(w http.ResponseWriter, r *http.Request) { return } - // Send success HTML response - w.Header().Set("Content-Type", "text/html; charset=utf-8") - w.WriteHeader(http.StatusOK) - fmt.Fprintf(w, ` - - -

    placeholder

    -`) + // Redirect to success page + http.Redirect(w, r, driveWebURL+"/auth-link-ok", http.StatusFound) s.result <- authResult{ mnemonic: string(mnemonicBytes), @@ -172,10 +168,11 @@ func doAuth(ctx context.Context) (token, mnemonic string, err error) { } } - type userInfo struct { RootFolderID string Bucket string + BridgeUser string + UserID string } type userInfoConfig struct { @@ -229,8 +226,30 @@ func getUserInfo(ctx context.Context, cfg *userInfoConfig) (*userInfo, error) { } info.Bucket = resp.User.Bucket + info.BridgeUser = resp.User.BridgeUser + info.UserID = resp.User.UserID + + // Use RootFolderID from refresh response + if resp.User.RootFolderID != "" { + info.RootFolderID = resp.User.RootFolderID + fs.Debugf(nil, "Using RootFolderID from refresh response: %s", info.RootFolderID) + } else if resp.User.UUID != "" { + info.RootFolderID = resp.User.UUID + fs.Debugf(nil, "Using UUID from refresh response as RootFolderID: %s", info.RootFolderID) + } + + if info.RootFolderID == "" { + return nil, errors.New("could not determine root folder ID from API response") + } + + fs.Debugf(nil, "User info: rootFolderId=%s, bucket=%s, bridgeUser=%s, userID=%s", + info.RootFolderID, info.Bucket, info.BridgeUser, info.UserID) + + if info.BridgeUser == "" || info.UserID == "" { + fs.Errorf(nil, "WARNING: BridgeUser or UserID is empty! BridgeUser=%q, UserID=%q", + info.BridgeUser, info.UserID) + } - fs.Debugf(nil, "User info: rootFolderId=%s, bucket=%s", info.RootFolderID, info.Bucket) return info, nil } @@ -269,6 +288,15 @@ func jwtToOAuth2Token(jwtString string) (*oauth2.Token, error) { }, nil } +// computeBasicAuthHeader creates the BasicAuthHeader for bucket operations +// Following the pattern from SDK's auth/access.go:96-102 +func computeBasicAuthHeader(bridgeUser, userID string) string { + sum := sha256.Sum256([]byte(userID)) + hexPass := hex.EncodeToString(sum[:]) + creds := fmt.Sprintf("%s:%s", bridgeUser, hexPass) + return "Basic " + base64.StdEncoding.EncodeToString([]byte(creds)) +} + // refreshJWTToken refreshes the token using Internxt's refresh endpoint func refreshJWTToken(ctx context.Context, name string, m configmap.Mapper) error { currentToken, err := oauthutil.GetToken(name, m) @@ -276,7 +304,10 @@ func refreshJWTToken(ctx context.Context, name string, m configmap.Mapper) error return fmt.Errorf("failed to get current token: %w", err) } - mnemonic, _ := m.Get("mnemonic") + mnemonic, ok := m.Get("mnemonic") + if !ok || mnemonic == "" { + return errors.New("mnemonic is missing from configuration") + } cfg := internxtconfig.NewDefaultToken(currentToken.AccessToken) resp, err := internxtauth.RefreshToken(ctx, cfg) @@ -302,7 +333,6 @@ func refreshJWTToken(ctx context.Context, name string, m configmap.Mapper) error if resp.User.Bucket != "" { m.Set("bucket", resp.User.Bucket) } - m.Set("mnemonic", mnemonic) fs.Debugf(name, "Token refreshed successfully, new expiry: %v", token.Expiry) return nil diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 23618a309e2d5..07734e937bd98 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -159,6 +159,8 @@ type Fs struct { cfg *config.Config features *fs.Features tokenRenewer *oauthutil.Renew + bridgeUser string + userID string } // Object holds the data for a remote file object @@ -215,14 +217,13 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e TokenURL: "https://gateway.internxt.com/drive/users/refresh", } - oAuthClient, ts, err := oauthutil.NewClient(ctx, name, m, oauthConfig) + _, ts, err := oauthutil.NewClient(ctx, name, m, oauthConfig) if err != nil { return nil, fmt.Errorf("failed to create oauth client: %w", err) } cfg := config.NewDefaultToken(oauthToken.AccessToken) cfg.Mnemonic = opt.Mnemonic - cfg.HTTPClient = oAuthClient userInfo, err := getUserInfo(ctx, &userInfoConfig{Token: cfg.Token}) if err != nil { @@ -231,12 +232,15 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e cfg.RootFolderID = userInfo.RootFolderID cfg.Bucket = userInfo.Bucket + cfg.BasicAuthHeader = computeBasicAuthHeader(userInfo.BridgeUser, userInfo.UserID) f := &Fs{ - name: name, - root: strings.Trim(root, "/"), - opt: *opt, - cfg: cfg, + name: name, + root: strings.Trim(root, "/"), + opt: *opt, + cfg: cfg, + bridgeUser: userInfo.BridgeUser, + userID: userInfo.UserID, } f.features = (&fs.Features{ @@ -245,7 +249,19 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e if ts != nil { f.tokenRenewer = oauthutil.NewRenew(f.String(), ts, func() error { - return refreshJWTToken(ctx, name, m) + err := refreshJWTToken(ctx, name, m) + if err != nil { + return err + } + + newToken, err := oauthutil.GetToken(name, m) + if err != nil { + return fmt.Errorf("failed to get refreshed token: %w", err) + } + f.cfg.Token = newToken.AccessToken + f.cfg.BasicAuthHeader = computeBasicAuthHeader(f.bridgeUser, f.userID) + + return nil }) f.tokenRenewer.Start() } From 161afefe969d4fb0d1b77336e6628ddc181dc6b1 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Mon, 8 Dec 2025 14:56:52 -0600 Subject: [PATCH 074/130] internxt: refactor getUserInfo function to streamline user metadata retrieval from the refresh endpoint --- backend/internxt/auth.go | 77 ++++++++++------------------------------ 1 file changed, 19 insertions(+), 58 deletions(-) diff --git a/backend/internxt/auth.go b/backend/internxt/auth.go index aab4078e9da3a..d6a85e4adb310 100644 --- a/backend/internxt/auth.go +++ b/backend/internxt/auth.go @@ -179,77 +179,38 @@ type userInfoConfig struct { Token string } -// getUserInfo fetches user metadata from the JWT token and refresh endpoint +// getUserInfo fetches user metadata from the refresh endpoint func getUserInfo(ctx context.Context, cfg *userInfoConfig) (*userInfo, error) { - parser := jwt.NewParser(jwt.WithoutClaimsValidation()) - token, _, err := parser.ParseUnverified(cfg.Token, jwt.MapClaims{}) - if err != nil { - return nil, fmt.Errorf("failed to parse token: %w", err) - } - - claims, ok := token.Claims.(jwt.MapClaims) - if !ok { - return nil, errors.New("invalid token claims") - } - - info := &userInfo{} - - if payload, ok := claims["payload"].(map[string]any); ok { - if uuid, ok := payload["uuid"].(string); ok { - info.RootFolderID = uuid - } else if rootFolderID, ok := payload["rootFolderId"].(string); ok { - info.RootFolderID = rootFolderID - } - } - - if info.RootFolderID == "" { - if uuid, ok := claims["uuid"].(string); ok { - info.RootFolderID = uuid - } else if sub, ok := claims["sub"].(string); ok { - info.RootFolderID = sub - } - } - - if info.RootFolderID == "" { - fs.Debugf(nil, "JWT token claims: %+v", claims) - return nil, errors.New("could not find rootFolderId/uuid in JWT token") - } - + // Call the refresh endpoint to get all user metadata refreshCfg := internxtconfig.NewDefaultToken(cfg.Token) resp, err := internxtauth.RefreshToken(ctx, refreshCfg) if err != nil { - return nil, fmt.Errorf("failed to get bucket: %w", err) + return nil, fmt.Errorf("failed to fetch user info: %w", err) } if resp.User.Bucket == "" { - return nil, errors.New("refresh response missing user.bucket") + return nil, errors.New("API response missing user.bucket") } - - info.Bucket = resp.User.Bucket - info.BridgeUser = resp.User.BridgeUser - info.UserID = resp.User.UserID - - // Use RootFolderID from refresh response - if resp.User.RootFolderID != "" { - info.RootFolderID = resp.User.RootFolderID - fs.Debugf(nil, "Using RootFolderID from refresh response: %s", info.RootFolderID) - } else if resp.User.UUID != "" { - info.RootFolderID = resp.User.UUID - fs.Debugf(nil, "Using UUID from refresh response as RootFolderID: %s", info.RootFolderID) + if resp.User.RootFolderID == "" { + return nil, errors.New("API response missing user.rootFolderId") } - - if info.RootFolderID == "" { - return nil, errors.New("could not determine root folder ID from API response") + if resp.User.BridgeUser == "" { + return nil, errors.New("API response missing user.bridgeUser") + } + if resp.User.UserID == "" { + return nil, errors.New("API response missing user.userId") } - fs.Debugf(nil, "User info: rootFolderId=%s, bucket=%s, bridgeUser=%s, userID=%s", - info.RootFolderID, info.Bucket, info.BridgeUser, info.UserID) - - if info.BridgeUser == "" || info.UserID == "" { - fs.Errorf(nil, "WARNING: BridgeUser or UserID is empty! BridgeUser=%q, UserID=%q", - info.BridgeUser, info.UserID) + info := &userInfo{ + RootFolderID: resp.User.RootFolderID, + Bucket: resp.User.Bucket, + BridgeUser: resp.User.BridgeUser, + UserID: resp.User.UserID, } + fs.Debugf(nil, "User info: rootFolderId=%s, bucket=%s", + info.RootFolderID, info.Bucket) + return info, nil } From 528aa461796f637f5c32160331b2c2e5122a492b Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Mon, 8 Dec 2025 15:14:36 -0600 Subject: [PATCH 075/130] internxt: Enhance authentication callback handling with BIP39 mnemonic validation and improved error redirection --- backend/internxt/auth.go | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/backend/internxt/auth.go b/backend/internxt/auth.go index d6a85e4adb310..0ec4fcdc37765 100644 --- a/backend/internxt/auth.go +++ b/backend/internxt/auth.go @@ -18,6 +18,7 @@ import ( "github.com/rclone/rclone/fs" "github.com/rclone/rclone/fs/config/configmap" "github.com/rclone/rclone/lib/oauthutil" + "github.com/tyler-smith/go-bip39" "golang.org/x/oauth2" ) @@ -32,7 +33,6 @@ const ( type authResult struct { mnemonic string token string - bucket string err error } @@ -87,23 +87,33 @@ func (s *authServer) handleCallback(w http.ResponseWriter, r *http.Request) { mnemonicB64 := query.Get("mnemonic") tokenB64 := query.Get("newToken") + // Helper to redirect and report error + redirectWithError := func(err error) { + http.Redirect(w, r, driveWebURL+"/auth-link-error", http.StatusFound) + s.result <- authResult{err: err} + } + if mnemonicB64 == "" || tokenB64 == "" { - http.Error(w, "Missing mnemonic or token", http.StatusBadRequest) - s.result <- authResult{err: errors.New("missing mnemonic or token in callback")} + redirectWithError(errors.New("missing mnemonic or token in callback")) return } mnemonicBytes, err := base64.StdEncoding.DecodeString(mnemonicB64) if err != nil { - http.Error(w, "Invalid mnemonic encoding", http.StatusBadRequest) - s.result <- authResult{err: fmt.Errorf("failed to decode mnemonic: %w", err)} + redirectWithError(fmt.Errorf("failed to decode mnemonic: %w", err)) + return + } + + // Validate that the mnemonic is a valid BIP39 mnemonic + mnemonic := string(mnemonicBytes) + if !bip39.IsMnemonicValid(mnemonic) { + redirectWithError(errors.New("mnemonic is not a valid BIP39 mnemonic")) return } tokenBytes, err := base64.StdEncoding.DecodeString(tokenB64) if err != nil { - http.Error(w, "Invalid token encoding", http.StatusBadRequest) - s.result <- authResult{err: fmt.Errorf("failed to decode token: %w", err)} + redirectWithError(fmt.Errorf("failed to decode token: %w", err)) return } @@ -111,7 +121,7 @@ func (s *authServer) handleCallback(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, driveWebURL+"/auth-link-ok", http.StatusFound) s.result <- authResult{ - mnemonic: string(mnemonicBytes), + mnemonic: mnemonic, token: string(tokenBytes), } } From f3269e952bab5f2ac6fdf67e340b516be0b3b0fd Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Mon, 8 Dec 2025 12:01:25 -0600 Subject: [PATCH 076/130] internxt: Add skip hash validation option for file downloads --- backend/internxt/internxt.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 07734e937bd98..e27ef7c1c50fc 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -50,6 +50,12 @@ func init() { Default: false, Help: "Simulates empty files by uploading a small placeholder file instead. Alters the filename when uploading to keep track of empty files, but this is not visible through rclone.", }, + { + Name: "skipHashValidation", + Default: true, + Advanced: true, + Help: "Skip hash validation when downloading files.\n\nBy default, hash validation is disabled. Set this to false to enable validation.", + }, { Name: rclone_config.ConfigEncoding, Help: rclone_config.ConfigEncodingHelp, @@ -148,6 +154,7 @@ type Options struct { Mnemonic string `config:"mnemonic"` Encoding encoder.MultiEncoder `config:"encoding"` SimulateEmptyFiles bool `config:"simulateEmptyFiles"` + SkipHashValidation bool `config:"skipHashValidation"` } // Fs represents an Internxt remote @@ -224,6 +231,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e cfg := config.NewDefaultToken(oauthToken.AccessToken) cfg.Mnemonic = opt.Mnemonic + cfg.SkipHashValidation = opt.SkipHashValidation userInfo, err := getUserInfo(ctx, &userInfoConfig{Token: cfg.Token}) if err != nil { From ca5cf24ddd9fb16aa240556a742ffe8bc628d12a Mon Sep 17 00:00:00 2001 From: jhasse-shade Date: Tue, 16 Dec 2025 12:21:22 -0500 Subject: [PATCH 077/130] shade: Fix VFS test issues --- backend/shade/shade.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/backend/shade/shade.go b/backend/shade/shade.go index 53f39029fe361..d06c66d51d8cf 100644 --- a/backend/shade/shade.go +++ b/backend/shade/shade.go @@ -311,6 +311,8 @@ func (f *Fs) Move(ctx context.Context, src fs.Object, remote string) (fs.Object, o := &Object{ fs: f, remote: remote, + mtime: srcObj.mtime, + size: srcObj.size, } fromFullPath := path.Join(src.Fs().Root(), srcObj.remote) toFullPath := path.Join(f.root, remote) @@ -367,7 +369,18 @@ func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string return fs.ErrorDirExists } - err := f.ensureParentDirectories(ctx, dstRemote) + fullPathSrc := f.buildFullPath(srcRemote) + fullPathSrcUnencoded, err := url.QueryUnescape(fullPathSrc) + if err != nil { + return err + } + + fullPathDstUnencoded, err := url.QueryUnescape(fullPath) + if err != nil { + return err + } + + err = f.ensureParentDirectories(ctx, dstRemote) if err != nil { return err } @@ -378,6 +391,15 @@ func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string } _, err = f.Move(ctx, o, dstRemote) + + if err == nil { + + f.createdDirMu.Lock() + f.createdDirs[fullPathSrcUnencoded] = false + f.createdDirs[fullPathDstUnencoded] = true + f.createdDirMu.Unlock() + } + return err } From 7ecfee4ccdd65a21c727d404de2b3d91031c6c1c Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 17 Dec 2025 10:20:59 +0000 Subject: [PATCH 078/130] Add vyv03354 to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index 879a110f19b95..939263c361c32 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1058,3 +1058,4 @@ put them back in again. --> - Tingsong Xu - Jonas Tingeborn <134889+jojje@users.noreply.github.com> - jhasse-shade +- vyv03354 From f301ea1b632814d52283d53ad693c884ddd9f95c Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Sun, 14 Dec 2025 12:41:33 +0000 Subject: [PATCH 079/130] memory: add --memory-discard flag for speed testing - fixes #9037 --- backend/memory/memory.go | 51 ++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/backend/memory/memory.go b/backend/memory/memory.go index 92a79bcdc5142..b6e2683ed547d 100644 --- a/backend/memory/memory.go +++ b/backend/memory/memory.go @@ -6,6 +6,7 @@ import ( "context" "crypto/md5" "encoding/hex" + "errors" "fmt" "io" "path" @@ -24,7 +25,8 @@ import ( var ( hashType = hash.MD5 // the object storage is persistent - buckets = newBucketsInfo() + buckets = newBucketsInfo() + errWriteOnly = errors.New("can't read when using --memory-discard") ) // Register with Fs @@ -33,12 +35,32 @@ func init() { Name: "memory", Description: "In memory object storage system.", NewFs: NewFs, - Options: []fs.Option{}, + Options: []fs.Option{{ + Name: "discard", + Default: false, + Advanced: true, + Help: `If set all writes will be discarded and reads will return an error + +If set then when files are uploaded the contents not be saved. The +files will appear to have been uploaded but will give an error on +read. Files will have their MD5 sum calculated on upload which takes +very little CPU time and allows the transfers to be checked. + +This can be useful for testing performance. + +Probably most easily used by using the connection string syntax: + + :memory,discard:bucket + +`, + }}, }) } // Options defines the configuration for this backend -type Options struct{} +type Options struct { + Discard bool `config:"discard"` +} // Fs represents a remote memory server type Fs struct { @@ -164,6 +186,7 @@ type objectData struct { hash string mimeType string data []byte + size int64 } // Object describes a memory object @@ -558,7 +581,7 @@ func (o *Object) Hash(ctx context.Context, t hash.Type) (string, error) { if t != hashType { return "", hash.ErrUnsupported } - if o.od.hash == "" { + if o.od.hash == "" && !o.fs.opt.Discard { sum := md5.Sum(o.od.data) o.od.hash = hex.EncodeToString(sum[:]) } @@ -567,7 +590,7 @@ func (o *Object) Hash(ctx context.Context, t hash.Type) (string, error) { // Size returns the size of an object in bytes func (o *Object) Size() int64 { - return int64(len(o.od.data)) + return o.od.size } // ModTime returns the modification time of the object @@ -593,6 +616,9 @@ func (o *Object) Storable() bool { // Open an object for read func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (in io.ReadCloser, err error) { + if o.fs.opt.Discard { + return nil, errWriteOnly + } var offset, limit int64 = 0, -1 for _, option := range options { switch x := option.(type) { @@ -624,13 +650,24 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (in io.Read // The new object may have been created if an error is returned func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (err error) { bucket, bucketPath := o.split() - data, err := io.ReadAll(in) + var data []byte + var size int64 + var hash string + if o.fs.opt.Discard { + h := md5.New() + size, err = io.Copy(h, in) + hash = hex.EncodeToString(h.Sum(nil)) + } else { + data, err = io.ReadAll(in) + size = int64(len(data)) + } if err != nil { return fmt.Errorf("failed to update memory object: %w", err) } o.od = &objectData{ data: data, - hash: "", + size: size, + hash: hash, modTime: src.ModTime(ctx), mimeType: fs.MimeType(ctx, src), } From 5af930dc097792a0991d3028387bf78ae4823afc Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Tue, 16 Dec 2025 15:34:05 -0600 Subject: [PATCH 080/130] internxt: Implement mnemonic obscuring and revealing in authentication flow --- backend/internxt/auth.go | 7 +++++++ backend/internxt/internxt.go | 12 ++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/backend/internxt/auth.go b/backend/internxt/auth.go index 0ec4fcdc37765..0b3f7aab27e73 100644 --- a/backend/internxt/auth.go +++ b/backend/internxt/auth.go @@ -17,6 +17,7 @@ import ( internxtconfig "github.com/internxt/rclone-adapter/config" "github.com/rclone/rclone/fs" "github.com/rclone/rclone/fs/config/configmap" + "github.com/rclone/rclone/fs/config/obscure" "github.com/rclone/rclone/lib/oauthutil" "github.com/tyler-smith/go-bip39" "golang.org/x/oauth2" @@ -280,6 +281,12 @@ func refreshJWTToken(ctx context.Context, name string, m configmap.Mapper) error return errors.New("mnemonic is missing from configuration") } + // Reveal the obscured mnemonic + mnemonic, err = obscure.Reveal(mnemonic) + if err != nil { + return fmt.Errorf("failed to reveal mnemonic: %w", err) + } + cfg := internxtconfig.NewDefaultToken(currentToken.AccessToken) resp, err := internxtauth.RefreshToken(ctx, cfg) if err != nil { diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index e27ef7c1c50fc..b8df9f1604adf 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -21,6 +21,7 @@ import ( rclone_config "github.com/rclone/rclone/fs/config" "github.com/rclone/rclone/fs/config/configmap" "github.com/rclone/rclone/fs/config/configstruct" + "github.com/rclone/rclone/fs/config/obscure" "github.com/rclone/rclone/fs/hash" "github.com/rclone/rclone/lib/dircache" "github.com/rclone/rclone/lib/encoder" @@ -116,8 +117,8 @@ func Config(ctx context.Context, name string, m configmap.Mapper, configIn fs.Co return nil, fmt.Errorf("authentication failed: %w", err) } - // Store mnemonic - m.Set("mnemonic", newMnemonic) + // Store mnemonic (obscured) + m.Set("mnemonic", obscure.MustObscure(newMnemonic)) // Store token in oauth2 format oauthToken, err := jwtToOAuth2Token(newToken) @@ -215,6 +216,13 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e return nil, errors.New("mnemonic is required - please run: rclone config reconnect " + name + ":") } + // Reveal the obscured mnemonic + var err error + opt.Mnemonic, err = obscure.Reveal(opt.Mnemonic) + if err != nil { + return nil, fmt.Errorf("failed to reveal mnemonic: %w", err) + } + oauthToken, err := oauthutil.GetToken(name, m) if err != nil { return nil, fmt.Errorf("failed to get token - please run: rclone config reconnect %s: - %w", name, err) From b0cc77cd13fa8bb17c5373deec24ef6aca0daab8 Mon Sep 17 00:00:00 2001 From: masrlinu Date: Wed, 17 Dec 2025 16:13:25 +0100 Subject: [PATCH 081/130] pcloud: add support for real-time updates in mount Co-authored-by: masrlinu <5259918+masrlinu@users.noreply.github.com> --- backend/pcloud/api/types.go | 8 +++ backend/pcloud/pcloud.go | 133 ++++++++++++++++++++++++++++++++++++ docs/content/pcloud.md | 25 +++++++ 3 files changed, 166 insertions(+) diff --git a/backend/pcloud/api/types.go b/backend/pcloud/api/types.go index 6f2d6361bc13f..d567d49afae51 100644 --- a/backend/pcloud/api/types.go +++ b/backend/pcloud/api/types.go @@ -222,3 +222,11 @@ type UserInfo struct { } `json:"steps"` } `json:"journey"` } + +// DiffResult is the response from /diff +type DiffResult struct { + Result int `json:"result"` + DiffID int64 `json:"diffid"` + Entries []map[string]any `json:"entries"` + Error string `json:"error"` +} diff --git a/backend/pcloud/pcloud.go b/backend/pcloud/pcloud.go index ff7fa1a68215b..afbc421efaff6 100644 --- a/backend/pcloud/pcloud.go +++ b/backend/pcloud/pcloud.go @@ -171,6 +171,7 @@ type Fs struct { dirCache *dircache.DirCache // Map of directory path to directory id pacer *fs.Pacer // pacer for API calls tokenRenewer *oauthutil.Renew // renew the token on expiry + lastDiffID int64 // change tracking state for diff long-polling } // Object describes a pcloud object @@ -1033,6 +1034,137 @@ func (f *Fs) Shutdown(ctx context.Context) error { return nil } +// ChangeNotify implements fs.Features.ChangeNotify +func (f *Fs) ChangeNotify(ctx context.Context, notify func(string, fs.EntryType), ch <-chan time.Duration) { + // Start long-poll loop in background + go f.changeNotifyLoop(ctx, notify, ch) +} + +// changeNotifyLoop contains the blocking long-poll logic. +func (f *Fs) changeNotifyLoop(ctx context.Context, notify func(string, fs.EntryType), ch <-chan time.Duration) { + // Standard polling interval + interval := 30 * time.Second + + // Start with diffID = 0 to get the current state + var diffID int64 + + // Helper to process changes from the diff API + handleChanges := func(entries []map[string]any) { + notifiedPaths := make(map[string]bool) + + for _, entry := range entries { + meta, ok := entry["metadata"].(map[string]any) + if !ok { + continue + } + + // Robust extraction of ParentFolderID + var pid int64 + if val, ok := meta["parentfolderid"]; ok { + switch v := val.(type) { + case float64: + pid = int64(v) + case int64: + pid = v + case int: + pid = int64(v) + } + } + + // Resolve the path using dirCache.GetInv + // pCloud uses "d" prefix for directory IDs in cache, but API returns numbers + dirID := fmt.Sprintf("d%d", pid) + parentPath, ok := f.dirCache.GetInv(dirID) + + if !ok { + // Parent not in cache, so we can ignore this change as it is outside + // of what the mount has seen or cares about. + continue + } + + name, _ := meta["name"].(string) + fullPath := path.Join(parentPath, name) + + // Determine EntryType (File or Directory) + entryType := fs.EntryObject + if isFolder, ok := meta["isfolder"].(bool); ok && isFolder { + entryType = fs.EntryDirectory + } + + // Deduplicate notifications for this batch + if !notifiedPaths[fullPath] { + fs.Debugf(f, "ChangeNotify: detected change in %q (type: %v)", fullPath, entryType) + notify(fullPath, entryType) + notifiedPaths[fullPath] = true + } + } + } + + for { + // Check context and channel + select { + case <-ctx.Done(): + return + case newInterval, ok := <-ch: + if !ok { + return + } + interval = newInterval + default: + } + + // Setup /diff Request + opts := rest.Opts{ + Method: "GET", + Path: "/diff", + Parameters: url.Values{}, + } + + if diffID != 0 { + opts.Parameters.Set("diffid", strconv.FormatInt(diffID, 10)) + opts.Parameters.Set("block", "1") + } else { + opts.Parameters.Set("last", "0") + } + + // Perform Long-Poll + // Timeout set to 90s (server usually blocks for 60s max) + reqCtx, cancel := context.WithTimeout(ctx, 90*time.Second) + var result api.DiffResult + + _, err := f.srv.CallJSON(reqCtx, &opts, nil, &result) + cancel() + + if err != nil { + if errors.Is(err, context.Canceled) { + return + } + // Ignore timeout errors as they are normal for long-polling + if !errors.Is(err, context.DeadlineExceeded) { + fs.Infof(f, "ChangeNotify: polling error: %v. Waiting %v.", err, interval) + time.Sleep(interval) + } + continue + } + + // If result is not 0, reset DiffID to resync + if result.Result != 0 { + diffID = 0 + time.Sleep(2 * time.Second) + continue + } + + if result.DiffID != 0 { + diffID = result.DiffID + f.lastDiffID = diffID + } + + if len(result.Entries) > 0 { + handleChanges(result.Entries) + } + } +} + // Hashes returns the supported hash sets. func (f *Fs) Hashes() hash.Set { // EU region supports SHA1 and SHA256 (but rclone doesn't @@ -1401,6 +1533,7 @@ var ( _ fs.ListPer = (*Fs)(nil) _ fs.Abouter = (*Fs)(nil) _ fs.Shutdowner = (*Fs)(nil) + _ fs.ChangeNotifier = (*Fs)(nil) _ fs.Object = (*Object)(nil) _ fs.IDer = (*Object)(nil) ) diff --git a/docs/content/pcloud.md b/docs/content/pcloud.md index 8f8167e34c75c..90e16b3801f64 100644 --- a/docs/content/pcloud.md +++ b/docs/content/pcloud.md @@ -173,6 +173,31 @@ So if the folder you want rclone to use your is "My Music/", then use the return id from ```rclone lsf``` command (ex. `dxxxxxxxx2`) as the `root_folder_id` variable value in the config file. +### Change notifications and mounts + +The pCloud backend supports real‑time updates for rclone mounts via change +notifications. rclone uses pCloud’s diff long‑polling API to detect changes and +will automatically refresh directory listings in the mounted filesystem when +changes occur. + +Notes and behavior: + +- Works automatically when using `rclone mount` and requires no additional + configuration. +- Notifications are directory‑scoped: when rclone detects a change, it refreshes + the affected directory so new/removed/renamed files become visible promptly. +- Updates are near real‑time. The backend uses a long‑poll with short fallback + polling intervals, so you should see changes appear quickly without manual + refreshes. + +If you want to debug or verify notifications, you can use the helper command: + +```bash +rclone test changenotify remote: +``` + +This will log incoming change notifications for the given remote. + ### Standard options From be2f5d67324464647a3a1ab4f1b7144e86aad567 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Thu, 18 Dec 2025 10:16:28 +0000 Subject: [PATCH 082/130] Add masrlinu to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index 939263c361c32..610a9abcbc645 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1059,3 +1059,4 @@ put them back in again. --> - Jonas Tingeborn <134889+jojje@users.noreply.github.com> - jhasse-shade - vyv03354 +- masrlinu <5259918+masrlinu@users.noreply.github.com> From 85960cde58cf0ad6256c4db79d7800f4e660b625 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 17 Dec 2025 16:49:04 +0000 Subject: [PATCH 083/130] serve s3: make errors in --s3-auth-key fatal - fixes #9044 Previously if auth keys were provided without a comma then rclone would only log an INFO message which could mean it went on to serve without any auth. The parsing for environment variables was changed in v1.70.0 to make them work properly with multiple inputs. This means the input is treated like a mini CSV file which works well except in this case when the input has commas. This meant `user,auth` without quotes is treated as two key pairs `user` and `quote`. The correct syntax is `"user,auth"`. This updates the documentation accordingly. --- cmd/serve/s3/serve_s3.md | 20 ++++++++++++++++++++ cmd/serve/s3/server.go | 9 +++++++-- cmd/serve/s3/utils.go | 8 ++++---- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/cmd/serve/s3/serve_s3.md b/cmd/serve/s3/serve_s3.md index 7143da9acfb4b..a1281b515b07b 100644 --- a/cmd/serve/s3/serve_s3.md +++ b/cmd/serve/s3/serve_s3.md @@ -13,6 +13,26 @@ docs](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)). `--auth-key` is not provided then `serve s3` will allow anonymous access. +Like all rclone flags `--auth-key` can be set via environment +variables, in this case `RCLONE_AUTH_KEY`. Since this flag can be +repeated, the input to `RCLONE_AUTH_KEY` is CSV encoded. Because the +`accessKey,secretKey` has a comma in, this means it needs to be in +quotes. + +```console +export RCLONE_AUTH_KEY='"user,pass"' +rclone serve s3 ... +``` + +Or to supply multiple identities: + +```console +export RCLONE_AUTH_KEY='"user1,pass1","user2,pass2"' +rclone serve s3 ... +``` + +Setting this variable without quotes will produce an error. + Please note that some clients may require HTTPS endpoints. See [the SSL docs](#tls-ssl) for more information. diff --git a/cmd/serve/s3/server.go b/cmd/serve/s3/server.go index 4ef79270186cd..0d690b6421327 100644 --- a/cmd/serve/s3/server.go +++ b/cmd/serve/s3/server.go @@ -70,6 +70,11 @@ func newServer(ctx context.Context, f fs.Fs, opt *Options, vfsOpt *vfscommon.Opt w.s3Secret = getAuthSecret(opt.AuthKey) } + authList, err := authlistResolver(opt.AuthKey) + if err != nil { + return nil, fmt.Errorf("parsing auth list failed: %q", err) + } + var newLogger logger w.faker = gofakes3.New( newBackend(w), @@ -77,7 +82,7 @@ func newServer(ctx context.Context, f fs.Fs, opt *Options, vfsOpt *vfscommon.Opt gofakes3.WithLogger(newLogger), gofakes3.WithRequestID(rand.Uint64()), gofakes3.WithoutVersioning(), - gofakes3.WithV4Auth(authlistResolver(opt.AuthKey)), + gofakes3.WithV4Auth(authList), gofakes3.WithIntegrityCheck(true), // Check Content-MD5 if supplied ) @@ -92,7 +97,7 @@ func newServer(ctx context.Context, f fs.Fs, opt *Options, vfsOpt *vfscommon.Opt w._vfs = vfs.New(f, vfsOpt) if len(opt.AuthKey) > 0 { - w.faker.AddAuthKeys(authlistResolver(opt.AuthKey)) + w.faker.AddAuthKeys(authList) } } diff --git a/cmd/serve/s3/utils.go b/cmd/serve/s3/utils.go index 5020df63af9e9..cb6a926a37595 100644 --- a/cmd/serve/s3/utils.go +++ b/cmd/serve/s3/utils.go @@ -3,6 +3,7 @@ package s3 import ( "context" "encoding/hex" + "errors" "io" "os" "path" @@ -125,15 +126,14 @@ func rmdirRecursive(p string, VFS *vfs.VFS) { } } -func authlistResolver(list []string) map[string]string { +func authlistResolver(list []string) (map[string]string, error) { authList := make(map[string]string) for _, v := range list { parts := strings.Split(v, ",") if len(parts) != 2 { - fs.Infof(nil, "Ignored: invalid auth pair %s", v) - continue + return nil, errors.New("invalid auth pair: expecting a single comma") } authList[parts[0]] = parts[1] } - return authList + return authList, nil } From fac976c865e98869d4b6a3d8286207985e7a2227 Mon Sep 17 00:00:00 2001 From: vupn0712 <126212736+vupn0712@users.noreply.github.com> Date: Sat, 20 Dec 2025 21:42:00 +0700 Subject: [PATCH 084/130] s3: fix Copy ignoring storage class Co-authored-by: sys6101 --- backend/s3/s3.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/backend/s3/s3.go b/backend/s3/s3.go index 48af2e8e705cb..246077e3b3128 100644 --- a/backend/s3/s3.go +++ b/backend/s3/s3.go @@ -2928,7 +2928,9 @@ func (f *Fs) Copy(ctx context.Context, src fs.Object, remote string) (fs.Object, req := s3.CopyObjectInput{ MetadataDirective: types.MetadataDirectiveCopy, } - + if srcObj.storageClass != nil { + req.StorageClass = types.StorageClass(*srcObj.storageClass) + } // Build upload options including headers and metadata ci := fs.GetConfig(ctx) uploadOptions := fs.MetadataAsOpenOptions(ctx) @@ -4501,7 +4503,12 @@ func (o *Object) prepareUpload(ctx context.Context, src fs.ObjectInfo, options [ ACL: types.ObjectCannedACL(o.fs.opt.ACL), Key: &bucketPath, } - + if tierObj, ok := src.(fs.GetTierer); ok { + tier := tierObj.GetTier() + if tier != "" { + ui.req.StorageClass = types.StorageClass(strings.ToUpper(tier)) + } + } // Fetch metadata if --metadata is in use meta, err := fs.GetMetadataOptions(ctx, o.fs, src, options) if err != nil { From 822c443cc9053318e28d26d1d2e0d4482e0ecab5 Mon Sep 17 00:00:00 2001 From: darkdragon-001 Date: Sun, 21 Dec 2025 12:23:59 +0100 Subject: [PATCH 085/130] docs: fix headers hierarchy in mount docs --- docs/content/commands/rclone_mount.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/commands/rclone_mount.md b/docs/content/commands/rclone_mount.md index ce5af7d95f136..9cba7200ab83d 100644 --- a/docs/content/commands/rclone_mount.md +++ b/docs/content/commands/rclone_mount.md @@ -336,7 +336,7 @@ full new copy of the file. When mounting with `--read-only`, attempts to write to files will fail *silently* as opposed to with a clear warning as in macFUSE. -# Mounting on Linux +## Mounting on Linux On newer versions of Ubuntu, you may encounter the following error when running `rclone mount`: From aacae77a9e53ec600808a53bdcee2494f0dec726 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Mon, 22 Dec 2025 07:28:14 -0600 Subject: [PATCH 086/130] internxt: Implement pacer for rate limiting and retry logic in folder and file operations --- backend/internxt/internxt.go | 63 ++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index b8df9f1604adf..7f3e15d481861 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -22,12 +22,28 @@ import ( "github.com/rclone/rclone/fs/config/configmap" "github.com/rclone/rclone/fs/config/configstruct" "github.com/rclone/rclone/fs/config/obscure" + "github.com/rclone/rclone/fs/fserrors" "github.com/rclone/rclone/fs/hash" "github.com/rclone/rclone/lib/dircache" "github.com/rclone/rclone/lib/encoder" "github.com/rclone/rclone/lib/oauthutil" + "github.com/rclone/rclone/lib/pacer" ) +const ( + minSleep = 10 * time.Millisecond + maxSleep = 2 * time.Second + decayConstant = 2 // bigger for slower decay, exponential +) + +// shouldRetry determines if an error should be retried +func shouldRetry(ctx context.Context, err error) (bool, error) { + if fserrors.ContextError(ctx, &err) { + return false, err + } + return fserrors.ShouldRetry(err), err +} + // Register with Fs func init() { fs.Register(&fs.RegInfo{ @@ -166,6 +182,7 @@ type Fs struct { dirCache *dircache.DirCache cfg *config.Config features *fs.Features + pacer *fs.Pacer tokenRenewer *oauthutil.Renew bridgeUser string userID string @@ -259,6 +276,8 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e userID: userInfo.UserID, } + f.pacer = fs.NewPacer(ctx, pacer.NewDefault(pacer.MinSleep(minSleep), pacer.MaxSleep(maxSleep), pacer.DecayConstant(decayConstant))) + f.features = (&fs.Features{ CanHaveEmptyDirectories: true, }).Fill(ctx, f) @@ -321,7 +340,6 @@ func (f *Fs) Mkdir(ctx context.Context, dir string) error { } f.dirCache.Put(dir, id) - time.Sleep(500 * time.Millisecond) return nil } @@ -340,7 +358,12 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { } // Check if directory is empty - childFolders, err := folders.ListAllFolders(ctx, f.cfg, id) + var childFolders []folders.Folder + err = f.pacer.Call(func() (bool, error) { + var err error + childFolders, err = folders.ListAllFolders(ctx, f.cfg, id) + return shouldRetry(ctx, err) + }) if err != nil { return err } @@ -348,7 +371,12 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { return fs.ErrorDirectoryNotEmpty } - childFiles, err := folders.ListAllFiles(ctx, f.cfg, id) + var childFiles []folders.File + err = f.pacer.Call(func() (bool, error) { + var err error + childFiles, err = folders.ListAllFiles(ctx, f.cfg, id) + return shouldRetry(ctx, err) + }) if err != nil { return err } @@ -357,16 +385,18 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { } // Delete the directory - err = folders.DeleteFolder(ctx, f.cfg, id) - if err != nil { - if strings.Contains(err.Error(), "404") { - return fs.ErrorDirNotFound + err = f.pacer.Call(func() (bool, error) { + err := folders.DeleteFolder(ctx, f.cfg, id) + if err != nil && strings.Contains(err.Error(), "404") { + return false, fs.ErrorDirNotFound } + return shouldRetry(ctx, err) + }) + if err != nil { return err } f.dirCache.FlushDir(dir) - time.Sleep(500 * time.Millisecond) return nil } @@ -387,16 +417,22 @@ func (f *Fs) FindLeaf(ctx context.Context, pathID, leaf string) (string, bool, e // CreateDir creates a new directory func (f *Fs) CreateDir(ctx context.Context, pathID, leaf string) (string, error) { - resp, err := folders.CreateFolder(ctx, f.cfg, folders.CreateFolderRequest{ + request := folders.CreateFolderRequest{ PlainName: f.opt.Encoding.FromStandardName(leaf), ParentFolderUUID: pathID, ModificationTime: time.Now().UTC().Format(time.RFC3339), + } + + var resp *folders.Folder + err := f.pacer.Call(func() (bool, error) { + var err error + resp, err = folders.CreateFolder(ctx, f.cfg, request) + return shouldRetry(ctx, err) }) if err != nil { return "", fmt.Errorf("can't create folder, %w", err) } - time.Sleep(500 * time.Millisecond) return resp.UUID, nil } @@ -688,7 +724,8 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op // Remove deletes a file func (o *Object) Remove(ctx context.Context) error { - err := files.DeleteFile(ctx, o.f.cfg, o.uuid) - time.Sleep(500 * time.Millisecond) - return err + return o.f.pacer.Call(func() (bool, error) { + err := files.DeleteFile(ctx, o.f.cfg, o.uuid) + return shouldRetry(ctx, err) + }) } From 537e3e886241fcd53647284117ed63c82dbff6e5 Mon Sep 17 00:00:00 2001 From: yuval-cloudinary <46710068+yuval-cloudinary@users.noreply.github.com> Date: Mon, 22 Dec 2025 23:39:53 +0200 Subject: [PATCH 087/130] docs: add cloudinary to readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 728f4a27ee10d..ed60b1fa5078d 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,9 @@ directories to and from different cloud storage providers. - Box [:page_facing_up:](https://rclone.org/box/) - Ceph [:page_facing_up:](https://rclone.org/s3/#ceph) - China Mobile Ecloud Elastic Object Storage (EOS) [:page_facing_up:](https://rclone.org/s3/#china-mobile-ecloud-eos) -- Cloudflare R2 [:page_facing_up:](https://rclone.org/s3/#cloudflare-r2) - Citrix ShareFile [:page_facing_up:](https://rclone.org/sharefile/) +- Cloudflare R2 [:page_facing_up:](https://rclone.org/s3/#cloudflare-r2) +- Cloudinary [:page_facing_up:](https://rclone.org/cloudinary/) - Cubbit DS3 [:page_facing_up:](https://rclone.org/s3/#Cubbit) - DigitalOcean Spaces [:page_facing_up:](https://rclone.org/s3/#digitalocean-spaces) - Digi Storage [:page_facing_up:](https://rclone.org/koofr/#digi-storage) From 11e69f73be90e36d4bd8c9bf02869bff2b941fdb Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Mon, 22 Dec 2025 15:40:28 -0600 Subject: [PATCH 088/130] internxt: Simplify authentication flow by removing mnemonic and token prompts; streamline re-authentication handling --- backend/internxt/internxt.go | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 7f3e15d481861..8bce63b79043d 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -52,16 +52,6 @@ func init() { NewFs: NewFs, Config: Config, Options: []fs.Option{ - { - Name: "token", - Help: "Internxt auth token (JWT).\n\nLeave blank to trigger interactive login.", - IsPassword: true, - }, - { - Name: "mnemonic", - Help: "Internxt encryption mnemonic.\n\nLeave blank to trigger interactive login.", - IsPassword: true, - }, { Name: "simulateEmptyFiles", Default: false, @@ -100,7 +90,7 @@ func Config(ctx context.Context, name string, m configmap.Mapper, configIn fs.Co oauthToken, err := oauthutil.GetToken(name, m) if err != nil { fs.Errorf(nil, "Failed to get token: %v", err) - return fs.ConfigGoto("reauth") + return fs.ConfigGoto("auth") } if time.Until(oauthToken.Expiry) < tokenExpiry2d { @@ -108,23 +98,17 @@ func Config(ctx context.Context, name string, m configmap.Mapper, configIn fs.Co err := refreshJWTToken(ctx, name, m) if err != nil { fs.Errorf(nil, "Failed to refresh token: %v", err) - return fs.ConfigConfirm("reauth", true, "config_reauth", - "Token refresh failed. Re-authenticate?") + return fs.ConfigGoto("auth") } fs.Logf(nil, "Token refreshed successfully") return nil, nil } - return fs.ConfigConfirm("reauth", false, "config_reauth", - "Already authenticated. Re-authenticate?") - } - - return fs.ConfigGoto("auth") - - case "reauth": - if configIn.Result == "false" { + // Token is valid - complete config without re-auth prompt + fs.Logf(nil, "Existing credentials are valid") return nil, nil } + return fs.ConfigGoto("auth") case "auth": From 4debf01f53409b13168dd89a074830755d34e2f7 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Sun, 21 Dec 2025 15:38:20 -0600 Subject: [PATCH 089/130] internxt: Implement pre-upload file existence check and enhance file update process with backup mechanism --- backend/internxt/internxt.go | 217 +++++++++++++++++++++++++++-------- 1 file changed, 172 insertions(+), 45 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 8bce63b79043d..d60b5de40ac8c 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -28,6 +28,7 @@ import ( "github.com/rclone/rclone/lib/encoder" "github.com/rclone/rclone/lib/oauthutil" "github.com/rclone/rclone/lib/pacer" + "github.com/rclone/rclone/lib/random" ) const ( @@ -420,6 +421,61 @@ func (f *Fs) CreateDir(ctx context.Context, pathID, leaf string) (string, error) return resp.UUID, nil } +// preUploadCheck checks if a file exists in the given directory +// Returns the file metadata if it exists, nil if not +func (f *Fs) preUploadCheck(ctx context.Context, leaf, directoryID string) (*folders.File, error) { + // Parse name and extension from the leaf + baseName := f.opt.Encoding.FromStandardName(leaf) + name := strings.TrimSuffix(baseName, filepath.Ext(baseName)) + ext := strings.TrimPrefix(filepath.Ext(baseName), ".") + + checkResult, err := files.CheckFilesExistence(ctx, f.cfg, directoryID, []files.FileExistenceCheck{ + { + PlainName: name, + Type: ext, + OriginalFile: struct{}{}, + }, + }) + + if err != nil { + // If existence check fails, assume file doesn't exist to allow upload to proceed + return nil, nil + } + + if len(checkResult.Files) > 0 && checkResult.Files[0].Exists { + existingUUID := checkResult.Files[0].UUID + if existingUUID != "" { + fileMeta, err := files.GetFileMeta(ctx, f.cfg, existingUUID) + if err == nil && fileMeta != nil { + return convertFileMetaToFile(fileMeta), nil + } + + if err != nil { + return nil, err + } + } + } + + return nil, nil +} + +// convertFileMetaToFile converts files.FileMeta to folders.File +func convertFileMetaToFile(meta *files.FileMeta) *folders.File { + // FileMeta and folders.File have compatible structures + return &folders.File{ + ID: meta.ID, + UUID: meta.UUID, + FileID: meta.FileID, + PlainName: meta.PlainName, + Type: meta.Type, + Size: meta.Size, + Bucket: meta.Bucket, + FolderUUID: meta.FolderUUID, + EncryptVersion: meta.EncryptVersion, + ModificationTime: meta.ModificationTime, + } +} + // List lists a directory func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { dirID, err := f.dirCache.FindDir(ctx, dir, false) @@ -458,19 +514,45 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { // Put uploads a file func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { + remote := src.Remote() + leaf, directoryID, err := f.dirCache.FindPath(ctx, remote, false) + if err != nil { + if err == fs.ErrorDirNotFound { + o := &Object{ + f: f, + remote: remote, + size: src.Size(), + modTime: src.ModTime(ctx), + } + return o, o.Update(ctx, in, src, options...) + } + return nil, err + } + + // Check if file already exists + existingFile, err := f.preUploadCheck(ctx, leaf, directoryID) + if err != nil { + return nil, err + } + + // Create object - if file exists, populate it with existing metadata o := &Object{ f: f, - remote: src.Remote(), + remote: remote, size: src.Size(), modTime: src.ModTime(ctx), } - err := o.Update(ctx, in, src, options...) - if err != nil { - return nil, err + if existingFile != nil { + // File exists - populate object with existing metadata + size, _ := existingFile.Size.Int64() + o.id = existingFile.FileID + o.uuid = existingFile.UUID + o.size = size + o.modTime = existingFile.ModificationTime } - return o, nil + return o, o.Update(ctx, in, src, options...) } // Remove removes an object @@ -632,77 +714,122 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadClo return buckets.DownloadFileStream(ctx, o.f.cfg, o.id, rangeValue) } -// Update updates an existing file +// Update updates an existing file or creates a new one func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error { isEmptyFile := false + remote := o.remote + + // Handle empty file simulation if src.Size() == 0 { if !o.f.opt.SimulateEmptyFiles { return fs.ErrorCantUploadEmptyFiles - } else { - // If we're faking an empty file, write some nonsense into it and give it a special suffix - isEmptyFile = true - in = bytes.NewReader(EMPTY_FILE_BYTES) - src = &Object{ - f: o.f, - remote: src.Remote() + EMPTY_FILE_EXT, - modTime: src.ModTime(ctx), - size: int64(len(EMPTY_FILE_BYTES)), - } - o.remote = o.remote + EMPTY_FILE_EXT } - } else { - if o.f.opt.SimulateEmptyFiles { - // Remove the suffix if we're updating an empty file with actual data - o.remote = strings.TrimSuffix(o.remote, EMPTY_FILE_EXT) + // Simulate empty file with placeholder data and special suffix + isEmptyFile = true + in = bytes.NewReader(EMPTY_FILE_BYTES) + src = &Object{ + f: o.f, + remote: src.Remote() + EMPTY_FILE_EXT, + modTime: src.ModTime(ctx), + size: int64(len(EMPTY_FILE_BYTES)), } + remote = remote + EMPTY_FILE_EXT + } else if o.f.opt.SimulateEmptyFiles { + // Remove suffix if updating an empty file with actual data + remote = strings.TrimSuffix(remote, EMPTY_FILE_EXT) } - // Check if object exists on the server - existsInBackend := true - if o.uuid == "" { - objectInBackend, err := o.f.NewObject(ctx, src.Remote()) - if err != nil { - existsInBackend = false - } else { - // If the object already exists, use the object from the server - if objectInBackend, ok := objectInBackend.(*Object); ok { - o = objectInBackend - } - } + // Create directory if it doesn't exist + _, dirID, err := o.f.dirCache.FindPath(ctx, remote, true) + if err != nil { + return err } - if o.uuid != "" || existsInBackend { - if err := files.DeleteFile(ctx, o.f.cfg, o.uuid); err != nil { - return fs.ErrorNotAFile + // === RENAME-BASED ROLLBACK PATTERN === + // This ensures data safety: old file is preserved until new upload succeeds + + var backupUUID string + var backupName, backupType string + oldUUID := o.uuid + + // Step 1: If file exists, rename to backup (preserves old file during upload) + if oldUUID != "" { + // Generate unique backup name + baseName := filepath.Base(remote) + name := strings.TrimSuffix(baseName, filepath.Ext(baseName)) + ext := strings.TrimPrefix(filepath.Ext(baseName), ".") + + backupSuffix := fmt.Sprintf(".rclone-backup-%s", random.String(8)) + backupName = o.f.opt.Encoding.FromStandardName(name + backupSuffix) + backupType = ext + + // Rename existing file to backup name + err = files.RenameFile(ctx, o.f.cfg, oldUUID, backupName, backupType) + if err != nil { + return fmt.Errorf("failed to rename existing file to backup: %w", err) } - } + backupUUID = oldUUID - // Create folder if it doesn't exist - _, dirID, err := o.f.dirCache.FindPath(ctx, o.remote, true) - if err != nil { - return err + fs.Debugf(o.f, "Renamed existing file %s to backup %s.%s (UUID: %s)", remote, backupName, backupType, backupUUID) } + // Step 2: Upload new file to original location meta, err := buckets.UploadFileStreamAuto(ctx, o.f.cfg, dirID, - o.f.opt.Encoding.FromStandardName(filepath.Base(o.remote)), + o.f.opt.Encoding.FromStandardName(filepath.Base(remote)), in, src.Size(), src.ModTime(ctx), ) if err != nil { - return err + // Upload failed - restore backup if it exists + if backupUUID != "" { + // Extract original name from remote + origBaseName := filepath.Base(remote) + origName := strings.TrimSuffix(origBaseName, filepath.Ext(origBaseName)) + origType := strings.TrimPrefix(filepath.Ext(origBaseName), ".") + + fs.Debugf(o.f, "Upload failed, attempting to restore backup %s.%s to %s", backupName, backupType, remote) + + restoreErr := files.RenameFile(ctx, o.f.cfg, backupUUID, + o.f.opt.Encoding.FromStandardName(origName), origType) + if restoreErr != nil { + fs.Errorf(o.f, "CRITICAL: Upload failed AND backup restore failed: %v. Backup file remains as %s.%s (UUID: %s)", + restoreErr, backupName, backupType, backupUUID) + return fmt.Errorf("upload failed: %w (backup restore also failed: %v)", err, restoreErr) + } + fs.Debugf(o.f, "Upload failed, successfully restored backup file to original name") + } + return fmt.Errorf("upload failed: %w", err) } - // Update the object with the new info + // Step 3: Upload succeeded - delete backup file + if backupUUID != "" { + fs.Debugf(o.f, "Upload succeeded, deleting backup %s.%s (UUID: %s)", backupName, backupType, backupUUID) + + if err := files.DeleteFile(ctx, o.f.cfg, backupUUID); err != nil { + // Log warning but don't fail - new file is uploaded successfully + // Backup file becomes orphaned but data integrity is maintained + if !strings.Contains(err.Error(), "404") { + fs.Logf(o.f, "Warning: uploaded new version but failed to delete backup %s.%s (UUID: %s): %v. You may need to manually delete this orphaned file.", + backupName, backupType, backupUUID, err) + } + } else { + fs.Debugf(o.f, "Successfully deleted backup file after upload") + } + } + + // Update object metadata o.uuid = meta.UUID o.size = src.Size() - // If this is a simulated empty file set fake size to 0 + o.remote = remote + // If this is a simulated empty file, set size to 0 for user-facing operations if isEmptyFile { o.size = 0 } + return nil } From 76bc413dcac69ddf09e525760c19b4c41dba645c Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Mon, 22 Dec 2025 13:37:20 -0600 Subject: [PATCH 090/130] internxt: Refactor Update method to extract original file name and type for improved rollback handling --- backend/internxt/internxt.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index d60b5de40ac8c..320e2ea9b4b59 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -719,6 +719,10 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op isEmptyFile := false remote := o.remote + origBaseName := filepath.Base(remote) + origName := strings.TrimSuffix(origBaseName, filepath.Ext(origBaseName)) + origType := strings.TrimPrefix(filepath.Ext(origBaseName), ".") + // Handle empty file simulation if src.Size() == 0 { if !o.f.opt.SimulateEmptyFiles { @@ -745,8 +749,8 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op return err } - // === RENAME-BASED ROLLBACK PATTERN === - // This ensures data safety: old file is preserved until new upload succeeds + // rename based rollback pattern + // old file is preserved until new upload succeeds var backupUUID string var backupName, backupType string @@ -786,11 +790,6 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op if err != nil { // Upload failed - restore backup if it exists if backupUUID != "" { - // Extract original name from remote - origBaseName := filepath.Base(remote) - origName := strings.TrimSuffix(origBaseName, filepath.Ext(origBaseName)) - origType := strings.TrimPrefix(filepath.Ext(origBaseName), ".") - fs.Debugf(o.f, "Upload failed, attempting to restore backup %s.%s to %s", backupName, backupType, remote) restoreErr := files.RenameFile(ctx, o.f.cfg, backupUUID, @@ -810,8 +809,6 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op fs.Debugf(o.f, "Upload succeeded, deleting backup %s.%s (UUID: %s)", backupName, backupType, backupUUID) if err := files.DeleteFile(ctx, o.f.cfg, backupUUID); err != nil { - // Log warning but don't fail - new file is uploaded successfully - // Backup file becomes orphaned but data integrity is maintained if !strings.Contains(err.Error(), "404") { fs.Logf(o.f, "Warning: uploaded new version but failed to delete backup %s.%s (UUID: %s): %v. You may need to manually delete this orphaned file.", backupName, backupType, backupUUID, err) @@ -825,7 +822,6 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op o.uuid = meta.UUID o.size = src.Size() o.remote = remote - // If this is a simulated empty file, set size to 0 for user-facing operations if isEmptyFile { o.size = 0 } From 7363401fb5de5cc41e6c7a7f7c627aa9e6ce4336 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Tue, 23 Dec 2025 10:21:27 -0600 Subject: [PATCH 091/130] internxt: Integrate pacer for retry logic in various folder and file operations to enhance error handling and improve reliability --- backend/internxt/internxt.go | 108 +++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 35 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 320e2ea9b4b59..e2cfaaa55db08 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -388,7 +388,12 @@ func (f *Fs) Rmdir(ctx context.Context, dir string) error { // FindLeaf looks for a sub‑folder named `leaf` under the Internxt folder `pathID`. // If found, it returns its UUID and true. If not found, returns "", false. func (f *Fs) FindLeaf(ctx context.Context, pathID, leaf string) (string, bool, error) { - entries, err := folders.ListAllFolders(ctx, f.cfg, pathID) + var entries []folders.Folder + err := f.pacer.Call(func() (bool, error) { + var err error + entries, err = folders.ListAllFolders(ctx, f.cfg, pathID) + return shouldRetry(ctx, err) + }) if err != nil { return "", false, err } @@ -484,7 +489,12 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { } var out fs.DirEntries - foldersList, err := folders.ListAllFolders(ctx, f.cfg, dirID) + var foldersList []folders.Folder + err = f.pacer.Call(func() (bool, error) { + var err error + foldersList, err = folders.ListAllFolders(ctx, f.cfg, dirID) + return shouldRetry(ctx, err) + }) if err != nil { return nil, err } @@ -492,7 +502,12 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { remote := filepath.Join(dir, f.opt.Encoding.ToStandardName(e.PlainName)) out = append(out, fs.NewDir(remote, e.ModificationTime)) } - filesList, err := folders.ListAllFiles(ctx, f.cfg, dirID) + var filesList []folders.File + err = f.pacer.Call(func() (bool, error) { + var err error + filesList, err = folders.ListAllFiles(ctx, f.cfg, dirID) + return shouldRetry(ctx, err) + }) if err != nil { return nil, err } @@ -571,7 +586,11 @@ func (f *Fs) Remove(ctx context.Context, remote string) error { if err != nil { return err } - if err := folders.DeleteFolder(ctx, f.cfg, dirID); err != nil { + err = f.pacer.Call(func() (bool, error) { + err := folders.DeleteFolder(ctx, f.cfg, dirID) + return shouldRetry(ctx, err) + }) + if err != nil { return err } f.dirCache.FlushDir(remote) @@ -591,7 +610,12 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { return nil, fs.ErrorObjectNotFound } - files, err := folders.ListAllFiles(ctx, f.cfg, dirID) + var files []folders.File + err = f.pacer.Call(func() (bool, error) { + var err error + files, err = folders.ListAllFiles(ctx, f.cfg, dirID) + return shouldRetry(ctx, err) + }) if err != nil { return nil, err } @@ -669,12 +693,22 @@ func (o *Object) SetModTime(ctx context.Context, t time.Time) error { // About gets quota information func (f *Fs) About(ctx context.Context) (*fs.Usage, error) { - internxtLimit, err := users.GetLimit(ctx, f.cfg) + var internxtLimit *users.LimitResponse + err := f.pacer.Call(func() (bool, error) { + var err error + internxtLimit, err = users.GetLimit(ctx, f.cfg) + return shouldRetry(ctx, err) + }) if err != nil { return nil, err } - internxtUsage, err := users.GetUsage(ctx, f.cfg) + var internxtUsage *users.UsageResponse + err = f.pacer.Call(func() (bool, error) { + var err error + internxtUsage, err = users.GetUsage(ctx, f.cfg) + return shouldRetry(ctx, err) + }) if err != nil { return nil, err } @@ -711,7 +745,16 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadClo if o.f.opt.SimulateEmptyFiles && o.size == 0 { return io.NopCloser(bytes.NewReader(nil)), nil } - return buckets.DownloadFileStream(ctx, o.f.cfg, o.id, rangeValue) + var stream io.ReadCloser + err := o.f.pacer.Call(func() (bool, error) { + var err error + stream, err = buckets.DownloadFileStream(ctx, o.f.cfg, o.id, rangeValue) + return shouldRetry(ctx, err) + }) + if err != nil { + return nil, err + } + return stream, nil } // Update updates an existing file or creates a new one @@ -768,7 +811,10 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op backupType = ext // Rename existing file to backup name - err = files.RenameFile(ctx, o.f.cfg, oldUUID, backupName, backupType) + err = o.f.pacer.Call(func() (bool, error) { + err := files.RenameFile(ctx, o.f.cfg, oldUUID, backupName, backupType) + return shouldRetry(ctx, err) + }) if err != nil { return fmt.Errorf("failed to rename existing file to backup: %w", err) } @@ -777,23 +823,30 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op fs.Debugf(o.f, "Renamed existing file %s to backup %s.%s (UUID: %s)", remote, backupName, backupType, backupUUID) } - // Step 2: Upload new file to original location - meta, err := buckets.UploadFileStreamAuto(ctx, - o.f.cfg, - dirID, - o.f.opt.Encoding.FromStandardName(filepath.Base(remote)), - in, - src.Size(), - src.ModTime(ctx), - ) + var meta *buckets.CreateMetaResponse + err = o.f.pacer.Call(func() (bool, error) { + var err error + meta, err = buckets.UploadFileStreamAuto(ctx, + o.f.cfg, + dirID, + o.f.opt.Encoding.FromStandardName(filepath.Base(remote)), + in, + src.Size(), + src.ModTime(ctx), + ) + return shouldRetry(ctx, err) + }) if err != nil { // Upload failed - restore backup if it exists if backupUUID != "" { fs.Debugf(o.f, "Upload failed, attempting to restore backup %s.%s to %s", backupName, backupType, remote) - restoreErr := files.RenameFile(ctx, o.f.cfg, backupUUID, - o.f.opt.Encoding.FromStandardName(origName), origType) + restoreErr := o.f.pacer.Call(func() (bool, error) { + err := files.RenameFile(ctx, o.f.cfg, backupUUID, + o.f.opt.Encoding.FromStandardName(origName), origType) + return shouldRetry(ctx, err) + }) if restoreErr != nil { fs.Errorf(o.f, "CRITICAL: Upload failed AND backup restore failed: %v. Backup file remains as %s.%s (UUID: %s)", restoreErr, backupName, backupType, backupUUID) @@ -801,21 +854,6 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op } fs.Debugf(o.f, "Upload failed, successfully restored backup file to original name") } - return fmt.Errorf("upload failed: %w", err) - } - - // Step 3: Upload succeeded - delete backup file - if backupUUID != "" { - fs.Debugf(o.f, "Upload succeeded, deleting backup %s.%s (UUID: %s)", backupName, backupType, backupUUID) - - if err := files.DeleteFile(ctx, o.f.cfg, backupUUID); err != nil { - if !strings.Contains(err.Error(), "404") { - fs.Logf(o.f, "Warning: uploaded new version but failed to delete backup %s.%s (UUID: %s): %v. You may need to manually delete this orphaned file.", - backupName, backupType, backupUUID, err) - } - } else { - fs.Debugf(o.f, "Successfully deleted backup file after upload") - } } // Update object metadata From 7e5cefcafe148793d45c788089e397bcd4bf6481 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Wed, 24 Dec 2025 13:01:02 -0600 Subject: [PATCH 092/130] internxt: fix pre-upload file existence check and enhance backup file deletion process in Update method --- backend/internxt/internxt.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index e2cfaaa55db08..726c1650dc190 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -447,7 +447,7 @@ func (f *Fs) preUploadCheck(ctx context.Context, leaf, directoryID string) (*fol return nil, nil } - if len(checkResult.Files) > 0 && checkResult.Files[0].Exists { + if len(checkResult.Files) > 0 && checkResult.Files[0].FileExists() { existingUUID := checkResult.Files[0].UUID if existingUUID != "" { fileMeta, err := files.GetFileMeta(ctx, f.cfg, existingUUID) @@ -460,7 +460,6 @@ func (f *Fs) preUploadCheck(ctx context.Context, leaf, directoryID string) (*fol } } } - return nil, nil } @@ -854,6 +853,7 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op } fs.Debugf(o.f, "Upload failed, successfully restored backup file to original name") } + return err } // Update object metadata @@ -864,6 +864,22 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op o.size = 0 } + // Step 3: Upload succeeded - delete the backup file + if backupUUID != "" { + fs.Debugf(o.f, "Upload succeeded, deleting backup file %s.%s (UUID: %s)", backupName, backupType, backupUUID) + err := o.f.pacer.Call(func() (bool, error) { + err := files.DeleteFile(ctx, o.f.cfg, backupUUID) + return shouldRetry(ctx, err) + }) + if err != nil { + fs.Errorf(o.f, "Failed to delete backup file %s.%s (UUID: %s): %v. This may leave an orphaned backup file.", + backupName, backupType, backupUUID, err) + // Don't fail the upload just because backup deletion failed + } else { + fs.Debugf(o.f, "Successfully deleted backup file") + } + } + return nil } From 6fe048d81c525b60f51b68a1f39e16e64e3482f2 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Fri, 26 Dec 2025 16:02:25 -0600 Subject: [PATCH 093/130] internxt: fix folder creation conflict resolution, fix pacer no retry in problematic calls --- backend/internxt/internxt.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 726c1650dc190..3c588dd2ee547 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -72,7 +72,8 @@ func init() { encoder.EncodeSlash | encoder.EncodeBackSlash | encoder.EncodeRightPeriod | - encoder.EncodeDot, + encoder.EncodeDot | + encoder.EncodeCrLf, }, }}, ) @@ -414,12 +415,20 @@ func (f *Fs) CreateDir(ctx context.Context, pathID, leaf string) (string, error) } var resp *folders.Folder - err := f.pacer.Call(func() (bool, error) { + err := f.pacer.CallNoRetry(func() (bool, error) { var err error resp, err = folders.CreateFolder(ctx, f.cfg, request) return shouldRetry(ctx, err) }) if err != nil { + // If folder already exists (409 conflict), try to find it + if strings.Contains(err.Error(), "409") || strings.Contains(err.Error(), "Conflict") { + existingID, found, findErr := f.FindLeaf(ctx, pathID, leaf) + if findErr == nil && found { + fs.Debugf(f, "Folder %q already exists in %q, using existing UUID: %s", leaf, pathID, existingID) + return existingID, nil + } + } return "", fmt.Errorf("can't create folder, %w", err) } @@ -823,7 +832,7 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op } var meta *buckets.CreateMetaResponse - err = o.f.pacer.Call(func() (bool, error) { + err = o.f.pacer.CallNoRetry(func() (bool, error) { var err error meta, err = buckets.UploadFileStreamAuto(ctx, o.f.cfg, From d67ec56f541ebb1b4e0232390fb0881e28de0559 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Mon, 29 Dec 2025 06:41:27 -0600 Subject: [PATCH 094/130] internxt: Enhance error handling and logging in token management and file operations --- backend/internxt/internxt.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 3c588dd2ee547..04b24197a23dc 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -42,6 +42,9 @@ func shouldRetry(ctx context.Context, err error) (bool, error) { if fserrors.ContextError(ctx, &err) { return false, err } + if err != nil && (strings.Contains(err.Error(), "401") || strings.Contains(err.Error(), "Unauthorized")) { + return true, err + } return fserrors.ShouldRetry(err), err } @@ -538,6 +541,11 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { // Put uploads a file func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { remote := src.Remote() + + if src.Size() == 0 && !f.opt.SimulateEmptyFiles { + return nil, fs.ErrorCantUploadEmptyFiles + } + leaf, directoryID, err := f.dirCache.FindPath(ctx, remote, false) if err != nil { if err == fs.ErrorDirNotFound { @@ -632,7 +640,11 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { if len(e.Type) > 0 { name += "." + e.Type } - if f.opt.Encoding.ToStandardName(name) == filepath.Base(remote) { + decodedName := f.opt.Encoding.ToStandardName(name) + targetName := filepath.Base(remote) + match := decodedName == targetName + + if match { return newObjectWithFile(f, remote, &e), nil } // If we are simulating empty files, check for a file with the special suffix and if found return it as if empty. From efbd2ff4ffe140bae7573ac873d0e39d1148dea9 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Mon, 29 Dec 2025 14:41:13 -0600 Subject: [PATCH 095/130] internxt: Improve error recovery in file operations --- backend/internxt/internxt.go | 99 ++++++++++++++++++++++++++++++------ 1 file changed, 83 insertions(+), 16 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 04b24197a23dc..1083348276693 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "io" + "net" "path" "path/filepath" "strings" @@ -858,27 +859,17 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op }) if err != nil { - // Upload failed - restore backup if it exists - if backupUUID != "" { - fs.Debugf(o.f, "Upload failed, attempting to restore backup %s.%s to %s", backupName, backupType, remote) - - restoreErr := o.f.pacer.Call(func() (bool, error) { - err := files.RenameFile(ctx, o.f.cfg, backupUUID, - o.f.opt.Encoding.FromStandardName(origName), origType) - return shouldRetry(ctx, err) - }) - if restoreErr != nil { - fs.Errorf(o.f, "CRITICAL: Upload failed AND backup restore failed: %v. Backup file remains as %s.%s (UUID: %s)", - restoreErr, backupName, backupType, backupUUID) - return fmt.Errorf("upload failed: %w (backup restore also failed: %v)", err, restoreErr) - } - fs.Debugf(o.f, "Upload failed, successfully restored backup file to original name") - } + meta, err = o.recoverFromTimeoutConflict(ctx, err, remote, dirID) + } + + if err != nil { + o.restoreBackupFile(ctx, backupUUID, origName, origType) return err } // Update object metadata o.uuid = meta.UUID + o.id = meta.FileID o.size = src.Size() o.remote = remote if isEmptyFile { @@ -904,6 +895,82 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op return nil } +// isTimeoutError checks if an error is a timeout using proper error type checking +func isTimeoutError(err error) bool { + if errors.Is(err, context.DeadlineExceeded) { + return true + } + var netErr net.Error + if errors.As(err, &netErr) && netErr.Timeout() { + return true + } + return false +} + +// isConflictError checks if an error indicates a file conflict (409) +func isConflictError(err error) bool { + errMsg := err.Error() + return strings.Contains(errMsg, "409") || + strings.Contains(errMsg, "Conflict") || + strings.Contains(errMsg, "already exists") +} + +// recoverFromTimeoutConflict attempts to recover from a timeout or conflict error +func (o *Object) recoverFromTimeoutConflict(ctx context.Context, uploadErr error, remote, dirID string) (*buckets.CreateMetaResponse, error) { + if !isTimeoutError(uploadErr) && !isConflictError(uploadErr) { + return nil, uploadErr + } + + baseName := filepath.Base(remote) + encodedName := o.f.opt.Encoding.FromStandardName(baseName) + + var meta *buckets.CreateMetaResponse + checkErr := o.f.pacer.Call(func() (bool, error) { + existingFile, err := o.f.preUploadCheck(ctx, encodedName, dirID) + if err != nil { + return shouldRetry(ctx, err) + } + if existingFile != nil { + name := strings.TrimSuffix(baseName, filepath.Ext(baseName)) + ext := strings.TrimPrefix(filepath.Ext(baseName), ".") + + meta = &buckets.CreateMetaResponse{ + UUID: existingFile.UUID, + FileID: existingFile.FileID, + Name: name, + PlainName: name, + Type: ext, + Size: existingFile.Size, + } + o.id = existingFile.FileID + } + return false, nil + }) + + if checkErr != nil { + return nil, uploadErr + } + + if meta != nil { + return meta, nil + } + + return nil, uploadErr +} + +// restoreBackupFile restores a backup file after upload failure +func (o *Object) restoreBackupFile(ctx context.Context, backupUUID, origName, origType string) { + if backupUUID == "" { + return + } + + o.f.pacer.Call(func() (bool, error) { + err := files.RenameFile(ctx, o.f.cfg, backupUUID, + o.f.opt.Encoding.FromStandardName(origName), origType) + return shouldRetry(ctx, err) + }) +} + // Remove deletes a file func (o *Object) Remove(ctx context.Context) error { return o.f.pacer.Call(func() (bool, error) { From 63c7583c8be18ab9ec25c2bfffccebc8ba0e48a4 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 31 Dec 2025 17:03:57 +0000 Subject: [PATCH 096/130] Add vupn0712 to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index 610a9abcbc645..b1c50d56f8e40 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1060,3 +1060,4 @@ put them back in again. --> - jhasse-shade - vyv03354 - masrlinu <5259918+masrlinu@users.noreply.github.com> +- vupn0712 <126212736+vupn0712@users.noreply.github.com> From 526e3ead08d5d0deb8f5d47b6e6de1046e9df546 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 31 Dec 2025 17:03:57 +0000 Subject: [PATCH 097/130] Add darkdragon-001 to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index b1c50d56f8e40..ef87f05b3c173 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1061,3 +1061,4 @@ put them back in again. --> - vyv03354 - masrlinu <5259918+masrlinu@users.noreply.github.com> - vupn0712 <126212736+vupn0712@users.noreply.github.com> +- darkdragon-001 From afbd535036434017871ad7a4caecad439692fdf5 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 31 Dec 2025 17:03:57 +0000 Subject: [PATCH 098/130] Add sys6101 to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index ef87f05b3c173..938f627c82872 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1062,3 +1062,4 @@ put them back in again. --> - masrlinu <5259918+masrlinu@users.noreply.github.com> - vupn0712 <126212736+vupn0712@users.noreply.github.com> - darkdragon-001 +- sys6101 From 456f36b3319de6e11f4edcea95fd351aee508ffa Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 31 Dec 2025 17:03:19 +0000 Subject: [PATCH 099/130] docs: update sponsor logos --- docs/content/sponsor.md | 2 +- docs/layouts/chrome/menu.html | 15 +-------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/docs/content/sponsor.md b/docs/content/sponsor.md index f42ccd916a50a..e57a54246d65e 100644 --- a/docs/content/sponsor.md +++ b/docs/content/sponsor.md @@ -13,7 +13,7 @@ Thank you to our sponsors: -{{< sponsor src="/img/logos/rabata/txt_1_300x114.png" width="300" height="200" title="Visit our sponsor Rabata.io" link="https://rabata.io/?utm_source=banner&utm_medium=rclone&utm_content=general">}} +{{< sponsor src="/img/logos/rabata.svg" width="300" height="200" title="Visit our sponsor Rabata.io" link="https://rabata.io/?utm_source=banner&utm_medium=rclone&utm_content=general">}} {{< sponsor src="/img/logos/idrive_e2.svg" width="300" height="200" title="Visit our sponsor IDrive e2" link="https://www.idrive.com/e2/?refer=rclone">}} {{< sponsor src="/img/logos/filescom-enterprise-grade-workflows.png" width="300" height="200" title="Start Your Free Trial Today" link="https://files.com/?utm_source=rclone&utm_medium=referral&utm_campaign=banner&utm_term=rclone">}} {{< sponsor src="/img/logos/mega-s4.svg" width="300" height="200" title="MEGA S4: New S3 compatible object storage. High scale. Low cost. Free egress." link="https://mega.io/objectstorage?utm_source=rclone&utm_medium=referral&utm_campaign=rclone-mega-s4&mct=rclonepromo">}} diff --git a/docs/layouts/chrome/menu.html b/docs/layouts/chrome/menu.html index 966fc5b623dce..322bf45b65af1 100644 --- a/docs/layouts/chrome/menu.html +++ b/docs/layouts/chrome/menu.html @@ -14,20 +14,7 @@ Platinum Sponsor
    -
    - +
    From 8137c733c91ac214323b78f4377d7434e40f4c36 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Tue, 30 Dec 2025 15:05:35 -0600 Subject: [PATCH 100/130] internxt: Refactor error handling --- backend/internxt/internxt.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 1083348276693..d95ff3b656eec 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -15,6 +15,7 @@ import ( "github.com/internxt/rclone-adapter/buckets" config "github.com/internxt/rclone-adapter/config" + sdkerrors "github.com/internxt/rclone-adapter/errors" "github.com/internxt/rclone-adapter/files" "github.com/internxt/rclone-adapter/folders" "github.com/internxt/rclone-adapter/users" @@ -43,9 +44,11 @@ func shouldRetry(ctx context.Context, err error) (bool, error) { if fserrors.ContextError(ctx, &err) { return false, err } - if err != nil && (strings.Contains(err.Error(), "401") || strings.Contains(err.Error(), "Unauthorized")) { + var httpErr *sdkerrors.HTTPError + if errors.As(err, &httpErr) && httpErr.StatusCode() == 401 { return true, err } + return fserrors.ShouldRetry(err), err } From ec3364f92ee877536977a02e08b4920b1ee90e08 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Tue, 30 Dec 2025 16:31:35 -0600 Subject: [PATCH 101/130] internxt: Update authentication flow to redirect to fail page on access error --- backend/internxt/auth.go | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/backend/internxt/auth.go b/backend/internxt/auth.go index 0b3f7aab27e73..9ab3a64d2c384 100644 --- a/backend/internxt/auth.go +++ b/backend/internxt/auth.go @@ -118,12 +118,23 @@ func (s *authServer) handleCallback(w http.ResponseWriter, r *http.Request) { return } - // Redirect to success page + cfg := internxtconfig.NewDefaultToken(string(tokenBytes)) + resp, err := internxtauth.RefreshToken(r.Context(), cfg) + if err != nil { + redirectWithError(fmt.Errorf("failed to refresh token: %w", err)) + return + } + + if resp.NewToken == "" { + redirectWithError(errors.New("refresh response missing newToken")) + return + } + http.Redirect(w, r, driveWebURL+"/auth-link-ok", http.StatusFound) s.result <- authResult{ mnemonic: mnemonic, - token: string(tokenBytes), + token: resp.NewToken, } } @@ -159,20 +170,11 @@ func doAuth(ctx context.Context) (token, mnemonic string, err error) { return "", "", result.err } - fs.Logf(nil, "SSO login successful, refreshing token to fetch user data...") - - cfg := internxtconfig.NewDefaultToken(result.token) - resp, err := internxtauth.RefreshToken(ctx, cfg) - if err != nil { - return "", "", fmt.Errorf("failed to refresh token: %w", err) - } - - if resp.NewToken == "" { - return "", "", errors.New("refresh response missing newToken") - } - fs.Logf(nil, "Authentication successful!") - return resp.NewToken, result.mnemonic, nil + return result.token, result.mnemonic, nil + + case <-ctx.Done(): + return "", "", fmt.Errorf("authentication cancelled: %w", ctx.Err()) case <-time.After(5 * time.Minute): return "", "", errors.New("authentication timeout after 5 minutes") From 7732fad47ffe095baf9072883cb457a542b117e9 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Wed, 31 Dec 2025 13:42:05 -0600 Subject: [PATCH 102/130] internxt: Remove simulation of empty files and related logic from file operations --- backend/internxt/internxt.go | 60 +++++------------------------------- 1 file changed, 7 insertions(+), 53 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index d95ff3b656eec..5bb9bfa2b97f4 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -60,11 +60,6 @@ func init() { NewFs: NewFs, Config: Config, Options: []fs.Option{ - { - Name: "simulateEmptyFiles", - Default: false, - Help: "Simulates empty files by uploading a small placeholder file instead. Alters the filename when uploading to keep track of empty files, but this is not visible through rclone.", - }, { Name: "skipHashValidation", Default: true, @@ -150,20 +145,11 @@ func Config(ctx context.Context, name string, m configmap.Mapper, configIn fs.Co return nil, fmt.Errorf("unknown state %q", configIn.State) } -const ( - EMPTY_FILE_EXT = ".__RCLONE_EMPTY__" -) - -var ( - EMPTY_FILE_BYTES = []byte{0x13, 0x09, 0x20, 0x23} -) - // Options holds configuration options for this interface type Options struct { Token string `config:"token"` Mnemonic string `config:"mnemonic"` Encoding encoder.MultiEncoder `config:"encoding"` - SimulateEmptyFiles bool `config:"simulateEmptyFiles"` SkipHashValidation bool `config:"skipHashValidation"` } @@ -532,11 +518,6 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { remote += "." + e.Type } remote = filepath.Join(dir, f.opt.Encoding.ToStandardName(remote)) - // If we found a file with the special empty file suffix, pretend that it's empty - if f.opt.SimulateEmptyFiles && strings.HasSuffix(remote, EMPTY_FILE_EXT) { - remote = strings.TrimSuffix(remote, EMPTY_FILE_EXT) - e.Size = "0" - } out = append(out, newObjectWithFile(f, remote, &e)) } return out, nil @@ -546,7 +527,7 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { remote := src.Remote() - if src.Size() == 0 && !f.opt.SimulateEmptyFiles { + if src.Size() == 0 { return nil, fs.ErrorCantUploadEmptyFiles } @@ -651,13 +632,6 @@ func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { if match { return newObjectWithFile(f, remote, &e), nil } - // If we are simulating empty files, check for a file with the special suffix and if found return it as if empty. - if f.opt.SimulateEmptyFiles { - if f.opt.Encoding.ToStandardName(name) == filepath.Base(remote+EMPTY_FILE_EXT) { - e.Size = "0" - return newObjectWithFile(f, remote, &e), nil - } - } } return nil, fs.ErrorObjectNotFound } @@ -765,10 +739,10 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadClo } } - // Return nothing if we're faking an empty file - if o.f.opt.SimulateEmptyFiles && o.size == 0 { + if o.size == 0 { return io.NopCloser(bytes.NewReader(nil)), nil } + var stream io.ReadCloser err := o.f.pacer.Call(func() (bool, error) { var err error @@ -783,33 +757,16 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadClo // Update updates an existing file or creates a new one func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error { - isEmptyFile := false + if src.Size() == 0 { + return fs.ErrorCantUploadEmptyFiles + } + remote := o.remote origBaseName := filepath.Base(remote) origName := strings.TrimSuffix(origBaseName, filepath.Ext(origBaseName)) origType := strings.TrimPrefix(filepath.Ext(origBaseName), ".") - // Handle empty file simulation - if src.Size() == 0 { - if !o.f.opt.SimulateEmptyFiles { - return fs.ErrorCantUploadEmptyFiles - } - // Simulate empty file with placeholder data and special suffix - isEmptyFile = true - in = bytes.NewReader(EMPTY_FILE_BYTES) - src = &Object{ - f: o.f, - remote: src.Remote() + EMPTY_FILE_EXT, - modTime: src.ModTime(ctx), - size: int64(len(EMPTY_FILE_BYTES)), - } - remote = remote + EMPTY_FILE_EXT - } else if o.f.opt.SimulateEmptyFiles { - // Remove suffix if updating an empty file with actual data - remote = strings.TrimSuffix(remote, EMPTY_FILE_EXT) - } - // Create directory if it doesn't exist _, dirID, err := o.f.dirCache.FindPath(ctx, remote, true) if err != nil { @@ -875,9 +832,6 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op o.id = meta.FileID o.size = src.Size() o.remote = remote - if isEmptyFile { - o.size = 0 - } // Step 3: Upload succeeded - delete the backup file if backupUUID != "" { From 64da0e7bfe36f480a3752913b9b9c5372738ce4f Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Fri, 2 Jan 2026 15:02:04 -0600 Subject: [PATCH 103/130] internxt: update rclone-adapter dependency version --- go.mod | 4 ++-- go.sum | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 4ed39d402f3df..eb24d07196669 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/hanwen/go-fuse/v2 v2.9.0 github.com/henrybear327/Proton-API-Bridge v1.0.0 github.com/henrybear327/go-proton-api v1.0.0 - github.com/internxt/rclone-adapter v0.0.0-20251128125449-40f1a8e381e7 + github.com/internxt/rclone-adapter v0.0.0-20260102144006-dbee67e2bad8 github.com/jcmturner/gokrb5/v8 v8.4.4 github.com/jlaffaye/ftp v0.2.1-0.20240918233326-1b970516f5d3 github.com/josephspurrier/goversioninfo v1.5.0 @@ -79,6 +79,7 @@ require ( github.com/spf13/pflag v1.0.10 github.com/stretchr/testify v1.11.1 github.com/t3rm1n4l/go-mega v0.0.0-20251031123324-a804aaa87491 + github.com/tyler-smith/go-bip39 v1.1.0 github.com/unknwon/goconfig v1.0.0 github.com/willscott/go-nfs v0.0.3 github.com/winfsp/cgofuse v1.6.1-0.20250813110601-7d90b0992471 @@ -242,7 +243,6 @@ require ( github.com/tinylib/msgp v1.5.0 // indirect github.com/tklauser/go-sysconf v0.3.15 // indirect github.com/tklauser/numcpus v0.10.0 // indirect - github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/ulikunitz/xz v0.5.15 // indirect github.com/willscott/go-nfs-client v0.0.0-20251022144359-801f10d98886 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect diff --git a/go.sum b/go.sum index e827c8879d353..3c8fe0a7d65f6 100644 --- a/go.sum +++ b/go.sum @@ -422,6 +422,8 @@ github.com/henrybear327/go-proton-api v1.0.0/go.mod h1:w63MZuzufKcIZ93pwRgiOtxMX github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/internxt/rclone-adapter v0.0.0-20260102144006-dbee67e2bad8 h1:GIlDB8qFdSmY6LTP23Lk847QhV5tH/Kljymayt/4WAc= +github.com/internxt/rclone-adapter v0.0.0-20260102144006-dbee67e2bad8/go.mod h1:XZ47hBE41lE1ixntK+ZuSLnS9ZGEtc6Pba0bKIo/CbU= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= From 11102548e94df77c81d2149fdfa5a92a2f679f81 Mon Sep 17 00:00:00 2001 From: vupn0712 <126212736+vupn0712@users.noreply.github.com> Date: Tue, 6 Jan 2026 21:56:49 +0700 Subject: [PATCH 104/130] s3: add provider Bizfly Cloud Simple Storage Co-authored-by: sys6101 --- README.md | 1 + backend/s3/provider/BizflyCloud.yaml | 15 ++++++++++++++ docs/content/_index.md | 1 + docs/content/s3.md | 31 ++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 backend/s3/provider/BizflyCloud.yaml diff --git a/README.md b/README.md index ed60b1fa5078d..8733afe54138e 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ directories to and from different cloud storage providers. - Alibaba Cloud (Aliyun) Object Storage System (OSS) [:page_facing_up:](https://rclone.org/s3/#alibaba-oss) - Amazon S3 [:page_facing_up:](https://rclone.org/s3/) - ArvanCloud Object Storage (AOS) [:page_facing_up:](https://rclone.org/s3/#arvan-cloud-object-storage-aos) +- Bizfly Cloud Simple Storage [:page_facing_up:](https://rclone.org/s3/#bizflycloud) - Backblaze B2 [:page_facing_up:](https://rclone.org/b2/) - Box [:page_facing_up:](https://rclone.org/box/) - Ceph [:page_facing_up:](https://rclone.org/s3/#ceph) diff --git a/backend/s3/provider/BizflyCloud.yaml b/backend/s3/provider/BizflyCloud.yaml new file mode 100644 index 0000000000000..42232d4603b31 --- /dev/null +++ b/backend/s3/provider/BizflyCloud.yaml @@ -0,0 +1,15 @@ +name: BizflyCloud +description: Bizfly Cloud Simple Storage +region: + hn: Ha Noi + hcm: Ho Chi Minh +endpoint: + hn.ss.bfcplatform.vn: Hanoi endpoint + hcm.ss.bfcplatform.vn: Ho Chi Minh endpoint +acl: {} +bucket_acl: true +quirks: + force_path_style: true + list_url_encode: false + use_multipart_etag: false + use_already_exists: false diff --git a/docs/content/_index.md b/docs/content/_index.md index 6a3832c2a2930..04b668bd44fb9 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -116,6 +116,7 @@ WebDAV or S3, that work out of the box.) {{< provider name="Akamai Netstorage" home="https://www.akamai.com/us/en/products/media-delivery/netstorage.jsp" config="/netstorage/" >}} {{< provider name="Alibaba Cloud (Aliyun) Object Storage System (OSS)" home="https://www.alibabacloud.com/product/oss/" config="/s3/#alibaba-oss" >}} {{< provider name="Amazon S3" home="https://aws.amazon.com/s3/" config="/s3/" >}} +{{< provider name="Bizfly Cloud Simple Storage" home="https://bizflycloud.vn/" config="/s3/#bizflycloud" >}} {{< provider name="Backblaze B2" home="https://www.backblaze.com/cloud-storage" config="/b2/" >}} {{< provider name="Box" home="https://www.box.com/" config="/box/" >}} {{< provider name="Ceph" home="http://ceph.com/" config="/s3/#ceph" >}} diff --git a/docs/content/s3.md b/docs/content/s3.md index ecd5473b262e6..7c98828845ced 100644 --- a/docs/content/s3.md +++ b/docs/content/s3.md @@ -18,6 +18,7 @@ The S3 backend can be used with a number of different providers: {{< provider name="China Mobile Ecloud Elastic Object Storage (EOS)" home="https://ecloud.10086.cn/home/product-introduction/eos/" config="/s3/#china-mobile-ecloud-eos" >}} {{< provider name="Cloudflare R2" home="https://blog.cloudflare.com/r2-open-beta/" config="/s3/#cloudflare-r2" >}} {{< provider name="Arvan Cloud Object Storage (AOS)" home="https://www.arvancloud.com/en/products/cloud-storage" config="/s3/#arvan-cloud" >}} +{{< provider name="Bizfly Cloud Simple Storage" home="https://bizflycloud.vn/" config="/s3/#bizflycloud" >}} {{< provider name="Cubbit DS3" home="https://cubbit.io/ds3-cloud" config="/s3/#Cubbit" >}} {{< provider name="DigitalOcean Spaces" home="https://www.digitalocean.com/products/object-storage/" config="/s3/#digitalocean-spaces" >}} {{< provider name="Dreamhost" home="https://www.dreamhost.com/cloud/storage/" config="/s3/#dreamhost" >}} @@ -4536,6 +4537,36 @@ server_side_encryption = storage_class = ``` +### BizflyCloud {#bizflycloud} + +[Bizfly Cloud Simple Storage](https://bizflycloud.vn/simple-storage) is an +S3-compatible service with regions in Hanoi (HN) and Ho Chi Minh City (HCM). + +Use the endpoint for your region: + +- HN: `hn.ss.bfcplatform.vn` +- HCM: `hcm.ss.bfcplatform.vn` + +A minimal configuration looks like this. + +```ini +[bizfly] +type = s3 +provider = BizflyCloud +env_auth = false +access_key_id = YOUR_ACCESS_KEY +secret_access_key = YOUR_SECRET_KEY +region = HN +endpoint = hn.ss.bfcplatform.vn +location_constraint = +acl = +server_side_encryption = +storage_class = +``` + +Switch `region` and `endpoint` to `HCM` and `hcm.ss.bfcplatform.vn` for Ho Chi +Minh City. + ### Ceph [Ceph](https://ceph.com/) is an open-source, unified, distributed From 8130ac87c468d7c3eaeff642b11e03194e350a8e Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Fri, 2 Jan 2026 12:32:42 +0000 Subject: [PATCH 105/130] docs: update sponsors --- docs/layouts/chrome/menu.html | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/docs/layouts/chrome/menu.html b/docs/layouts/chrome/menu.html index 322bf45b65af1..7c87de0721455 100644 --- a/docs/layouts/chrome/menu.html +++ b/docs/layouts/chrome/menu.html @@ -10,27 +10,21 @@ {{end}}
    -
    - Platinum Sponsor -
    +
    Platinum Sponso⁠r

    -
    - Gold Sponsor -
    +
    Gold Sponso⁠r

    -
    - Gold Sponsor -
    +
    Gold Sponso⁠r

    @@ -38,25 +32,19 @@ {{if .IsHome}}
    -
    - Silver Sponsor -
    +
    Silver Sponso⁠r
    -
    +
    -
    - Silver Sponsor -
    +
    Silver Sponso⁠r

    -
    - Silver Sponsor -
    +
    Silver Sponso⁠r

    From bb16015ed1a87620b86bcbffa39c610bc0d7fbe8 Mon Sep 17 00:00:00 2001 From: dougal Date: Mon, 8 Dec 2025 17:12:25 +0000 Subject: [PATCH 106/130] dircache: allow empty string as root parent id This was causing an internal error with the drime backend which has the root parent id as an empty string. This shouldn't affect anything else. --- lib/dircache/dircache.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/dircache/dircache.go b/lib/dircache/dircache.go index 7fdf9e1afd35b..6a17dc2ca2473 100644 --- a/lib/dircache/dircache.go +++ b/lib/dircache/dircache.go @@ -361,9 +361,6 @@ func (dc *DirCache) RootParentID(ctx context.Context, create bool) (ID string, e } else if dc.rootID == dc.trueRootID { return "", errors.New("is root directory") } - if dc.rootParentID == "" { - return "", errors.New("internal error: didn't find rootParentID") - } return dc.rootParentID, nil } From 27f96f6030c6353477ddc0caf334356d2baa9e96 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Mon, 8 Dec 2025 17:55:59 +0000 Subject: [PATCH 107/130] lib/rest: add opts.MultipartContentType to explicitly set Content-Type of attachements Before this the standard library set it to application/octet-stream for some reason --- backend/imagekit/client/upload.go | 2 +- backend/pcloud/pcloud.go | 2 +- backend/pikpak/pikpak.go | 2 +- backend/seafile/webapi.go | 2 +- backend/zoho/zoho.go | 2 +- fs/operations/rc_test.go | 4 +-- lib/rest/rest.go | 41 ++++++++++++++++++++++++++----- 7 files changed, 42 insertions(+), 13 deletions(-) diff --git a/backend/imagekit/client/upload.go b/backend/imagekit/client/upload.go index 7964f8c460349..630f068c47e13 100644 --- a/backend/imagekit/client/upload.go +++ b/backend/imagekit/client/upload.go @@ -72,7 +72,7 @@ func (ik *ImageKit) Upload(ctx context.Context, file io.Reader, param UploadPara response := &UploadResult{} - formReader, contentType, _, err := rest.MultipartUpload(ctx, file, formParams, "file", param.FileName) + formReader, contentType, _, err := rest.MultipartUpload(ctx, file, formParams, "file", param.FileName, "application/octet-stream") if err != nil { return nil, nil, fmt.Errorf("failed to make multipart upload: %w", err) diff --git a/backend/pcloud/pcloud.go b/backend/pcloud/pcloud.go index afbc421efaff6..4b52e391f8f6a 100644 --- a/backend/pcloud/pcloud.go +++ b/backend/pcloud/pcloud.go @@ -1459,7 +1459,7 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op // opts.Body=0), so upload it as a multipart form POST with // Content-Length set. if size == 0 { - formReader, contentType, overhead, err := rest.MultipartUpload(ctx, in, opts.Parameters, "content", leaf) + formReader, contentType, overhead, err := rest.MultipartUpload(ctx, in, opts.Parameters, "content", leaf, opts.ContentType) if err != nil { return fmt.Errorf("failed to make multipart upload for 0 length file: %w", err) } diff --git a/backend/pikpak/pikpak.go b/backend/pikpak/pikpak.go index 7cce6695e4722..142905475dee2 100644 --- a/backend/pikpak/pikpak.go +++ b/backend/pikpak/pikpak.go @@ -1384,7 +1384,7 @@ func (f *Fs) uploadByForm(ctx context.Context, in io.Reader, name string, size i for i := range iVal.NumField() { params.Set(iTyp.Field(i).Tag.Get("json"), iVal.Field(i).String()) } - formReader, contentType, overhead, err := rest.MultipartUpload(ctx, in, params, "file", name) + formReader, contentType, overhead, err := rest.MultipartUpload(ctx, in, params, "file", name, "application/octet-stream") if err != nil { return fmt.Errorf("failed to make multipart upload: %w", err) } diff --git a/backend/seafile/webapi.go b/backend/seafile/webapi.go index 967dbabf0e527..dc9da9e16dcec 100644 --- a/backend/seafile/webapi.go +++ b/backend/seafile/webapi.go @@ -688,7 +688,7 @@ func (f *Fs) upload(ctx context.Context, in io.Reader, uploadLink, filePath stri "need_idx_progress": {"true"}, "replace": {"1"}, } - formReader, contentType, _, err := rest.MultipartUpload(ctx, in, parameters, "file", f.opt.Enc.FromStandardName(filename)) + formReader, contentType, _, err := rest.MultipartUpload(ctx, in, parameters, "file", f.opt.Enc.FromStandardName(filename), "application/octet-stream") if err != nil { return nil, fmt.Errorf("failed to make multipart upload: %w", err) } diff --git a/backend/zoho/zoho.go b/backend/zoho/zoho.go index 30adb413eca44..3b40e08286df0 100644 --- a/backend/zoho/zoho.go +++ b/backend/zoho/zoho.go @@ -817,7 +817,7 @@ func (f *Fs) upload(ctx context.Context, name string, parent string, size int64, params.Set("filename", url.QueryEscape(name)) params.Set("parent_id", parent) params.Set("override-name-exist", strconv.FormatBool(true)) - formReader, contentType, overhead, err := rest.MultipartUpload(ctx, in, nil, "content", name) + formReader, contentType, overhead, err := rest.MultipartUpload(ctx, in, nil, "content", name, "application/octet-stream") if err != nil { return nil, fmt.Errorf("failed to make multipart upload: %w", err) } diff --git a/fs/operations/rc_test.go b/fs/operations/rc_test.go index 2d8d0f2afb8b5..f8b3cb6f3d23c 100644 --- a/fs/operations/rc_test.go +++ b/fs/operations/rc_test.go @@ -561,7 +561,7 @@ func TestUploadFile(t *testing.T) { assert.NoError(t, currentFile.Close()) }() - formReader, contentType, _, err := rest.MultipartUpload(ctx, currentFile, url.Values{}, "file", testFileName) + formReader, contentType, _, err := rest.MultipartUpload(ctx, currentFile, url.Values{}, "file", testFileName, "application/octet-stream") require.NoError(t, err) httpReq := httptest.NewRequest("POST", "/", formReader) @@ -587,7 +587,7 @@ func TestUploadFile(t *testing.T) { assert.NoError(t, currentFile2.Close()) }() - formReader, contentType, _, err = rest.MultipartUpload(ctx, currentFile2, url.Values{}, "file", testFileName) + formReader, contentType, _, err = rest.MultipartUpload(ctx, currentFile2, url.Values{}, "file", testFileName, "application/octet-stream") require.NoError(t, err) httpReq = httptest.NewRequest("POST", "/", formReader) diff --git a/lib/rest/rest.go b/lib/rest/rest.go index 2557b68c3dc98..3e92163a60d57 100644 --- a/lib/rest/rest.go +++ b/lib/rest/rest.go @@ -14,7 +14,9 @@ import ( "maps" "mime/multipart" "net/http" + "net/textproto" "net/url" + "strings" "sync" "github.com/rclone/rclone/fs" @@ -145,6 +147,7 @@ type Opts struct { MultipartMetadataName string // ..this is used for the name of the metadata form part if set MultipartContentName string // ..name of the parameter which is the attached file MultipartFileName string // ..name of the file for the attached file + MultipartContentType string // ..content type of the attached file Parameters url.Values // any parameters for the final URL TransferEncoding []string // transfer encoding, set to "identity" to disable chunked encoding Trailer *http.Header // set the request trailer @@ -371,6 +374,32 @@ func (api *Client) Call(ctx context.Context, opts *Opts) (resp *http.Response, e return resp, nil } +var quoteEscaper = strings.NewReplacer("\\", "\\\\", `"`, "\\\"") + +func escapeQuotes(s string) string { + return quoteEscaper.Replace(s) +} + +// multipartFileContentDisposition returns the value of a Content-Disposition header +// with the provided field name and file name. +func multipartFileContentDisposition(fieldname, filename string) string { + return fmt.Sprintf(`form-data; name="%s"; filename="%s"`, + escapeQuotes(fieldname), escapeQuotes(filename)) +} + +// CreateFormFile is a convenience wrapper around [Writer.CreatePart]. It creates +// a new form-data header with the provided field name and file name. +func CreateFormFile(w *multipart.Writer, fieldname, filename, contentType string) (io.Writer, error) { + h := make(textproto.MIMEHeader) + // FIXME when go1.24 is no longer supported, change to + // multipart.FileContentDisposition and remove definition above + h.Set("Content-Disposition", multipartFileContentDisposition(fieldname, filename)) + if contentType != "" { + h.Set("Content-Type", contentType) + } + return w.CreatePart(h) +} + // MultipartUpload creates an io.Reader which produces an encoded a // multipart form upload from the params passed in and the passed in // @@ -382,10 +411,10 @@ func (api *Client) Call(ctx context.Context, opts *Opts) (resp *http.Response, e // the int64 returned is the overhead in addition to the file contents, in case Content-Length is required // // NB This doesn't allow setting the content type of the attachment -func MultipartUpload(ctx context.Context, in io.Reader, params url.Values, contentName, fileName string) (io.ReadCloser, string, int64, error) { +func MultipartUpload(ctx context.Context, in io.Reader, params url.Values, contentName, fileName string, contentType string) (io.ReadCloser, string, int64, error) { bodyReader, bodyWriter := io.Pipe() writer := multipart.NewWriter(bodyWriter) - contentType := writer.FormDataContentType() + formContentType := writer.FormDataContentType() // Create a Multipart Writer as base for calculating the Content-Length buf := &bytes.Buffer{} @@ -404,7 +433,7 @@ func MultipartUpload(ctx context.Context, in io.Reader, params url.Values, conte } } if in != nil { - _, err = dummyMultipartWriter.CreateFormFile(contentName, fileName) + _, err = CreateFormFile(dummyMultipartWriter, contentName, fileName, contentType) if err != nil { return nil, "", 0, err } @@ -445,7 +474,7 @@ func MultipartUpload(ctx context.Context, in io.Reader, params url.Values, conte } if in != nil { - part, err := writer.CreateFormFile(contentName, fileName) + part, err := CreateFormFile(writer, contentName, fileName, contentType) if err != nil { _ = bodyWriter.CloseWithError(fmt.Errorf("failed to create form file: %w", err)) return @@ -467,7 +496,7 @@ func MultipartUpload(ctx context.Context, in io.Reader, params url.Values, conte _ = bodyWriter.Close() }() - return bodyReader, contentType, multipartLength, nil + return bodyReader, formContentType, multipartLength, nil } // CallJSON runs Call and decodes the body as a JSON object into response (if not nil) @@ -539,7 +568,7 @@ func (api *Client) callCodec(ctx context.Context, opts *Opts, request any, respo opts = opts.Copy() var overhead int64 - opts.Body, opts.ContentType, overhead, err = MultipartUpload(ctx, opts.Body, params, opts.MultipartContentName, opts.MultipartFileName) + opts.Body, opts.ContentType, overhead, err = MultipartUpload(ctx, opts.Body, params, opts.MultipartContentName, opts.MultipartFileName, opts.MultipartContentType) if err != nil { return nil, err } From 625ce1d939bfdb99b19205a3d5b30262c5db1869 Mon Sep 17 00:00:00 2001 From: dougal Date: Wed, 3 Dec 2025 16:43:04 +0000 Subject: [PATCH 108/130] Add Drime backend Co-Authored-By: Nick Craig-Wood --- README.md | 1 + backend/all/all.go | 1 + backend/drime/api/types.go | 237 +++++ backend/drime/drime.go | 1563 +++++++++++++++++++++++++++++++ backend/drime/drime_test.go | 33 + bin/make_manual.py | 1 + docs/content/_index.md | 1 + docs/content/docs.md | 1 + docs/content/drime.md | 244 +++++ docs/content/overview.md | 2 + docs/layouts/chrome/navbar.html | 1 + fstest/test_all/config.yaml | 6 + 12 files changed, 2091 insertions(+) create mode 100644 backend/drime/api/types.go create mode 100644 backend/drime/drime.go create mode 100644 backend/drime/drime_test.go create mode 100644 docs/content/drime.md diff --git a/README.md b/README.md index 8733afe54138e..2c99a640b829f 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ directories to and from different cloud storage providers. - DigitalOcean Spaces [:page_facing_up:](https://rclone.org/s3/#digitalocean-spaces) - Digi Storage [:page_facing_up:](https://rclone.org/koofr/#digi-storage) - Dreamhost [:page_facing_up:](https://rclone.org/s3/#dreamhost) +- Drime [:page_facing_up:](https://rclone.org/s3/#drime) - Dropbox [:page_facing_up:](https://rclone.org/dropbox/) - Enterprise File Fabric [:page_facing_up:](https://rclone.org/filefabric/) - Exaba [:page_facing_up:](https://rclone.org/s3/#exaba) diff --git a/backend/all/all.go b/backend/all/all.go index aed11e189ae44..7ad63c2712ce1 100644 --- a/backend/all/all.go +++ b/backend/all/all.go @@ -16,6 +16,7 @@ import ( _ "github.com/rclone/rclone/backend/compress" _ "github.com/rclone/rclone/backend/crypt" _ "github.com/rclone/rclone/backend/doi" + _ "github.com/rclone/rclone/backend/drime" _ "github.com/rclone/rclone/backend/drive" _ "github.com/rclone/rclone/backend/dropbox" _ "github.com/rclone/rclone/backend/fichier" diff --git a/backend/drime/api/types.go b/backend/drime/api/types.go new file mode 100644 index 0000000000000..0a1a8bab27176 --- /dev/null +++ b/backend/drime/api/types.go @@ -0,0 +1,237 @@ +// Package api has type definitions for drime +// +// Converted from the API docs with help from https://mholt.github.io/json-to-go/ +package api + +import ( + "encoding/json" + "fmt" + "time" +) + +// Types of things in Item +const ( + ItemTypeFolder = "folder" +) + +// User information +type User struct { + Email string `json:"email"` + ID json.Number `json:"id"` + Avatar string `json:"avatar"` + ModelType string `json:"model_type"` + OwnsEntry bool `json:"owns_entry"` + EntryPermissions []any `json:"entry_permissions"` + DisplayName string `json:"display_name"` +} + +// Permissions for a file +type Permissions struct { + FilesUpdate bool `json:"files.update"` + FilesCreate bool `json:"files.create"` + FilesDownload bool `json:"files.download"` + FilesDelete bool `json:"files.delete"` +} + +// Item describes a folder or a file as returned by /drive/file-entries +type Item struct { + ID json.Number `json:"id"` + Name string `json:"name"` + Description any `json:"description"` + FileName string `json:"file_name"` + Mime string `json:"mime"` + Color any `json:"color"` + Backup bool `json:"backup"` + Tracked int `json:"tracked"` + FileSize int64 `json:"file_size"` + UserID json.Number `json:"user_id"` + ParentID json.Number `json:"parent_id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + DeletedAt any `json:"deleted_at"` + IsDeleted int `json:"is_deleted"` + Path string `json:"path"` + DiskPrefix any `json:"disk_prefix"` + Type string `json:"type"` + Extension any `json:"extension"` + FileHash any `json:"file_hash"` + Public bool `json:"public"` + Thumbnail bool `json:"thumbnail"` + MuxStatus any `json:"mux_status"` + ThumbnailURL any `json:"thumbnail_url"` + WorkspaceID int `json:"workspace_id"` + IsEncrypted int `json:"is_encrypted"` + Iv any `json:"iv"` + VaultID any `json:"vault_id"` + OwnerID int `json:"owner_id"` + Hash string `json:"hash"` + URL string `json:"url"` + Users []User `json:"users"` + Tags []any `json:"tags"` + Permissions Permissions `json:"permissions"` +} + +// Listing response +type Listing struct { + CurrentPage int `json:"current_page"` + Data []Item `json:"data"` + From int `json:"from"` + LastPage int `json:"last_page"` + NextPage int `json:"next_page"` + PerPage int `json:"per_page"` + PrevPage int `json:"prev_page"` + To int `json:"to"` + Total int `json:"total"` +} + +// UploadResponse for a file +type UploadResponse struct { + Status string `json:"status"` + FileEntry Item `json:"fileEntry"` +} + +// CreateFolderRequest for a folder +type CreateFolderRequest struct { + Name string `json:"name"` + ParentID json.Number `json:"parentId,omitempty"` +} + +// CreateFolderResponse for a folder +type CreateFolderResponse struct { + Status string `json:"status"` + Folder Item `json:"folder"` +} + +// Error is returned from drime when things go wrong +type Error struct { + Message string `json:"message"` +} + +// Error returns a string for the error and satisfies the error interface +func (e Error) Error() string { + out := fmt.Sprintf("Error %q", e.Message) + return out +} + +// Check Error satisfies the error interface +var _ error = (*Error)(nil) + +// DeleteRequest is the input to DELETE /file-entries +type DeleteRequest struct { + EntryIDs []string `json:"entryIds"` + DeleteForever bool `json:"deleteForever"` +} + +// DeleteResponse is the input to DELETE /file-entries +type DeleteResponse struct { + Status string `json:"status"` + Message string `json:"message"` + Errors map[string]string `json:"errors"` +} + +// UpdateItemRequest describes the updates to be done to an item for PUT /file-entries/{id}/ +type UpdateItemRequest struct { + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` +} + +// UpdateItemResponse is returned by PUT /file-entries/{id}/ +type UpdateItemResponse struct { + Status string `json:"status"` + FileEntry Item `json:"fileEntry"` +} + +// MoveRequest is the input to /file-entries/move +type MoveRequest struct { + EntryIDs []string `json:"entryIds"` + DestinationID string `json:"destinationId"` +} + +// MoveResponse is returned by POST /file-entries/move +type MoveResponse struct { + Status string `json:"status"` + Entries []Item `json:"entries"` +} + +// CopyRequest is the input to /file-entries/duplicate +type CopyRequest struct { + EntryIDs []string `json:"entryIds"` + DestinationID string `json:"destinationId"` +} + +// CopyResponse is returned by POST /file-entries/duplicate +type CopyResponse struct { + Status string `json:"status"` + Entries []Item `json:"entries"` +} + +// MultiPartCreateRequest is the input of POST /s3/multipart/create +type MultiPartCreateRequest struct { + Filename string `json:"filename"` + Mime string `json:"mime"` + Size int64 `json:"size"` + Extension string `json:"extension"` + ParentID json.Number `json:"parent_id"` + RelativePath string `json:"relativePath"` +} + +// MultiPartCreateResponse is returned by POST /s3/multipart/create +type MultiPartCreateResponse struct { + UploadID string `json:"uploadId"` + Key string `json:"key"` +} + +// CompletedPart Type for completed parts when making a multipart upload. +type CompletedPart struct { + ETag string `json:"ETag"` + PartNumber int32 `json:"PartNumber"` +} + +// MultiPartGetURLsRequest is the input of POST /s3/multipart/batch-sign-part-urls +type MultiPartGetURLsRequest struct { + UploadID string `json:"uploadId"` + Key string `json:"key"` + PartNumbers []int `json:"partNumbers"` +} + +// MultiPartGetURLsResponse is the result of POST /s3/multipart/batch-sign-part-urls +type MultiPartGetURLsResponse struct { + URLs []struct { + URL string `json:"url"` + PartNumber int32 `json:"partNumber"` + } `json:"urls"` +} + +// MultiPartCompleteRequest is the input to POST /s3/multipart/complete +type MultiPartCompleteRequest struct { + UploadID string `json:"uploadId"` + Key string `json:"key"` + Parts []CompletedPart `json:"parts"` +} + +// MultiPartCompleteResponse is the result of POST /s3/multipart/complete +type MultiPartCompleteResponse struct { + Location string `json:"location"` +} + +// MultiPartEntriesRequest is the input to POST /s3/entries +type MultiPartEntriesRequest struct { + ClientMime string `json:"clientMime"` + ClientName string `json:"clientName"` + Filename string `json:"filename"` + Size int64 `json:"size"` + ClientExtension string `json:"clientExtension"` + ParentID json.Number `json:"parent_id"` + RelativePath string `json:"relativePath"` +} + +// MultiPartEntriesResponse is the result of POST /s3/entries +type MultiPartEntriesResponse struct { + FileEntry Item `json:"fileEntry"` +} + +// MultiPartAbort is the input of POST /s3/multipart/abort +type MultiPartAbort struct { + UploadID string `json:"uploadId"` + Key string `json:"key"` +} diff --git a/backend/drime/drime.go b/backend/drime/drime.go new file mode 100644 index 0000000000000..8a199ab11b5e1 --- /dev/null +++ b/backend/drime/drime.go @@ -0,0 +1,1563 @@ +// Package drime provides an interface to the Drime +// object storage system. +package drime + +/* +Return results give + + X-Ratelimit-Limit: 2000 + X-Ratelimit-Remaining: 1999 + +The rate limit headers indicate the number of allowed API requests per +minute. The limit is two thousand requests per minute, and rclone +should stay under that. +*/ + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "net/url" + "path" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/rclone/rclone/backend/drime/api" + "github.com/rclone/rclone/fs" + "github.com/rclone/rclone/fs/chunksize" + "github.com/rclone/rclone/fs/config" + "github.com/rclone/rclone/fs/config/configmap" + "github.com/rclone/rclone/fs/config/configstruct" + "github.com/rclone/rclone/fs/fserrors" + "github.com/rclone/rclone/fs/fshttp" + "github.com/rclone/rclone/fs/hash" + "github.com/rclone/rclone/lib/dircache" + "github.com/rclone/rclone/lib/encoder" + "github.com/rclone/rclone/lib/multipart" + "github.com/rclone/rclone/lib/pacer" + "github.com/rclone/rclone/lib/random" + "github.com/rclone/rclone/lib/rest" +) + +const ( + minSleep = 10 * time.Millisecond + maxSleep = 20 * time.Second + decayConstant = 1 // bigger for slower decay, exponential + baseURL = "https://app.drime.cloud/" + rootURL = baseURL + "api/v1" + maxUploadParts = 10000 // maximum allowed number of parts in a multi-part upload + minChunkSize = fs.SizeSuffix(1024 * 1024 * 5) + defaultUploadCutoff = fs.SizeSuffix(200 * 1024 * 1024) +) + +// Register with Fs +func init() { + fs.Register(&fs.RegInfo{ + Name: "drime", + Description: "Drime", + NewFs: NewFs, + Options: []fs.Option{{ + Name: "access_token", + Help: `API Access token + +You can get this from the web control panel.`, + Sensitive: true, + }, { + Name: "root_folder_id", + Help: `ID of the root folder + +Leave this blank normally, rclone will fill it in automatically. + +If you want rclone to be restricted to a particular folder you can +fill it in - see the docs for more info. +`, + Default: "", + Advanced: true, + Sensitive: true, + }, { + Name: "workspace_id", + Help: `Account ID + +Leave this blank normally unless you wish to specify a Workspace ID. +`, + Default: "", + Advanced: true, + Sensitive: true, + }, { + Name: "list_chunk", + Help: `Number of items to list in each call`, + Default: 1000, + Advanced: true, + }, { + Name: "hard_delete", + Help: "Delete files permanently rather than putting them into the trash.", + Default: false, + Advanced: true, + }, { + Name: "upload_cutoff", + Help: `Cutoff for switching to chunked upload. + +Any files larger than this will be uploaded in chunks of chunk_size. +The minimum is 0 and the maximum is 5 GiB.`, + Default: defaultUploadCutoff, + Advanced: true, + }, { + Name: "chunk_size", + Help: `Chunk size to use for uploading. + +When uploading files larger than upload_cutoff or files with unknown +size (e.g. from "rclone rcat" or uploaded with "rclone mount" or google +photos or google docs) they will be uploaded as multipart uploads +using this chunk size. + +Note that "--drime-upload-concurrency" chunks of this size are buffered +in memory per transfer. + +If you are transferring large files over high-speed links and you have +enough memory, then increasing this will speed up the transfers. + +Rclone will automatically increase the chunk size when uploading a +large file of known size to stay below the 10,000 chunks limit. + +Files of unknown size are uploaded with the configured +chunk_size. Since the default chunk size is 5 MiB and there can be at +most 10,000 chunks, this means that by default the maximum size of +a file you can stream upload is 48 GiB. If you wish to stream upload +larger files then you will need to increase chunk_size. +`, + Default: minChunkSize, + Advanced: true, + }, { + Name: "upload_concurrency", + Help: `Concurrency for multipart uploads and copies. + +This is the number of chunks of the same file that are uploaded +concurrently for multipart uploads and copies. + +If you are uploading small numbers of large files over high-speed links +and these uploads do not fully utilize your bandwidth, then increasing +this may help to speed up the transfers.`, + Default: 4, + Advanced: true, + }, { + Name: "upload_cutoff", + Help: `Cutoff for switching to chunked upload. + +Any files larger than this will be uploaded in chunks of chunk_size. +The minimum is 0 and the maximum is 5 GiB.`, + Default: defaultUploadCutoff, + Advanced: true, + }, { + Name: config.ConfigEncoding, + Help: config.ConfigEncodingHelp, + Advanced: true, + Default: (encoder.Display | // Slash Control Delete Dot + encoder.EncodeLeftSpace | + encoder.EncodeBackSlash | + encoder.EncodeRightSpace | + encoder.EncodeInvalidUtf8), + }}, + }) +} + +/* +TestDrime{sb0-v} +stringNeedsEscaping = []rune{ + '/', '\\', '\a', '\b', '\f', '\n', '\r', '\t', '\v', '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x0e', '\x0f', '\x10', '\x11', '\x12', '\x13', '\x14', + '\x15', '\x16', '\x17', '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f', '\x7f', '\xbf', '\xfe' +} +maxFileLength = 255 // for 1 byte unicode characters +maxFileLength = 127 // for 2 byte unicode characters +maxFileLength = 85 // for 3 byte unicode characters +maxFileLength = 63 // for 4 byte unicode characters +canWriteUnnormalized = true +canReadUnnormalized = true +canReadRenormalized = false +canStream = true +base32768isOK = true // make sure maxFileLength for 2 byte unicode chars is the same as for 1 byte characters +*/ + +// Options defines the configuration for this backend +type Options struct { + AccessToken string `config:"access_token"` + RootFolderID string `config:"root_folder_id"` + WorkspaceID string `config:"workspace_id"` + UploadConcurrency int `config:"upload_concurrency"` + ChunkSize fs.SizeSuffix `config:"chunk_size"` + HardDelete bool `config:"hard_delete"` + UploadCutoff fs.SizeSuffix `config:"upload_cutoff"` + ListChunk int `config:"list_chunk"` + Enc encoder.MultiEncoder `config:"encoding"` +} + +// Fs represents a remote drime +type Fs struct { + name string // name of this remote + root string // the path we are working on + opt Options // parsed options + features *fs.Features // optional features + srv *rest.Client // the connection to the server + dirCache *dircache.DirCache // Map of directory path to directory id + pacer *fs.Pacer // pacer for API calls +} + +// Object describes a drime object +// +// The full set of metadata will always be present +type Object struct { + fs *Fs // what this object is part of + remote string // The remote path + size int64 // size of the object + modTime time.Time // modification time of the object + id string // ID of the object + dirID string // ID of the object's directory + mimeType string // mime type of the object + url string // where to download this object +} + +// ------------------------------------------------------------ + +func checkUploadChunkSize(cs fs.SizeSuffix) error { + if cs < minChunkSize { + return fmt.Errorf("%s is less than %s", cs, minChunkSize) + } + return nil +} + +func (f *Fs) setUploadChunkSize(cs fs.SizeSuffix) (old fs.SizeSuffix, err error) { + err = checkUploadChunkSize(cs) + if err == nil { + old, f.opt.ChunkSize = f.opt.ChunkSize, cs + } + return +} + +func (f *Fs) setUploadCutoff(cs fs.SizeSuffix) (old fs.SizeSuffix, err error) { + old, f.opt.UploadCutoff = f.opt.UploadCutoff, cs + return +} + +// Name of the remote (as passed into NewFs) +func (f *Fs) Name() string { + return f.name +} + +// Root of the remote (as passed into NewFs) +func (f *Fs) Root() string { + return f.root +} + +// String converts this Fs to a string +func (f *Fs) String() string { + return fmt.Sprintf("drime root '%s'", f.root) +} + +// Features returns the optional features of this Fs +func (f *Fs) Features() *fs.Features { + return f.features +} + +// parsePath parses a drime 'url' +func parsePath(path string) (root string) { + root = strings.Trim(path, "/") + return +} + +// retryErrorCodes is a slice of error codes that we will retry +var retryErrorCodes = []int{ + 429, // Too Many Requests. + 500, // Internal Server Error + 502, // Bad Gateway + 503, // Service Unavailable + 504, // Gateway Timeout + 509, // Bandwidth Limit Exceeded +} + +// shouldRetry returns a boolean as to whether this resp and err +// deserve to be retried. It returns the err as a convenience +func shouldRetry(ctx context.Context, resp *http.Response, err error) (bool, error) { + if fserrors.ContextError(ctx, &err) { + return false, err + } + return fserrors.ShouldRetry(err) || fserrors.ShouldRetryHTTP(resp, retryErrorCodes), err +} + +// readMetaDataForPath reads the metadata from the path +func (f *Fs) readMetaDataForPath(ctx context.Context, path string) (info *api.Item, err error) { + leaf, directoryID, err := f.dirCache.FindPath(ctx, path, false) + if err != nil { + if err == fs.ErrorDirNotFound { + return nil, fs.ErrorObjectNotFound + } + return nil, err + } + + found, err := f.listAll(ctx, directoryID, false, true, leaf, func(item *api.Item) bool { + if item.Name == leaf { + info = item + return true + } + return false + }) + if err != nil { + return nil, err + } + if !found { + return nil, fs.ErrorObjectNotFound + } + return info, nil +} + +// getItem reads item for ID given +func (f *Fs) getItem(ctx context.Context, id string, dirID string, leaf string) (info *api.Item, err error) { + found, err := f.listAll(ctx, dirID, false, true, leaf, func(item *api.Item) bool { + if item.ID.String() == id { + info = item + return true + } + return false + }) + if !found { + return nil, fs.ErrorObjectNotFound + } + return info, err +} + +// errorHandler parses a non 2xx error response into an error +func errorHandler(resp *http.Response) error { + body, err := rest.ReadBody(resp) + if err != nil { + fs.Debugf(nil, "Couldn't read error out of body: %v", err) + body = nil + } + // Decode error response if there was one - they can be blank + var errResponse api.Error + if len(body) > 0 { + err = json.Unmarshal(body, &errResponse) + if err != nil { + fs.Debugf(nil, "Couldn't decode error response: %v", err) + } + } + if errResponse.Message == "" { + errResponse.Message = fmt.Sprintf("%s (%d): %s", resp.Status, resp.StatusCode, string(body)) + } + return errResponse +} + +// NewFs constructs an Fs from the path, container:path +func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, error) { + // Parse config into Options struct + opt := new(Options) + err := configstruct.Set(m, opt) + if err != nil { + return nil, err + } + + err = checkUploadChunkSize(opt.ChunkSize) + if err != nil { + return nil, fmt.Errorf("drime: chunk size: %w", err) + } + + root = parsePath(root) + + client := fshttp.NewClient(ctx) + + f := &Fs{ + name: name, + root: root, + opt: *opt, + srv: rest.NewClient(client).SetRoot(rootURL), + pacer: fs.NewPacer(ctx, pacer.NewDefault(pacer.MinSleep(minSleep), pacer.MaxSleep(maxSleep), pacer.DecayConstant(decayConstant))), + } + f.features = (&fs.Features{ + CanHaveEmptyDirectories: true, + ReadMimeType: true, + WriteMimeType: true, + }).Fill(ctx, f) + f.srv.SetErrorHandler(errorHandler) + f.srv.SetHeader("Authorization", "Bearer "+f.opt.AccessToken) + f.srv.SetHeader("Accept", "application/json") + + // Get rootFolderID + rootID := f.opt.RootFolderID + f.dirCache = dircache.New(root, rootID, f) + + // Find the current root + err = f.dirCache.FindRoot(ctx, false) + if err != nil { + // Assume it is a file + newRoot, remote := dircache.SplitPath(root) + tempF := *f + tempF.dirCache = dircache.New(newRoot, rootID, &tempF) + tempF.root = newRoot + // Make new Fs which is the parent + err = tempF.dirCache.FindRoot(ctx, false) + if err != nil { + // No root so return old f + return f, nil + } + _, err := tempF.newObjectWithInfo(ctx, remote, nil) + if err != nil { + if err == fs.ErrorObjectNotFound { + // File doesn't exist so return old f + return f, nil + } + return nil, err + } + f.features.Fill(ctx, &tempF) + // XXX: update the old f here instead of returning tempF, since + // `features` were already filled with functions having *f as a receiver. + // See https://github.com/rclone/rclone/issues/2182 + f.dirCache = tempF.dirCache + f.root = tempF.root + // return an error with an fs which points to the parent + return f, fs.ErrorIsFile + } + return f, nil +} + +// rootSlash returns root with a slash on if it is empty, otherwise empty string +func (f *Fs) rootSlash() string { + if f.root == "" { + return f.root + } + return f.root + "/" +} + +// Return an Object from a path +// +// If it can't be found it returns the error fs.ErrorObjectNotFound. +func (f *Fs) newObjectWithInfo(ctx context.Context, remote string, info *api.Item) (fs.Object, error) { + o := &Object{ + fs: f, + remote: remote, + } + var err error + if info != nil { + // Set info + err = o.setMetaData(info) + } else { + err = o.readMetaData(ctx) // reads info and meta, returning an error + } + if err != nil { + return nil, err + } + return o, nil +} + +// NewObject finds the Object at remote. If it can't be found +// it returns the error fs.ErrorObjectNotFound. +func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { + return f.newObjectWithInfo(ctx, remote, nil) +} + +// FindLeaf finds a directory of name leaf in the folder with ID pathID +func (f *Fs) FindLeaf(ctx context.Context, pathID, leaf string) (pathIDOut string, found bool, err error) { + // Find the leaf in pathID + found, err = f.listAll(ctx, pathID, true, false, leaf, func(item *api.Item) bool { + if item.Name == leaf { + pathIDOut = item.ID.String() + return true + } + return false + }) + return pathIDOut, found, err +} + +// createDir makes a directory with pathID as parent and name leaf and modTime +func (f *Fs) createDir(ctx context.Context, pathID, leaf string, modTime time.Time) (item *api.Item, err error) { + var resp *http.Response + var result api.CreateFolderResponse + opts := rest.Opts{ + Method: "POST", + Path: "/folders", + } + mkdir := api.CreateFolderRequest{ + Name: f.opt.Enc.FromStandardName(leaf), + ParentID: json.Number(pathID), + } + err = f.pacer.Call(func() (bool, error) { + resp, err = f.srv.CallJSON(ctx, &opts, &mkdir, &result) + return shouldRetry(ctx, resp, err) + }) + if err != nil { + return nil, fmt.Errorf("failed to create folder: %w", err) + } + return &result.Folder, nil +} + +// CreateDir makes a directory with pathID as parent and name leaf +func (f *Fs) CreateDir(ctx context.Context, pathID, leaf string) (newID string, err error) { + item, err := f.createDir(ctx, pathID, leaf, time.Now()) + if err != nil { + return "", err + } + return item.ID.String(), nil +} + +// list the objects into the function supplied +// +// If directories is set it only sends directories +// User function to process a File item from listAll +// +// Should return true to finish processing +type listAllFn func(*api.Item) bool + +// Lists the directory required calling the user function on each item found +// +// If name is set then the server will limit the returned items to those +// with that name. +// +// If the user fn ever returns true then it early exits with found = true +func (f *Fs) listAll(ctx context.Context, dirID string, directoriesOnly bool, filesOnly bool, name string, fn listAllFn) (found bool, err error) { + opts := rest.Opts{ + Method: "GET", + Path: "/drive/file-entries", + Parameters: url.Values{}, + } + if dirID != "" { + opts.Parameters.Add("parentIds", dirID) + } + if directoriesOnly { + opts.Parameters.Add("type", api.ItemTypeFolder) + } + if f.opt.WorkspaceID != "" { + opts.Parameters.Set("workspaceId", f.opt.WorkspaceID) + } + opts.Parameters.Set("perPage", strconv.Itoa(f.opt.ListChunk)) + page := 1 +OUTER: + for { + opts.Parameters.Set("page", strconv.Itoa(page)) + var result api.Listing + var resp *http.Response + err = f.pacer.Call(func() (bool, error) { + resp, err = f.srv.CallJSON(ctx, &opts, nil, &result) + return shouldRetry(ctx, resp, err) + }) + if err != nil { + return found, fmt.Errorf("couldn't list files: %w", err) + } + for _, item := range result.Data { + if item.Type == api.ItemTypeFolder { + if filesOnly { + continue + } + } else { + if directoriesOnly { + continue + } + } + item.Name = f.opt.Enc.ToStandardName(item.Name) + if fn(&item) { + found = true + break OUTER + } + } + if result.NextPage == 0 { + break + } + page = result.NextPage + } + return found, err +} + +// Convert a list item into a DirEntry +func (f *Fs) itemToDirEntry(ctx context.Context, remote string, info *api.Item) (entry fs.DirEntry, err error) { + if info.Type == api.ItemTypeFolder { + // cache the directory ID for later lookups + f.dirCache.Put(remote, info.ID.String()) + entry = fs.NewDir(remote, info.UpdatedAt). + SetSize(info.FileSize). + SetID(info.ID.String()). + SetParentID(info.ParentID.String()) + } else { + entry, err = f.newObjectWithInfo(ctx, remote, info) + if err != nil { + return nil, err + } + } + return entry, nil +} + +// List the objects and directories in dir into entries. The +// entries can be returned in any order but should be for a +// complete directory. +// +// dir should be "" to list the root, and should not have +// trailing slashes. +// +// This should return ErrDirNotFound if the directory isn't +// found. +func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err error) { + directoryID, err := f.dirCache.FindDir(ctx, dir, false) + if err != nil { + return nil, err + } + var iErr error + _, err = f.listAll(ctx, directoryID, false, false, "", func(info *api.Item) bool { + remote := path.Join(dir, info.Name) + entry, err := f.itemToDirEntry(ctx, remote, info) + if err != nil { + iErr = err + return true + } + entries = append(entries, entry) + return false + }) + if err != nil { + return nil, err + } + if iErr != nil { + return nil, iErr + } + return entries, nil +} + +// Creates from the parameters passed in a half finished Object which +// must have setMetaData called on it +// +// Returns the object, leaf, directoryID and error. +// +// Used to create new objects +func (f *Fs) createObject(ctx context.Context, remote string, modTime time.Time, size int64) (o *Object, leaf string, directoryID string, err error) { + // Create the directory for the object if it doesn't exist + leaf, directoryID, err = f.dirCache.FindPath(ctx, remote, true) + if err != nil { + return + } + // Temporary Object under construction + o = &Object{ + fs: f, + remote: remote, + } + return o, leaf, directoryID, nil +} + +// Put the object +// +// Copy the reader in to the new object which is returned. +// +// The new object may have been created if an error is returned +func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { + existingObj, err := f.NewObject(ctx, src.Remote()) + switch err { + case nil: + return existingObj, existingObj.Update(ctx, in, src, options...) + case fs.ErrorObjectNotFound: + // Not found so create it + return f.PutUnchecked(ctx, in, src, options...) + default: + return nil, err + } +} + +// PutStream uploads to the remote path with the modTime given of indeterminate size +func (f *Fs) PutStream(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { + return f.Put(ctx, in, src, options...) +} + +// PutUnchecked the object into the container +// +// This will produce a duplicate if the object already exists. +// +// Copy the reader in to the new object which is returned. +// +// The new object may have been created if an error is returned +func (f *Fs) PutUnchecked(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { + remote := src.Remote() + size := src.Size() + modTime := src.ModTime(ctx) + + o, _, _, err := f.createObject(ctx, remote, modTime, size) + if err != nil { + return nil, err + } + return o, o.Update(ctx, in, src, options...) +} + +// Mkdir creates the container if it doesn't exist +func (f *Fs) Mkdir(ctx context.Context, dir string) error { + _, err := f.dirCache.FindDir(ctx, dir, true) + return err +} + +// deleteObject removes an object by ID +func (f *Fs) deleteObject(ctx context.Context, id string) error { + opts := rest.Opts{ + Method: "POST", + Path: "/file-entries/delete", + } + request := api.DeleteRequest{ + EntryIDs: []string{id}, + DeleteForever: f.opt.HardDelete, + } + var result api.DeleteResponse + err := f.pacer.Call(func() (bool, error) { + resp, err := f.srv.CallJSON(ctx, &opts, &request, &result) + return shouldRetry(ctx, resp, err) + }) + if err != nil { + return fmt.Errorf("failed to delete item: %w", err) + } + // Check the individual result codes also + for name, errstring := range result.Errors { + return fmt.Errorf("failed to delete item %q: %s", name, errstring) + } + return nil +} + +// purgeCheck removes the root directory, if check is set then it +// refuses to do so if it has anything in +func (f *Fs) purgeCheck(ctx context.Context, dir string, check bool) error { + root := path.Join(f.root, dir) + if root == "" { + return errors.New("can't purge root directory") + } + dc := f.dirCache + rootID, err := dc.FindDir(ctx, dir, false) + if err != nil { + return err + } + + // Check to see if there is contents in the directory + if check { + found, err := f.listAll(ctx, rootID, false, false, "", func(item *api.Item) bool { + return true + }) + if err != nil { + return err + } + if found { + return fs.ErrorDirectoryNotEmpty + } + } + + // Delete the directory + err = f.deleteObject(ctx, rootID) + if err != nil { + return err + } + + f.dirCache.FlushDir(dir) + return nil +} + +// Rmdir deletes the root folder +// +// Returns an error if it isn't empty +func (f *Fs) Rmdir(ctx context.Context, dir string) error { + return f.purgeCheck(ctx, dir, true) +} + +// Precision return the precision of this Fs +func (f *Fs) Precision() time.Duration { + return fs.ModTimeNotSupported +} + +// Purge deletes all the files and the container +// +// Optional interface: Only implement this if you have a way of +// deleting all the files quicker than just running Remove() on the +// result of List() +func (f *Fs) Purge(ctx context.Context, dir string) error { + return f.purgeCheck(ctx, dir, false) +} + +// patch an attribute on an object to value +func (f *Fs) patch(ctx context.Context, id, attribute string, value string) (item *api.Item, err error) { + var resp *http.Response + var request = api.UpdateItemRequest{ + Name: value, + } + var result api.UpdateItemResponse + opts := rest.Opts{ + Method: "PUT", + Path: "/file-entries/" + id, + } + err = f.pacer.Call(func() (bool, error) { + resp, err = f.srv.CallJSON(ctx, &opts, &request, &result) + return shouldRetry(ctx, resp, err) + }) + if err != nil { + return nil, fmt.Errorf("failed to patch item %q to %v: %w", attribute, value, err) + } + return &result.FileEntry, nil +} + +// rename a file or a folder +func (f *Fs) rename(ctx context.Context, id, newLeaf string) (item *api.Item, err error) { + return f.patch(ctx, id, "name", f.opt.Enc.FromStandardName(newLeaf)) +} + +// move a file or a folder to a new directory +// func (f *Fs) move(ctx context.Context, id, newDirID string, dstLeaf string) (item *api.Item, err error) { +func (f *Fs) move(ctx context.Context, id, newDirID string) (err error) { + var resp *http.Response + var request = api.MoveRequest{ + EntryIDs: []string{id}, + DestinationID: newDirID, + } + var result api.MoveResponse + opts := rest.Opts{ + Method: "POST", + Path: "/file-entries/move", + } + err = f.pacer.Call(func() (bool, error) { + resp, err = f.srv.CallJSON(ctx, &opts, &request, &result) + return shouldRetry(ctx, resp, err) + }) + if err != nil { + return fmt.Errorf("failed to move item: %w", err) + } + + return nil +} + +// move and rename a file or folder to directoryID with leaf +func (f *Fs) moveTo(ctx context.Context, id, srcLeaf, dstLeaf, srcDirectoryID, dstDirectoryID string) (info *api.Item, err error) { + newLeaf := f.opt.Enc.FromStandardName(dstLeaf) + oldLeaf := f.opt.Enc.FromStandardName(srcLeaf) + doRenameLeaf := oldLeaf != newLeaf + doMove := srcDirectoryID != dstDirectoryID + + // Now rename the leaf to a temporary name if we are moving to + // another directory to make sure we don't overwrite something + // in the destination directory by accident + if doRenameLeaf && doMove { + tmpLeaf := newLeaf + "." + random.String(8) + info, err = f.rename(ctx, id, tmpLeaf) + if err != nil { + return nil, fmt.Errorf("Move rename leaf: %w", err) + } + } + + // Move the object to a new directory (with the existing name) + // if required + if doMove { + err = f.move(ctx, id, dstDirectoryID) + if err != nil { + return nil, err + } + } + + // Rename the leaf to its final name if required + if doRenameLeaf { + info, err = f.rename(ctx, id, newLeaf) + if err != nil { + return nil, fmt.Errorf("Move rename leaf: %w", err) + } + } + + if info == nil { + info, err = f.getItem(ctx, id, dstDirectoryID, dstLeaf) + if err != nil { + return nil, err + } + } + + return info, nil +} + +// Move src to this remote using server-side move operations. +// +// This is stored with the remote path given. +// +// It returns the destination Object and a possible error. +// +// Will only be called if src.Fs().Name() == f.Name() +// +// If it isn't possible then return fs.ErrorCantMove +func (f *Fs) Move(ctx context.Context, src fs.Object, remote string) (fs.Object, error) { + srcObj, ok := src.(*Object) + if !ok { + fs.Debugf(src, "Can't move - not same remote type") + return nil, fs.ErrorCantMove + } + + // Find existing object + srcLeaf, srcDirectoryID, err := srcObj.fs.dirCache.FindPath(ctx, srcObj.remote, false) + if err != nil { + return nil, err + } + + // Create temporary object + dstObj, dstLeaf, dstDirectoryID, err := f.createObject(ctx, remote, srcObj.modTime, srcObj.size) + if err != nil { + return nil, err + } + + // Do the move + info, err := f.moveTo(ctx, srcObj.id, srcLeaf, dstLeaf, srcDirectoryID, dstDirectoryID) + if err != nil { + return nil, err + } + + err = dstObj.setMetaData(info) + if err != nil { + return nil, err + } + return dstObj, nil +} + +// DirMove moves src, srcRemote to this remote at dstRemote +// using server-side move operations. +// +// Will only be called if src.Fs().Name() == f.Name() +// +// If it isn't possible then return fs.ErrorCantDirMove +// +// If destination exists then return fs.ErrorDirExists +func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string) error { + srcFs, ok := src.(*Fs) + if !ok { + fs.Debugf(srcFs, "Can't move directory - not same remote type") + return fs.ErrorCantDirMove + } + + srcID, srcDirectoryID, srcLeaf, dstDirectoryID, dstLeaf, err := f.dirCache.DirMove(ctx, srcFs.dirCache, srcFs.root, srcRemote, f.root, dstRemote) + if err != nil { + return err + } + + // Do the move + _, err = f.moveTo(ctx, srcID, srcLeaf, dstLeaf, srcDirectoryID, dstDirectoryID) + if err != nil { + return err + } + srcFs.dirCache.FlushDir(srcRemote) + return nil +} + +// copy a file or a folder to a new directory +func (f *Fs) copy(ctx context.Context, id, newDirID string) (item *api.Item, err error) { + var resp *http.Response + var request = api.CopyRequest{ + EntryIDs: []string{id}, + DestinationID: newDirID, + } + var result api.CopyResponse + opts := rest.Opts{ + Method: "POST", + Path: "/file-entries/duplicate", + } + err = f.pacer.Call(func() (bool, error) { + resp, err = f.srv.CallJSON(ctx, &opts, &request, &result) + return shouldRetry(ctx, resp, err) + }) + if err != nil { + return nil, fmt.Errorf("failed to copy item: %w", err) + } + itemResult := result.Entries[0] + return &itemResult, nil +} + +// copy and rename a file or folder to directoryID with leaf +func (f *Fs) copyTo(ctx context.Context, srcID, srcLeaf, dstLeaf, dstDirectoryID string) (info *api.Item, err error) { + // Can have duplicates so don't have to be careful here + + // Copy to dstDirectoryID first + info, err = f.copy(ctx, srcID, dstDirectoryID) + if err != nil { + return nil, err + } + + // Rename if required + if srcLeaf != dstLeaf { + info, err = f.rename(ctx, info.ID.String(), dstLeaf) + if err != nil { + return nil, err + } + } + return info, nil +} + +// Copy src to this remote using server-side copy operations. +// +// This is stored with the remote path given. +// +// It returns the destination Object and a possible error. +// +// Will only be called if src.Fs().Name() == f.Name() +// +// If it isn't possible then return fs.ErrorCantCopy +func (f *Fs) Copy(ctx context.Context, src fs.Object, remote string) (dst fs.Object, err error) { + srcObj, ok := src.(*Object) + if !ok { + fs.Debugf(src, "Can't copy - not same remote type") + return nil, fs.ErrorCantCopy + } + srcLeaf := path.Base(srcObj.remote) + + srcPath := srcObj.fs.rootSlash() + srcObj.remote + dstPath := f.rootSlash() + remote + if srcPath == dstPath { + return nil, fmt.Errorf("can't copy %q -> %q as are same name", srcPath, dstPath) + } + + // Find existing object + existingObj, err := f.NewObject(ctx, remote) + if err == nil { + defer func() { + // Don't remove existing object if returning an error + if err != nil { + return + } + fs.Debugf(existingObj, "Server side copy: removing existing object after successful copy") + err = existingObj.Remove(ctx) + }() + } + + // Create temporary object + dstObj, dstLeaf, dstDirectoryID, err := f.createObject(ctx, remote, srcObj.modTime, srcObj.size) + if err != nil { + return nil, err + } + + // Copy the object + info, err := f.copyTo(ctx, srcObj.id, srcLeaf, dstLeaf, dstDirectoryID) + if err != nil { + return nil, err + } + err = dstObj.setMetaData(info) + if err != nil { + return nil, err + } + + return dstObj, nil +} + +// DirCacheFlush resets the directory cache - used in testing as an +// optional interface +func (f *Fs) DirCacheFlush() { + f.dirCache.ResetRoot() +} + +// Hashes returns the supported hash sets. +func (f *Fs) Hashes() hash.Set { + return hash.Set(hash.None) +} + +var warnStreamUpload sync.Once + +// Status of open chunked upload +type drimeChunkWriter struct { + uploadID string + key string + chunkSize int64 + size int64 + f *Fs + o *Object + written atomic.Int64 + fileEntry api.Item + + uploadName string + leaf string + mime string + extension string + parentID json.Number + relativePath string + + completedPartsMu sync.Mutex + completedParts []api.CompletedPart +} + +// OpenChunkWriter returns the chunk size and a ChunkWriter +// +// Pass in the remote and the src object +// You can also use options to hint at the desired chunk size +func (f *Fs) OpenChunkWriter(ctx context.Context, remote string, src fs.ObjectInfo, options ...fs.OpenOption) (info fs.ChunkWriterInfo, writer fs.ChunkWriter, err error) { + // Create the directory for the object if it doesn't exist + leaf, directoryID, err := f.dirCache.FindPath(ctx, remote, true) + if err != nil { + return info, nil, err + } + + // Temporary Object under construction + o := &Object{ + fs: f, + remote: remote, + } + + size := src.Size() + fs.FixRangeOption(options, size) + + // calculate size of parts + chunkSize := f.opt.ChunkSize + + // size can be -1 here meaning we don't know the size of the incoming file. We use ChunkSize + // buffers here (default 5 MB). With a maximum number of parts (10,000) this will be a file of + // 48 GB. + if size == -1 { + warnStreamUpload.Do(func() { + fs.Logf(f, "Streaming uploads using chunk size %v will have maximum file size of %v", + chunkSize, fs.SizeSuffix(int64(chunkSize)*int64(maxUploadParts))) + }) + } else { + chunkSize = chunksize.Calculator(src, size, maxUploadParts, chunkSize) + } + + createSize := max(0, size) + + // Initiate multipart upload + req := api.MultiPartCreateRequest{ + Filename: leaf, + Mime: fs.MimeType(ctx, src), + Size: createSize, + Extension: strings.TrimPrefix(path.Ext(leaf), `.`), + ParentID: json.Number(directoryID), + RelativePath: f.opt.Enc.FromStandardPath(path.Join(f.root, remote)), + } + + var resp api.MultiPartCreateResponse + + opts := rest.Opts{ + Method: "POST", + Path: "/s3/multipart/create", + Options: options, + } + + err = o.fs.pacer.Call(func() (bool, error) { + res, err := o.fs.srv.CallJSON(ctx, &opts, req, &resp) + return shouldRetry(ctx, res, err) + }) + + if err != nil { + return info, nil, fmt.Errorf("failed to initiate multipart upload: %w", err) + } + + mime := fs.MimeType(ctx, src) + ext := strings.TrimPrefix(path.Ext(leaf), ".") + // must have file extension for multipart upload + if ext == "" { + ext = "bin" + } + rel := f.opt.Enc.FromStandardPath(path.Join(f.root, remote)) + + chunkWriter := &drimeChunkWriter{ + uploadID: resp.UploadID, + key: resp.Key, + chunkSize: int64(chunkSize), + size: size, + f: f, + o: o, + uploadName: path.Base(resp.Key), + leaf: leaf, + mime: mime, + extension: ext, + parentID: json.Number(directoryID), + relativePath: rel, + } + info = fs.ChunkWriterInfo{ + ChunkSize: int64(chunkSize), + Concurrency: f.opt.UploadConcurrency, + LeavePartsOnError: false, + } + return info, chunkWriter, err +} + +// WriteChunk will write chunk number with reader bytes, where chunk number >= 0 +func (s *drimeChunkWriter) WriteChunk(ctx context.Context, chunkNumber int, reader io.ReadSeeker) (bytesWritten int64, err error) { + // chunk numbers between 1 and 100000 + chunkNumber++ + + // find size of chunk + chunkSize, err := reader.Seek(0, io.SeekEnd) + if err != nil { + return 0, fmt.Errorf("failed to seek chunk: %w", err) + } + + if chunkSize == 0 && chunkNumber != 1 { + return 0, nil + } + + partOpts := rest.Opts{ + Method: "POST", + Path: "/s3/multipart/batch-sign-part-urls", + } + + req := api.MultiPartGetURLsRequest{ + UploadID: s.uploadID, + Key: s.key, + PartNumbers: []int{ + chunkNumber, + }, + } + + var resp api.MultiPartGetURLsResponse + + err = s.f.pacer.Call(func() (bool, error) { + res, err := s.f.srv.CallJSON(ctx, &partOpts, req, &resp) + return shouldRetry(ctx, res, err) + }) + + if err != nil { + return 0, fmt.Errorf("failed to get part URL: %w", err) + } + + if len(resp.URLs) != 1 { + return 0, fmt.Errorf("expecting 1 URL but got %d", len(resp.URLs)) + } + partURL := resp.URLs[0].URL + + opts := rest.Opts{ + Method: "PUT", + RootURL: partURL, + Body: reader, + ContentType: "application/octet-stream", + ContentLength: &chunkSize, + NoResponse: true, + ExtraHeaders: map[string]string{ + "Authorization": "", // clear the default auth + }, + } + + var uploadRes *http.Response + + err = s.f.pacer.Call(func() (bool, error) { + _, err = reader.Seek(0, io.SeekStart) + if err != nil { + return false, fmt.Errorf("failed to seek chunk: %w", err) + } + uploadRes, err = s.f.srv.Call(ctx, &opts) + return shouldRetry(ctx, uploadRes, err) + }) + + if err != nil { + return 0, fmt.Errorf("failed to upload part %d: %w", chunkNumber, err) + } + + // Get ETag from response + etag := uploadRes.Header.Get("ETag") + fs.CheckClose(uploadRes.Body, &err) + + s.completedPartsMu.Lock() + defer s.completedPartsMu.Unlock() + s.completedParts = append(s.completedParts, api.CompletedPart{ + PartNumber: int32(chunkNumber), + ETag: etag, + }) + + // Count size written for unknown file sizes + s.written.Add(chunkSize) + + return chunkSize, nil +} + +// Close complete chunked writer finalising the file. +func (s *drimeChunkWriter) Close(ctx context.Context) error { + s.completedPartsMu.Lock() + defer s.completedPartsMu.Unlock() + + // Complete multipart upload + sort.Slice(s.completedParts, func(i, j int) bool { + return s.completedParts[i].PartNumber < s.completedParts[j].PartNumber + }) + + completeBody := api.MultiPartCompleteRequest{ + UploadID: s.uploadID, + Key: s.key, + Parts: s.completedParts, + } + + completeOpts := rest.Opts{ + Method: "POST", + Path: "/s3/multipart/complete", + } + + var response api.MultiPartCompleteResponse + + err := s.f.pacer.Call(func() (bool, error) { + res, err := s.f.srv.CallJSON(ctx, &completeOpts, completeBody, &response) + return shouldRetry(ctx, res, err) + }) + + if err != nil { + return fmt.Errorf("failed to complete multipart upload: %w", err) + } + + finalSize := s.size + if finalSize < 0 { + finalSize = s.written.Load() + } + + // s3/entries request to create drime object from multipart upload + req := api.MultiPartEntriesRequest{ + ClientMime: s.mime, + ClientName: s.leaf, + Filename: s.uploadName, + Size: finalSize, + ClientExtension: s.extension, + ParentID: s.parentID, + RelativePath: s.relativePath, + } + + entriesOpts := rest.Opts{ + Method: "POST", + Path: "/s3/entries", + } + + var res api.MultiPartEntriesResponse + err = s.f.pacer.Call(func() (bool, error) { + res, err := s.f.srv.CallJSON(ctx, &entriesOpts, req, &res) + return shouldRetry(ctx, res, err) + }) + if err != nil { + return fmt.Errorf("failed to create entry after multipart upload: %w", err) + } + s.fileEntry = res.FileEntry + + return nil +} + +// Abort chunk write +// +// You can and should call Abort without calling Close. +func (s *drimeChunkWriter) Abort(ctx context.Context) error { + opts := rest.Opts{ + Method: "POST", + Path: "/s3/multipart/abort", + NoResponse: true, + } + + req := api.MultiPartAbort{ + UploadID: s.uploadID, + Key: s.key, + } + + err := s.f.pacer.Call(func() (bool, error) { + res, err := s.f.srv.CallJSON(ctx, &opts, req, nil) + return shouldRetry(ctx, res, err) + }) + + if err != nil { + return fmt.Errorf("failed to abort multipart upload: %w", err) + } + + return nil +} + +// ------------------------------------------------------------ + +// Fs returns the parent Fs +func (o *Object) Fs() fs.Info { + return o.fs +} + +// String returns a string version +func (o *Object) String() string { + if o == nil { + return "" + } + return o.remote +} + +// Remote returns the remote path +func (o *Object) Remote() string { + return o.remote +} + +// Hash returns the hash of an object returning a lowercase hex string +func (o *Object) Hash(ctx context.Context, t hash.Type) (string, error) { + return "", hash.ErrUnsupported +} + +// Size returns the size of an object in bytes +func (o *Object) Size() int64 { + return o.size +} + +// setMetaDataAny sets the metadata from info but doesn't check the type +func (o *Object) setMetaDataAny(info *api.Item) { + o.size = info.FileSize + o.modTime = info.UpdatedAt + o.id = info.ID.String() + o.dirID = info.ParentID.String() + o.mimeType = info.Mime + o.url = info.URL +} + +// setMetaData sets the metadata from info +func (o *Object) setMetaData(info *api.Item) (err error) { + if info.Type == api.ItemTypeFolder { + return fs.ErrorIsDir + } + if info.ID == "" { + return fmt.Errorf("ID not found in response") + } + o.setMetaDataAny(info) + return nil +} + +// readMetaData gets the metadata unconditionally as we expect Object +// to always have the full set of metadata +func (o *Object) readMetaData(ctx context.Context) (err error) { + var info *api.Item + info, err = o.fs.readMetaDataForPath(ctx, o.remote) + if err != nil { + return err + } + return o.setMetaData(info) +} + +// ModTime returns the modification time of the object +// +// It attempts to read the objects mtime and if that isn't present the +// LastModified returned in the http headers +func (o *Object) ModTime(ctx context.Context) time.Time { + return o.modTime +} + +// SetModTime sets the modification time of the local fs object +func (o *Object) SetModTime(ctx context.Context, modTime time.Time) error { + return fs.ErrorCantSetModTime +} + +// Storable returns a boolean showing whether this object storable +func (o *Object) Storable() bool { + return true +} + +// Open an object for read +func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (in io.ReadCloser, err error) { + if o.id == "" { + return nil, errors.New("can't download - no id") + } + if o.url == "" { + // On upload an Object is returned with no url, so fetch it here if needed + err = o.readMetaData(ctx) + if err != nil { + return nil, fmt.Errorf("read metadata: %w", err) + } + } + fs.FixRangeOption(options, o.size) + var resp *http.Response + opts := rest.Opts{ + Method: "GET", + RootURL: baseURL + o.url, + Options: options, + } + + err = o.fs.pacer.Call(func() (bool, error) { + resp, err = o.fs.srv.Call(ctx, &opts) + return shouldRetry(ctx, resp, err) + }) + if err != nil { + return nil, err + } + return resp.Body, err +} + +// Update the object with the contents of the io.Reader, modTime and size +// +// If existing is set then it updates the object rather than creating a new one. +// +// The new object may have been created if an error is returned. +func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (err error) { + remote := o.Remote() + size := src.Size() + + // Create the directory for the object if it doesn't exist + leaf, directoryID, err := o.fs.dirCache.FindPath(ctx, remote, true) + if err != nil { + return err + } + + // If the file exists, delete it after a successful upload + if o.id != "" { + id := o.id + o.id = "" + defer func() { + if err != nil { + return + } + fs.Debugf(o, "Removing old object on successful upload") + deleteErr := o.fs.deleteObject(ctx, id) + if deleteErr != nil { + err = fmt.Errorf("failed to delete existing object: %w", deleteErr) + } + }() + } + + if size < 0 || size > int64(o.fs.opt.UploadCutoff) { + chunkWriter, err := multipart.UploadMultipart(ctx, src, in, multipart.UploadMultipartOptions{ + Open: o.fs, + OpenOptions: options, + }) + if err != nil { + return err + } + s := chunkWriter.(*drimeChunkWriter) + + return o.setMetaData(&s.fileEntry) + } + + // Do the upload + var resp *http.Response + var result api.UploadResponse + var encodedLeaf = o.fs.opt.Enc.FromStandardName(leaf) + opts := rest.Opts{ + Method: "POST", + Body: in, + MultipartParams: url.Values{ + "parentId": {directoryID}, + "relativePath": {encodedLeaf}, + }, + MultipartContentName: "file", + MultipartFileName: encodedLeaf, + MultipartContentType: fs.MimeType(ctx, src), + Path: "/uploads", + Options: options, + } + err = o.fs.pacer.CallNoRetry(func() (bool, error) { + resp, err = o.fs.srv.CallJSON(ctx, &opts, nil, &result) + return shouldRetry(ctx, resp, err) + }) + if err != nil { + return fmt.Errorf("failed to upload file: %w", err) + } + return o.setMetaData(&result.FileEntry) +} + +// Remove an object +func (o *Object) Remove(ctx context.Context) error { + return o.fs.deleteObject(ctx, o.id) +} + +// ID returns the ID of the Object if known, or "" if not +func (o *Object) ID() string { + return o.id +} + +// MimeType returns the content type of the Object if known, or "" if not +func (o *Object) MimeType(ctx context.Context) string { + return o.mimeType +} + +// ParentID returns the ID of the Object parent if known, or "" if not +func (o *Object) ParentID() string { + return o.dirID +} + +// Check the interfaces are satisfied +var ( + _ fs.Fs = (*Fs)(nil) + _ fs.Purger = (*Fs)(nil) + _ fs.PutStreamer = (*Fs)(nil) + _ fs.Copier = (*Fs)(nil) + _ fs.Mover = (*Fs)(nil) + _ fs.DirMover = (*Fs)(nil) + _ fs.DirCacheFlusher = (*Fs)(nil) + _ fs.OpenChunkWriter = (*Fs)(nil) + _ fs.Object = (*Object)(nil) + _ fs.IDer = (*Object)(nil) + _ fs.ParentIDer = (*Object)(nil) + _ fs.MimeTyper = (*Object)(nil) +) diff --git a/backend/drime/drime_test.go b/backend/drime/drime_test.go new file mode 100644 index 0000000000000..37b72d6c7fd0d --- /dev/null +++ b/backend/drime/drime_test.go @@ -0,0 +1,33 @@ +// Drime filesystem interface +package drime + +import ( + "testing" + + "github.com/rclone/rclone/fs" + "github.com/rclone/rclone/fstest/fstests" +) + +// TestIntegration runs integration tests against the remote +func TestIntegration(t *testing.T) { + fstests.Run(t, &fstests.Opt{ + RemoteName: "TestDrime:", + NilObject: (*Object)(nil), + ChunkedUpload: fstests.ChunkedUploadConfig{ + MinChunkSize: minChunkSize, + }, + }) +} + +func (f *Fs) SetUploadChunkSize(cs fs.SizeSuffix) (fs.SizeSuffix, error) { + return f.setUploadChunkSize(cs) +} + +func (f *Fs) SetUploadCutoff(cs fs.SizeSuffix) (fs.SizeSuffix, error) { + return f.setUploadCutoff(cs) +} + +var ( + _ fstests.SetUploadChunkSizer = (*Fs)(nil) + _ fstests.SetUploadCutoffer = (*Fs)(nil) +) diff --git a/bin/make_manual.py b/bin/make_manual.py index 4373638577bbb..e4593b213b0f4 100755 --- a/bin/make_manual.py +++ b/bin/make_manual.py @@ -43,6 +43,7 @@ "compress.md", "combine.md", "doi.md", + "drime.md" "dropbox.md", "filefabric.md", "filelu.md", diff --git a/docs/content/_index.md b/docs/content/_index.md index 04b668bd44fb9..16cc1d9e49ec2 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -129,6 +129,7 @@ WebDAV or S3, that work out of the box.) {{< provider name="DigitalOcean Spaces" home="https://www.digitalocean.com/products/object-storage/" config="/s3/#digitalocean-spaces" >}} {{< provider name="Digi Storage" home="https://storage.rcs-rds.ro/" config="/koofr/#digi-storage" >}} {{< provider name="Dreamhost" home="https://www.dreamhost.com/cloud/storage/" config="/s3/#dreamhost" >}} +{{< provider name="Drime" home="https://www.drime.cloud/" config="/drime/" >}} {{< provider name="Dropbox" home="https://www.dropbox.com/" config="/dropbox/" >}} {{< provider name="Enterprise File Fabric" home="https://storagemadeeasy.com/about/" config="/filefabric/" >}} {{< provider name="Exaba" home="https://exaba.com/" config="/s3/#exaba" >}} diff --git a/docs/content/docs.md b/docs/content/docs.md index f3269ac6136f2..780573626edc8 100644 --- a/docs/content/docs.md +++ b/docs/content/docs.md @@ -43,6 +43,7 @@ See the following for detailed instructions for - [Crypt](/crypt/) - to encrypt other remotes - [DigitalOcean Spaces](/s3/#digitalocean-spaces) - [Digi Storage](/koofr/#digi-storage) +- [Drime](/drime/) - [Dropbox](/dropbox/) - [Enterprise File Fabric](/filefabric/) - [FileLu Cloud Storage](/filelu/) diff --git a/docs/content/drime.md b/docs/content/drime.md new file mode 100644 index 0000000000000..7b8055e2a3fad --- /dev/null +++ b/docs/content/drime.md @@ -0,0 +1,244 @@ +--- +title: "Drime" +description: "Rclone docs for Drime" +versionIntroduced: "v1.73" +--- + +# {{< icon "fa fa-cloud" >}} Drime + +[Drime](https://drime.cloud/) is a cloud storage and transfer service focused +on fast, resilient file delivery. It offers both free and paid tiers with +emphasis on high-speed uploads and link sharing. + +To setup Drime you need to log in, navigate to Settings, Developer, and create a +token to use as an API access key. Give it a sensible name and copy the token +for use in the config. + +## Configuration + +Here is a run through of `rclone config` to make a remote called `remote`. + +Firstly run: + + +```console +rclone config +``` + +Then follow through the interactive setup: + + +```text +No remotes found, make a new one? +n) New remote +s) Set configuration password +q) Quit config +n/s/q> n + +Enter name for new remote. +name> remote + +Option Storage. +Type of storage to configure. +Choose a number from below, or type in your own value. +XX / Drime + \ (drime) +Storage> drime + +Option access_token. +API Access token +You can get this from the web control panel. +Enter a value. Press Enter to leave empty. +access_token> YOUR_API_ACCESS_TOKEN + +Edit advanced config? +y) Yes +n) No (default) +y/n> n + +Configuration complete. +Options: +- type: drime +- access_token: YOUR_API_ACCESS_TOKEN +Keep this "remote" remote? +y) Yes this is OK (default) +e) Edit this remote +d) Delete this remote +y/e/d> y +``` + +Once configured you can then use `rclone` like this (replace `remote` with the +name you gave your remote): + +List directories and files in the top level of your Drime + +```console +rclone lsf remote: +``` + +To copy a local directory to a Drime directory called backup + +```console +rclone copy /home/source remote:backup +``` + + +### Modification times and hashes + +Drime does not support modification times or hashes. + +This means that by default syncs will only use the size of the file to determine +if it needs updating. + +You can use the `--update` flag which will use the time the object was uploaded. +For many operations this is sufficient to determine if it has changed. However +files created with timestamps in the past will be missed by the sync if using +`--update`. + + +### Restricted filename characters + +In addition to the [default restricted characters set](/overview/#restricted-characters) +the following characters are also replaced: + +| Character | Value | Replacement | +| --------- |:-----:|:-----------:| +| \ | 0x5C | \ | + +File names can also not start or end with the following characters. These only +get replaced if they are the first or last character in the name: + +| Character | Value | Replacement | +| --------- |:-----:|:-----------:| +| SP | 0x20 | ␠ | + +Invalid UTF-8 bytes will also be [replaced](/overview/#invalid-utf8), +as they can't be used in JSON strings. + +### Root folder ID + +You can set the `root_folder_id` for rclone. This is the directory +(identified by its `Folder ID`) that rclone considers to be the root +of your Drime drive. + +Normally you will leave this blank and rclone will determine the +correct root to use itself and fill in the value in the config file. + +However you can set this to restrict rclone to a specific folder +hierarchy. + +In order to do this you will have to find the `Folder ID` of the +directory you wish rclone to display. + +You can do this with rclone + +```console +$ rclone lsf -Fip --dirs-only remote: +d6341f53-ee65-4f29-9f59-d11e8070b2a0;Files/ +f4f5c9b8-6ece-478b-b03e-4538edfe5a1c;Photos/ +d50e356c-29ca-4b27-a3a7-494d91026e04;Videos/ +``` + +The ID to use is the part before the `;` so you could set + +```text +root_folder_id = d6341f53-ee65-4f29-9f59-d11e8070b2a0 +``` + +To restrict rclone to the `Files` directory. + + +### Standard options + +Here are the Standard options specific to drime (Drime). + +#### --drime-access-token + +API Access token + +You can get this from the web control panel. + +Properties: + +- Config: access_token +- Env Var: RCLONE_DRIME_ACCESS_TOKEN +- Type: string +- Required: false + +### Advanced options + +Here are the Advanced options specific to drime (Drime). + +#### --drime-root-folder-id + +ID of the root folder + +Leave this blank normally, rclone will fill it in automatically. + +If you want rclone to be restricted to a particular folder you can +fill it in - see the docs for more info. + + +Properties: + +- Config: root_folder_id +- Env Var: RCLONE_DRIME_ROOT_FOLDER_ID +- Type: string +- Required: false + +#### --drime-workspace-id + +Account ID + +Leave this blank normally, rclone will fill it in automatically. + + +Properties: + +- Config: workspace_id +- Env Var: RCLONE_DRIME_WORKSPACE_ID +- Type: string +- Required: false + +#### --drime-list-chunk + +Number of items to list in each call + +Properties: + +- Config: list_chunk +- Env Var: RCLONE_DRIME_LIST_CHUNK +- Type: int +- Default: 1000 + +#### --drime-encoding + +The encoding for the backend. + +See the [encoding section in the overview](/overview/#encoding) for more info. + +Properties: + +- Config: encoding +- Env Var: RCLONE_DRIME_ENCODING +- Type: Encoding +- Default: Slash,BackSlash,Del,Ctl,LeftSpace,RightSpace,InvalidUtf8,Dot + +#### --drime-description + +Description of the remote. + +Properties: + +- Config: description +- Env Var: RCLONE_DRIME_DESCRIPTION +- Type: string +- Required: false + + + +## Limitations + +Drime only supports filenames up to 255 bytes in length, where filenames are +encoded in UTF8. + diff --git a/docs/content/overview.md b/docs/content/overview.md index 35789f4aea02c..52a244e91d11b 100644 --- a/docs/content/overview.md +++ b/docs/content/overview.md @@ -23,6 +23,7 @@ Here is an overview of the major features of each cloud storage system. | Box | SHA1 | R/W | Yes | No | - | - | | Citrix ShareFile | MD5 | R/W | Yes | No | - | - | | Cloudinary | MD5 | R | No | Yes | - | - | +| Drime | - | - | No | No | R/W | - | | Dropbox | DBHASH ¹ | R | Yes | No | - | - | | Enterprise File Fabric | - | R/W | Yes | No | R/W | - | | FileLu Cloud Storage | MD5 | R/W | No | Yes | R | - | @@ -515,6 +516,7 @@ upon backend-specific capabilities. | Backblaze B2 | No | Yes | No | No | Yes | Yes | Yes | Yes | Yes | No | No | | Box | Yes | Yes | Yes | Yes | Yes | No | Yes | No | Yes | Yes | Yes | | Citrix ShareFile | Yes | Yes | Yes | Yes | No | No | No | No | No | No | Yes | +| Drime | Yes | Yes | Yes | Yes | No | No | Yes | Yes | No | No | Yes | | Dropbox | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes | | Cloudinary | No | No | No | No | No | No | Yes | No | No | No | No | | Enterprise File Fabric | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No | Yes | diff --git a/docs/layouts/chrome/navbar.html b/docs/layouts/chrome/navbar.html index 3f0e7da84d85d..b6b617ea38cae 100644 --- a/docs/layouts/chrome/navbar.html +++ b/docs/layouts/chrome/navbar.html @@ -66,6 +66,7 @@ Citrix ShareFile Crypt (encrypts the others) Digi Storage + Drime Dropbox Enterprise File Fabric FileLu Cloud Storage diff --git a/fstest/test_all/config.yaml b/fstest/test_all/config.yaml index c36f6b3e7e52c..d0ddcbd10206b 100644 --- a/fstest/test_all/config.yaml +++ b/fstest/test_all/config.yaml @@ -677,3 +677,9 @@ backends: # with the parent backend having a different precision. - TestServerSideCopyOverSelf - TestServerSideMoveOverSelf + - backend: "drime" + remote: "TestDrime:" + ignoretests: + # The TestBisyncRemoteLocal/check_access_filters tests fail due to duplicated objects + - cmd/bisync + fastlist: false From 11945785da5b04a48213a056b947a5643bc7cf4a Mon Sep 17 00:00:00 2001 From: Nicolas Dessart Date: Wed, 25 Jun 2025 09:48:32 +0200 Subject: [PATCH 109/130] sftp,ftp: add http proxy authentication support This change supports the `http://user:pass@host:port` syntax for the http_proxy setting. --- backend/ftp/ftp.go | 6 ++++++ backend/sftp/sftp.go | 6 ++++++ docs/content/ftp.md | 6 ++++++ docs/content/sftp.md | 6 ++++++ lib/proxy/http.go | 9 ++++++++- 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/backend/ftp/ftp.go b/backend/ftp/ftp.go index fe666fb710df4..88ddc1008a2d6 100644 --- a/backend/ftp/ftp.go +++ b/backend/ftp/ftp.go @@ -204,6 +204,12 @@ Example: Help: `URL for HTTP CONNECT proxy Set this to a URL for an HTTP proxy which supports the HTTP CONNECT verb. + +Supports the format http://user:pass@host:port, http://host:port, http://host. + +Example: + + http://myUser:myPass@proxyhostname.example.com:8000 `, Advanced: true, }, { diff --git a/backend/sftp/sftp.go b/backend/sftp/sftp.go index e3d5242fbc07b..f7eb2a1c382f7 100644 --- a/backend/sftp/sftp.go +++ b/backend/sftp/sftp.go @@ -519,6 +519,12 @@ Example: Help: `URL for HTTP CONNECT proxy Set this to a URL for an HTTP proxy which supports the HTTP CONNECT verb. + +Supports the format http://user:pass@host:port, http://host:port, http://host. + +Example: + + http://myUser:myPass@proxyhostname.example.com:8000 `, Advanced: true, }, { diff --git a/docs/content/ftp.md b/docs/content/ftp.md index 38b9bad0cc87d..6e8495388a1c2 100644 --- a/docs/content/ftp.md +++ b/docs/content/ftp.md @@ -498,6 +498,12 @@ URL for HTTP CONNECT proxy Set this to a URL for an HTTP proxy which supports the HTTP CONNECT verb. +Supports the format http://user:pass@host:port, http://host:port, http://host. + +Example: + + http://myUser:myPass@proxyhostname.example.com:8000 + Properties: diff --git a/docs/content/sftp.md b/docs/content/sftp.md index be7aa96ae1a85..b747235de19ce 100644 --- a/docs/content/sftp.md +++ b/docs/content/sftp.md @@ -1186,6 +1186,12 @@ URL for HTTP CONNECT proxy Set this to a URL for an HTTP proxy which supports the HTTP CONNECT verb. +Supports the format http://user:pass@host:port, http://host:port, http://host. + +Example: + + http://myUser:myPass@proxyhostname.example.com:8000 + Properties: diff --git a/lib/proxy/http.go b/lib/proxy/http.go index 616d2c4c1521b..647a3c5a12a11 100644 --- a/lib/proxy/http.go +++ b/lib/proxy/http.go @@ -3,6 +3,7 @@ package proxy import ( "bufio" "crypto/tls" + "encoding/base64" "fmt" "net" "net/http" @@ -55,7 +56,13 @@ func HTTPConnectDial(network, addr string, proxyURL *url.URL, proxyDialer proxy. } // send CONNECT - _, err = fmt.Fprintf(conn, "CONNECT %s HTTP/1.1\r\nHost: %s\r\n\r\n", addr, addr) + user := proxyURL.User + if user != nil { + credential := base64.StdEncoding.EncodeToString([]byte(user.String())) + _, err = fmt.Fprintf(conn, "CONNECT %s HTTP/1.1\r\nHost: %s\r\nProxy-Authorization: Basic %s\r\n\r\n", addr, addr, credential) + } else { + _, err = fmt.Fprintf(conn, "CONNECT %s HTTP/1.1\r\nHost: %s\r\n\r\n", addr, addr) + } if err != nil { _ = conn.Close() return nil, fmt.Errorf("HTTP CONNECT proxy failed to send CONNECT: %q", err) From af47701ac19883e30b4a89a3c502deb88e081d7b Mon Sep 17 00:00:00 2001 From: Qingwei Li <332664203@qq.com> Date: Sat, 10 Jan 2026 00:10:02 +0800 Subject: [PATCH 110/130] oracleobjectstorage, sftp: eliminate unnecessary heap allocation Move the declaration location of variables to eliminate heap allocation which may make rclone faster and reduce memory usage slightly. Fixes #9078 --- backend/ftp/ftp.go | 4 ++-- backend/oracleobjectstorage/waiter.go | 9 ++++----- cmd/serve/sftp/connection.go | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/backend/ftp/ftp.go b/backend/ftp/ftp.go index 88ddc1008a2d6..5b73801b059ec 100644 --- a/backend/ftp/ftp.go +++ b/backend/ftp/ftp.go @@ -898,7 +898,7 @@ func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err e resultchan := make(chan []*ftp.Entry, 1) errchan := make(chan error, 1) - go func() { + go func(c *ftp.ServerConn) { result, err := c.List(f.dirFromStandardPath(path.Join(f.root, dir))) f.putFtpConnection(&c, err) if err != nil { @@ -906,7 +906,7 @@ func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err e return } resultchan <- result - }() + }(c) // Wait for List for up to Timeout seconds timer := time.NewTimer(f.ci.TimeoutOrInfinite()) diff --git a/backend/oracleobjectstorage/waiter.go b/backend/oracleobjectstorage/waiter.go index d09f00033fd00..ec6dc7463a350 100644 --- a/backend/oracleobjectstorage/waiter.go +++ b/backend/oracleobjectstorage/waiter.go @@ -60,9 +60,6 @@ type StateChangeConf struct { func (conf *StateChangeConf) WaitForStateContext(ctx context.Context, entityType string) (any, error) { // fs.Debugf(entityType, "Waiting for state to become: %s", conf.Target) - notfoundTick := 0 - targetOccurrence := 0 - // Set a default for times to check for not found if conf.NotFoundChecks == 0 { conf.NotFoundChecks = 20 @@ -84,9 +81,11 @@ func (conf *StateChangeConf) WaitForStateContext(ctx context.Context, entityType // cancellation channel for the refresh loop cancelCh := make(chan struct{}) - result := Result{} - go func() { + notfoundTick := 0 + targetOccurrence := 0 + result := Result{} + defer close(resCh) select { diff --git a/cmd/serve/sftp/connection.go b/cmd/serve/sftp/connection.go index 5d174c2ab362d..a9282fc5bb3be 100644 --- a/cmd/serve/sftp/connection.go +++ b/cmd/serve/sftp/connection.go @@ -291,7 +291,7 @@ func (c *conn) handleChannel(newChannel ssh.NewChannel) { } } fs.Debugf(c.what, " - accepted: %v\n", ok) - err = req.Reply(ok, reply) + err := req.Reply(ok, reply) if err != nil { fs.Errorf(c.what, "Failed to Reply to request: %v", err) return From 33269698ed5dcc04c758aeef3bccac882328b5a3 Mon Sep 17 00:00:00 2001 From: dougal <147946567+roucc@users.noreply.github.com> Date: Fri, 9 Jan 2026 16:30:01 +0000 Subject: [PATCH 111/130] log: fix systemd adding extra newline - fixes #9086 This was broken in v1.71.0 as a typo. --- fs/log/systemd_unix.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/log/systemd_unix.go b/fs/log/systemd_unix.go index fa29b203c1da2..8ea34f1e89f28 100644 --- a/fs/log/systemd_unix.go +++ b/fs/log/systemd_unix.go @@ -16,7 +16,7 @@ func startSystemdLog(handler *OutputHandler) bool { handler.clearFormatFlags(logFormatDate | logFormatTime | logFormatMicroseconds | logFormatUTC | logFormatLongFile | logFormatShortFile | logFormatPid) handler.setFormatFlags(logFormatNoLevel) handler.SetOutput(func(level slog.Level, text string) { - _ = journal.Print(slogLevelToSystemdPriority(level), "%-6s: %s\n", level, text) + _ = journal.Print(slogLevelToSystemdPriority(level), "%-6s: %s", level, text) }) return true } From 6d29553f11e6ac7f6503ec0228c50d332161dd32 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Tue, 13 Jan 2026 12:40:12 +0000 Subject: [PATCH 112/130] Add Nicolas Dessart to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index 938f627c82872..9f42f14aa4194 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1063,3 +1063,4 @@ put them back in again. --> - vupn0712 <126212736+vupn0712@users.noreply.github.com> - darkdragon-001 - sys6101 +- Nicolas Dessart From 5ce5102aa5efce751cdebf58adbc13a50b63bf34 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Tue, 13 Jan 2026 12:40:12 +0000 Subject: [PATCH 113/130] Add Qingwei Li to contributors --- docs/content/authors.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/authors.md b/docs/content/authors.md index 9f42f14aa4194..bea75210d23db 100644 --- a/docs/content/authors.md +++ b/docs/content/authors.md @@ -1064,3 +1064,4 @@ put them back in again. --> - darkdragon-001 - sys6101 - Nicolas Dessart +- Qingwei Li <332664203@qq.com> From f50105c3b5f82c560301ab1ceaf3eb3c94af7404 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Fri, 9 Jan 2026 12:33:31 +0000 Subject: [PATCH 114/130] fstest: Make Copy mutation test work properly Before this change it could miss a mutation if the Modtime was cached --- fstest/fstests/fstests.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fstest/fstests/fstests.go b/fstest/fstests/fstests.go index b1651a55f05be..78f716dcb57b4 100644 --- a/fstest/fstests/fstests.go +++ b/fstest/fstests/fstests.go @@ -1276,6 +1276,8 @@ func Run(t *testing.T, opt *Opt) { err = dst.SetModTime(ctx, fstest.Time("2004-03-03T04:05:06.499999999Z")) if err != fs.ErrorCantSetModTimeWithoutDelete && err != fs.ErrorCantSetModTime { assert.NoError(t, err) + // Re-read the source and check its modtime + src = fstest.NewObject(ctx, t, f, src.Remote()) assert.False(t, src.ModTime(ctx).Equal(dst.ModTime(ctx)), "mutating dst should not mutate src -- is it Copying by pointer?") } From e18ac61075285fced927e64a803743914b71c385 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Fri, 9 Jan 2026 12:43:26 +0000 Subject: [PATCH 115/130] fstest: skip Copy mutation test with --sftp-copy-is-hardlink --- fstest/fstests/fstests.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/fstest/fstests/fstests.go b/fstest/fstests/fstests.go index 78f716dcb57b4..cc69830240484 100644 --- a/fstest/fstests/fstests.go +++ b/fstest/fstests/fstests.go @@ -1273,12 +1273,14 @@ func Run(t *testing.T, opt *Opt) { assert.Equal(t, file2Copy.Path, dst.Remote()) // check that mutating dst does not mutate src - err = dst.SetModTime(ctx, fstest.Time("2004-03-03T04:05:06.499999999Z")) - if err != fs.ErrorCantSetModTimeWithoutDelete && err != fs.ErrorCantSetModTime { - assert.NoError(t, err) - // Re-read the source and check its modtime - src = fstest.NewObject(ctx, t, f, src.Remote()) - assert.False(t, src.ModTime(ctx).Equal(dst.ModTime(ctx)), "mutating dst should not mutate src -- is it Copying by pointer?") + if !strings.Contains(fs.ConfigStringFull(f), "copy_is_hardlink") { + err = dst.SetModTime(ctx, fstest.Time("2004-03-03T04:05:06.499999999Z")) + if err != fs.ErrorCantSetModTimeWithoutDelete && err != fs.ErrorCantSetModTime { + assert.NoError(t, err) + // Re-read the source and check its modtime + src = fstest.NewObject(ctx, t, f, src.Remote()) + assert.False(t, src.ModTime(ctx).Equal(dst.ModTime(ctx)), "mutating dst should not mutate src -- is it Copying by pointer?") + } } // Delete copy From 4968acd10fc58c536e5f651ae23381b707d1aa6b Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Fri, 9 Jan 2026 12:44:11 +0000 Subject: [PATCH 116/130] sftp: fix proxy initialisation This was being done in NewFs instead of NewFsWithConnection like it should have been which meant calls to NewFsWithConnection were not initialising the proxy correctly. --- backend/sftp/sftp.go | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/backend/sftp/sftp.go b/backend/sftp/sftp.go index f7eb2a1c382f7..97678c4c260e5 100644 --- a/backend/sftp/sftp.go +++ b/backend/sftp/sftp.go @@ -925,15 +925,8 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e opt.Port = "22" } - // get proxy URL if set - if opt.HTTPProxy != "" { - proxyURL, err := url.Parse(opt.HTTPProxy) - if err != nil { - return nil, fmt.Errorf("failed to parse HTTP Proxy URL: %w", err) - } - f.proxyURL = proxyURL - } - + // Set up sshConfig here from opt + // **NB** everything else should be setup in NewFsWithConnection sshConfig := &ssh.ClientConfig{ User: opt.User, Auth: []ssh.AuthMethod{}, @@ -1181,11 +1174,21 @@ func NewFsWithConnection(ctx context.Context, f *Fs, name string, root string, m f.mkdirLock = newStringLock() f.pacer = fs.NewPacer(ctx, pacer.NewDefault(pacer.MinSleep(minSleep), pacer.MaxSleep(maxSleep), pacer.DecayConstant(decayConstant))) f.savedpswd = "" + // set the pool drainer timer going if f.opt.IdleTimeout > 0 { f.drain = time.AfterFunc(time.Duration(f.opt.IdleTimeout), func() { _ = f.drainPool(ctx) }) } + // get proxy URL if set + if opt.HTTPProxy != "" { + proxyURL, err := url.Parse(opt.HTTPProxy) + if err != nil { + return nil, fmt.Errorf("failed to parse HTTP Proxy URL: %w", err) + } + f.proxyURL = proxyURL + } + f.features = (&fs.Features{ CanHaveEmptyDirectories: true, SlowHash: true, From de28851ff897e61468c8eaca734c86a5b0700de0 Mon Sep 17 00:00:00 2001 From: Enduriel Date: Mon, 12 Jan 2026 15:45:48 +0100 Subject: [PATCH 117/130] filen: add Filen backend - Fixes #6728 --- README.md | 1 + backend/all/all.go | 1 + backend/filen/filen.go | 1178 +++++++++++++++++++++++++++++++ backend/filen/filen_test.go | 14 + bin/make_manual.py | 1 + docs/content/_index.md | 1 + docs/content/docs.md | 1 + docs/content/filen.md | 244 +++++++ docs/content/overview.md | 2 + docs/layouts/chrome/navbar.html | 1 + fstest/test_all/config.yaml | 3 + go.mod | 2 + go.sum | 10 + 13 files changed, 1459 insertions(+) create mode 100644 backend/filen/filen.go create mode 100644 backend/filen/filen_test.go create mode 100644 docs/content/filen.md diff --git a/README.md b/README.md index 2c99a640b829f..fd1101bc9f287 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ directories to and from different cloud storage providers. - Exaba [:page_facing_up:](https://rclone.org/s3/#exaba) - Fastmail Files [:page_facing_up:](https://rclone.org/webdav/#fastmail-files) - FileLu [:page_facing_up:](https://rclone.org/filelu/) +- Filen [:page_facing_up:](https://rclone.org/filen/) - Files.com [:page_facing_up:](https://rclone.org/filescom/) - FlashBlade [:page_facing_up:](https://rclone.org/s3/#pure-storage-flashblade) - FTP [:page_facing_up:](https://rclone.org/ftp/) diff --git a/backend/all/all.go b/backend/all/all.go index 7ad63c2712ce1..1a3c3d37c19f9 100644 --- a/backend/all/all.go +++ b/backend/all/all.go @@ -22,6 +22,7 @@ import ( _ "github.com/rclone/rclone/backend/fichier" _ "github.com/rclone/rclone/backend/filefabric" _ "github.com/rclone/rclone/backend/filelu" + _ "github.com/rclone/rclone/backend/filen" _ "github.com/rclone/rclone/backend/filescom" _ "github.com/rclone/rclone/backend/ftp" _ "github.com/rclone/rclone/backend/gofile" diff --git a/backend/filen/filen.go b/backend/filen/filen.go new file mode 100644 index 0000000000000..2a3d8cb169145 --- /dev/null +++ b/backend/filen/filen.go @@ -0,0 +1,1178 @@ +// Package filen provides an interface to Filen cloud storage. +package filen + +import ( + "context" + "errors" + "fmt" + "io" + pathModule "path" + "strings" + "sync" + "time" + + sdk "github.com/FilenCloudDienste/filen-sdk-go/filen" + "github.com/FilenCloudDienste/filen-sdk-go/filen/client" + "github.com/FilenCloudDienste/filen-sdk-go/filen/types" + + "github.com/google/uuid" + "github.com/rclone/rclone/fs" + "github.com/rclone/rclone/fs/config" + "github.com/rclone/rclone/fs/config/configmap" + "github.com/rclone/rclone/fs/config/configstruct" + "github.com/rclone/rclone/fs/config/obscure" + "github.com/rclone/rclone/fs/hash" + "github.com/rclone/rclone/fs/list" + "github.com/rclone/rclone/lib/encoder" + "golang.org/x/sync/errgroup" +) + +func init() { + fs.Register(&fs.RegInfo{ + Name: "filen", + Description: "Filen", + NewFs: NewFs, + Options: []fs.Option{ + { + Name: "email", + Help: "Email of your Filen account", + Required: true, + }, + { + Name: "password", + Help: "Password of your Filen account", + Required: true, + IsPassword: true, + Sensitive: true, + }, + { + Name: "api_key", + Help: `API Key for your Filen account + +Get this using the Filen CLI export-api-key command +You can download the Filen CLI from https://github.com/FilenCloudDienste/filen-cli`, + Required: true, + IsPassword: true, + Sensitive: true, + }, + { + Name: "upload_concurrency", + Help: `Concurrency for chunked uploads. + +This is the upper limit for how many transfers for the same file are running concurrently. +Setting this above to a value smaller than 1 will cause uploads to deadlock. + +If you are uploading small numbers of large files over high-speed links +and these uploads do not fully utilize your bandwidth, then increasing +this may help to speed up the transfers.`, + Default: 16, + Advanced: true, + }, + { + Name: config.ConfigEncoding, + Help: config.ConfigEncodingHelp, + Advanced: true, + Default: encoder.Standard | encoder.EncodeInvalidUtf8, + }, + { + Name: "master_keys", + Help: "Master Keys (internal use only)", + Sensitive: true, + Advanced: true, + }, { + Name: "private_key", + Help: "Private RSA Key (internal use only)", + Sensitive: true, + Advanced: true, + }, { + Name: "public_key", + Help: "Public RSA Key (internal use only)", + Sensitive: true, + Advanced: true, + }, { + Name: "auth_version", + Help: "Authentication Version (internal use only)", + Advanced: true, + }, { + Name: "base_folder_uuid", + Help: "UUID of Account Root Directory (internal use only)", + Sensitive: true, + Advanced: true, + }, + }, + }) +} + +// NewFs constructs a Fs at the path root +func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, error) { + opt := new(Options) + err := configstruct.Set(m, opt) + if err != nil { + return nil, err + } + + root = opt.Encoder.FromStandardPath(root) + password, err := obscure.Reveal(opt.Password) + if err != nil { + return nil, fmt.Errorf("failed to reveal password: %w", err) + } + apiKey, err := obscure.Reveal(opt.APIKey) + if err != nil { + return nil, fmt.Errorf("failed to reveal api key: %w", err) + } + + var filen *sdk.Filen + if password == "INTERNAL" { + tsconfig := sdk.TSConfig{ + Email: opt.Email, + MasterKeys: strings.Split(opt.MasterKeys, "|"), + APIKey: apiKey, + PublicKey: opt.PublicKey, + PrivateKey: opt.PrivateKey, + AuthVersion: opt.AuthVersion, + BaseFolderUUID: opt.BaseFolderUUID, + } + filen, err = sdk.NewFromTSConfig(tsconfig) + if err != nil { + return nil, err + } + } else { + filen, err = sdk.NewWithAPIKey(ctx, opt.Email, password, apiKey) + if err != nil { + return nil, err + } + } + + maybeRootDir, err := filen.FindDirectory(ctx, root) + if errors.Is(err, fs.ErrorIsFile) { // FsIsFile special case + var err2 error + root = pathModule.Dir(root) + maybeRootDir, err2 = filen.FindDirectory(ctx, root) + if err2 != nil { + return nil, err2 + } + } else if err != nil { + return nil, err + } + + fileSystem := &Fs{ + name: name, + root: Directory{}, + filen: filen, + Enc: opt.Encoder, + concurrency: opt.UploadConcurrency, + } + + fileSystem.features = (&fs.Features{ + ReadMimeType: true, + WriteMimeType: true, + CanHaveEmptyDirectories: true, + ChunkWriterDoesntSeek: true, + }).Fill(ctx, fileSystem) + + fileSystem.root = Directory{ + fs: fileSystem, + directory: maybeRootDir, // could be null at this point + path: root, + } + + // must return the error from FindDirectory (see FsIsFile) + return fileSystem, err +} + +// Options defines the configuration for this backend +type Options struct { + Email string `config:"email"` + Password string `config:"password"` + APIKey string `config:"api_key"` + Encoder encoder.MultiEncoder `config:"encoding"` + MasterKeys string `config:"master_keys"` + PrivateKey string `config:"private_key"` + PublicKey string `config:"public_key"` + AuthVersion int `config:"auth_version"` + BaseFolderUUID string `config:"base_folder_uuid"` + UploadConcurrency int `config:"upload_concurrency"` +} + +// Fs represents a virtual filesystem mounted on a specific root folder +type Fs struct { + name string + root Directory + filen *sdk.Filen + Enc encoder.MultiEncoder + features *fs.Features + concurrency int +} + +// Name of the remote (as passed into NewFs) +func (f *Fs) Name() string { + return f.name +} + +// Root of the remote (as passed into NewFs) +func (f *Fs) Root() string { + return f.root.path +} + +// String converts this Fs to a string +func (f *Fs) String() string { + return fmt.Sprintf("Filen %s at /%s", f.filen.Email, f.root.String()) +} + +// Precision return the precision of this Fs +func (f *Fs) Precision() time.Duration { + return time.Millisecond +} + +// Hashes returns the supported hash sets. +func (f *Fs) Hashes() hash.Set { + return hash.Set(hash.SHA512) +} + +// Features returns the optional features of this Fs +func (f *Fs) Features() *fs.Features { + return f.features +} + +// List the objects and directories in dir into entries. The +// entries can be returned in any order but should be for a +// complete directory. +// +// dir should be "" to list the root, and should not have +// trailing slashes. +// +// This should return ErrDirNotFound if the directory isn't +// found. +func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err error) { + dir = f.Enc.FromStandardPath(dir) + // find directory uuid + directory, err := f.filen.FindDirectory(ctx, f.resolvePath(dir)) + if err != nil { + return nil, err + } + + if directory == nil { + return nil, fs.ErrorDirNotFound + } + + // read directory content + files, directories, err := f.filen.ReadDirectory(ctx, directory) + if err != nil { + return nil, err + } + entries = make(fs.DirEntries, 0, len(files)+len(directories)) + + for _, directory := range directories { + entries = append(entries, &Directory{ + fs: f, + path: pathModule.Join(dir, directory.Name), + directory: directory, + }) + } + for _, file := range files { + file := &Object{ + fs: f, + path: pathModule.Join(dir, file.Name), + file: file, + } + entries = append(entries, file) + } + return entries, nil +} + +// NewObject finds the Object at remote. If it can't be found +// it returns the error ErrorObjectNotFound. +// +// If remote points to a directory then it should return +// ErrorIsDir if possible without doing any extra work, +// otherwise ErrorObjectNotFound. +func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { + remote = f.Enc.FromStandardPath(remote) + file, err := f.filen.FindFile(ctx, f.resolvePath(remote)) + if err != nil { + return nil, err + } + if file == nil { + return nil, fs.ErrorObjectNotFound + } + return &Object{ + fs: f, + path: remote, + file: file, + }, nil +} + +// Put in to the remote path with the modTime given of the given size +// +// When called from outside an Fs by rclone, src.Size() will always be >= 0. +// But for unknown-sized objects (indicated by src.Size() == -1), Put should either +// return an error or upload it properly (rather than e.g. calling panic). +// +// May create the object even if it returns an error - if so +// will return the object and the error, otherwise will return +// nil and the error +func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { + for _, option := range options { + if option.Mandatory() { + fs.Logf(option, "Unsupported mandatory option: %v", option) + } + } + path := f.Enc.FromStandardPath(src.Remote()) + resolvedPath := f.resolvePath(path) + modTime := src.ModTime(ctx) + parent, err := f.filen.FindDirectoryOrCreate(ctx, pathModule.Dir(resolvedPath)) + if err != nil { + return nil, err + } + incompleteFile, err := types.NewIncompleteFile(f.filen.FileEncryptionVersion, pathModule.Base(resolvedPath), fs.MimeType(ctx, src), modTime, modTime, parent) + if err != nil { + return nil, err + } + uploadedFile, err := f.filen.UploadFile(ctx, incompleteFile, in) + if err != nil { + return nil, err + } + return &Object{ + fs: f, + path: path, + file: uploadedFile, + }, nil +} + +// PutStream uploads to the remote path with the modTime given of indeterminate size +// +// May create the object even if it returns an error - if so +// will return the object and the error, otherwise will return +// nil and the error +func (f *Fs) PutStream(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { + return f.Put(ctx, in, src, options...) +} + +type chunkWriter struct { + sdk.FileUpload + filen *sdk.Filen + bucketAndRegion chan client.V3UploadResponse + chunkSize int64 + + chunksLock sync.Mutex + knownChunks map[int][]byte // known chunks to be hashed + nextChunkToHash int + + sizeLock sync.Mutex + size int64 +} + +func (cw *chunkWriter) WriteChunk(ctx context.Context, chunkNumber int, reader io.ReadSeeker) (bytesWritten int64, err error) { + realChunkNumber := int(int64(chunkNumber) * (cw.chunkSize) / sdk.ChunkSize) + chunk := make([]byte, sdk.ChunkSize, sdk.ChunkSize+cw.EncryptionKey.Cipher.Overhead()) + + totalWritten := int64(0) + for sliceStart := 0; sliceStart < int(cw.chunkSize); sliceStart += sdk.ChunkSize { + chunk = chunk[:sdk.ChunkSize] + chunkRead := 0 + for { + read, err := reader.Read(chunk[chunkRead:]) + chunkRead += read + if err == io.EOF || chunkRead == sdk.ChunkSize { + break + } + if err != nil { + return 0, err + } + } + if chunkRead == 0 { + break + } + chunkReadSlice := chunk[:chunkRead] + err = func() error { + cw.chunksLock.Lock() + defer cw.chunksLock.Unlock() + if cw.nextChunkToHash == realChunkNumber { + _, err := cw.Hasher.Write(chunkReadSlice) + if err != nil { + return err + } + cw.nextChunkToHash++ + for ; ; cw.nextChunkToHash++ { + chunk := cw.knownChunks[cw.nextChunkToHash] + if chunk == nil { + break + } + _, err := cw.Hasher.Write(chunk) + if err != nil { + return err + } + delete(cw.knownChunks, cw.nextChunkToHash) + } + } else { + chunkCopy := make([]byte, len(chunkReadSlice)) + copy(chunkCopy, chunkReadSlice) + cw.knownChunks[realChunkNumber] = chunkCopy + } + return nil + }() + if err != nil { + return totalWritten, err + } + resp, err := cw.filen.UploadChunk(ctx, &cw.FileUpload, realChunkNumber, chunkReadSlice) + select { // only care about getting this once + case cw.bucketAndRegion <- *resp: + default: + } + if err != nil { + return totalWritten, err + } + totalWritten += int64(len(chunkReadSlice)) + realChunkNumber++ + } + + cw.sizeLock.Lock() + cw.size += totalWritten + cw.sizeLock.Unlock() + return totalWritten, nil +} + +func (cw *chunkWriter) Close(ctx context.Context) error { + cw.chunksLock.Lock() + defer close(cw.bucketAndRegion) + defer cw.chunksLock.Unlock() + cw.sizeLock.Lock() + size := cw.size + cw.sizeLock.Unlock() + if len(cw.knownChunks) != 0 { + return errors.New("not all chunks have been hashed") + } + _, err := cw.filen.CompleteFileUpload(ctx, &cw.FileUpload, cw.bucketAndRegion, size) + return err +} + +func (cw *chunkWriter) Abort(ctx context.Context) error { + return nil +} + +// OpenChunkWriter returns the chunk size and a ChunkWriter +// +// Pass in the remote and the src object +// You can also use options to hint at the desired chunk size +func (f *Fs) OpenChunkWriter(ctx context.Context, remote string, src fs.ObjectInfo, options ...fs.OpenOption) (info fs.ChunkWriterInfo, writer fs.ChunkWriter, err error) { + path := f.Enc.FromStandardPath(remote) + resolvedPath := f.resolvePath(path) + modTime := src.ModTime(ctx) + + chunkSize := int64(sdk.ChunkSize) + for _, option := range options { + switch x := option.(type) { + case *fs.ChunkOption: + chunkSize = x.ChunkSize + default: + if option.Mandatory() { + fs.Logf(option, "Unsupported mandatory option: %v", option) + } + } + } + + if chunkSize%sdk.ChunkSize != 0 { + return info, nil, errors.New("chunk size must be a multiple of 1MB") + } + + info = fs.ChunkWriterInfo{ + ChunkSize: chunkSize, + Concurrency: f.concurrency, + LeavePartsOnError: false, + } + + parent, err := f.filen.FindDirectoryOrCreate(ctx, pathModule.Dir(resolvedPath)) + if err != nil { + return info, nil, err + } + incompleteFile, err := types.NewIncompleteFile(f.filen.FileEncryptionVersion, pathModule.Base(resolvedPath), fs.MimeType(ctx, src), modTime, modTime, parent) + if err != nil { + return info, nil, err + } + // unused + fu := f.filen.NewFileUpload(incompleteFile) + return info, &chunkWriter{ + FileUpload: *fu, + filen: f.filen, + chunkSize: chunkSize, + bucketAndRegion: make(chan client.V3UploadResponse, 1), + knownChunks: make(map[int][]byte), + nextChunkToHash: 0, + size: 0, + }, nil +} + +// Mkdir makes the directory (container, bucket) +// +// Shouldn't return an error if it already exists +func (f *Fs) Mkdir(ctx context.Context, dir string) error { + dirObj, err := f.filen.FindDirectoryOrCreate(ctx, f.resolvePath(f.Enc.FromStandardPath(dir))) + if err != nil { + return err + } + if dir == f.root.path { + f.root.directory = dirObj + } + return nil +} + +// Rmdir removes the directory (container, bucket) if empty +// +// Return an error if it doesn't exist or isn't empty +func (f *Fs) Rmdir(ctx context.Context, dir string) error { + // find directory + resolvedPath := f.resolvePath(f.Enc.FromStandardPath(dir)) + //if resolvedPath == f.root.path { + // return fs.ErrorDirNotFound + //} + directory, err := f.filen.FindDirectory(ctx, resolvedPath) + if err != nil { + return err + } + if directory == nil { + return errors.New("directory not found") + } + + files, dirs, err := f.filen.ReadDirectory(ctx, directory) + if err != nil { + return err + } + if len(files) > 0 || len(dirs) > 0 { + return errors.New("directory is not empty") + } + + // trash directory + err = f.filen.TrashDirectory(ctx, directory) + if err != nil { + return err + } + return nil +} + +// Directory is Filen's directory type +type Directory struct { + fs *Fs + path string + directory types.DirectoryInterface +} + +// Fs returns read only access to the Fs that this object is part of +func (dir *Directory) Fs() fs.Info { + return dir.fs +} + +// String returns a description of the Object +func (dir *Directory) String() string { + if dir == nil { + return "" + } + return dir.Remote() +} + +// Remote returns the remote path +func (dir *Directory) Remote() string { + return dir.fs.Enc.ToStandardPath(dir.path) +} + +// ModTime returns the modification date of the file +// It should return a best guess if one isn't available +func (dir *Directory) ModTime(ctx context.Context) time.Time { + directory, ok := dir.directory.(*types.Directory) + if !ok { + return time.Time{} // todo add account creation time? + } + + if directory.Created.IsZero() { + obj, err := dir.fs.filen.FindDirectory(ctx, dir.fs.resolvePath(dir.path)) + newDir, ok := obj.(*types.Directory) + if err != nil || !ok { + return time.Now() + } + directory = newDir + dir.directory = newDir + } + return directory.Created +} + +// Size returns the size of the file +// +// filen doesn't have an efficient way to find the size of a directory +func (dir *Directory) Size() int64 { + return -1 +} + +// Items returns the count of items in this directory or this +// directory and subdirectories if known, -1 for unknown +func (dir *Directory) Items() int64 { + return -1 +} + +// ID returns the internal ID of this directory if known, or +// "" otherwise +func (dir *Directory) ID() string { + return dir.directory.GetUUID() +} + +// Object is Filen's normal file +type Object struct { + fs *Fs + path string + file *types.File + isMoved bool +} + +// Fs returns read only access to the Fs that this object is part of +func (o *Object) Fs() fs.Info { + return o.fs +} + +// String returns a description of the Object +func (o *Object) String() string { + if o == nil { + return "" + } + return o.Remote() +} + +// Remote returns the remote path +func (o *Object) Remote() string { + return o.fs.Enc.ToStandardPath(o.path) +} + +// ModTime returns the modification date of the file +// It should return a best guess if one isn't available +func (o *Object) ModTime(ctx context.Context) time.Time { + if o.file.LastModified.IsZero() { + newFile, err := o.fs.filen.FindFile(ctx, o.fs.resolvePath(o.path)) + if err == nil && newFile != nil { + o.file = newFile + } + } + return o.file.LastModified +} + +// Size returns the size of the file +func (o *Object) Size() int64 { + return o.file.Size +} + +// Hash returns the selected checksum of the file +// If no checksum is available it returns "" +func (o *Object) Hash(ctx context.Context, ty hash.Type) (string, error) { + if ty != hash.SHA512 { + return "", hash.ErrUnsupported + } + if o.file.Hash == "" { + foundFile, err := o.fs.filen.FindFile(ctx, o.fs.resolvePath(o.path)) + if err != nil { + return "", err + } + if foundFile == nil { + return "", fs.ErrorObjectNotFound + } + o.file = foundFile + } + return o.file.Hash, nil +} + +// Storable says whether this object can be stored +func (o *Object) Storable() bool { + return true +} + +// SetModTime sets the metadata on the object to set the modification date +func (o *Object) SetModTime(ctx context.Context, t time.Time) error { + o.file.LastModified = t + return o.fs.filen.UpdateMeta(ctx, o.file) +} + +// Open opens the file for read. Call Close() on the returned io.ReadCloser +func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadCloser, error) { + fs.FixRangeOption(options, o.Size()) + // Create variables to hold our options + var offset int64 + var limit int64 = -1 // -1 means no limit + + // Parse the options + for _, option := range options { + switch opt := option.(type) { + case *fs.RangeOption: + offset = opt.Start + limit = opt.End + 1 // +1 because End is inclusive + case *fs.SeekOption: + offset = opt.Offset + default: + if option.Mandatory() { + fs.Logf(option, "Unsupported mandatory option: %v", option) + } + } + } + + // Get the base reader + readCloser := o.fs.filen.GetDownloadReaderWithOffset(ctx, o.file, offset, limit) + return readCloser, nil +} + +// Update in to the object with the modTime given of the given size +// +// When called from outside an Fs by rclone, src.Size() will always be >= 0. +// But for unknown-sized objects (indicated by src.Size() == -1), Upload should either +// return an error or update the object properly (rather than e.g. calling panic). +func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error { + for _, option := range options { + if option.Mandatory() { + fs.Logf(option, "Unsupported mandatory option: %v", option) + } + } + newModTime := src.ModTime(ctx) + newIncomplete, err := o.file.NewFromBase(o.fs.filen.FileEncryptionVersion) + if err != nil { + return err + } + newIncomplete.LastModified = newModTime + newIncomplete.Created = newModTime + newIncomplete.SetMimeType(fs.MimeType(ctx, src)) + uploadedFile, err := o.fs.filen.UploadFile(ctx, newIncomplete, in) + if err != nil { + return err + } + o.file = uploadedFile + return nil +} + +// Remove this object +func (o *Object) Remove(ctx context.Context) error { + if o.isMoved { // doesn't exist at this path + return nil + } + err := o.fs.filen.TrashFile(ctx, *o.file) + if err != nil { + return err + } + return nil +} + +// MimeType returns the content type of the Object if +// known, or "" if not +func (o *Object) MimeType(_ context.Context) string { + return o.file.MimeType +} + +// ID returns the ID of the Object if known, or "" if not +func (o *Object) ID() string { + return o.file.GetUUID() +} + +// ParentID returns the ID of the parent directory if known or nil if not +func (o *Object) ParentID() string { + return o.file.GetParent() +} + +// Purge all files in the directory specified +// +// Implement this if you have a way of deleting all the files +// quicker than just running Remove() on the result of List() +// +// Return an error if it doesn't exist +func (f *Fs) Purge(ctx context.Context, dir string) error { + path := f.resolvePath(f.Enc.FromStandardPath(dir)) + foundDir, err := f.filen.FindDirectory(ctx, path) + if err != nil { + return err + } else if foundDir == nil { + return fs.ErrorDirNotFound + } + return f.filen.TrashDirectory(ctx, foundDir) +} + +// Move src to this remote using server-side move operations. +// +// # This is stored with the remote path given +// +// # It returns the destination Object and a possible error +// +// Will only be called if src.Fs().Name() == f.Name() +// +// If it isn't possible then return fs.ErrorCantMove +func (f *Fs) Move(ctx context.Context, src fs.Object, remote string) (fs.Object, error) { + obj, ok := src.(*Object) + if !ok { + return nil, fmt.Errorf("can't move %T: %w", src, fs.ErrorCantMove) + } + newRemote := f.Enc.FromStandardPath(remote) + oldPath, newPath := obj.fs.resolvePath(f.Enc.FromStandardPath(src.Remote())), f.resolvePath(newRemote) + oldParentPath, newParentPath := pathModule.Dir(oldPath), pathModule.Dir(newPath) + oldName, newName := pathModule.Base(oldPath), pathModule.Base(newPath) + if oldPath == newPath { + return nil, fs.ErrorCantMove + } + err := f.filen.Lock(ctx) + if err != nil { + return nil, err + } + defer f.filen.Unlock() + if oldParentPath == newParentPath { + err = f.rename(ctx, obj.file, newPath, newName) + } else if newName == oldName { + err = f.move(ctx, obj.file, newPath, newParentPath) + } else { + err = f.moveWithRename(ctx, obj.file, oldPath, oldName, newPath, newParentPath, newName) + } + if err != nil { + return nil, err + } + return moveFileObjIntoNewPath(obj, newRemote), nil +} + +// moveWithRename moves item to newPath +// using a more complex set of operations designed to handle the fact that +// Filen doesn't support a single moveRename operation +// which requires some annoying hackery to get around reliably +func (f *Fs) moveWithRename(ctx context.Context, item types.NonRootFileSystemObject, oldPath, oldName, newPath, newParentPath, newName string) error { + g, gCtx := errgroup.WithContext(ctx) + var ( + newParentDir types.DirectoryInterface + renamedToUUID bool + ) + + // rename to random UUID first + g.Go(func() error { + err := f.filen.Rename(gCtx, item, uuid.NewString()) + if err != nil { + return fmt.Errorf("failed to rename file: %w : %w", err, fs.ErrorCantMove) + } + renamedToUUID = true + return nil + }) + defer func() { + // safety to try and not leave the item in a bad state + if renamedToUUID { + err := f.filen.Rename(ctx, item, oldName) + if err != nil { + fmt.Printf("ERROR: FAILED TO REVERT UUID RENAME for file %s: %s", oldPath, err) + } + } + }() + + // find parent dir + g.Go(func() error { + var err error + newParentDir, err = f.filen.FindDirectoryOrCreate(gCtx, newParentPath) + return err + }) + + if err := g.Wait(); err != nil { + return err + } + + // move + oldParentUUID := item.GetParent() + err := f.filen.MoveItem(ctx, item, newParentDir.GetUUID(), true) + if err != nil { + return fmt.Errorf("failed to move file: %w : %w", err, fs.ErrorCantMove) + } + defer func() { + // safety to try and not leave the item in a bad state + if renamedToUUID { + err := f.filen.MoveItem(ctx, item, oldParentUUID, true) + if err != nil { + fmt.Printf("ERROR: FAILED TO REVERT MOVE for file %s: %s", oldPath, err) + } + } + }() + + // rename to final name + err = f.filen.Rename(ctx, item, newName) + if err != nil { + return fmt.Errorf("failed to rename file: %w : %w", err, fs.ErrorCantMove) + } + renamedToUUID = false + + return nil +} + +// move moves item to newPath +// by finding the parent and calling moveWithParentUUID +func (f *Fs) move(ctx context.Context, item types.NonRootFileSystemObject, newPath, newParentPath string) error { + newParentDir, err := f.filen.FindDirectoryOrCreate(ctx, newParentPath) + if err != nil { + return fmt.Errorf("failed to find or create directory: %w : %w", err, fs.ErrorCantMove) + } + return f.moveWithParentUUID(ctx, item, newParentDir.GetUUID()) +} + +// moveWithParentUUID moves item to newParentUUID +// using a simple filen.MoveItem operation +func (f *Fs) moveWithParentUUID(ctx context.Context, item types.NonRootFileSystemObject, newParentUUID string) error { + err := f.filen.MoveItem(ctx, item, newParentUUID, true) + if err != nil { + return fmt.Errorf("failed to move file: %w : %w", err, fs.ErrorCantMove) + } + + return nil +} + +// rename moves item to newPath +// using a simple Filen rename operation +func (f *Fs) rename(ctx context.Context, item types.NonRootFileSystemObject, newPath string, newName string) error { + err := f.filen.Rename(ctx, item, newName) + if err != nil { + return fmt.Errorf("failed to rename item: %w : %w", err, fs.ErrorCantMove) + } + return nil +} + +// moveFileObjIntoNewPath 'moves' an existing object into a new path +// invalidating the previous object +// and making a copy with the passed path +// +// this is to work around the fact that rclone expects to have to delete a file after moving +func moveFileObjIntoNewPath(o *Object, newPath string) *Object { + newFile := &Object{ + fs: o.fs, + path: newPath, + file: o.file, + } + o.isMoved = true + return newFile +} + +// DirMove moves src, srcRemote to this remote at dstRemote +// using server-side move operations. +// +// Will only be called if src.Fs().Name() == f.Name() +// +// If it isn't possible then return fs.ErrorCantDirMove +// +// If destination exists then return fs.ErrorDirExists +func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string) error { + + srcF, ok := src.(*Fs) + if !ok || srcF == nil { + return fs.ErrorCantDirMove + } + err := f.filen.Lock(ctx) + if err != nil { + return err + } + defer f.filen.Unlock() + g, gCtx := errgroup.WithContext(ctx) + var ( + srcDirInt types.DirectoryInterface + dstDir types.DirectoryInterface + srcPath = srcF.resolvePath(srcF.Enc.FromStandardPath(srcRemote)) + dstPath = f.resolvePath(f.Enc.FromStandardPath(dstRemote)) + ) + if srcPath == dstPath { + return fs.ErrorDirExists + } + + g.Go(func() error { + var err error + srcDirInt, err = srcF.filen.FindDirectory(gCtx, srcPath) + return err + }) + g.Go(func() error { + var err error + dstDir, err = f.filen.FindDirectory(gCtx, dstPath) + return err + }) + + if err := g.Wait(); err != nil { + return err + } + + if srcDirInt == nil { + return fs.ErrorDirNotFound + } + + if dstDir != nil { + return fs.ErrorDirExists + } + + srcDir, ok := srcDirInt.(*types.Directory) + if !ok { + return fs.ErrorCantDirMove + } + + return f.dirMoveEntireDir(ctx, srcDir, srcPath, dstPath) +} + +// dirMoveEntireDir moves srcDir to newPath +// used for the case where the target directory doesn't exist +func (f *Fs) dirMoveEntireDir(ctx context.Context, srcDir *types.Directory, oldPath string, newPath string) error { + oldParentPath, newParentPath := pathModule.Dir(oldPath), pathModule.Dir(newPath) + oldName, newName := pathModule.Base(oldPath), pathModule.Base(newPath) + var err error + if oldPath == newPath { + return fs.ErrorDirExists + } else if oldParentPath == newParentPath { + err = f.rename(ctx, srcDir, newPath, newName) + } else if newName == oldName { + err = f.move(ctx, srcDir, newPath, newParentPath) + } else { + err = f.moveWithRename(ctx, srcDir, oldPath, oldName, newPath, newParentPath, newName) + } + if err != nil { + return err + } + return err +} + +// ListR lists the objects and directories of the Fs starting +// from dir recursively into out. +// +// dir should be "" to start from the root, and should not +// have trailing slashes. +// +// This should return ErrDirNotFound if the directory isn't +// found. +// +// It should call callback for each tranche of entries read. +// These need not be returned in any particular order. If +// callback returns an error then the listing will stop +// immediately. +// +// Don't implement this unless you have a more efficient way +// of listing recursively that doing a directory traversal. +func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (err error) { + basePath := f.Enc.FromStandardPath(dir) + path := f.resolvePath(basePath) + foundDir, err := f.filen.FindDirectory(ctx, path) + if err != nil { + return err + } + if foundDir == nil { + return fs.ErrorDirNotFound + } + + files, dirs, err := f.filen.ListRecursive(ctx, foundDir) + if err != nil { + return err + } + listHelper := list.NewHelper(callback) + // have to build paths + uuidDirMap, uuidPathMap := buildUUIDDirMaps(basePath, foundDir, dirs) + + for _, dir := range dirs { + path, err := getPathForUUID(dir.GetUUID(), uuidPathMap, uuidDirMap) + if err != nil { + return err + } + err = listHelper.Add(&Directory{ + fs: f, + directory: dir, + path: path, + }) + if err != nil { + return err + } + } + + for _, file := range files { + parentPath, err := getPathForUUID(file.GetParent(), uuidPathMap, uuidDirMap) + if err != nil { + return err + } + err = listHelper.Add(&Object{ + fs: f, + file: file, + path: pathModule.Join(parentPath, file.GetName()), + }) + if err != nil { + return err + } + } + return listHelper.Flush() +} + +func buildUUIDDirMaps(rootPath string, rootDir types.DirectoryInterface, dirs []*types.Directory) (map[string]types.DirectoryInterface, map[string]string) { + uuidPathMap := make(map[string]string, len(dirs)+1) + uuidPathMap[rootDir.GetUUID()] = rootPath + + uuidDirMap := make(map[string]types.DirectoryInterface, len(dirs)+1) + uuidDirMap[rootDir.GetUUID()] = rootDir + for _, dir := range dirs { + uuidDirMap[dir.GetUUID()] = dir + } + return uuidDirMap, uuidPathMap +} + +func getPathForUUID(uuid string, uuidPathMap map[string]string, uuidDirMap map[string]types.DirectoryInterface) (string, error) { + if path, ok := uuidPathMap[uuid]; ok { + return path, nil + } + dir, ok := uuidDirMap[uuid] + if !ok { + return "", fs.ErrorDirNotFound + } + parentPath, err := getPathForUUID(dir.GetParent(), uuidPathMap, uuidDirMap) + if err != nil { + return "", err + } + path := pathModule.Join(parentPath, dir.GetName()) + uuidPathMap[uuid] = path + return path, nil +} + +// About gets quota information from the Fs +func (f *Fs) About(ctx context.Context) (*fs.Usage, error) { + userInfo, err := f.filen.GetUserInfo(ctx) + if err != nil { + return nil, err + } + + total := int64(userInfo.MaxStorage) + used := int64(userInfo.UsedStorage) + free := total - used + return &fs.Usage{ + Total: &total, + Used: &used, + Trashed: nil, + Other: nil, + Free: &free, + Objects: nil, + }, nil +} + +// CleanUp the trash in the Fs +func (f *Fs) CleanUp(ctx context.Context) error { + // not sure if this is implemented correctly, since this trashes ALL trash + // not just the trash in the currently mounted fs + // not currently wiping file versions because that feels dangerous + // especially since versioning can be toggled on/off + return f.filen.EmptyTrash(ctx) +} + +// helpers + +// resolvePath returns the absolute path specified by the input path, which is seen relative to the remote's root. +func (f *Fs) resolvePath(path string) string { + return pathModule.Join(f.root.path, path) +} + +// Check the interfaces are satisfied +var ( + _ fs.Fs = &Fs{} + _ fs.Mover = &Fs{} + _ fs.DirMover = &Fs{} + _ fs.Purger = &Fs{} + _ fs.PutStreamer = &Fs{} + _ fs.CleanUpper = &Fs{} + _ fs.ListRer = &Fs{} + _ fs.Abouter = &Fs{} + _ fs.OpenChunkWriter = &Fs{} + _ fs.Directory = &Directory{} + _ fs.Object = &Object{} + _ fs.MimeTyper = &Object{} + _ fs.IDer = &Object{} + _ fs.ParentIDer = &Object{} + _ fs.ChunkWriter = &chunkWriter{} +) + +// todo PublicLinker, +// we could technically implement ChangeNotifier, but +// 1) the current implementation on Filen's side isn't great, it's worth waiting until SSE +// 2) I'm not really clear that the benefits are so great +// a bunch of the information would get wasted, since the Filen does actually specify exact updates, +// whereas rclone seems to only accept a path and object type diff --git a/backend/filen/filen_test.go b/backend/filen/filen_test.go new file mode 100644 index 0000000000000..808456274278d --- /dev/null +++ b/backend/filen/filen_test.go @@ -0,0 +1,14 @@ +package filen + +import ( + "testing" + + "github.com/rclone/rclone/fstest/fstests" +) + +func TestIntegration(t *testing.T) { + fstests.Run(t, &fstests.Opt{ + RemoteName: "TestFilen:", + NilObject: (*Object)(nil), + }) +} diff --git a/bin/make_manual.py b/bin/make_manual.py index e4593b213b0f4..936a239230711 100755 --- a/bin/make_manual.py +++ b/bin/make_manual.py @@ -47,6 +47,7 @@ "dropbox.md", "filefabric.md", "filelu.md", + "filen.md", "filescom.md", "ftp.md", "gofile.md", diff --git a/docs/content/_index.md b/docs/content/_index.md index 16cc1d9e49ec2..1b3fdfb375239 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -136,6 +136,7 @@ WebDAV or S3, that work out of the box.) {{< provider name="Fastmail Files" home="https://www.fastmail.com/" config="/webdav/#fastmail-files" >}} {{< provider name="FileLu Cloud Storage" home="https://filelu.com/" config="/filelu/" >}} {{< provider name="FileLu S5 (S3-Compatible Object Storage)" home="https://s5lu.com/" config="/s3/#filelu-s5" >}} +{{< provider name="Filen" home="https://www.filen.io/" config="/filen/" >}} {{< provider name="Files.com" home="https://www.files.com/" config="/filescom/" >}} {{< provider name="FlashBlade" home="https://www.purestorage.com/products/unstructured-data-storage.html" config="/s3/#pure-storage-flashblade" >}} {{< provider name="FTP" home="https://en.wikipedia.org/wiki/File_Transfer_Protocol" config="/ftp/" >}} diff --git a/docs/content/docs.md b/docs/content/docs.md index 780573626edc8..e71e95d2f5997 100644 --- a/docs/content/docs.md +++ b/docs/content/docs.md @@ -47,6 +47,7 @@ See the following for detailed instructions for - [Dropbox](/dropbox/) - [Enterprise File Fabric](/filefabric/) - [FileLu Cloud Storage](/filelu/) +- [Filen](/filen/) - [Files.com](/filescom/) - [FTP](/ftp/) - [Gofile](/gofile/) diff --git a/docs/content/filen.md b/docs/content/filen.md new file mode 100644 index 0000000000000..4c6e2b2a19260 --- /dev/null +++ b/docs/content/filen.md @@ -0,0 +1,244 @@ +--- +title: "Filen" +description: "Rclone docs for Filen" +versionIntroduced: "1.73" +--- + +# {{< icon "fa fa-solid fa-f" >}} Filen +## Configuration +The initial setup for Filen requires that you get an API key for your account, +currently this is only possible using the [Filen CLI](https://github.com/FilenCloudDienste/filen-cli). +This means you must first download the CLI, login, and then run the `export-api-key` command. + +Here is an example of how to make a remote called `FilenRemote`. First run: + + rclone config + +This will guide you through an interactive setup process: +``` +No remotes found, make a new one? +n) New remote +s) Set configuration password +q) Quit config +n/s/q> n + +name> FilenRemote +Option Storage. + +Type of storage to configure. +Choose a number from below, or type in your own value. +[snip] +XX / Filen + \ "filen" +[snip] +Storage> filen + +Option Email. +The email of your Filen account +Enter a value. +Email> youremail@provider.com + +Option Password. +The password of your Filen account +Choose an alternative below. +y) Yes, type in my own password +g) Generate random password +y/g> y +Enter the password: +password: +Confirm the password: +password: + +Option API Key. +An API Key for your Filen account +Get this using the Filen CLI export-api-key command +You can download the Filen CLI from https://github.com/FilenCloudDienste/filen-cli +Choose an alternative below. +y) Yes, type in my own password +g) Generate random password +y/g> y +Enter the password: +password: +Confirm the password: +password: + +Edit advanced config? +y) Yes +n) No (default) +y/n> n + +Configuration complete. +Options: +- type: filen +- Email: youremail@provider.com +- Password: *** ENCRYPTED *** +- API Key: *** ENCRYPTED *** +Keep this "FilenRemote" remote? +y) Yes this is OK (default) +e) Edit this remote +d) Delete this remote +y/e/d> y +``` + +### Modification times and hashes +Modification times are fully supported for files, for directories, only the creation time matters. + +Filen supports SHA512 hashes. + +### Restricted filename characters +Invalid UTF-8 bytes will be [replaced](/overview/#invalid-utf8) + + +### API Key + +{{< rem autogenerated options start" - DO NOT EDIT - instead edit fs.RegInfo in backend/filen/filen.go then run make backenddocs" >}} +### Standard options + +Here are the Standard options specific to filen (Filen). + +#### --filen-email + +Email of your Filen account + +Properties: + +- Config: email +- Env Var: RCLONE_FILEN_EMAIL +- Type: string +- Required: true + +#### --filen-password + +Password of your Filen account + +**NB** Input to this must be obscured - see [rclone obscure](/commands/rclone_obscure/). + +Properties: + +- Config: password +- Env Var: RCLONE_FILEN_PASSWORD +- Type: string +- Required: true + +#### --filen-api-key + +API Key for your Filen account + +Get this using the Filen CLI export-api-key command +You can download the Filen CLI from https://github.com/FilenCloudDienste/filen-cli + +**NB** Input to this must be obscured - see [rclone obscure](/commands/rclone_obscure/). + +Properties: + +- Config: api_key +- Env Var: RCLONE_FILEN_API_KEY +- Type: string +- Required: true + +### Advanced options + +Here are the Advanced options specific to filen (Filen). + +#### --filen-encoding + +The encoding for the backend. + +See the [encoding section in the overview](/overview/#encoding) for more info. + +Properties: + +- Config: encoding +- Env Var: RCLONE_FILEN_ENCODING +- Type: Encoding +- Default: Slash,Del,Ctl,InvalidUtf8,Dot + +#### --filen-upload-concurrency + +Concurrency for multipart uploads. + +This is the number of chunks of the same file that are uploaded +concurrently for multipart uploads. + +Note that chunks are stored in memory and there may be up to +"--transfers" * "--filen-upload-concurrency" chunks stored at once +in memory. + +If you are uploading small numbers of large files over high-speed links +and these uploads do not fully utilize your bandwidth, then increasing +this may help to speed up the transfers. + +Properties: + +- Config: upload_concurrency +- Env Var: RCLONE_FILEN_UPLOAD_CONCURRENCY +- Type: int +- Default: 16 + +#### --filen-master-keys + +Master Keys (internal use only) + +Properties: + +- Config: master_keys +- Env Var: RCLONE_FILEN_MASTER_KEYS +- Type: string +- Required: false + +#### --filen-private-key + +Private RSA Key (internal use only) + +Properties: + +- Config: private_key +- Env Var: RCLONE_FILEN_PRIVATE_KEY +- Type: string +- Required: false + +#### --filen-public-key + +Public RSA Key (internal use only) + +Properties: + +- Config: public_key +- Env Var: RCLONE_FILEN_PUBLIC_KEY +- Type: string +- Required: false + +#### --filen-auth-version + +Authentication Version (internal use only) + +Properties: + +- Config: auth_version +- Env Var: RCLONE_FILEN_AUTH_VERSION +- Type: string +- Required: false + +#### --filen-base-folder-uuid + +UUID of Account Root Directory (internal use only) + +Properties: + +- Config: base_folder_uuid +- Env Var: RCLONE_FILEN_BASE_FOLDER_UUID +- Type: string +- Required: false + +#### --filen-description + +Description of the remote. + +Properties: + +- Config: description +- Env Var: RCLONE_FILEN_DESCRIPTION +- Type: string +- Required: false + +{{< rem autogenerated options stop >}} diff --git a/docs/content/overview.md b/docs/content/overview.md index 52a244e91d11b..d3bd1e534749f 100644 --- a/docs/content/overview.md +++ b/docs/content/overview.md @@ -27,6 +27,7 @@ Here is an overview of the major features of each cloud storage system. | Dropbox | DBHASH ¹ | R | Yes | No | - | - | | Enterprise File Fabric | - | R/W | Yes | No | R/W | - | | FileLu Cloud Storage | MD5 | R/W | No | Yes | R | - | +| Filen | SHA512 | R/W | Yes | No | R/W | - | | Files.com | MD5, CRC32 | DR/W | Yes | No | R | - | | FTP | - | R/W ¹⁰ | No | No | - | - | | Gofile | MD5 | DR/W | No | Yes | R | - | @@ -520,6 +521,7 @@ upon backend-specific capabilities. | Dropbox | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes | | Cloudinary | No | No | No | No | No | No | Yes | No | No | No | No | | Enterprise File Fabric | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No | Yes | +| Filen | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | | Files.com | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | No | Yes | | FTP | No | No | Yes | Yes | No | No | Yes | No | No | No | Yes | | Gofile | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes | diff --git a/docs/layouts/chrome/navbar.html b/docs/layouts/chrome/navbar.html index b6b617ea38cae..b17a8cc3917c0 100644 --- a/docs/layouts/chrome/navbar.html +++ b/docs/layouts/chrome/navbar.html @@ -71,6 +71,7 @@ Enterprise File Fabric FileLu Cloud Storage FileLu S5 (S3-Compatible) + Filen Files.com FTP Gofile diff --git a/fstest/test_all/config.yaml b/fstest/test_all/config.yaml index d0ddcbd10206b..2371d4b420c38 100644 --- a/fstest/test_all/config.yaml +++ b/fstest/test_all/config.yaml @@ -164,6 +164,9 @@ backends: - backend: "gofile" remote: "TestGoFile:" fastlist: true + - backend: "filen" + remote: "TestFilen:" + fastlist: false - backend: "filescom" remote: "TestFilesCom:" fastlist: false diff --git a/go.mod b/go.mod index 3440bb78f1994..e82cb740584d5 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3 github.com/Azure/azure-sdk-for-go/sdk/storage/azfile v1.5.3 github.com/Azure/go-ntlmssp v0.0.2-0.20251110135918-10b7b7e7cd26 + github.com/FilenCloudDienste/filen-sdk-go v0.0.34 github.com/Files-com/files-sdk-go/v3 v3.2.264 github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd github.com/a1ex3/zstd-seekable-format-go/pkg v0.10.0 @@ -155,6 +156,7 @@ require ( github.com/cronokirby/saferith v0.33.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect + github.com/dromara/dongle v1.0.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/ebitengine/purego v0.9.1 // indirect github.com/emersion/go-message v0.18.2 // indirect diff --git a/go.sum b/go.sum index 30e0aa0498b17..92ec04240587f 100644 --- a/go.sum +++ b/go.sum @@ -61,6 +61,8 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgv github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/FilenCloudDienste/filen-sdk-go v0.0.34 h1:Fd/wagh/Qn35p3PkCUYubmaELATQlYGC9pxpJ9TkHUE= +github.com/FilenCloudDienste/filen-sdk-go v0.0.34/go.mod h1:XkI1Iq30/tU8vk4Zd1cKr2cCTiFqBEf0ZfG4+KKUBrY= github.com/Files-com/files-sdk-go/v3 v3.2.264 h1:lMHTplAYI9FtmCo/QOcpRxmPA5REVAct1r2riQmDQKw= github.com/Files-com/files-sdk-go/v3 v3.2.264/go.mod h1:wGqkOzRu/ClJibvDgcfuJNAqI2nLhe8g91tPlDKRCdE= github.com/IBM/go-sdk-core/v5 v5.21.0 h1:DUnYhvC4SoC8T84rx5omnhY3+xcQg/Whyoa3mDPIMkk= @@ -232,6 +234,8 @@ github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/dop251/scsu v0.0.0-20220106150536-84ac88021d00 h1:xJBhC00smQpSZw3Kr0ErMUBXhUSjYoLRm2szxdbRBL0= github.com/dop251/scsu v0.0.0-20220106150536-84ac88021d00/go.mod h1:nNICngOdmNImBb/vuL+dSc0aIg3ryNATpjxThNoPw4g= +github.com/dromara/dongle v1.0.1 h1:si/7UP/EXxnFVZok1cNos70GiMGxInAYMilHQFP5dJs= +github.com/dromara/dongle v1.0.1/go.mod h1:ebFhTaDgxaDIKppycENTWlBsxz8mWCPWOLnsEgDpMv4= github.com/dropbox/dropbox-sdk-go-unofficial/v6 v6.0.5 h1:FT+t0UEDykcor4y3dMVKXIiWJETBpRgERYTGlmMd7HU= github.com/dropbox/dropbox-sdk-go-unofficial/v6 v6.0.5/go.mod h1:rSS3kM9XMzSQ6pw91Qgd6yB5jdt70N4OdtrAf74As5M= github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4= @@ -249,6 +253,7 @@ github.com/emersion/go-message v0.18.2 h1:rl55SQdjd9oJcIoQNhubD2Acs1E6IzlZISRTK7 github.com/emersion/go-message v0.18.2/go.mod h1:XpJyL70LwRvq2a8rVbHXikPgKj8+aI0kGdHlg16ibYA= github.com/emersion/go-vcard v0.0.0-20241024213814-c9703dde27ff h1:4N8wnS3f1hNHSmFD5zgFkWCyA4L1kCDkImPAtK7D6tg= github.com/emersion/go-vcard v0.0.0-20241024213814-c9703dde27ff/go.mod h1:HMJKR5wlh/ziNp+sHEDV2ltblO4JD2+IdDOWtGcQBTM= +github.com/emmansun/gmsm v0.15.5/go.mod h1:2m4jygryohSWkaSduFErgCwQKab5BNjURoFrn2DNwyU= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -748,6 +753,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= @@ -828,6 +834,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= @@ -904,6 +911,7 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -916,6 +924,7 @@ golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= @@ -932,6 +941,7 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= From e6486f599409522e502c15b04494e9f35d760ba2 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 14 Jan 2026 12:27:54 +0000 Subject: [PATCH 118/130] docs: update sponsor link --- docs/layouts/chrome/menu.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/layouts/chrome/menu.html b/docs/layouts/chrome/menu.html index 7c87de0721455..bb5e165c213e5 100644 --- a/docs/layouts/chrome/menu.html +++ b/docs/layouts/chrome/menu.html @@ -40,7 +40,7 @@
    Silver Sponso⁠r
    -
    +
    From ffdbdc29c39341c3919fd25f98ba6ced95d2c70a Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 14 Jan 2026 12:18:45 +0000 Subject: [PATCH 119/130] rc: add operations/hashsumfile to sum a single file only --- fs/operations/rc.go | 84 +++++++++++++++++++++++++++++++++++----- fs/operations/rc_test.go | 26 ++++++++++++- 2 files changed, 100 insertions(+), 10 deletions(-) diff --git a/fs/operations/rc.go b/fs/operations/rc.go index 644a947e9f816..ce92a0024f2a7 100644 --- a/fs/operations/rc.go +++ b/fs/operations/rc.go @@ -921,6 +921,18 @@ See the [hashsum](/commands/rclone_hashsum/) command for more information on the }) } +// Parse download, base64 and hashType parameters +func parseHashParameters(in rc.Params) (download bool, base64 bool, ht hash.Type, err error) { + download, _ = in.GetBool("download") + base64, _ = in.GetBool("base64") + hashType, err := in.GetString("hashType") + if err != nil { + return + } + err = ht.Set(hashType) + return +} + // Hashsum a directory func rcHashsum(ctx context.Context, in rc.Params) (out rc.Params, err error) { ctx, f, err := rc.GetFsNamedFileOK(ctx, in, "fs") @@ -928,16 +940,9 @@ func rcHashsum(ctx context.Context, in rc.Params) (out rc.Params, err error) { return nil, err } - download, _ := in.GetBool("download") - base64, _ := in.GetBool("base64") - hashType, err := in.GetString("hashType") - if err != nil { - return nil, fmt.Errorf("%s\n%w", hash.HelpString(0), err) - } - var ht hash.Type - err = ht.Set(hashType) + download, base64, ht, err := parseHashParameters(in) if err != nil { - return nil, fmt.Errorf("%s\n%w", hash.HelpString(0), err) + return out, err } hashes := []string{} @@ -948,3 +953,64 @@ func rcHashsum(ctx context.Context, in rc.Params) (out rc.Params, err error) { } return out, err } + +func init() { + rc.Add(rc.Call{ + Path: "operations/hashsumfile", + AuthRequired: true, + Fn: rcHashsumFile, + Title: "Produces a hash for a single file.", + Help: `Produces a hash for a single file using the hash named. + +This takes the following parameters: + +- fs - a remote name string e.g. "drive:" +- remote - a path within that remote e.g. "file.txt" +- hashType - type of hash to be used +- download - check by downloading rather than with hash (boolean) +- base64 - output the hashes in base64 rather than hex (boolean) + +If you supply the download flag, it will download the data from the +remote and create the hash on the fly. This can be useful for remotes +that don't support the given hash or if you really want to read all +the data. + +Returns: + +- hash - hash for the file +- hashType - type of hash used + +Example: + + $ rclone rc --loopback operations/hashsumfile fs=/ remote=/bin/bash hashType=MD5 download=true base64=true + { + "hashType": "md5", + "hash": "MDMw-fG2YXs7Uz5Nz-H68A==" + } + +See the [hashsum](/commands/rclone_hashsum/) command for more information on the above. +`, + }) +} + +// Hashsum a file +func rcHashsumFile(ctx context.Context, in rc.Params) (out rc.Params, err error) { + f, remote, err := rc.GetFsAndRemote(ctx, in) + if err != nil { + return nil, err + } + download, base64, ht, err := parseHashParameters(in) + if err != nil { + return out, err + } + o, err := f.NewObject(ctx, remote) + if err != nil { + return nil, err + } + sum, err := HashSum(ctx, ht, base64, download, o) + out = rc.Params{ + "hashType": ht.String(), + "hash": sum, + } + return out, err +} diff --git a/fs/operations/rc_test.go b/fs/operations/rc_test.go index f8b3cb6f3d23c..04357fb72418b 100644 --- a/fs/operations/rc_test.go +++ b/fs/operations/rc_test.go @@ -840,7 +840,7 @@ func TestRcHashsum(t *testing.T) { } // operations/hashsum: hashsum a single file -func TestRcHashsumFile(t *testing.T) { +func TestRcHashsumSingleFile(t *testing.T) { ctx := context.Background() r, call := rcNewRun(t, "operations/hashsum") r.Mkdir(ctx, r.Fremote) @@ -866,3 +866,27 @@ func TestRcHashsumFile(t *testing.T) { assert.Equal(t, "md5", out["hashType"]) assert.Equal(t, []string{"0ef726ce9b1a7692357ff70dd321d595 hashsum-file1"}, out["hashsum"]) } + +// operations/hashsumfile: hashsum a single file +func TestRcHashsumFile(t *testing.T) { + ctx := context.Background() + r, call := rcNewRun(t, "operations/hashsumfile") + r.Mkdir(ctx, r.Fremote) + + file1Contents := "file1 contents" + file1 := r.WriteBoth(ctx, "hashsumfile-file1", file1Contents, t1) + r.CheckLocalItems(t, file1) + r.CheckRemoteItems(t, file1) + + in := rc.Params{ + "fs": r.FremoteName, + "remote": file1.Path, + "hashType": "MD5", + "download": true, + } + + out, err := call.Fn(ctx, in) + require.NoError(t, err) + assert.Equal(t, "md5", out["hashType"]) + assert.Equal(t, "0ef726ce9b1a7692357ff70dd321d595", out["hash"]) +} From d23751627990ddf70ce4c1d237686210091ee690 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 14 Jan 2026 15:31:46 +0000 Subject: [PATCH 120/130] uptobox: remove backend as service is no longer available Uptobox was shutdown in September 2023 and does not appear to be returning. --- backend/all/all.go | 1 - backend/uptobox/api/types.go | 171 ----- backend/uptobox/uptobox.go | 1087 ------------------------------- backend/uptobox/uptobox_test.go | 21 - bin/make_manual.py | 1 - docs/content/_index.md | 1 - docs/content/commands/rclone.md | 4 - docs/content/docs.md | 1 - docs/content/flags.md | 4 - docs/content/overview.md | 2 - docs/content/uptobox.md | 179 ----- docs/layouts/chrome/navbar.html | 1 - fstest/test_all/config.yaml | 5 - 13 files changed, 1478 deletions(-) delete mode 100644 backend/uptobox/api/types.go delete mode 100644 backend/uptobox/uptobox.go delete mode 100644 backend/uptobox/uptobox_test.go delete mode 100644 docs/content/uptobox.md diff --git a/backend/all/all.go b/backend/all/all.go index 1a3c3d37c19f9..493d7dadc1a94 100644 --- a/backend/all/all.go +++ b/backend/all/all.go @@ -66,7 +66,6 @@ import ( _ "github.com/rclone/rclone/backend/swift" _ "github.com/rclone/rclone/backend/ulozto" _ "github.com/rclone/rclone/backend/union" - _ "github.com/rclone/rclone/backend/uptobox" _ "github.com/rclone/rclone/backend/webdav" _ "github.com/rclone/rclone/backend/yandex" _ "github.com/rclone/rclone/backend/zoho" diff --git a/backend/uptobox/api/types.go b/backend/uptobox/api/types.go deleted file mode 100644 index 8cf1977546f44..0000000000000 --- a/backend/uptobox/api/types.go +++ /dev/null @@ -1,171 +0,0 @@ -// Package api provides types used by the Uptobox API. -package api - -import "fmt" - -// Error contains the error code and message returned by the API -type Error struct { - Success bool `json:"success,omitempty"` - StatusCode int `json:"statusCode,omitempty"` - Message string `json:"message,omitempty"` - Data string `json:"data,omitempty"` -} - -// Error returns a string for the error and satisfies the error interface -func (e Error) Error() string { - out := fmt.Sprintf("api error %d", e.StatusCode) - if e.Message != "" { - out += ": " + e.Message - } - if e.Data != "" { - out += ": " + e.Data - } - return out -} - -// FolderEntry represents a Uptobox subfolder when listing folder contents -type FolderEntry struct { - FolderID uint64 `json:"fld_id"` - Description string `json:"fld_descr"` - Password string `json:"fld_password"` - FullPath string `json:"fullPath"` - Path string `json:"fld_name"` - Name string `json:"name"` - Hash string `json:"hash"` -} - -// FolderInfo represents the current folder when listing folder contents -type FolderInfo struct { - FolderID uint64 `json:"fld_id"` - Hash string `json:"hash"` - FileCount uint64 `json:"fileCount"` - TotalFileSize int64 `json:"totalFileSize"` -} - -// FileInfo represents a file when listing folder contents -type FileInfo struct { - Name string `json:"file_name"` - Description string `json:"file_descr"` - Created string `json:"file_created"` - Size int64 `json:"file_size"` - Downloads uint64 `json:"file_downloads"` - Code string `json:"file_code"` - Password string `json:"file_password"` - Public int `json:"file_public"` - LastDownload string `json:"file_last_download"` - ID uint64 `json:"id"` -} - -// ReadMetadataResponse is the response when listing folder contents -type ReadMetadataResponse struct { - StatusCode int `json:"statusCode"` - Message string `json:"message"` - Data struct { - CurrentFolder FolderInfo `json:"currentFolder"` - Folders []FolderEntry `json:"folders"` - Files []FileInfo `json:"files"` - PageCount int `json:"pageCount"` - TotalFileCount int `json:"totalFileCount"` - TotalFileSize int64 `json:"totalFileSize"` - } `json:"data"` -} - -// UploadInfo is the response when initiating an upload -type UploadInfo struct { - StatusCode int `json:"statusCode"` - Message string `json:"message"` - Data struct { - UploadLink string `json:"uploadLink"` - MaxUpload string `json:"maxUpload"` - } `json:"data"` -} - -// UploadResponse is the response to a successful upload -type UploadResponse struct { - Files []struct { - Name string `json:"name"` - Size int64 `json:"size"` - URL string `json:"url"` - DeleteURL string `json:"deleteUrl"` - } `json:"files"` -} - -// UpdateResponse is a generic response to various action on files (rename/copy/move) -type UpdateResponse struct { - Message string `json:"message"` - StatusCode int `json:"statusCode"` -} - -// Download is the response when requesting a download link -type Download struct { - StatusCode int `json:"statusCode"` - Message string `json:"message"` - Data struct { - DownloadLink string `json:"dlLink"` - } `json:"data"` -} - -// MetadataRequestOptions represents all the options when listing folder contents -type MetadataRequestOptions struct { - Limit uint64 - Offset uint64 - SearchField string - Search string -} - -// CreateFolderRequest is used for creating a folder -type CreateFolderRequest struct { - Token string `json:"token"` - Path string `json:"path"` - Name string `json:"name"` -} - -// DeleteFolderRequest is used for deleting a folder -type DeleteFolderRequest struct { - Token string `json:"token"` - FolderID uint64 `json:"fld_id"` -} - -// CopyMoveFileRequest is used for moving/copying a file -type CopyMoveFileRequest struct { - Token string `json:"token"` - FileCodes string `json:"file_codes"` - DestinationFolderID uint64 `json:"destination_fld_id"` - Action string `json:"action"` -} - -// MoveFolderRequest is used for moving a folder -type MoveFolderRequest struct { - Token string `json:"token"` - FolderID uint64 `json:"fld_id"` - DestinationFolderID uint64 `json:"destination_fld_id"` - Action string `json:"action"` -} - -// RenameFolderRequest is used for renaming a folder -type RenameFolderRequest struct { - Token string `json:"token"` - FolderID uint64 `json:"fld_id"` - NewName string `json:"new_name"` -} - -// UpdateFileInformation is used for renaming a file -type UpdateFileInformation struct { - Token string `json:"token"` - FileCode string `json:"file_code"` - NewName string `json:"new_name,omitempty"` - Description string `json:"description,omitempty"` - Password string `json:"password,omitempty"` - Public string `json:"public,omitempty"` -} - -// RemoveFileRequest is used for deleting a file -type RemoveFileRequest struct { - Token string `json:"token"` - FileCodes string `json:"file_codes"` -} - -// Token represents the authentication token -type Token struct { - Token string `json:"token"` -} diff --git a/backend/uptobox/uptobox.go b/backend/uptobox/uptobox.go deleted file mode 100644 index ee13d0c672669..0000000000000 --- a/backend/uptobox/uptobox.go +++ /dev/null @@ -1,1087 +0,0 @@ -// Package uptobox provides an interface to the Uptobox storage system. -package uptobox - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "net/url" - "path" - "regexp" - "strconv" - "strings" - "time" - - "github.com/rclone/rclone/backend/uptobox/api" - "github.com/rclone/rclone/fs" - "github.com/rclone/rclone/fs/config" - "github.com/rclone/rclone/fs/config/configmap" - "github.com/rclone/rclone/fs/config/configstruct" - "github.com/rclone/rclone/fs/fserrors" - "github.com/rclone/rclone/fs/fshttp" - "github.com/rclone/rclone/fs/hash" - "github.com/rclone/rclone/lib/encoder" - "github.com/rclone/rclone/lib/pacer" - "github.com/rclone/rclone/lib/random" - "github.com/rclone/rclone/lib/rest" -) - -const ( - apiBaseURL = "https://uptobox.com/api" - minSleep = 400 * time.Millisecond // api is extremely rate limited now - maxSleep = 5 * time.Second - decayConstant = 2 // bigger for slower decay, exponential - attackConstant = 0 // start with max sleep -) - -func init() { - fs.Register(&fs.RegInfo{ - Name: "uptobox", - Description: "Uptobox", - NewFs: NewFs, - Options: []fs.Option{{ - Help: "Your access token.\n\nGet it from https://uptobox.com/my_account.", - Name: "access_token", - Sensitive: true, - }, { - Help: "Set to make uploaded files private", - Name: "private", - Advanced: true, - Default: false, - }, { - Name: config.ConfigEncoding, - Help: config.ConfigEncodingHelp, - Advanced: true, - // maxFileLength = 255 - Default: (encoder.Display | - encoder.EncodeBackQuote | - encoder.EncodeDoubleQuote | - encoder.EncodeLtGt | - encoder.EncodeLeftSpace | - encoder.EncodeInvalidUtf8), - }}, - }) -} - -// Options defines the configuration for this backend -type Options struct { - AccessToken string `config:"access_token"` - Private bool `config:"private"` - Enc encoder.MultiEncoder `config:"encoding"` -} - -// Fs is the interface a cloud storage system must provide -type Fs struct { - root string - name string - opt Options - features *fs.Features - srv *rest.Client - pacer *fs.Pacer - IDRegexp *regexp.Regexp - public string // "0" to make objects private -} - -// Object represents an Uptobox object -type Object struct { - fs *Fs // what this object is part of - remote string // The remote path - hasMetaData bool // whether info below has been set - size int64 // Bytes in the object - // modTime time.Time // Modified time of the object - code string -} - -// Name of the remote (as passed into NewFs) -func (f *Fs) Name() string { - return f.name -} - -// Root of the remote (as passed into NewFs) -func (f *Fs) Root() string { - return f.root -} - -// String returns a description of the FS -func (f *Fs) String() string { - return fmt.Sprintf("Uptobox root '%s'", f.root) -} - -// Precision of the ModTimes in this Fs -func (f *Fs) Precision() time.Duration { - return fs.ModTimeNotSupported -} - -// Hashes returns the supported hash types of the filesystem -func (f *Fs) Hashes() hash.Set { - return hash.Set(hash.None) -} - -// Features returns the optional features of this Fs -func (f *Fs) Features() *fs.Features { - return f.features -} - -// retryErrorCodes is a slice of error codes that we will retry -var retryErrorCodes = []int{ - 429, // Too Many Requests. - 500, // Internal Server Error - 502, // Bad Gateway - 503, // Service Unavailable - 504, // Gateway Timeout - 509, // Bandwidth Limit Exceeded -} - -// shouldRetry returns a boolean as to whether this resp and err -// deserve to be retried. It returns the err as a convenience -func shouldRetry(ctx context.Context, resp *http.Response, err error) (bool, error) { - if fserrors.ContextError(ctx, &err) { - return false, err - } - return fserrors.ShouldRetry(err) || fserrors.ShouldRetryHTTP(resp, retryErrorCodes), err -} - -// dirPath returns an escaped file path (f.root, file) -func (f *Fs) dirPath(file string) string { - //return path.Join(f.diskRoot, file) - if file == "" || file == "." { - return "//" + f.root - } - return "//" + path.Join(f.root, file) -} - -// returns the full path based on root and the last element -func (f *Fs) splitPathFull(pth string) (string, string) { - fullPath := strings.Trim(path.Join(f.root, pth), "/") - - i := len(fullPath) - 1 - for i >= 0 && fullPath[i] != '/' { - i-- - } - - if i < 0 { - return "//" + fullPath[:i+1], fullPath[i+1:] - } - - // do not include the / at the split - return "//" + fullPath[:i], fullPath[i+1:] -} - -// splitPath is modified splitPath version that doesn't include the separator -// in the base path -func (f *Fs) splitPath(pth string) (string, string) { - // chop of any leading or trailing '/' - pth = strings.Trim(pth, "/") - - i := len(pth) - 1 - for i >= 0 && pth[i] != '/' { - i-- - } - - if i < 0 { - return pth[:i+1], pth[i+1:] - } - return pth[:i], pth[i+1:] -} - -// NewFs makes a new Fs object from the path -// -// The path is of the form remote:path -// -// Remotes are looked up in the config file. If the remote isn't -// found then NotFoundInConfigFile will be returned. -// -// On Windows avoid single character remote names as they can be mixed -// up with drive letters. -func NewFs(ctx context.Context, name string, root string, config configmap.Mapper) (fs.Fs, error) { - opt := new(Options) - err := configstruct.Set(config, opt) - if err != nil { - return nil, err - } - - f := &Fs{ - name: name, - root: root, - opt: *opt, - pacer: fs.NewPacer(ctx, pacer.NewDefault(pacer.MinSleep(minSleep), pacer.MaxSleep(maxSleep), pacer.DecayConstant(decayConstant), pacer.AttackConstant(attackConstant))), - } - if root == "/" || root == "." { - f.root = "" - } else { - f.root = root - } - f.features = (&fs.Features{ - DuplicateFiles: true, - CanHaveEmptyDirectories: true, - ReadMimeType: false, - }).Fill(ctx, f) - if f.opt.Private { - f.public = "0" - } - - client := fshttp.NewClient(ctx) - f.srv = rest.NewClient(client).SetRoot(apiBaseURL) - f.IDRegexp = regexp.MustCompile(`^https://uptobox\.com/([a-zA-Z0-9]+)`) - - _, err = f.readMetaDataForPath(ctx, f.dirPath(""), &api.MetadataRequestOptions{Limit: 10}) - if err != nil { - if _, ok := err.(api.Error); !ok { - return nil, err - } - // assume it's a file than - oldRoot := f.root - rootDir, file := f.splitPath(root) - f.root = rootDir - _, err = f.NewObject(ctx, file) - if err == nil { - return f, fs.ErrorIsFile - } - f.root = oldRoot - } - - return f, nil -} - -func (f *Fs) decodeError(resp *http.Response, response any) (err error) { - defer fs.CheckClose(resp.Body, &err) - - body, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - // try to unmarshal into correct structure - err = json.Unmarshal(body, response) - if err == nil { - return nil - } - // try to unmarshal into Error - var apiErr api.Error - err = json.Unmarshal(body, &apiErr) - if err != nil { - return err - } - return apiErr -} - -func (f *Fs) readMetaDataForPath(ctx context.Context, path string, options *api.MetadataRequestOptions) (*api.ReadMetadataResponse, error) { - opts := rest.Opts{ - Method: "GET", - Path: "/user/files", - Parameters: url.Values{ - "token": []string{f.opt.AccessToken}, - "path": []string{f.opt.Enc.FromStandardPath(path)}, - "limit": []string{strconv.FormatUint(options.Limit, 10)}, - }, - } - - if options.Offset != 0 { - opts.Parameters.Set("offset", strconv.FormatUint(options.Offset, 10)) - } - - var err error - var info api.ReadMetadataResponse - var resp *http.Response - err = f.pacer.Call(func() (bool, error) { - resp, err = f.srv.Call(ctx, &opts) - return shouldRetry(ctx, resp, err) - }) - if err != nil { - return nil, err - } - - err = f.decodeError(resp, &info) - if err != nil { - return nil, err - } - - if info.StatusCode != 0 { - return nil, errors.New(info.Message) - } - - return &info, nil -} - -// List the objects and directories in dir into entries. The -// entries can be returned in any order but should be for a -// complete directory. -// -// dir should be "" to list the root, and should not have -// trailing slashes. -// -// This should return ErrDirNotFound if the directory isn't -// found. -func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err error) { - root := f.dirPath(dir) - - var limit uint64 = 100 // max number of objects per request - 100 seems to be the maximum the api accepts - var page uint64 = 1 - var offset uint64 // for the next page of requests - - for { - opts := &api.MetadataRequestOptions{ - Limit: limit, - Offset: offset, - } - - info, err := f.readMetaDataForPath(ctx, root, opts) - if err != nil { - if apiErr, ok := err.(api.Error); ok { - // might indicate other errors but we can probably assume not found here - if apiErr.StatusCode == 1 { - return nil, fs.ErrorDirNotFound - } - } - return nil, err - } - - for _, item := range info.Data.Files { - remote := path.Join(dir, f.opt.Enc.ToStandardName(item.Name)) - o, err := f.newObjectWithInfo(ctx, remote, &item) - if err != nil { - continue - } - entries = append(entries, o) - } - - // folders are always listed entirely on every page grr. - if page == 1 { - for _, item := range info.Data.Folders { - remote := path.Join(dir, f.opt.Enc.ToStandardName(item.Name)) - d := fs.NewDir(remote, time.Time{}).SetID(strconv.FormatUint(item.FolderID, 10)) - entries = append(entries, d) - } - } - - //offset for the next page of items - page++ - offset += limit - //check if we reached end of list - if page > uint64(info.Data.PageCount) { - break - } - } - return entries, nil -} - -// Return an Object from a path -// -// If it can't be found it returns the error fs.ErrorObjectNotFound. -func (f *Fs) newObjectWithInfo(ctx context.Context, remote string, info *api.FileInfo) (fs.Object, error) { - o := &Object{ - fs: f, - remote: remote, - size: info.Size, - code: info.Code, - hasMetaData: true, - } - return o, nil -} - -// NewObject finds the Object at remote. If it can't be found it -// returns the error fs.ErrorObjectNotFound. -func (f *Fs) NewObject(ctx context.Context, remote string) (fs.Object, error) { - // no way to directly access an object by path so we have to list the parent dir - entries, err := f.List(ctx, path.Dir(remote)) - if err != nil { - // need to change error type - // if the parent dir doesn't exist the object doesn't exist either - if err == fs.ErrorDirNotFound { - return nil, fs.ErrorObjectNotFound - } - return nil, err - } - for _, entry := range entries { - if o, ok := entry.(fs.Object); ok { - if o.Remote() == remote { - return o, nil - } - } - } - return nil, fs.ErrorObjectNotFound -} - -func (f *Fs) uploadFile(ctx context.Context, in io.Reader, size int64, filename string, uploadURL string, options ...fs.OpenOption) (*api.UploadResponse, error) { - opts := rest.Opts{ - Method: "POST", - RootURL: "https:" + uploadURL, - Body: in, - ContentLength: &size, - Options: options, - MultipartContentName: "files", - MultipartFileName: filename, - } - - var err error - var resp *http.Response - var ul api.UploadResponse - err = f.pacer.CallNoRetry(func() (bool, error) { - resp, err = f.srv.CallJSON(ctx, &opts, nil, &ul) - return shouldRetry(ctx, resp, err) - }) - if err != nil { - return nil, fmt.Errorf("couldn't upload file: %w", err) - } - return &ul, nil -} - -// dstPath starts from root and includes // -func (f *Fs) move(ctx context.Context, dstPath string, fileID string) (err error) { - meta, err := f.readMetaDataForPath(ctx, dstPath, &api.MetadataRequestOptions{Limit: 10}) - if err != nil { - return err - } - - opts := rest.Opts{ - Method: "PATCH", - Path: "/user/files", - } - mv := api.CopyMoveFileRequest{ - Token: f.opt.AccessToken, - FileCodes: fileID, - DestinationFolderID: meta.Data.CurrentFolder.FolderID, - Action: "move", - } - - var resp *http.Response - var info api.UpdateResponse - err = f.pacer.Call(func() (bool, error) { - resp, err = f.srv.CallJSON(ctx, &opts, &mv, &info) - return shouldRetry(ctx, resp, err) - }) - if err != nil { - return fmt.Errorf("couldn't move file: %w", err) - } - if info.StatusCode != 0 { - return fmt.Errorf("move: api error: %d - %s", info.StatusCode, info.Message) - } - return err -} - -// updateFileInformation set's various file attributes most importantly it's name -func (f *Fs) updateFileInformation(ctx context.Context, update *api.UpdateFileInformation) (err error) { - opts := rest.Opts{ - Method: "PATCH", - Path: "/user/files", - } - - var resp *http.Response - var info api.UpdateResponse - err = f.pacer.Call(func() (bool, error) { - resp, err = f.srv.CallJSON(ctx, &opts, update, &info) - return shouldRetry(ctx, resp, err) - }) - if err != nil { - return fmt.Errorf("couldn't update file info: %w", err) - } - if info.StatusCode != 0 { - return fmt.Errorf("updateFileInfo: api error: %d - %s", info.StatusCode, info.Message) - } - return err -} - -func (f *Fs) putUnchecked(ctx context.Context, in io.Reader, remote string, size int64, options ...fs.OpenOption) error { - if size > int64(200e9) { // max size 200GB - return errors.New("file too big, can't upload") - } else if size == 0 { - return fs.ErrorCantUploadEmptyFiles - } - // yes it does take 4 requests if we're uploading to root and 6+ if we're uploading to any subdir :( - - // create upload request - opts := rest.Opts{ - Method: "GET", - Path: "/upload", - } - token := api.Token{ - Token: f.opt.AccessToken, - } - var info api.UploadInfo - err := f.pacer.Call(func() (bool, error) { - resp, err := f.srv.CallJSON(ctx, &opts, &token, &info) - return shouldRetry(ctx, resp, err) - }) - if err != nil { - return err - } - if info.StatusCode != 0 { - return fmt.Errorf("putUnchecked api error: %d - %s", info.StatusCode, info.Message) - } - // we need to have a safe name for the upload to work - tmpName := "rcloneTemp" + random.String(8) - upload, err := f.uploadFile(ctx, in, size, tmpName, info.Data.UploadLink, options...) - if err != nil { - return err - } - if len(upload.Files) != 1 { - return errors.New("upload unexpected response") - } - match := f.IDRegexp.FindStringSubmatch(upload.Files[0].URL) - - // move file to destination folder - base, leaf := f.splitPath(remote) - fullBase := f.dirPath(base) - - if fullBase != "//" { - // make all the parent folders - err = f.Mkdir(ctx, base) - if err != nil { - // this might need some more error handling. if any of the following requests fail - // we'll leave an orphaned temporary file floating around somewhere - // they rarely fail though - return err - } - - err = f.move(ctx, fullBase, match[1]) - if err != nil { - return err - } - } - - // rename file to final name - err = f.updateFileInformation(ctx, &api.UpdateFileInformation{ - Token: f.opt.AccessToken, - FileCode: match[1], - NewName: f.opt.Enc.FromStandardName(leaf), - Public: f.public, - }) - if err != nil { - return err - } - - return nil -} - -// Put in to the remote path with the modTime given of the given size -// -// When called from outside an Fs by rclone, src.Size() will always be >= 0. -// But for unknown-sized objects (indicated by src.Size() == -1), Put should either -// return an error or upload it properly (rather than e.g. calling panic). -// -// May create the object even if it returns an error - if so -// will return the object and the error, otherwise will return -// nil and the error -func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { - existingObj, err := f.NewObject(ctx, src.Remote()) - switch err { - case nil: - return existingObj, existingObj.Update(ctx, in, src, options...) - case fs.ErrorObjectNotFound: - // Not found so create it - return f.PutUnchecked(ctx, in, src, options...) - default: - return nil, err - } -} - -// PutUnchecked uploads the object -// -// This will create a duplicate if we upload a new file without -// checking to see if there is one already - use Put() for that. -func (f *Fs) PutUnchecked(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { - err := f.putUnchecked(ctx, in, src.Remote(), src.Size(), options...) - if err != nil { - return nil, err - } - return f.NewObject(ctx, src.Remote()) -} - -// CreateDir dir creates a directory with the given parent path -// base starts from root and may or may not include // -func (f *Fs) CreateDir(ctx context.Context, base string, leaf string) (err error) { - base = "//" + strings.Trim(base, "/") - - var resp *http.Response - var apiErr api.Error - opts := rest.Opts{ - Method: "PUT", - Path: "/user/files", - } - mkdir := api.CreateFolderRequest{ - Name: f.opt.Enc.FromStandardName(leaf), - Path: f.opt.Enc.FromStandardPath(base), - Token: f.opt.AccessToken, - } - err = f.pacer.Call(func() (bool, error) { - resp, err = f.srv.CallJSON(ctx, &opts, &mkdir, &apiErr) - return shouldRetry(ctx, resp, err) - }) - if err != nil { - return err - } - // checking if the dir exists beforehand would be slower so we'll just ignore the error here - if apiErr.StatusCode != 0 && !strings.Contains(apiErr.Data, "already exists") { - return apiErr - } - return nil -} - -func (f *Fs) mkDirs(ctx context.Context, path string) (err error) { - // chop of any leading or trailing slashes - dirs := strings.Split(path, "/") - var base = "" - for _, element := range dirs { - // create every dir one by one - if element != "" { - err = f.CreateDir(ctx, base, element) - if err != nil { - return err - } - base += "/" + element - } - } - return nil -} - -// Mkdir makes the directory (container, bucket) -// -// Shouldn't return an error if it already exists -func (f *Fs) Mkdir(ctx context.Context, dir string) (err error) { - if dir == "" || dir == "." { - return f.mkDirs(ctx, f.root) - } - return f.mkDirs(ctx, path.Join(f.root, dir)) -} - -// may or may not delete folders with contents? -func (f *Fs) purge(ctx context.Context, folderID uint64) (err error) { - var resp *http.Response - var apiErr api.Error - opts := rest.Opts{ - Method: "DELETE", - Path: "/user/files", - } - rm := api.DeleteFolderRequest{ - FolderID: folderID, - Token: f.opt.AccessToken, - } - err = f.pacer.Call(func() (bool, error) { - resp, err = f.srv.CallJSON(ctx, &opts, &rm, &apiErr) - return shouldRetry(ctx, resp, err) - }) - if err != nil { - return err - } - if apiErr.StatusCode != 0 { - return apiErr - } - return nil -} - -// Rmdir removes the directory (container, bucket) if empty -// -// Return an error if it doesn't exist or isn't empty -func (f *Fs) Rmdir(ctx context.Context, dir string) error { - info, err := f.readMetaDataForPath(ctx, f.dirPath(dir), &api.MetadataRequestOptions{Limit: 10}) - if err != nil { - return err - } - if len(info.Data.Folders) > 0 || len(info.Data.Files) > 0 { - return fs.ErrorDirectoryNotEmpty - } - - return f.purge(ctx, info.Data.CurrentFolder.FolderID) -} - -// Move src to this remote using server side move operations. -func (f *Fs) Move(ctx context.Context, src fs.Object, remote string) (fs.Object, error) { - srcObj, ok := src.(*Object) - if !ok { - fs.Debugf(src, "Can't move - not same remote type") - return nil, fs.ErrorCantMove - } - - srcBase, srcLeaf := srcObj.fs.splitPathFull(src.Remote()) - dstBase, dstLeaf := f.splitPathFull(remote) - - needRename := srcLeaf != dstLeaf - needMove := srcBase != dstBase - - // do the move if required - if needMove { - err := f.mkDirs(ctx, strings.Trim(dstBase, "/")) - if err != nil { - return nil, fmt.Errorf("move: failed to make destination dirs: %w", err) - } - - err = f.move(ctx, dstBase, srcObj.code) - if err != nil { - return nil, err - } - } - - // rename to final name if we need to - if needRename { - err := f.updateFileInformation(ctx, &api.UpdateFileInformation{ - Token: f.opt.AccessToken, - FileCode: srcObj.code, - NewName: f.opt.Enc.FromStandardName(dstLeaf), - Public: f.public, - }) - if err != nil { - return nil, fmt.Errorf("move: failed final rename: %w", err) - } - } - - // copy the old object and apply the changes - newObj := *srcObj - newObj.remote = remote - newObj.fs = f - return &newObj, nil -} - -// renameDir renames a directory -func (f *Fs) renameDir(ctx context.Context, folderID uint64, newName string) (err error) { - var resp *http.Response - var apiErr api.Error - opts := rest.Opts{ - Method: "PATCH", - Path: "/user/files", - } - rename := api.RenameFolderRequest{ - Token: f.opt.AccessToken, - FolderID: folderID, - NewName: newName, - } - err = f.pacer.Call(func() (bool, error) { - resp, err = f.srv.CallJSON(ctx, &opts, &rename, &apiErr) - return shouldRetry(ctx, resp, err) - }) - if err != nil { - return err - } - if apiErr.StatusCode != 0 { - return apiErr - } - return nil -} - -// DirMove moves src, srcRemote to this remote at dstRemote -// using server-side move operations. -// -// Will only be called if src.Fs().Name() == f.Name() -// -// If it isn't possible then return fs.ErrorCantDirMove -// -// If destination exists then return fs.ErrorDirExists -func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string) error { - srcFs, ok := src.(*Fs) - if !ok { - fs.Debugf(srcFs, "Can't move directory - not same remote type") - return fs.ErrorCantDirMove - } - - // find out source - srcPath := srcFs.dirPath(srcRemote) - srcInfo, err := f.readMetaDataForPath(ctx, srcPath, &api.MetadataRequestOptions{Limit: 1}) - if err != nil { - return fmt.Errorf("dirmove: source not found: %w", err) - } - // check if the destination already exists - dstPath := f.dirPath(dstRemote) - _, err = f.readMetaDataForPath(ctx, dstPath, &api.MetadataRequestOptions{Limit: 1}) - if err == nil { - return fs.ErrorDirExists - } - - // make the destination parent path - dstBase, dstName := f.splitPathFull(dstRemote) - err = f.mkDirs(ctx, strings.Trim(dstBase, "/")) - if err != nil { - return fmt.Errorf("dirmove: failed to create dirs: %w", err) - } - - // find the destination parent dir - dstInfo, err := f.readMetaDataForPath(ctx, dstBase, &api.MetadataRequestOptions{Limit: 1}) - if err != nil { - return fmt.Errorf("dirmove: failed to read destination: %w", err) - } - srcBase, srcName := srcFs.splitPathFull(srcRemote) - - needRename := srcName != dstName - needMove := srcBase != dstBase - - // if we have to rename we'll have to use a temporary name since - // there could already be a directory with the same name as the src directory - if needRename { - // rename to a temporary name - tmpName := "rcloneTemp" + random.String(8) - err = f.renameDir(ctx, srcInfo.Data.CurrentFolder.FolderID, tmpName) - if err != nil { - return fmt.Errorf("dirmove: failed initial rename: %w", err) - } - } - - // do the move - if needMove { - opts := rest.Opts{ - Method: "PATCH", - Path: "/user/files", - } - move := api.MoveFolderRequest{ - Token: f.opt.AccessToken, - FolderID: srcInfo.Data.CurrentFolder.FolderID, - DestinationFolderID: dstInfo.Data.CurrentFolder.FolderID, - Action: "move", - } - var resp *http.Response - var apiErr api.Error - err = f.pacer.Call(func() (bool, error) { - resp, err = f.srv.CallJSON(ctx, &opts, &move, &apiErr) - return shouldRetry(ctx, resp, err) - }) - if err != nil { - return fmt.Errorf("dirmove: failed to move: %w", err) - } - if apiErr.StatusCode != 0 { - return apiErr - } - } - - // rename to final name - if needRename { - err = f.renameDir(ctx, srcInfo.Data.CurrentFolder.FolderID, dstName) - if err != nil { - return fmt.Errorf("dirmove: failed final rename: %w", err) - } - } - return nil -} - -func (f *Fs) copy(ctx context.Context, dstPath string, fileID string) (err error) { - meta, err := f.readMetaDataForPath(ctx, dstPath, &api.MetadataRequestOptions{Limit: 10}) - if err != nil { - return err - } - - opts := rest.Opts{ - Method: "PATCH", - Path: "/user/files", - } - cp := api.CopyMoveFileRequest{ - Token: f.opt.AccessToken, - FileCodes: fileID, - DestinationFolderID: meta.Data.CurrentFolder.FolderID, - Action: "copy", - } - - var resp *http.Response - var info api.UpdateResponse - err = f.pacer.Call(func() (bool, error) { - resp, err = f.srv.CallJSON(ctx, &opts, &cp, &info) - return shouldRetry(ctx, resp, err) - }) - if err != nil { - return fmt.Errorf("couldn't copy file: %w", err) - } - if info.StatusCode != 0 { - return fmt.Errorf("copy: api error: %d - %s", info.StatusCode, info.Message) - } - return err -} - -// Copy src to this remote using server side move operations. -func (f *Fs) Copy(ctx context.Context, src fs.Object, remote string) (fs.Object, error) { - srcObj, ok := src.(*Object) - if !ok { - fs.Debugf(src, "Can't copy - not same remote type") - return nil, fs.ErrorCantMove - } - - _, srcLeaf := f.splitPath(src.Remote()) - dstBase, dstLeaf := f.splitPath(remote) - - needRename := srcLeaf != dstLeaf - - err := f.mkDirs(ctx, path.Join(f.root, dstBase)) - if err != nil { - return nil, fmt.Errorf("copy: failed to make destination dirs: %w", err) - } - - err = f.copy(ctx, f.dirPath(dstBase), srcObj.code) - if err != nil { - return nil, err - } - - newObj, err := f.NewObject(ctx, path.Join(dstBase, srcLeaf)) - if err != nil { - return nil, fmt.Errorf("copy: couldn't find copied object: %w", err) - } - - if needRename { - err := f.updateFileInformation(ctx, &api.UpdateFileInformation{ - Token: f.opt.AccessToken, - FileCode: newObj.(*Object).code, - NewName: f.opt.Enc.FromStandardName(dstLeaf), - Public: f.public, - }) - if err != nil { - return nil, fmt.Errorf("copy: failed final rename: %w", err) - } - newObj.(*Object).remote = remote - } - - return newObj, nil -} - -// ------------------------------------------------------------ - -// Fs returns the parent Fs -func (o *Object) Fs() fs.Info { - return o.fs -} - -// Return a string version -func (o *Object) String() string { - if o == nil { - return "" - } - return o.remote -} - -// Remote returns the remote path -func (o *Object) Remote() string { - return o.remote -} - -// ModTime returns the modification time of the object -// -// It attempts to read the objects mtime and if that isn't present the -// LastModified returned in the http headers -func (o *Object) ModTime(ctx context.Context) time.Time { - ci := fs.GetConfig(ctx) - return time.Time(ci.DefaultTime) -} - -// Size returns the size of an object in bytes -func (o *Object) Size() int64 { - return o.size -} - -// Hash returns the Md5sum of an object returning a lowercase hex string -func (o *Object) Hash(ctx context.Context, t hash.Type) (string, error) { - return "", hash.ErrUnsupported -} - -// ID returns the ID of the Object if known, or "" if not -func (o *Object) ID() string { - return o.code -} - -// Storable returns whether this object is storable -func (o *Object) Storable() bool { - return true -} - -// SetModTime sets the modification time of the local fs object -func (o *Object) SetModTime(ctx context.Context, modTime time.Time) error { - return fs.ErrorCantSetModTime -} - -// Open an object for read -func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (in io.ReadCloser, err error) { - opts := rest.Opts{ - Method: "GET", - Path: "/link", - Parameters: url.Values{ - "token": []string{o.fs.opt.AccessToken}, - "file_code": []string{o.code}, - }, - } - var dl api.Download - var resp *http.Response - err = o.fs.pacer.Call(func() (bool, error) { - resp, err = o.fs.srv.CallJSON(ctx, &opts, nil, &dl) - return shouldRetry(ctx, resp, err) - }) - if err != nil { - return nil, fmt.Errorf("open: failed to get download link: %w", err) - } - - fs.FixRangeOption(options, o.size) - opts = rest.Opts{ - Method: "GET", - RootURL: dl.Data.DownloadLink, - Options: options, - } - - err = o.fs.pacer.Call(func() (bool, error) { - resp, err = o.fs.srv.Call(ctx, &opts) - return shouldRetry(ctx, resp, err) - }) - - if err != nil { - return nil, err - } - return resp.Body, err -} - -// Update the already existing object -// -// Copy the reader into the object updating modTime and size. -// -// The new object may have been created if an error is returned -func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error { - if src.Size() < 0 { - return errors.New("refusing to update with unknown size") - } - - // upload with new size but old name - err := o.fs.putUnchecked(ctx, in, o.Remote(), src.Size(), options...) - if err != nil { - return err - } - - // delete duplicate object after successful upload - err = o.Remove(ctx) - if err != nil { - return fmt.Errorf("failed to remove old version: %w", err) - } - - // Fetch new object after deleting the duplicate - info, err := o.fs.NewObject(ctx, o.Remote()) - if err != nil { - return err - } - - // Replace guts of old object with new one - *o = *info.(*Object) - - return nil -} - -// Remove an object -func (o *Object) Remove(ctx context.Context) error { - opts := rest.Opts{ - Method: "DELETE", - Path: "/user/files", - } - delete := api.RemoveFileRequest{ - Token: o.fs.opt.AccessToken, - FileCodes: o.code, - } - var info api.UpdateResponse - err := o.fs.pacer.Call(func() (bool, error) { - resp, err := o.fs.srv.CallJSON(ctx, &opts, &delete, &info) - return shouldRetry(ctx, resp, err) - }) - if err != nil { - return err - } - if info.StatusCode != 0 { - return fmt.Errorf("remove: api error: %d - %s", info.StatusCode, info.Message) - } - return nil -} - -// Check the interfaces are satisfied -var ( - _ fs.Fs = (*Fs)(nil) - _ fs.Copier = (*Fs)(nil) - _ fs.Mover = (*Fs)(nil) - _ fs.DirMover = (*Fs)(nil) - _ fs.Object = (*Object)(nil) -) diff --git a/backend/uptobox/uptobox_test.go b/backend/uptobox/uptobox_test.go deleted file mode 100644 index 4210b884d5b9d..0000000000000 --- a/backend/uptobox/uptobox_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// Test Uptobox filesystem interface -package uptobox_test - -import ( - "testing" - - "github.com/rclone/rclone/backend/uptobox" - "github.com/rclone/rclone/fstest" - "github.com/rclone/rclone/fstest/fstests" -) - -// TestIntegration runs integration tests against the remote -func TestIntegration(t *testing.T) { - if *fstest.RemoteName == "" { - *fstest.RemoteName = "TestUptobox:" - } - fstests.Run(t, &fstests.Opt{ - RemoteName: *fstest.RemoteName, - NilObject: (*uptobox.Object)(nil), - }) -} diff --git a/bin/make_manual.py b/bin/make_manual.py index 936a239230711..0262f1e310428 100755 --- a/bin/make_manual.py +++ b/bin/make_manual.py @@ -91,7 +91,6 @@ "storj.md", "sugarsync.md", "ulozto.md", - "uptobox.md", "union.md", "webdav.md", "yandex.md", diff --git a/docs/content/_index.md b/docs/content/_index.md index 1b3fdfb375239..0f03738005f3a 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -215,7 +215,6 @@ WebDAV or S3, that work out of the box.) {{< provider name="SugarSync" home="https://sugarsync.com/" config="/sugarsync/" >}} {{< provider name="Tencent Cloud Object Storage (COS)" home="https://intl.cloud.tencent.com/product/cos" config="/s3/#tencent-cos" >}} {{< provider name="Uloz.to" home="https://uloz.to" config="/ulozto/" >}} -{{< provider name="Uptobox" home="https://uptobox.com" config="/uptobox/" >}} {{< provider name="Wasabi" home="https://wasabi.com/" config="/s3/#wasabi" >}} {{< provider name="WebDAV" home="https://en.wikipedia.org/wiki/WebDAV" config="/webdav/" >}} {{< provider name="Yandex Disk" home="https://disk.yandex.com/" config="/yandex/" >}} diff --git a/docs/content/commands/rclone.md b/docs/content/commands/rclone.md index 8fb1e6dd30f6f..8d670c739b892 100644 --- a/docs/content/commands/rclone.md +++ b/docs/content/commands/rclone.md @@ -1015,10 +1015,6 @@ rclone [flags] --union-search-policy string Policy to choose upstream on SEARCH category (default "ff") --union-upstreams string List of space separated upstreams -u, --update Skip files that are newer on the destination - --uptobox-access-token string Your access token - --uptobox-description string Description of the remote - --uptobox-encoding Encoding The encoding for the backend (default Slash,LtGt,DoubleQuote,BackQuote,Del,Ctl,LeftSpace,InvalidUtf8,Dot) - --uptobox-private Set to make uploaded files private --use-cookies Enable session cookiejar --use-json-log Use json log format --use-mmap Use mmap allocator (see docs) diff --git a/docs/content/docs.md b/docs/content/docs.md index e71e95d2f5997..30bbb7ab5c912 100644 --- a/docs/content/docs.md +++ b/docs/content/docs.md @@ -91,7 +91,6 @@ See the following for detailed instructions for - [SugarSync](/sugarsync/) - [Union](/union/) - [Uloz.to](/ulozto/) -- [Uptobox](/uptobox/) - [WebDAV](/webdav/) - [Yandex Disk](/yandex/) - [Zoho WorkDrive](/zoho/) diff --git a/docs/content/flags.md b/docs/content/flags.md index cc3b11e0d53ba..24706dbf1aea2 100644 --- a/docs/content/flags.md +++ b/docs/content/flags.md @@ -1138,10 +1138,6 @@ Backend-only flags (these can be set in the config file also). --union-min-free-space SizeSuffix Minimum viable free space for lfs/eplfs policies (default 1Gi) --union-search-policy string Policy to choose upstream on SEARCH category (default "ff") --union-upstreams string List of space separated upstreams - --uptobox-access-token string Your access token - --uptobox-description string Description of the remote - --uptobox-encoding Encoding The encoding for the backend (default Slash,LtGt,DoubleQuote,BackQuote,Del,Ctl,LeftSpace,InvalidUtf8,Dot) - --uptobox-private Set to make uploaded files private --webdav-auth-redirect Preserve authentication on redirect --webdav-bearer-token string Bearer token instead of user/pass (e.g. a Macaroon) --webdav-bearer-token-command string Command to run to get a bearer token diff --git a/docs/content/overview.md b/docs/content/overview.md index d3bd1e534749f..a2f1f74773b5f 100644 --- a/docs/content/overview.md +++ b/docs/content/overview.md @@ -67,7 +67,6 @@ Here is an overview of the major features of each cloud storage system. | SugarSync | - | - | No | No | - | - | | Storj | - | R | No | No | - | - | | Uloz.to | MD5, SHA256 ¹³ | - | No | Yes | - | - | -| Uptobox | - | - | No | Yes | - | - | | WebDAV | MD5, SHA1 ³ | R ⁴ | Depends | No | - | - | | Yandex Disk | MD5 | R/W | No | No | R | - | | Zoho WorkDrive | - | - | No | No | - | - | @@ -560,7 +559,6 @@ upon backend-specific capabilities. | SugarSync | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | No | Yes | | Storj | Yes ² | Yes | Yes | No | No | Yes | Yes | No | Yes | No | No | | Uloz.to | No | No | Yes | Yes | No | No | No | No | No | No | Yes | -| Uptobox | No | Yes | Yes | Yes | No | No | No | No | No | No | No | | WebDAV | Yes | Yes | Yes | Yes | No | No | Yes ³ | No | No | Yes | Yes | | Yandex Disk | Yes | Yes | Yes | Yes | Yes | No | Yes | No | Yes | Yes | Yes | | Zoho WorkDrive | Yes | Yes | Yes | Yes | No | No | No | No | No | Yes | Yes | diff --git a/docs/content/uptobox.md b/docs/content/uptobox.md deleted file mode 100644 index deb08d13d74bd..0000000000000 --- a/docs/content/uptobox.md +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: "Uptobox" -description: "Rclone docs for Uptobox" -versionIntroduced: "v1.56" ---- - -# {{< icon "fa fa-archive" >}} Uptobox - -This is a Backend for Uptobox file storage service. Uptobox is closer to a -one-click hoster than a traditional cloud storage provider and therefore not -suitable for long term storage. - -Paths are specified as `remote:path` - -Paths may be as deep as required, e.g. `remote:directory/subdirectory`. - -## Configuration - -To configure an Uptobox backend you'll need your personal api token. You'll find -it in your [account settings](https://uptobox.com/my_account). - -Here is an example of how to make a remote called `remote` with the default setup. -First run: - -```console -rclone config -``` - -This will guide you through an interactive setup process: - -```text -Current remotes: - -Name Type -==== ==== -TestUptobox uptobox - -e) Edit existing remote -n) New remote -d) Delete remote -r) Rename remote -c) Copy remote -s) Set configuration password -q) Quit config -e/n/d/r/c/s/q> n -name> uptobox -Type of storage to configure. -Enter a string value. Press Enter for the default (""). -Choose a number from below, or type in your own value -[...] -37 / Uptobox - \ "uptobox" -[...] -Storage> uptobox -** See help for uptobox backend at: https://rclone.org/uptobox/ ** - -Your API Key, get it from https://uptobox.com/my_account -Enter a string value. Press Enter for the default (""). -api_key> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -Edit advanced config? (y/n) -y) Yes -n) No (default) -y/n> n -Remote config --------------------- -[uptobox] -type = uptobox -api_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --------------------- -y) Yes this is OK (default) -e) Edit this remote -d) Delete this remote -y/e/d> -``` - -Once configured you can then use `rclone` like this (replace `remote` with the -name you gave your remote): - -List directories in top level of your Uptobox - -```console -rclone lsd remote: -``` - -List all the files in your Uptobox - -```console -rclone ls remote: -``` - -To copy a local directory to an Uptobox directory called backup - -```console -rclone copy /home/source remote:backup -``` - -### Modification times and hashes - -Uptobox supports neither modified times nor checksums. All timestamps -will read as that set by `--default-time`. - -### Restricted filename characters - -In addition to the [default restricted characters set](/overview/#restricted-characters) -the following characters are also replaced: - -| Character | Value | Replacement | -| --------- |:-----:|:-----------:| -| " | 0x22 | " | -| ` | 0x41 | ` | - -Invalid UTF-8 bytes will also be [replaced](/overview/#invalid-utf8), -as they can't be used in XML strings. - - -### Standard options - -Here are the Standard options specific to uptobox (Uptobox). - -#### --uptobox-access-token - -Your access token. - -Get it from https://uptobox.com/my_account. - -Properties: - -- Config: access_token -- Env Var: RCLONE_UPTOBOX_ACCESS_TOKEN -- Type: string -- Required: false - -### Advanced options - -Here are the Advanced options specific to uptobox (Uptobox). - -#### --uptobox-private - -Set to make uploaded files private - -Properties: - -- Config: private -- Env Var: RCLONE_UPTOBOX_PRIVATE -- Type: bool -- Default: false - -#### --uptobox-encoding - -The encoding for the backend. - -See the [encoding section in the overview](/overview/#encoding) for more info. - -Properties: - -- Config: encoding -- Env Var: RCLONE_UPTOBOX_ENCODING -- Type: Encoding -- Default: Slash,LtGt,DoubleQuote,BackQuote,Del,Ctl,LeftSpace,InvalidUtf8,Dot - -#### --uptobox-description - -Description of the remote. - -Properties: - -- Config: description -- Env Var: RCLONE_UPTOBOX_DESCRIPTION -- Type: string -- Required: false - - - -## Limitations - -Uptobox will delete inactive files that have not been accessed in 60 days. - -`rclone about` is not supported by this backend an overview of used space can however -been seen in the uptobox web interface. diff --git a/docs/layouts/chrome/navbar.html b/docs/layouts/chrome/navbar.html index b17a8cc3917c0..5392dfa57e4d0 100644 --- a/docs/layouts/chrome/navbar.html +++ b/docs/layouts/chrome/navbar.html @@ -114,7 +114,6 @@ Storj SugarSync Uloz.to - Uptobox Union (merge backends) WebDAV Yandex Disk diff --git a/fstest/test_all/config.yaml b/fstest/test_all/config.yaml index 2371d4b420c38..fa20425cf31b9 100644 --- a/fstest/test_all/config.yaml +++ b/fstest/test_all/config.yaml @@ -627,11 +627,6 @@ backends: - TestSyncUTFNorm ignoretests: - cmd/gitannex - # - backend: "uptobox" - # remote: "TestUptobox:" - # fastlist: false - # ignore: - # - TestRWFileHandleWriteNoWrite - backend: "oracleobjectstorage" remote: "TestOracleObjectStorage:" fastlist: true From 058eebd3fbdbfb8439cd2a21dfbf5c9da670e4e2 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 14 Jan 2026 18:35:51 +0000 Subject: [PATCH 121/130] docs: fix use of removed rem macro --- docs/content/filen.md | 4 ++-- docs/content/shade.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/content/filen.md b/docs/content/filen.md index 4c6e2b2a19260..5697ed120648d 100644 --- a/docs/content/filen.md +++ b/docs/content/filen.md @@ -91,7 +91,7 @@ Invalid UTF-8 bytes will be [replaced](/overview/#invalid-utf8) ### API Key -{{< rem autogenerated options start" - DO NOT EDIT - instead edit fs.RegInfo in backend/filen/filen.go then run make backenddocs" >}} + ### Standard options Here are the Standard options specific to filen (Filen). @@ -241,4 +241,4 @@ Properties: - Type: string - Required: false -{{< rem autogenerated options stop >}} + diff --git a/docs/content/shade.md b/docs/content/shade.md index 82fe977ecbaaf..7735d7eeafd2b 100644 --- a/docs/content/shade.md +++ b/docs/content/shade.md @@ -97,7 +97,7 @@ Shade uses multipart uploads by default. This means that files will be chunked a Please note that when deleting files in Shade via rclone it will delete the file instantly, instead of sending it to the trash. This means that it will not be recoverable. -{{< rem autogenerated options start" - DO NOT EDIT - instead edit fs.RegInfo in backend/box/box.go then run make backenddocs" >}} + ### Standard options Here are the Standard options specific to shade (Shade FS). @@ -183,7 +183,7 @@ Properties: - Type: string - Required: false -{{< rem autogenerated options stop >}} + ## Limitations From 0202e43459f4612b940cf0cd53a583b878fb21ad Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Mon, 12 Jan 2026 06:34:53 -0600 Subject: [PATCH 122/130] internxt: update rclone-adapter to latest version to support thumbnail creation --- go.mod | 4 +++- go.sum | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index eb24d07196669..dcf9b6ec16df6 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/hanwen/go-fuse/v2 v2.9.0 github.com/henrybear327/Proton-API-Bridge v1.0.0 github.com/henrybear327/go-proton-api v1.0.0 - github.com/internxt/rclone-adapter v0.0.0-20260102144006-dbee67e2bad8 + github.com/internxt/rclone-adapter v0.0.0-20260112121928-f210b9df5a42 github.com/jcmturner/gokrb5/v8 v8.4.4 github.com/jlaffaye/ftp v0.2.1-0.20240918233326-1b970516f5d3 github.com/josephspurrier/goversioninfo v1.5.0 @@ -157,6 +157,7 @@ require ( github.com/creasty/defaults v1.8.0 // indirect github.com/cronokirby/saferith v0.33.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/disintegration/imaging v1.6.2 // indirect github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/ebitengine/purego v0.9.1 // indirect @@ -256,6 +257,7 @@ require ( go.yaml.in/yaml/v2 v2.4.3 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect + golang.org/x/image v0.32.0 // indirect golang.org/x/mod v0.29.0 // indirect golang.org/x/tools v0.38.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 // indirect diff --git a/go.sum b/go.sum index 3c8fe0a7d65f6..ba43cad661837 100644 --- a/go.sum +++ b/go.sum @@ -224,6 +224,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= +github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/diskfs/go-diskfs v1.7.0 h1:vonWmt5CMowXwUc79jWyGrf2DIMeoOjkLlMnQYGVOs8= github.com/diskfs/go-diskfs v1.7.0/go.mod h1:LhQyXqOugWFRahYUSw47NyZJPezFzB9UELwhpszLP/k= github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= @@ -422,8 +424,8 @@ github.com/henrybear327/go-proton-api v1.0.0/go.mod h1:w63MZuzufKcIZ93pwRgiOtxMX github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/internxt/rclone-adapter v0.0.0-20260102144006-dbee67e2bad8 h1:GIlDB8qFdSmY6LTP23Lk847QhV5tH/Kljymayt/4WAc= -github.com/internxt/rclone-adapter v0.0.0-20260102144006-dbee67e2bad8/go.mod h1:XZ47hBE41lE1ixntK+ZuSLnS9ZGEtc6Pba0bKIo/CbU= +github.com/internxt/rclone-adapter v0.0.0-20260112121928-f210b9df5a42 h1:+9+qWN7/X049i6Am77z8mdPkhbpb1oG2mx2LA/nGorE= +github.com/internxt/rclone-adapter v0.0.0-20260112121928-f210b9df5a42/go.mod h1:RKgfLRYCIlgMSN3iIJUB9VhP9HIN+fuw/zjlVyyRbQE= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -774,6 +776,9 @@ golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2 golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.32.0 h1:6lZQWq75h7L5IWNk0r+SCpUJ6tUVd3v4ZHnbRKLkUDQ= +golang.org/x/image v0.32.0/go.mod h1:/R37rrQmKXtO6tYXAjtDLwQgFLHmhW+V6ayXlxzP2Pc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= From 692d4efe6f1aa37e07697dcb1669dc5b303a6f88 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Wed, 14 Jan 2026 15:23:43 -0600 Subject: [PATCH 123/130] internxt: fix temp file handling during replacement --- backend/internxt/internxt.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 5bb9bfa2b97f4..9b69257dc5c69 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -794,6 +794,13 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op // Rename existing file to backup name err = o.f.pacer.Call(func() (bool, error) { err := files.RenameFile(ctx, o.f.cfg, oldUUID, backupName, backupType) + if err != nil { + // Handle 409 Conflict: Treat as success. + var httpErr *sdkerrors.HTTPError + if errors.As(err, &httpErr) && httpErr.StatusCode() == 409 { + return false, nil + } + } return shouldRetry(ctx, err) }) if err != nil { @@ -838,6 +845,16 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op fs.Debugf(o.f, "Upload succeeded, deleting backup file %s.%s (UUID: %s)", backupName, backupType, backupUUID) err := o.f.pacer.Call(func() (bool, error) { err := files.DeleteFile(ctx, o.f.cfg, backupUUID) + if err != nil { + var httpErr *sdkerrors.HTTPError + if errors.As(err, &httpErr) { + // Treat 404 (Not Found) and 204 (No Content) as success + switch httpErr.StatusCode() { + case 404, 204: + return false, nil + } + } + } return shouldRetry(ctx, err) }) if err != nil { From 6ff118a989ec0ff49969589f6a857178984fd3ee Mon Sep 17 00:00:00 2001 From: yy Date: Mon, 19 Jan 2026 04:48:33 +0900 Subject: [PATCH 124/130] docs: fix typos in comments and messages --- backend/doi/doi.go | 2 +- backend/onedrive/onedrive.go | 2 +- backend/sftp/sftp.go | 2 +- backend/swift/swift.go | 2 +- cmd/gitannex/gitannex_test.go | 2 +- cmd/lsjson/lsjson.go | 2 +- cmd/mountlib/rc.go | 2 +- fs/config/config.go | 2 +- fs/config/configstruct/configstruct.go | 4 ++-- fs/config/crypt.go | 2 +- fs/hash/hash.go | 2 +- fs/log/log.go | 2 +- fs/sync/sync_test.go | 4 ++-- fs/types.go | 2 +- lib/pool/pool.go | 2 +- vfs/vfscache/writeback/writeback.go | 2 +- 16 files changed, 18 insertions(+), 18 deletions(-) diff --git a/backend/doi/doi.go b/backend/doi/doi.go index 2811df559a8b6..3bb898381be1d 100644 --- a/backend/doi/doi.go +++ b/backend/doi/doi.go @@ -77,7 +77,7 @@ The DOI provider can be set when rclone does not automatically recognize a suppo Name: "doi_resolver_api_url", Help: `The URL of the DOI resolver API to use. -The DOI resolver can be set for testing or for cases when the the canonical DOI resolver API cannot be used. +The DOI resolver can be set for testing or for cases when the canonical DOI resolver API cannot be used. Defaults to "https://doi.org/api".`, Required: false, diff --git a/backend/onedrive/onedrive.go b/backend/onedrive/onedrive.go index 290c592202369..b9fe4509f0f4f 100644 --- a/backend/onedrive/onedrive.go +++ b/backend/onedrive/onedrive.go @@ -403,7 +403,7 @@ This is why this flag is not set as the default. As a rule of thumb if nearly all of your data is under rclone's root directory (the |root/directory| in |onedrive:root/directory|) then -using this flag will be be a big performance win. If your data is +using this flag will be a big performance win. If your data is mostly not under the root then using this flag will be a big performance loss. diff --git a/backend/sftp/sftp.go b/backend/sftp/sftp.go index 97678c4c260e5..79fa9c2a0cbb2 100644 --- a/backend/sftp/sftp.go +++ b/backend/sftp/sftp.go @@ -1258,7 +1258,7 @@ func NewFsWithConnection(ctx context.Context, f *Fs, name string, root string, m fs.Debugf(f, "Failed to resolve path using RealPath: %v", err) cwd, err := c.sftpClient.Getwd() if err != nil { - fs.Debugf(f, "Failed to to read current directory - using relative paths: %v", err) + fs.Debugf(f, "Failed to read current directory - using relative paths: %v", err) } else { f.absRoot = path.Join(cwd, f.root) fs.Debugf(f, "Relative path joined with current directory to get absolute path %q", f.absRoot) diff --git a/backend/swift/swift.go b/backend/swift/swift.go index cf4ce9d37db7d..d15c3394412c3 100644 --- a/backend/swift/swift.go +++ b/backend/swift/swift.go @@ -54,7 +54,7 @@ var SharedOptions = []fs.Option{{ Name: "chunk_size", Help: strings.ReplaceAll(`Above this size files will be chunked. -Above this size files will be chunked into a a |`+segmentsContainerSuffix+`| container +Above this size files will be chunked into a |`+segmentsContainerSuffix+`| container or a |`+segmentsDirectory+`| directory. (See the |use_segments_container| option for more info). Default for this is 5 GiB which is its maximum value, which means only files above this size will be chunked. diff --git a/cmd/gitannex/gitannex_test.go b/cmd/gitannex/gitannex_test.go index 7a45ee522ff20..7ee7452db0461 100644 --- a/cmd/gitannex/gitannex_test.go +++ b/cmd/gitannex/gitannex_test.go @@ -341,7 +341,7 @@ func (h *testState) preconfigureServer() { // The `\\?\` prefix tells Windows APIs to pass strings unmodified to the // filesystem without additional parsing [1]. Our workaround is roughly to add // the prefix to whichever parameter doesn't have it (when the OS is Windows). -// I'm not sure this generalizes, but it works for the the kinds of inputs we're +// I'm not sure this generalizes, but it works for the kinds of inputs we're // throwing at it. // // [1]: https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#win32-file-namespaces diff --git a/cmd/lsjson/lsjson.go b/cmd/lsjson/lsjson.go index 9f2390d3eeca0..d786bd740f8a6 100644 --- a/cmd/lsjson/lsjson.go +++ b/cmd/lsjson/lsjson.go @@ -97,7 +97,7 @@ with the following options: - If ` + "`--files-only`" + ` is specified then files will be returned only, no directories. -If ` + "`--stat`" + ` is set then the the output is not an array of items, +If ` + "`--stat`" + ` is set then the output is not an array of items, but instead a single JSON blob will be returned about the item pointed to. This will return an error if the item isn't found, however on bucket based backends (like s3, gcs, b2, azureblob etc) if the item isn't found it will diff --git a/cmd/mountlib/rc.go b/cmd/mountlib/rc.go index 65af12d71284a..b569153b52734 100644 --- a/cmd/mountlib/rc.go +++ b/cmd/mountlib/rc.go @@ -71,7 +71,7 @@ rclone rc mount/mount fs=mydrive: mountPoint=/home//mountPoint mountType=m rclone rc mount/mount fs=TestDrive: mountPoint=/mnt/tmp vfsOpt='{"CacheMode": 2}' mountOpt='{"AllowOther": true}' ` + "```" + ` -The vfsOpt are as described in options/get and can be seen in the the +The vfsOpt are as described in options/get and can be seen in the "vfs" section when running and the mountOpt can be seen in the "mount" section: ` + "```console" + ` diff --git a/fs/config/config.go b/fs/config/config.go index 617780c9c09e2..d01306534fb52 100644 --- a/fs/config/config.go +++ b/fs/config/config.go @@ -764,7 +764,7 @@ func SetCacheDir(path string) (err error) { // // To override the default we therefore set environment variable TMPDIR // on Unix systems, and both TMP and TEMP on Windows (they are almost exclusively -// aliases for the same path, and programs may refer to to either of them). +// aliases for the same path, and programs may refer to either of them). // This should make all libraries and forked processes use the same. func SetTempDir(path string) (err error) { var tempDir string diff --git a/fs/config/configstruct/configstruct.go b/fs/config/configstruct/configstruct.go index ba421f7f24141..bb72ae35989b8 100644 --- a/fs/config/configstruct/configstruct.go +++ b/fs/config/configstruct/configstruct.go @@ -31,7 +31,7 @@ func camelToSnake(in string) string { // // Builtin types are expected to be encoding as their natural // stringificatons as produced by fmt.Sprint except for []string which -// is expected to be encoded a a CSV with empty array encoded as "". +// is expected to be encoded as a CSV with empty array encoded as "". // // Any other types are expected to be encoded by their String() // methods and decoded by their `Set(s string) error` methods. @@ -93,7 +93,7 @@ func StringToInterface(def any, in string) (newValue any, err error) { // // Builtin types are expected to be encoding as their natural // stringificatons as produced by fmt.Sprint except for []string which -// is expected to be encoded a a CSV with empty array encoded as "". +// is expected to be encoded as a CSV with empty array encoded as "". // // Any other types are expected to be encoded by their String() // methods and decoded by their `Set(s string) error` methods. diff --git a/fs/config/crypt.go b/fs/config/crypt.go index c111fbbbe4642..c25595900fc68 100644 --- a/fs/config/crypt.go +++ b/fs/config/crypt.go @@ -180,7 +180,7 @@ func Decrypt(b io.ReadSeeker) (io.Reader, error) { // GetPasswordCommand gets the password using the --password-command setting // -// If the the --password-command flag was not in use it returns "", nil +// If the --password-command flag was not in use it returns "", nil func GetPasswordCommand(ctx context.Context) (pass string, err error) { ci := fs.GetConfig(ctx) if len(ci.PasswordCommand) == 0 { diff --git a/fs/hash/hash.go b/fs/hash/hash.go index 972fea186e598..634548a967621 100644 --- a/fs/hash/hash.go +++ b/fs/hash/hash.go @@ -225,7 +225,7 @@ func fromTypes(set Set) (map[Type]hash.Hash, error) { // single multiwriter, where one write will update all // the hashers. func toMultiWriter(h map[Type]hash.Hash) io.Writer { - // Convert to to slice + // Convert to slice var w = make([]io.Writer, 0, len(h)) for _, v := range h { w = append(w, v) diff --git a/fs/log/log.go b/fs/log/log.go index 71c6f08a3f311..76bf2b72d6b48 100644 --- a/fs/log/log.go +++ b/fs/log/log.go @@ -79,7 +79,7 @@ type Options struct { File string `config:"log_file"` // Log everything to this file MaxSize fs.SizeSuffix `config:"log_file_max_size"` // Max size of log file MaxBackups int `config:"log_file_max_backups"` // Max backups of log file - MaxAge fs.Duration `config:"log_file_max_age"` // Max age of of log file + MaxAge fs.Duration `config:"log_file_max_age"` // Max age of log file Compress bool `config:"log_file_compress"` // Set to compress log file Format logFormat `config:"log_format"` // Comma separated list of log format options UseSyslog bool `config:"syslog"` // Use Syslog for logging diff --git a/fs/sync/sync_test.go b/fs/sync/sync_test.go index 69eac38110807..de00e15444eaf 100644 --- a/fs/sync/sync_test.go +++ b/fs/sync/sync_test.go @@ -806,7 +806,7 @@ func TestSyncBasedOnCheckSum(t *testing.T) { // Create a file and sync it. Change the last modified date and the // file contents but not the size. If we're only doing sync by size -// only, we expect nothing to to be transferred on the second sync. +// only, we expect nothing to be transferred on the second sync. func TestSyncSizeOnly(t *testing.T) { ctx := context.Background() ctx, ci := fs.AddConfig(ctx) @@ -843,7 +843,7 @@ func TestSyncSizeOnly(t *testing.T) { } // Create a file and sync it. Keep the last modified date but change -// the size. With --ignore-size we expect nothing to to be +// the size. With --ignore-size we expect nothing to be // transferred on the second sync. func TestSyncIgnoreSize(t *testing.T) { ctx := context.Background() diff --git a/fs/types.go b/fs/types.go index dc3cc0cef8392..aed6926b6cb8b 100644 --- a/fs/types.go +++ b/fs/types.go @@ -328,7 +328,7 @@ type Flagger interface { // satisfy as non-pointers // // These are from pflag.Value and need to be tested against -// non-pointer value due the the way the backend flags are inserted +// non-pointer value due to the way the backend flags are inserted // into the flags. type FlaggerNP interface { String() string diff --git a/lib/pool/pool.go b/lib/pool/pool.go index 654ae444f75d1..3b7ddcc005323 100644 --- a/lib/pool/pool.go +++ b/lib/pool/pool.go @@ -46,7 +46,7 @@ type Pool struct { } // totalMemory is a semaphore used to control total buffer usage of -// all Pools. It it may be nil in which case the total buffer usage +// all Pools. It may be nil in which case the total buffer usage // will not be controlled. It counts memory in active use, it does not // count memory cached in the pool. var totalMemory *semaphore.Weighted diff --git a/vfs/vfscache/writeback/writeback.go b/vfs/vfscache/writeback/writeback.go index fe7b9ed626364..ee9566c777f53 100644 --- a/vfs/vfscache/writeback/writeback.go +++ b/vfs/vfscache/writeback/writeback.go @@ -254,7 +254,7 @@ func (wb *WriteBack) SetID(pid *Handle) { // // Use SetID to create Handles in advance of calling Add. // -// If modified is false then it it doesn't cancel a pending upload if +// If modified is false then it doesn't cancel a pending upload if // there is one as there is no need. func (wb *WriteBack) Add(id Handle, name string, size int64, modified bool, putFn PutFn) Handle { wb.mu.Lock() From 39c413b874afa314d37d50da8427f9e578b272cc Mon Sep 17 00:00:00 2001 From: Marc-Philip Date: Sun, 18 Jan 2026 20:56:26 +0100 Subject: [PATCH 125/130] docs: fix echo command syntax for password input --- cmd/obscure/obscure.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/obscure/obscure.go b/cmd/obscure/obscure.go index 531192b0e6aa4..7159670c6d5ac 100644 --- a/cmd/obscure/obscure.go +++ b/cmd/obscure/obscure.go @@ -34,7 +34,7 @@ argument by passing a hyphen as an argument. This will use the first line of STDIN as the password not including the trailing newline. ` + "```console" + ` -echo "secretpassword" | rclone obscure - +echo 'secretpassword' | rclone obscure - ` + "```" + ` If there is no data on STDIN to read, rclone obscure will default to From 2cb89ab6e3d92fb06819e21ce5abcb5384785774 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Mon, 19 Jan 2026 11:02:51 -0600 Subject: [PATCH 126/130] internxt: ensure pending thumbnails are processed during shutdown --- backend/internxt/internxt.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 9b69257dc5c69..8bd6dc1576cc1 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -722,6 +722,8 @@ func (f *Fs) About(ctx context.Context) (*fs.Usage, error) { } func (f *Fs) Shutdown(ctx context.Context) error { + buckets.WaitForPendingThumbnails() + if f.tokenRenewer != nil { f.tokenRenewer.Shutdown() } From 713cc494e76c994bd87f6c0a08fa80192b887197 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Tue, 20 Jan 2026 06:51:58 -0600 Subject: [PATCH 127/130] internxt: update rclone-adapter dependency to latest version to support thumbnail retries --- go.mod | 2 +- go.sum | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index dcf9b6ec16df6..dad82b8054418 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/hanwen/go-fuse/v2 v2.9.0 github.com/henrybear327/Proton-API-Bridge v1.0.0 github.com/henrybear327/go-proton-api v1.0.0 - github.com/internxt/rclone-adapter v0.0.0-20260112121928-f210b9df5a42 + github.com/internxt/rclone-adapter v0.0.0-20260119171815-eddb2c0aa71e github.com/jcmturner/gokrb5/v8 v8.4.4 github.com/jlaffaye/ftp v0.2.1-0.20240918233326-1b970516f5d3 github.com/josephspurrier/goversioninfo v1.5.0 diff --git a/go.sum b/go.sum index ba43cad661837..97e5b1d4cf1a4 100644 --- a/go.sum +++ b/go.sum @@ -424,8 +424,10 @@ github.com/henrybear327/go-proton-api v1.0.0/go.mod h1:w63MZuzufKcIZ93pwRgiOtxMX github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/internxt/rclone-adapter v0.0.0-20260112121928-f210b9df5a42 h1:+9+qWN7/X049i6Am77z8mdPkhbpb1oG2mx2LA/nGorE= -github.com/internxt/rclone-adapter v0.0.0-20260112121928-f210b9df5a42/go.mod h1:RKgfLRYCIlgMSN3iIJUB9VhP9HIN+fuw/zjlVyyRbQE= +github.com/internxt/rclone-adapter v0.0.0-20260119122458-ee05ff60abe3 h1:8qAhbS4dyWZsi4ps6Clg4myG97mC0eW0/5WKqBpXmgY= +github.com/internxt/rclone-adapter v0.0.0-20260119122458-ee05ff60abe3/go.mod h1:jpF/MwuBg+opa4Q9izanNl8KzdtYhfBoZWyv70vqmgc= +github.com/internxt/rclone-adapter v0.0.0-20260119171815-eddb2c0aa71e h1:8N6gQf9569NbT6FwGxKNnzUIEYXUB56tNnUDBZ4P39g= +github.com/internxt/rclone-adapter v0.0.0-20260119171815-eddb2c0aa71e/go.mod h1:jpF/MwuBg+opa4Q9izanNl8KzdtYhfBoZWyv70vqmgc= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= From 2b481da3eae850aae83426aae964ef2843e75df8 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Tue, 20 Jan 2026 06:51:58 -0600 Subject: [PATCH 128/130] internxt: update rclone-adapter dependency to latest version to support thumbnail retries --- go.mod | 2 +- go.sum | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index dcf9b6ec16df6..dad82b8054418 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/hanwen/go-fuse/v2 v2.9.0 github.com/henrybear327/Proton-API-Bridge v1.0.0 github.com/henrybear327/go-proton-api v1.0.0 - github.com/internxt/rclone-adapter v0.0.0-20260112121928-f210b9df5a42 + github.com/internxt/rclone-adapter v0.0.0-20260119171815-eddb2c0aa71e github.com/jcmturner/gokrb5/v8 v8.4.4 github.com/jlaffaye/ftp v0.2.1-0.20240918233326-1b970516f5d3 github.com/josephspurrier/goversioninfo v1.5.0 diff --git a/go.sum b/go.sum index ba43cad661837..97e5b1d4cf1a4 100644 --- a/go.sum +++ b/go.sum @@ -424,8 +424,10 @@ github.com/henrybear327/go-proton-api v1.0.0/go.mod h1:w63MZuzufKcIZ93pwRgiOtxMX github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/internxt/rclone-adapter v0.0.0-20260112121928-f210b9df5a42 h1:+9+qWN7/X049i6Am77z8mdPkhbpb1oG2mx2LA/nGorE= -github.com/internxt/rclone-adapter v0.0.0-20260112121928-f210b9df5a42/go.mod h1:RKgfLRYCIlgMSN3iIJUB9VhP9HIN+fuw/zjlVyyRbQE= +github.com/internxt/rclone-adapter v0.0.0-20260119122458-ee05ff60abe3 h1:8qAhbS4dyWZsi4ps6Clg4myG97mC0eW0/5WKqBpXmgY= +github.com/internxt/rclone-adapter v0.0.0-20260119122458-ee05ff60abe3/go.mod h1:jpF/MwuBg+opa4Q9izanNl8KzdtYhfBoZWyv70vqmgc= +github.com/internxt/rclone-adapter v0.0.0-20260119171815-eddb2c0aa71e h1:8N6gQf9569NbT6FwGxKNnzUIEYXUB56tNnUDBZ4P39g= +github.com/internxt/rclone-adapter v0.0.0-20260119171815-eddb2c0aa71e/go.mod h1:jpF/MwuBg+opa4Q9izanNl8KzdtYhfBoZWyv70vqmgc= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= From 1568923d0bc79fa127d9ce57f94572ba4a083e7b Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Fri, 2 Jan 2026 10:44:18 -0600 Subject: [PATCH 129/130] internxt: Remove checks for empty file uploads in Put and Update methods --- backend/internxt/internxt.go | 8 -------- go.mod | 4 ++-- go.sum | 6 ++---- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/backend/internxt/internxt.go b/backend/internxt/internxt.go index 8bd6dc1576cc1..1387fb48b9129 100644 --- a/backend/internxt/internxt.go +++ b/backend/internxt/internxt.go @@ -527,10 +527,6 @@ func (f *Fs) List(ctx context.Context, dir string) (fs.DirEntries, error) { func (f *Fs) Put(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) (fs.Object, error) { remote := src.Remote() - if src.Size() == 0 { - return nil, fs.ErrorCantUploadEmptyFiles - } - leaf, directoryID, err := f.dirCache.FindPath(ctx, remote, false) if err != nil { if err == fs.ErrorDirNotFound { @@ -759,10 +755,6 @@ func (o *Object) Open(ctx context.Context, options ...fs.OpenOption) (io.ReadClo // Update updates an existing file or creates a new one func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, options ...fs.OpenOption) error { - if src.Size() == 0 { - return fs.ErrorCantUploadEmptyFiles - } - remote := o.remote origBaseName := filepath.Base(remote) diff --git a/go.mod b/go.mod index ccd4e56880faf..ea67b1fe38dd3 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/hanwen/go-fuse/v2 v2.9.0 github.com/henrybear327/Proton-API-Bridge v1.0.0 github.com/henrybear327/go-proton-api v1.0.0 - github.com/internxt/rclone-adapter v0.0.0-20260119171815-eddb2c0aa71e + github.com/internxt/rclone-adapter v0.0.0-20260120161514-a27b77ef4431 github.com/jcmturner/gokrb5/v8 v8.4.4 github.com/jlaffaye/ftp v0.2.1-0.20240918233326-1b970516f5d3 github.com/josephspurrier/goversioninfo v1.5.0 @@ -159,8 +159,8 @@ require ( github.com/cronokirby/saferith v0.33.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/disintegration/imaging v1.6.2 // indirect - github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect github.com/dromara/dongle v1.0.1 // indirect + github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/ebitengine/purego v0.9.1 // indirect github.com/emersion/go-message v0.18.2 // indirect diff --git a/go.sum b/go.sum index 5706b1a96fcf1..94d7b2a2a8431 100644 --- a/go.sum +++ b/go.sum @@ -429,10 +429,8 @@ github.com/henrybear327/go-proton-api v1.0.0/go.mod h1:w63MZuzufKcIZ93pwRgiOtxMX github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/internxt/rclone-adapter v0.0.0-20260119122458-ee05ff60abe3 h1:8qAhbS4dyWZsi4ps6Clg4myG97mC0eW0/5WKqBpXmgY= -github.com/internxt/rclone-adapter v0.0.0-20260119122458-ee05ff60abe3/go.mod h1:jpF/MwuBg+opa4Q9izanNl8KzdtYhfBoZWyv70vqmgc= -github.com/internxt/rclone-adapter v0.0.0-20260119171815-eddb2c0aa71e h1:8N6gQf9569NbT6FwGxKNnzUIEYXUB56tNnUDBZ4P39g= -github.com/internxt/rclone-adapter v0.0.0-20260119171815-eddb2c0aa71e/go.mod h1:jpF/MwuBg+opa4Q9izanNl8KzdtYhfBoZWyv70vqmgc= +github.com/internxt/rclone-adapter v0.0.0-20260120161514-a27b77ef4431 h1:ZiJoHpiFsodynTDqc7tZYhe+qG2eMAy1kMoQf818RFc= +github.com/internxt/rclone-adapter v0.0.0-20260120161514-a27b77ef4431/go.mod h1:jpF/MwuBg+opa4Q9izanNl8KzdtYhfBoZWyv70vqmgc= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= From 9b5973eebfe4b9ce3c8aa71159835b982fc6f648 Mon Sep 17 00:00:00 2001 From: jzunigax2 <125698953+jzunigax2@users.noreply.github.com> Date: Wed, 21 Jan 2026 09:46:11 -0600 Subject: [PATCH 130/130] internxt: update Internxt documentation to reflect service name change and enhance configuration instructions --- docs/content/_index.md | 4 +- docs/content/internxt.md | 118 ++++++++++++++++++++++++--------------- 2 files changed, 74 insertions(+), 48 deletions(-) diff --git a/docs/content/_index.md b/docs/content/_index.md index 391f9e51a958b..2ff6c82d0fe51 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -31,8 +31,8 @@ mv, mount, ls, ncdu, tree, rm, and cat. Rclone's familiar syntax includes shell pipeline support, and `--dry-run` protection. It is used at the command line, in scripts or via its [API](/rc). -Users call rclone _"The Swiss army knife of cloud storage"_, and -_"Technology indistinguishable from magic"_. +Users call rclone *"The Swiss army knife of cloud storage"*, and +*Technology indistinguishable from magic"*. Rclone really looks after your data. It preserves timestamps and verifies checksums at all times. Transfers over limited bandwidth; diff --git a/docs/content/internxt.md b/docs/content/internxt.md index 0d2277e1d4fe1..dc61eba70309c 100644 --- a/docs/content/internxt.md +++ b/docs/content/internxt.md @@ -1,22 +1,20 @@ --- -title: "Internxt.com" -description: "Rclone docs for Internxt.com" -versionIntroduced: "TODO" +title: "Internxt Drive" +description: "Rclone docs for Internxt Drive" +versionIntroduced: "v1.69" --- -# {{< icon "fas fa-angle-double-down" >}} Internxt.com +# {{< icon "fas fa-cloud" >}} Internxt Drive + +[Internxt Drive](https://internxt.com) is a zero-knowledge encrypted cloud storage service. Paths are specified as `remote:path` Paths may be as deep as required, e.g. `remote:directory/subdirectory`. -The initial setup for Internxt.com involves filling in the user credentials. -`rclone config` walks you through it. - ## Configuration -You can configure it as a remote like this with `rclone config` too if -you want to: +Internxt uses browser-based authentication. Run `rclone config` and follow the prompts: ``` No remotes found, make a new one? @@ -24,72 +22,100 @@ n) New remote s) Set configuration password q) Quit config n/s/q> n -name> remote +name> internxt Type of storage to configure. -Enter a string value. Press Enter for the default (""). Choose a number from below, or type in your own value [snip] -XX / Internxt +XX / Internxt Drive \ "internxt" [snip] Storage> internxt -** See help for internxt backend at: https://rclone.org/internxt/ ** - -Remote config - -Option email. -The email of the user to operate as. -Enter a value. Press Enter to leave empty. -email> abc@gmail.com -Option password. -The password for the user. -Choose an alternative below. Press Enter for the default (n). -y) Yes, type in my own password -g) Generate random password -n) No, leave this optional password blank (default) -y/g/n> y +If your browser doesn't open automatically, visit this URL: +https://drive.internxt.com/login?universalLink=true&redirectUri=... -Enter the password: -password: -Confirm the password: -password: +Log in and authorize rclone for access +Waiting for authentication... -Edit advanced config? -y) Yes -n) No (default) -y/n> n +Authentication successful! Configuration complete. Options: - type: internxt -- email: abc@gmail.com -- password: *** ENCRYPTED *** -Keep this "remote" remote? +Keep this "internxt" remote? y) Yes this is OK (default) e) Edit this remote d) Delete this remote y/e/d> y ``` -Because the internxt backend isn't persistent it is most useful for -testing or with an rclone server or rclone mount, e.g. +Your default web browser will open automatically. Log in to your Internxt account to authorize rclone. + +### Headless/Remote Machine Setup + +If you're configuring rclone on a remote or headless machine (such as a server or NAS), the Internxt backend requires browser-based authentication. + +See the [rclone remote setup documentation](/remote_setup/) for detailed instructions on how to configure remotes on machines without a browser. The documentation covers: + +- Using `rclone authorize` to run authorization on a local machine and transfer the token +- SSH tunneling to forward the authentication port +- Copying the config file from a configured machine + +### Security Considerations + +The authentication process stores your mnemonic and JWT token in the rclone configuration file. It is **strongly recommended** to encrypt your rclone config to protect these sensitive credentials: + +``` +rclone config password +``` + +This will prompt you to set a password that encrypts your entire configuration file. - rclone mount :internxt: /mnt/tmp - rclone serve webdav :internxt: - rclone serve sftp :internxt: +## Usage Examples + +``` +# List files +rclone ls internxt: + +# Copy files to Internxt +rclone copy /local/path internxt:remote/path + +# Sync local directory to Internxt +rclone sync /local/path internxt:remote/path + +# Mount Internxt Drive as a local filesystem +rclone mount internxt: /path/to/mountpoint + +# Check storage usage +rclone about internxt: +``` ### Modification times and hashes -The internxt backend supports no hashes and modification times accurate to 1 second. +The Internxt backend does not support hashes. + +Modification times are read from the server but cannot be set. The backend reports `ModTimeNotSupported` precision, so modification times will not be used for sync comparisons. ### Restricted filename characters -The internxt backend replaces the [default restricted characters +The Internxt backend replaces the [default restricted characters set](/overview/#restricted-characters). {{< rem autogenerated options start" - DO NOT EDIT - instead edit fs.RegInfo in backend/internxt/internxt.go then run make backenddocs" >}} ### Advanced options -There are no Advanced options specific to internxt (In internxt object storage system). +Here are the Advanced options specific to internxt (Internxt Drive). + +#### --internxt-skip-hash-validation + +Skip hash validation when downloading files. + +By default, hash validation is disabled. Set this to false to enable validation. + +Properties: + +- Config: skip_hash_validation +- Env Var: RCLONE_INTERNXT_SKIP_HASH_VALIDATION +- Type: bool +- Default: true
  • w%jOKWG137E#bz+bDB1LTN%Bd0nW!CQa-;lh$ZWd>28s@$n7^E(&fbm@us z+~zAWO19$sin(1#76)TgPnRAe!iUval z>^AoF&~%KPk9>%kMaG-7JkDYHrMb|F0ML9gen#fuEs~5C>0H#)LXCv|>fZbqJCN2bc8* zB(E`{=Ti6X)Di0jVFY9A@lGHc+^a%VJjo>b*-bfaG1HdG6V{u@R#oZ!+~>diiy!Vhud=ppHc z*JbQsp<3omjK6C^4^6EgaTQBtl>Js;CxaxBMb)lr9ACmirzSl$w|KB38fT zaf~>EGbe?wzTc)dr;~CgK0Vl5@SYTT1_vvL4j4$wIXwzT_4o<2;FK}KO1&ZQyglbq zM9pOaDsg20Xlau+OJb!MBvSK{)fdK;~5|0&sbH z)dv0AwfK4_ZgN_g;Wi08J=!EHthzFhagdOXk%cgNX@jYf66{;l@}qLOO~sI$>@S*k|DJW zKJTvn)=CezDfie&>yRGIR_s|XJ2S^kvWWW10_goRY0Fn!0DrZ`nC1fF5NI~rPx zP~$fwpbZ|RHcm*LC;8>sx;5X{8=zCxZ~2q6PUysgT0dAY6)zC}vgO6QLYM1;Z#Lx6 zQ+Zf)_o1(M`726z4Xh7cEHGNd+DfY5NO=n07id(WogeG`bN7EiKF z-akX!E_%k)*#Hf*$1Q1qJM~bBpb@k>3Q`Be;M)q+(V0(R)}-iWvAM5YRE0nw5aiNV zSVcj_4E30qGdIodiS^j2X^eFGpf&r#nDo^fDxC{7)Eh7O$o9C)okQZ{k>*D#3lzJA zW{D^51!d@hEr?Gn-xE5|Efmw~%9gEDwJD_(a~Eoe#i_dD2j{Ysxek4$szzpmwhdr> zlMHC1(3)}c6^g>|0YQj}Kvb7sQx896x4oCJ_a~9?lPiruW z*v>P?D<-9op#gMeb|)lGfWZq=g0009VTQfWE{Of*)E153VE~a0dCv4Va7NzFT_|oO zl+zkT8S65XlLc%r2|VfA>69OgUKlLm646Nx4OeH)$!g-^RAIuMu>@J4QG|$M6-Zw_ zkK*FfSP6|ZNkU%^uRD{v`C5okVvD$>9jov;t2s^_YcjfaHN-owoJJbf=^I+}@gPne z7be;%+p$!f+5s!uIe;3R%_2*eJXn;AtEHwkJL%7)-$^%N)y2|_gDG`uyAUM@G8^h6 z3ABwnGiL~a+%~4Bo#sp|V_#g1pWpBEgvXez@&^v7!3I@(C1`8=3u^X}XYGXLjs|Ji z>IDyqY8Is*xTIDL$0r^C=`-4ytymG@1p4lH6$;7aK%9|D zuD3WxqH#u*zdLxl$ce)5#qmq^OoGRx8#Bc&dNoHJi%Klm&(PtN9gO% zyHVQN$taUN!Ya9A^2IqH;?LsRb+X6;BF?3HqZ`?C$zhXjV0W(q%j%8(hz>?E|vanILgb7xPZ4*CPD`|USqt-N6I&=!Hnpv$YbSHb?I#h1R9amqepOj7vR31 z<6nEWqct=q4dAzf?WGS2qbI(HWJw&sqTZAYL=@p_#`#rjr^Zo3v?egt*V)zun2Z(< z3L4AzgGqYBHn?@PjpRc*#1?7T?q{2@1Dm`qwZ73g8ET}EI z6@CIA7V;NefyLF;;lq1UZ`4q&lA68`{y2hdR+ll*>FJmg)2CqwVj}-;-*R2kk z)Z6^RE8?5tR7|@v>g&@P6o~qh^5A5J;LbVVlMQmAjLTQ7P}J@F+3>6GBOk@BaU~XH zu;Z>p5A15F4xl+kPM66S?Ygh08K*%1u=LY+Ks=+UD-?U~5$A@8wvx+<{ca=g9X7ElfzaVi*8cF3J z+Y*bBwQD_L83nfw$uT)o)O?}8m8`$jp5&$_OY zP8epMB)uoE^>w?_rcqKs;4HUhW~H7DNMn>Op@}8S@6EiY1 zpt@!@;LhAaNI8^qAGN#UkAOm^*fBYa3L$Q^ihiknomn7p#eJwrJ|55;(sP?jP&mBq zaycvcG0(N6i6$B0Q``wI9!E(>QW@TPGBmk4t~Y_3sF&&l&U6*o9V!^$utia48Y5Cy z9#3m@jkx@|$8iy{v7gpNaFDnv)ZO4snqsO#c<-v0axmzoAJ!Z30?wwJ=E_D~ z*im2t8*44pdUi{&)KMo3FB?3%S=t!-Q(36=v}`sasexS2!bJ30Hu9Cm|4mjd*XTTh%gsUrho>rL<{!R7oy!<)(3N;;iVC)S0VK%fikpRy`?(-2(h(`-go2T%2DRmnErz2YNzE9i z!}q}ww*eN=48nDTVWs-SpKC@KgDXK6t=|Qo@qv3jCzUbdpTuuTfUdXEdmq!Q*aifz zmt;e`dbIjXcG-NrXr(y}$$cmS*FPlW__JjYZja+xUcT^+*oD|)2%a56c18<(Cg<|_J6w-82TY$(wsw_9FtLd?|Lw(2CBei*k*U?%mkc;>*2P>}xih z=@)g9SH?AMpFNruF{2w=RaX}kP49ar#U@B+Kux3EbKSaK!a{PkaCHKPEZMpl@`C(X zFZ{D_pGZ3Sa-l1-&o-?O<<|?2#j})~4Or8%w=2}q-7f0{j2x5M&aUL|e9JYv(Sb*<@N7n2a*b7UyBm>j06M(;#d~8#)>!9VE)3 zC`1l5yMOOm=nT8?cmBRug`j-P?a;ZOW@S>8Z>-Ug0*UE&R2C_pd~?5UQOU~gGCSXI zxOy*#*z$I|KfRj%*kjPbezSp_L~U-4j;5xjilw&3 zY}j~vJ^sre@cIl|!nw^~Z|vU$7W0vh00JQtu|~>4)$j%q3*ghl~0JPLZaS3gfoJ_x9Ga!d8PXMpF01( z>Z$fHC~~^}*QaJZw5D= zJ2IM1RcIXtwVMih3?5pE&vY8K(@7|HSJ0ld%DXK{<%1Ks2Woi0RvTjebr^V84b6m` zQn$V4tiI@0F4FVu^Q*v$`xjl*2!k(%hQ19amVco18Ax4+j_Ztx~&|}D( zyKmX~i949CXBd!3waWvq`{uT0#|SA@yPOTsS;Y?n76F6!vCTn5Wk5ayj0=Wl#vi;Y zMmDB(ZY8_3#{$2yC$>lP(GJaor^+3j_W9s~$LC*FQO}x_nynf;e$O^+aA42CGS}Bk zDEJoEw#%@$Ao^Ng$3?jSwc~jpYN%Hy)B{bEN%=W#j^Fc>8}$bAD}jeFPIhOJqu`D_ za4@jK_OsMh9h3_Ewa~`a=z!iw^U*poukJy`YPAN)QR~avGJpcgYcq*n+pvv#n?IYl zG5dDW*=_BPvsOiuWhyQsAEl4_gwSf2YzS&zYjbaxhgwJmm!A!m*W1A07bjXMT(7=B zR_E#HU5lOOm->6h3o|_SXj1v36yCz6BWAEwmSXv4By0|6mD^)GEju)K90L$(* zZ0|R3bo!_=3S7PJZu0XbXn3KR4SE`2cE|hjGmDL}m9VvZBFvL9zF1iwZ<|KkmKIQS>pI5RB`8ToCl1y|-T$58w%sF6N3j z&`LmClFKPbA$f6Cla>_jA#%7Y;v5!PDP~+DaK#R3araADxb^$*H0Fsg0`oI zBYb=ogo4OchbXLEhqr4UD$nZLR&yp;gXaw|5#kNHHasDFaXvJL_E8XRCi+fwjKB-L zFD~O^xvLNq*}5%RaZ#c0f|!99pc2(%bhtfD3<^sw_iojyXZjl_jk2+^42*CZnK6QS zwt*%v0%obW&nlKD1b0eAxZ(ee4J#ctVaGe@(|=ccPp6@jy^ArP;_8Ppo+D;jT9xK% zCxqMGfIX0z6cizYL5n20xG>>@Y0)3m){VXX9tU$7+^-NIG`;qUVztKV`kfDkI)Orq zd*AzUSzO^ambbKzZRa3>Plajs@2{~i*zL=@%X$w92$FE27a=IC5h#GzIwGFCoqm!E z0cQUj*=QyJ7@K4OEa=>YO6C>=4m__G;#f!28ur-dI78iwOUNdp7nG4u*za=wn^U#ZUsRJi#HX@X2`8mvSc`gBoVg4KIj|X+UXNkcG-v^a}%W^ z7X+!N*0Tu+a^V81>?QAYIssDlN6?6$cR|)JZ6fqYX?BZrf?Dy+m$9ryi%EgV(q1nt zvk4kF!nDtvC7%Jo0V}1tCnRwXM!9JM(B#`s`lZJhLdZRme?z;w`vbg1VjlqibE8%h z?9RHh$R(`;kSkl{u?dZvUm)s?60m(duja>d9+3!ml@?qI*Y2&eM{HrT;MVB4_Qycb zds`5h)V4KFYcIfdpXg3ve=>Uf7&Pvmh(CG@9maPWl{Axw1}!zLB<57(R7*di7@eRG zk<6E#39TY^E&SM{DctWRK2mGy^U`3D<3|aaY@r`(kv%;U(Pb(Woh4<(RbaEmeE=SK z-5fQ-%nz_#es<<87n!hY0`XOcr9V57NsZ)&koYG? zFswJwny9XZV*az+N-4}qB56ht>PH|RixK&bnp;ZnOiy0ZL&(Q~-H^i2{gjy_?NZ+j z@<-|`IU%_CVUf7)Q%Cae_z~>dU!nF=(vbcAuVbrrQcg-!U!ani3XO+{rxqlL02^TZ|dz*C$!rE45U!>y_o@RUKT3vLM@pxtGbsL!*ZQB(}Us0_&^Add;~!R zpYYJZ*`}bYwhps+6QC1q1Odvbg3cq<++-EtC*uqHhapf@>#5cb2vnJo<+Qzd#*Tmn z^BCmETrv@|ly)4c$pGdm^e-9A=?7=R%CS{+_XS?US3WgZcqNc)ro04E53J(Z>YUzg z=F~}q0BW_v&2W;0i3Vj0Xre&ez>m(-YsVM)E3MCAsOc z%!9%qJDiO*aEZMUJjjDugqgc4boQ#8QM3CQPGDAs`1x*ER59OKcx}<#SeZj2s1V^* zOCcFGU}Z#v@Ji0RMkoFI%%ju%0k+QT-_cZJB|-x9B}Y=o$;pfQ#ln^9Y~#`n0+Se@&mfLIDFVZ9 zI)#_x@K-0EJ1Oyr2+SRsdJHO_y~raUU#mnr$0?HzqD(ERGc`jpRpvz{-`Nk>{cbgC zU}P!|S5PX$iaKS1ih#jO- z@W7T_2@Ht1C339&gyLX4sss%_~UWE#m*nOtkGs8na!WkenlSa>iNZy>Edidb)y%;GJal zW89x)aD@%PEHfU8A>)C^c|kPvqa2S&;HtkS8zV@#&hTOsJcXju(s&p1O}4=+LbGdv zreaoylM$fazbtZB+(3n4f0@dC-_M?NW_W=U)rU1dBY4xEJX{yRdz^{*;C4jhr{imP zI#_E&G89ZRYmB7ciPgNhMGq}{_63jfZ({6td9wy^sq8!0KBF8}PqVX>Z1WE44Ks(k z?5_9=M7F4+gLTbxzU7)~?XTxyR1PYMe4ES_wCFi8te;71+r5?gUMm#Ev>7}3UASkU z^P-Fp-kQ*!jipoVv-wdH0`3|nswtA z@iegVfds*# zMZ72|ls#tQP3{{TEqeVui9sPJo)RG`+UsnZWeK0BzNkln>WhMI3=dL{5Cv*t&~H)pGS+AcYboE7zhtZ_4Lfj?*}XX+q9 zY3K1s$2SB-Oe)z#h5t57hCYEWW_N&?=3}YS?}u_fD|RpAv#unDUQr7Rtq_~kHpe?@ zoIJ$-q@jI1l1(c3;yNl%w2ypl+~{L`kI@O4g_J-_potA{Uk1G$3#-zXOPsRbZmWK? zq}Qkpn^Hs#47w3T`I3z0Xz>Z+sZvsKc0>)sa&8vsEXKeLiQ8j#yilWCG>aPsSsu_M zxtqvfE0cG+RPT+xnQi}`zgrC)P@!L(bhIDKBEbw}%B&qt#^CAhVp+$6o;gP5@s`a= zqs^vvp91eyPVz9R=`5-jODnKno|H3Y{+{-f3lLG zf3go|07@F*i|?>+iV?c{3!>=D;;vE>^VD`~3KP9(ugR}~V=o@PYwpCA& zXUr<28V(qy4=s@C7=nf78y~B~R2y-~PaL0!G-I;SK z$*YlStiP^?z=1I9G=y=hmRlXLYa71 zcV)c=F58n*RQ`5lNQ%#UHn#NQuqHC7=AQICjcEAy--js;n`0ryX)HYJ%Xl-l4nCgX z6qV*&n-2Qjd4DokSEZlDUfvK8k&WlH91AD+ow1xO${_|FMRicnFL~OGKYpkvy~x}Ukv*@XjiR} zv4i9U2(Ug_GZ6~8Lz~F zjY0o6legr~vD}V?Aev{bYc)v3G&QKQ^&bgH8Pz-k=WAo#ONE_zUm$HFf3eut?7dvy zkqs*zhLOXvl-S#c3j$SDfy`{u_)L?S9^W;!f2Dmjt%%163U*9 zqmL?h637 z|FyVx;3%1}+|W0{OqldB9d4>lb`i;Fw4RhJIruYZU*GG~aCEm?jyk#H zL{N{)E6l?fZeOdo+wajiq|~VGSYN*KsLAF$BBL>)ft|o-;Q6%$UzxqZBX7s{8`uz)~?b#>LyCzrRXx#}2fZlOG#Kl7Y{&z{?8V6>MT!1qcRcZ3vZxsu>W z--!y$B>M#U{X2BtA=)HuxF5^T8SlP>LltGCPTfT+oGP?72hQTyPo$r_!ZBjn!vKm3 z$O)RdBIU@;1|dVnoO-0k6|-;%HM4-$Sx?$;&zsR9#&fek~xO zNKo-=>(lRzT~H0==<9ljAyg9$6>-|oBPASzrZy1uuqkj#9I_XtDR>WzDw#DStpL+g zR*LF848fJ2nE}(DM_K6sikAbHq7s17#FHfl9!^F`<4y2KJ^XSbu3h1-gYkFSMHnX`HIVm(q^(c!X%Ub7dfWlx&-ljoODlNg4aAmMqzOl(!%e$k<{zWJ-tW#Ui~DQPFjsj#iN z_7W3`Sr|8z!ptV?IqK%-9{`ex1UUu16sLgau14|9`K7kM3PLVY;S8@7V(0J%1zGM( zbBah;P8I;%rV@wZ+@Gpchm}YO^eh-slC@ML@rt2)eH27S;k_g*7LOd$_wNn-48uuA{9-0ZEuh{1qowGnsk4r=Hu%XkjD*e)3l`=+}PVj^e**8=lL_v7qPB?rk z6+cAel&PvF4l0GQF3W*%*J9yCm@!yvld?$%MOL8U)juTLe`2FZKl1%$Z`>Px%RXtA z$tkWxW35S5VCyHR8ej$$e+|k@G4J>)pvDQ;N1Bj7aYsaj@-dL_jdz;hB*?b1cz~U~!sOtBlq!=-g zM5jD%b5?1ykf|_VE4UgfMp0s(_Omh{m#eeNG0~}B3ujBPiUOhj?MORAkJ)^3An=S^ z|6~7ZPC2p&P3NA#vX3Y{q{>O{GZ63l_dP_ffu`}8whaFSSq+QMbrvW%gl9pU+H_+~ z5f>9h`Pu%aA)6FOT9!$>wS?v+{@Mx};F$$5nq13aJSU&cvx1gPOx#1=EKUG3<8wTc z;8Wa}6Yi--NsB7ABw0_U=QI1$7ZXj-yTR>unR$JNo@Kh^>L*ydo`jd9LnnRvII_QcE|XTw1FsX73a$B33PH&9r~Tgwyz1eOtco2)04dk$^Yr++BViP5 z2hwPsKYiTMiSn7+LHO%rJ(@*4(-DVp7%SgJ`8CW~rgFSVJapCh=19lq^Au{OMi=6$ z$K!|DKbcUxt1hkl#cBuIp4E3QBd0D_9JsTzuPb=j z9L;`kKtoLDnOywm{_K3%IW9I#N6udrG{#I)V=G8oUKBQ zhFC+h*Q+Drq$;=YN#?u6>nDL=J(*aQbw|yBD3y90>vv@fmw05saxb_a)3v4&`)uA2 zD9J^;DE1GQfbAQy*4z%hjusSy+KFf1v;^C-i6-ewD&vEvSt?G=IaV z*{*>9@wYqdMudR#Ho+3(6 z#%#a-_wSbGs(h8WnsT}t`1|tl_8M0XDoOg4l?NSdX)_r+#awKIHS>cIK6ZJ$uvD@t z5wqA^V{B?oCTxu)Z+}wt?U*TD zp^|JSpwlpFo+uHMfJ#&vHQ5`pGys&{k&^+SE>~(y;Z1>?p+>Bm%|^Ey{*HT%XF1xC z`dKWzgv7|F>3|yVbj3Q(cC%eR-CUN;=)TXX>3lwuwZ`y$6F**yq^eopKa(BSwZ9*e zx!!*5H(}qQ<63{##!eWlZS!)h-@cB1&c=4iXKj64RMyJsKBg1#I(53ZeUiV5tv}Ur zl@`0cXD{YsTKJy+)KqjHJPrMDR#&=Yg6jEtFTwXN_0VBFruhCO*Y-lQ*=~Qq{CfW^D~!0>W@>A9*bnXrxhQnt{QQzb>qP$_Tj$s$ zO0*!`wr%sYZQHhO`?PJ_wr$(CZQFk5zL=Pan3#|C2X!;WXT&>yb1b%)0S9Ve>A+PFTwwGJ7R#2_S=hnvjZNswkd!~6&YHr7W zZNbeWEc0(ZrAy77@8_XeE*|$d{Az#a^@DaKyiVDcOjz0{+GGgg%F2Nrz5_{`pO$pW z3O@a0_26PgzE_)5hZNCmW&W4evZ~O()a0S-xzWc+bs?9T!!{|G)+g(1+1cm*#kA>S zj7_|bOR!yIY4T;GT}6hT2ltBWdL>i_H#S=|{N@gemL6<6Hk*c?PSSeM!yEX|<8udo zOyjAonyJ-p^|lDdTYqf{*$63tbjTH|*W@Gyo&IZHFaBR4HIP<+0OCKMH?BH;D6XVcg;L;T8F^{@o06rXGZN66yt?d+&1k<%AKl& zC@LGqp>jjv=#pXbTz?;Z|5aSCABQ0?tJ%@Dj5e9lciRQvgWH8*3bJWiCPyM+iIyGi zRZdBbRqg70kLU+A9wpy;KR{+ZJ9brhoo^m4CgS2;&vfqUrGXOmZ|HR(ZmuWZ{?rG& zKwXKWBBO&_2k_~^s4Tvjb7$%6UZh)LxgKuwCFDklB)qDitJVdkgOO@V4W9A~S2=K) zZdSH>!_U0ZURxHG__Xm1V-}HQrQdf=MM>wb(pnjCvY2jrg5W2kYP}+nw8eNmA zWG*h(fy?f#%&8sU58oTkdlsV1!6V(8iJ|wWH)aQ7(BX<~Jr)C4Nq0ITUjVY+-pR3F zta-dkya}xe z$U}j*?7P_|>iBl_x7()VdY;DhcJK)BJ%{};7O!!O0f?$;t`(foPvETtuz2Vme8*Bd zJme_~*10i_y}u6W(7xYy-a8Cb#Nr>s3(2}}63O)5tR}pvbLEjQDD-`h!8BX68O57` zaI=n_HofNy8*b&rLfg%#d)vOW+q~sfcA=;@P)ADQr2Q; z#9=?cse{Ui;Jf|=(%WyleATYXrwqO7!lM0#ePcc(Z!)l^^NtQ9mN#f_L~QSMyu)o{ zzaDh+IRhnvid56lvEyRL^I~oSIJSW2m!F*rGMPn1_s_3?@$yiY3CZF9)L7*lGK14Y zh@w6I?$Pd7LWBk>`kkJ+=+TmyC#5dp8*CXc$dYDIT%BZ@(FDotB3gCzN~#r%vx$BL zSjnt<89eq&C5dWx8S^m>VthaVh+ACkZ0KlTdc?%BRRZK>gG<}OY8uiWiCWU`rf3s! zc~0R3fiR8jyG%1rgMozG?fb^iV`&oKYsZ%!6M>MYkVpS{>E@B^?KM@$fhaY&h*a=Y zSi$>cR~@^m-I0VA^uV<`yy#$)fITqFBC*6XdnLGXohu_6heObw^@d_}I_6qdPayh&&*MEs;YHbA>C=!;V^6G`gotA*_t~FnCG?U6$ zcY*>%ozZ>8O)?%6Jw#mOPU-rv0Y)JhS<)x>e5=Z3gIpT)x;lG!OgPP6>3|=65^4?d z?YFyW;FhOj4odKv8DdvAWxycncLx*f0|4daag9ghfjP7lORF(73^?Q$GW-_T9Xn15 zO{7->53rcT&g4!-mFsP5jQsoZts|3IY0-iKGpxHfBljO-k`@mUs7cvz*I#j^3$a@B^ z=R2QlAJB{BvYdjgbFo>pKMphe`24em+k&EV?SJwgECkF`uS($atWvx~5krSg(LVi1Ju@ToTH$LS(e@$7h=w&%>uuE+ zzp@7lMbc+Wdqi!u=MI7(m=8CG+aX?as6RRnRsG{)_2`k_Z-Lv56kbl1*dCza;S2~s zj1#ncMu9f&C1a0jp3quDGfWz_PyKXt9!bD%Y*Cqzk=#g)8w>+HjIbh5f}}Y?N_Kxp zElt4Z%-(XmzZA~OH}zR;q?1wOh*d4bz=7^-Q+ud z#>gF+0-~gXuJpo684^+FWL!K036-24q0_&^if78tZ5{EXN?SSweVBlU*_9!Wg6rZ5 zJgbn6ut_9}EUQ%YU)?Q?X1!{2hRvuw#rPgRx)v4dm=n1WQPalf$=tJef06opprP|< zRkbkH2QI9!##WHQTvZ8hT}}MYkQ{*J7G$vz{17UafO+8rZuE@EfIdOKQntT{>L0Na zG)^okCXMaUs?ES8rJPBqBUBDGG8_%}E1q^w*i&w_s?m;qDuBM@p@rPIJOC_(FmZV- zBU#71GH0dk8SNzF;^lT51wxgMj$Ae2ozg10Z>z2*9(C4Ez7X5cDA2M(fiY)5TTy+L z3N6fzT6K^HphLrC^U8q>d0Zks^lU_d1MQe5$Zizf48jYr6gNqGk6ff)*C!slQp}yj zfl#HnQ+ygwZ{A{p_BSAT_oh)`$)#(z$MLosFxSU*2y;8P6*AjfD7SKqyVe+@k|tWZ zHnibyIK1?V*M7UunrdMYUuC44uMFij&7;c(A{OSKb%=H_sYMtQp=lPsRpiY*yzs~m zgxsV>Y6D2CznRf?D&1p;dOF?ZR_qk&_Omb}4{Cqol>@&4t|IsrTHKDzcE_gG#bvii z{xML!QwiGDv;uy!vKif^#~UODQ~-5oe~tH$19gW+(*PRmN;A0l!MM1a@rn*cT}+;= zvJw*H5FP<_H4#*7Ii-7b4Pqix&c1LL;KzE~@U#)Zo@h?GE^`U$8E-p<&K9#qbS__w zb}U_0_kW^6IBstVNc4hFCJ(B7C7l6tkOz~8+%t|bFV(f;p^Ut2ke26FDmY_v@`1J( zg~T7)S|6(6#MSa$fn(N(#-PJEqnRQ|_+VTidlJMO74U$*B8F2+7n+;sm4-O6`?K#Y z7-=oNSr@}ogT^um94-%4qlN7B>*6t+YRlru;pdY8As=*TqUX7cW79<^wO|yU>LkxF~cluX{0`&d09a>EcN1LQ!acTK)e5Y1?>e* z7LNN6brk0XsGgAd$@A(>4GHLhmA7ZD47U@}tcim92(JQOKo3ilgE!KksnRa6wRL`(5e(LgcD zs1)^{iE9MvBO&*B?}I~-H1XJUxHy&-V}^MAw{KL8)|Us>ODWUdRZvK(;i+}!`G!g* zlKWxW*%JyXo77T3znYO53R9TzXw!Ks(N@G@3N{4}D^abom8iGxS%IEv(&`sR3~wli zs+vNzddA1O2;kO8#lnu>F-~)$3VtIVy3r^qSfM;=%xW5H_V_H1Ean-k($#>}S>Spj zw8QJ_>d8aP*|m0cu#7cE86bpO8pXLh*esvN5DYB>MvZBfHX{3)A@G+>S#EJIw=>S= ztVFLQUA0vRr=+fhq0-mP?~nmS6qv=J+r|wt)Q?CSi_{nFTJnI@C8k>?mC(d#MZ#G1 z%u2E9#C6uTZ^SX*bd|Xm((78G>OEu=>-Db7?8J z*z1jq@Zj1FP35zSK;E6cOmy#yVp8C~nk9itXo=$r!uCC*NCSo{)wnAKBgjkT+AdjT zRxP-VXVR;kbdfd47kmqq=t_U}V$gQ+K`KWli(3&yCR*?~oicnzfwE6i1i4pt@Y>RfSy&ZgiMbfF3cJVRP}@UJCG5HMR+r z!)3LU;ma?nUMDu{vqP&=R}PVnmTmLoJ~-ajUh&^~+|6pHHKg4l{PRCW4^XN6b$s811)Fz4b zG0~WeEL`zXliWH;=P6$Wh!d{E766C2WhzV`jz$4Gy3|rxy91L7RJ`Q5CtYSyF`mW^ zG^*){JI0)1t*B9&W1@}hUHb$xg#Dfsm*Yv^sC`6;TPy3^T*))d_sVsRcJnQ>}SeT z-2IEHuzr{SfkrUO%;wMr(sw$G6)fk?Z-c=?`qkfl(JZ|DkqE4^%#6T;KAbo5+QhA= z1Nd4%Q`Q(1LwZzm{yK4!z*je>)rjX#kj<5L0vj{DC_agOW5JdFV6kSp^X0~$pBnAA zT^Kx7^)DL$*zLJnGCb3DJ0I0fxSFjJ`8sZH&M%DI;yhYS9s zJ{#JRu4-cQJ*&pm!o!-CH!S|%*jiwtZqf>n{~-j2!JSN30w^kxq+;x+r)>Mt3IOr; z*jSZg1bU3RZU;k~ivo0>=B8ypH&wKI{Y;|V z&kT0Vnfm1>zE41j8IdV$krecn_WK+P>NrcbwP6s}M?8SjM`rFZJivCR@pR5weP;&0 ziuVlpF&~KS5>B7mkqoX{rr-f6BK7t#aG^Jfso9=ISnREp9`Q!U`wO>2Y9g|$ksTao zLZ)8LqIn`uOZpOdyp4ULhaJi>Kg>F(S)Nsr zJKQUyQH|$G|vi za^6KtXVq1Z&kM^}mZvi(RhBs@K8Mx+R5+ABnv@73YX}Pidrd@}4EAev7>CsbgOR26 zp+%kyvDLlEi-Vz&JdEVJxDl(FjIg3 z?C`lf%G5(>hc%pA=563yK&l4!dHL)77U}V9iU{C=N!ZT}(Byy@L?CT22>ftvV!OYc)SqA8}PJ&m$cxsjsMRXXKaypl2SX2n%I00L3w}k0n#P@Od=>A+qC25Y#H_5XB5Fh__ zi644gQT5!vo`{&2U-q9Dfqoh9az-g2t%`_QF+SP7m;G=_Bjw;SL*4(@EtcjAVSic* z68u;+L0NOtSx4%L^}nfpHpPXG{AYB@4!<}RXO{XGjU+$7k^_!5LKmwF9(U|3y0zo; zWfo3-CFw}%x`PN3pLwt5$w;b9hXNA z8=L;TS|yJm)PAk}tD=V1e7?MY^;nxRL_j+p zaTv_|vCIrw7iF;+xwhVjyg`ThaHM>YUGcYu1)xi3b#^h^od?+$Twg{5(WUk-N{EF0 zFsY=3Hm>Z4_okH~DrvmKeVyZ=?*1cq%&XC#t!Z?}XQ?2C`j-Da3F+h${)n>!%8>8Y zPty9pa23&`)4BYQEs;ad@NRt^DlL|qsXJdcdFLhsV=IP4HdmHJy0c~MtT%0Sb64;L z*<^VEV%zym=pSEJ(JHE8sVDKEHfAWl1lLYxoXZs#NQGBCpv5en$2lkTH3gaYkj4Oy zlwhG-<{{!;wL!_~2}rT<>*kvkZb#apOJUDWufPu|4=9|65v%o=8K;XRbYcRp4g=#| z>WYXBt2XlEus^lD+$quMAOcFFJlJG4LGwQ8M(xa?`%L$=qRX@q`^T4~7Z@~4ji>7% zb5}@*W09G#I|(QKB>V5FbpCvJW!Itb7eGDrT56H_jS$P@Z0y!l+$cCa6r4gI{~VWI zXC;hc1uQM9#L}>E4Y-~Y_>(Hto}jgFK|=l4!kIM7l3OB?xFXy(wZA?kYMlL)n*{8C z&z0xBxl9FtLq$Z~k$nBbeAnratK=U8RbUtbx-dYn4dgTiwJN^()G3Zr(W63%TXTNW^khs-2mI5V&oM4DzUzyF z?Q}J8gDCj-b~%_~yT_HOV)bmj_x(M%T#xQ* ziQ2I#EzQvWTkptL*Pjfp&hjGPvhs5R0xj_2)vrAJ!ItD`<)f*T80&g_^_T;%qV^y2 zNsYty`Mb6e`550EyH)mvSBgq4)kF=aqOJPA_4QX9<=O;OJ1U#5$Mw@u;mJUyic;@u z@9uoJm#=)!g$w9{;R0Z>{jV|ZC<(Y+cKlERqff}xkoO;1<9jJ2;X|e;7O3w>h z$5*rK_qoe96ZFO^GP{%7o1E5OPUF3eJV(_=Ys*PzUC7Gp_SgON1P{Es5<9~La2+)^ z^IJ1>FhnPo&4H|v^1~+dbswheK zXTW9k{;kHk^RRQWI#qm2l|Y1kDbT?Cx))+d-zGUg!6Y zQkaDpRhGLBTQ$$qVg3SX$Kht2>$wdVmzq+})@|kCW=9R{unN5SIV&D~mLvr`tF|#} zyFgdK=!U-kTg9V|gTVK*)Q)Gro-W=ls5$KAb|g=#%{Q3m3n=T5*munu^Rpy&n>o;r zdFR{!RV9`zxDr-l1J2BRR#XXSaa&}v~^(ufZ4tR!E3jp|89GGV=c&M3&1yJctUI8PTt*h5+$6PktPGV6< z^XZIdmJZO+xqk7QG7@R4176JstaMR##UDr7kkpoKAk(ENE6M0(QUF+!n}(P;8JU}N z$#+d)ri5v45W(KBFJu97v)%1CH%#a__%V>W=VSU~zyE#^1XlwoaG^&?m=& zNI2blh&{nW{%)mB6j_GnROiHKbyqQD!E81_3=E$mHEuv@R%d@+^;=~W7}sE-O1VQCFCy9|3MU>{i`OP2Zo;v=;4wM{NvlW5Zx{MHgD1?`dA%e(-z0zwiUr zgO=IRa$sR~>kEr9sun5nnj9?-IPwn*h-p`$Ap_uVspu}-6?^ zbKSBHun%yno<7=!V_V{cw#CcsN0!2EK+F`;m@zU>M9v8Z_xS71nDw_j7u5Y0ZJqpN6yj0C+8}RHV4S@Lv)N_XFiyNfM@sml^#QFK<*T1=1+J>7y(ih z$e#}8H664o4pF@@FxRCpz4>TE{vLbFLhm$BsnI0?#P{tN#UB{khstK#sC)Vz0cgl( zUl=VIua-lVv4x#4`g40ckI11XKD>cX)4H8mYVx94MX2yEf#s;m{nt6wXLaU0o6AUH zcOc11TkjKMFog#LWRBFY(QR=d(-7SemInqi8gWf}oPKo9RTz&+lEM1yML~kie@k2l zfW0XbpHM#tBZrt(eQ$Fk@Chtrkf1Q11<@Y}L#M4i9T0b?ZIeWW_Yb%-bAxYpU?{j` zJ<@t#F#Teg-Ziho*$?A z2#TybXqMwp)>LyCC>RU@e0nq8p1%{ej|XM&k~d@SV;PXIEDIQ_2IZNHt_Ki&QD`yQ zh)cY&Rv5APc~3RvK=pU$Yyq8^Ge_P+{ac;&hUISS-P^+`8I!n>QFHzhm|R~?`DdVE zseZ>79<269koWdE@Iky z7EMfGG$4&p!7O4p`1VGDjnXB{hGpO)8hnL)83g4Kc0>A0Vf}HW9I93ihT&w{MLv?? zdcqAGhyj3t(7BL(O7d0Gk(PoGNCI^gLG5s6#z@tm0Dz4U;Ga%R%Dn_RJg6 z-s1i*k_2;G5EZvw6d2QiaZcE4qEozgSbfNR$4q!ARq37>6;ll(#xzJ}5vvnv5N2M$ z>}>bnl=!>ng??$8QYP!&2H^;ltUqDxrxy1*@OE}J`=j1i6G1JJ#&M}{3|AO;8K?u{ z6D6`!UhFvL^EJ0q71Svd(WAM((bK4Xs%_W4f|^1t!(H!hE`@nND5meRqxl;MGWZeD z4;ubeXKg`ApfGluqam#HqKqFEsLn8?BO)WrEpPeZlu-P#Xl+Bk$lv&BzG?P>6!UzU z`Y;k=9RGBjO+SD<nydq8*E_+@@xcpYP#9VF349pWK% z@bPt2rkYgQf0r>dfvwC(IcBgRj?Ka!E310G!FfU+@X2$!nkH;$`UauJEeRD+w12acEJFT6b;yL)wRwyg%Ne) z_<^#T&Zws8eE@rVldtUrqKb&vbQLj)T`IjVR)~qN(yT@(QV=BtesM`@E5!(wLaob< zFv1eFA4yU_GAeI1QaRb8c(p%LK1Z3Ea&{Oa0Xc-FxFTLW6GoIuPcmY{m&$Vz5}&va z|4|dF>rAOJsZAdO(-e92mnw~rCh>|3ZiWm&&Bs|`P+ykh914o1h-EHxDy&>^+kd1p zpQ^|=tLPouR|3>wy~B9IyS&ME6rqHAuZuX9v`6x&0WEzjqtV-P0XrT7oU>IrK{gGx z=L;9&)AQGj{4QHS7Fsx^eP8r;Y&)QARs@OI)p9{sp~mrh{H~q-99pIcs@xMMCpNHv zok6nAT-A&08P96KB*ea~%ioYFL`sWC)!&$)Af9pOnQ5-VR<{c!`MQOsTEWKLKVQ~1 z_!uD8g@fb;*$VQ$0pkVR! z@(P7X+QFs1i(IatB2fv);2)CO>I)Knwp$ScmM5%W9gE&T6s!Csq&R*ZheeqUfkE^i z8Lrvrv#(U6NGKH^OQKCm$ZZy~Wm&328ZH7Y+SKTrydqvNhi(@zO+PS%k{gFz)&?d| z8qe0}%9Oy0tNcmen|-fOyIU@efYgI!09+^;Jk3hyqKdVnlUhN`Xh0LL37I>I8+)L~0{#br7O~T(6~7|V z`T*DWK3L@jZN&g5(%O<61Zjvil%&qDQrCb$n^>Y=@;YK`FM+s0h1@sYk^6)y}d zUH&uutuBSSw3ZdwNv^n$9nT+O3eC*&DxocVI>VKsz8;s`rcSEEotcmL!4Z8n2|rXr z&sV>jJ%8h#pDu7y!}>k*!Yqk(uWemf%Op0ib}hqeR%Mp9v>8n9G+#mtxTI*IaJlVb zMDp`my;{O;nH4-aPDZTV%Wb}W+1iXc{~%TQx9DWWu&h8nXFD#Yrw_bXaY4|2&$?O(EGSgC%UNNv4Q?e7fQvDts ziuzwSzR7eyYz>9jt74?~bW^;B7$=DpVR}uJ1&mO?`dVo+Qv$=VWcu7X3rF3(Om!Ru z2C#INh?scQaopKR!s}%Fa%%z7fHBvrel8Z5J}B(UGdJtDN)8b_xX#HOf4T<^Ep6gE zthFB)F}n6gHPcL<3v#YO>fBuVX8FZHgGSJS*jNxp1}Kuhi3L7#L+BD!kFNTz&sko& z_Hs8A&%g=!=i|l)uUEBWu}HjS^2rb@*L6@e)ITzFN>SvuiO;UO9}1of*wbS_akGk zaZpn48gly!XKk9vqLG*aj#@LC$5mj3%fDpFx_mQ zCHHEBdY-AgNlVQvY3ps4fh!md-kuR?dBt=gVvwr?gs4*O)VjScYh%)~kX{y#gjJ9JKjDV+p)YVC0ursNfr07tmrHbtG9kei%trB^HY#zUB@b8k z*B-cDP#qz=ul#4LxSsMm50j=$J$D0~1m!!1_d9Q;51^YK*KAviknR`uu#J!@S9OgS zg0lMX%W)|WZ}hIbO_E$V3#u7%l2It)9AEhk$qf3;1_nQYsX!T#4tdAu^hCbUYWC5#ZiT&V|tif zo&QzbNs}HRRABv7%c*f@`G7>ll1c$B;ULeu5OR4pYcyn#n*zhx5#ce|(Pr~=RlLCG z0O`EH)a=g4>&JAggH9<|o>t$q2cn4?#IUHCIE#3gn8A*LH;>pB8)SbD+31cPsiENt zxl=S;smPgd&_=bc>+g-pR!YC{r=eWAVs`Mz;M~uss&5A}U7q?AY1w*viAKTxY7z)H zmqW6HWOz14iFN$4B_w&YnctFPJ5QhD!oqYBI`#kz&R7}k!kRunm5~gQ31)t3lgpgX zowmG&W^f=1+T2>ZUljEs`zEoKWO!;Z21d&UI6=D+&=@~DMKKXO|q~fTKx!ZiVS_2H}L1B2Lr3C zhQ|nA0EM)$_Ly{qgqh8%maVPS48!Gi>RY*3`p^{rgl1y*1;-eW1!?UMxYGg zHM30<23qIn>84QNBsQ0F?8^ay@dA`-Hh3rafHPH;O%rbL6$Sx1k%mnIuDKnp@n;<44VQ30(2+%1>IQTO75t}8 zVN-nDyGN_5js;X!5nMTN+NWH({AkX%bA$dipW3FE#>MHe>Hy2q?&@gkwhGVV!Dl?E zLq{c290h5YyeQ-ORM;Vt(ZTb0UVj^{meDWG*|^FoO|Slji{jWi%O938WFI&&9S?q9 z%)WLH7v|s>N}27w>VMZgy@|`dpYOla|8hVEcyXg6j(`qP{1zVC`-HS12K$lTeEp;6 zZ+Sy0jGh(qnkbHNbfWd*%lz|Z)c&waq%Y1A7qA;-@HiICE}TnHU@N(0s`!R_s#sX5 zYJWrr)!+2o_o6X>^3@tEqY@FH435%!(95TWuHsgtHS=GJL+Dr@eeN!Fb+ED7&W|(` z@PY2SP}9XyHIbqn&9`Eog-ZsdLC1ygUhknW_79&!HVfl6K(lD@It$12oj%lEp-lL- z33igvqb>+b!oU>Fs5P|2Rq6J8vvLs1^MOuRzgh06ERIf3Oj2(B{`TWvMY8pU~v!zC+>oOYhj zxh1`;b!hkU{Vd~y&~AWX?dwn_8r zwil~b?dsxlWO@Da)!Wn4-xrEC<9_oRkgmo6rVSk$be2fN_PYft-5#V4hk^^|=CtC( z;Dips$qQ0Mwj#LGkb}vhY=+Xv^8Mtip4uqC5)5&3KlPQ_| zI&F4c_oOt-G^f>5&)~5FDkF;7*chL*bX$mxE;`v5_3rx6(a_m@U&kbcyKFLT!oO5q zW>S@!f8S=tu!6~gHE?6Z%AfQLgMfX%8Il(`eGBQLUj#4oAERD=(ViWIirSy09?=+8UYAiqP+mpO-;8rxEW!FOQIKbf$_Z}n|35&O4?lVsh0m*fLHr=K`D zBt?rzL%1FOFq4O`K>@+t7u9#Rqdr@owOZv51>mUb#G;&g5teeAvnl%&gVGPIObCt( z$K`vU4dhw{TJb3)DH?plwOO3wX!PjC;$KM7q<*|n1^*Y>{-;K^N=9}$GvTH}Phd+plr4x0e40ZLu zu7ix`NN!!%$$x3>F@`)wTM)e=gM~AXIuo&1GXK&wW2e$C&Kd}#bnEIsS-~DTf?bl6 zcAG_p^k0Tue{C{vVMUoAdR7jo!@z@){h6p%o?D9bfW%iAx_(rBvg)Ven zV>2vXLqX$i6Q%BM#oG#?zA|9ukH^C_^`!2$qq;r$;hoaMg` zLXAmV6bZELS2d8GI*JJl4`yJ-ma7w!J{U{3Xy!~+V-sal`SkeWFmWhLmS6hKcn>sl z*6v%G#)2Q?9^;vIM2%z<`C5L#mPR7to5L-q*=SB)?_Ji5?E8L~oBrv-^XtrsHVrjR zHJ-Nh(f8`!ZEl|To3w9X@XDYSqQ%ZHv>&!9vg18{D4L3}D)hUGpw) z`3&IZ@9U#B)(&ot7*^Jkqjud5bFAm@djk*qE%jFU9cFkq!LPYAd2D2O<*&MbPX+Gy z@MeTKWgD6AZo|qs8;pFNs0A*?FUS4+2V!%dg@sSKoU8*n}V4`dMc0 z*b*EYudK!6Z;6M;`i~PMALy6XO&(^JKh|#2#yGfHS;yX)c|J>%n$@1QJ}okZ%f&XG zdGGp<7A@*&8)8ffB|0Is#1&`_~nZ& zmXV`*vNQp{lO2?vHe))d zEsNhvEIaHyyxN4ds4_#!rb}%-b%JsATP3L<0E5`ImZ{&5?aj; z+9kS1Kd{k`!1v2wfI}mX@S4b?lI!caR_XKy`^iB_XYV>J4-*pn&=VEYmDtBXZ*Ac9 z;dCQhEOs~?JNI`@^9^CY#@s}Ipgc^nYLwJ$AF6%QR;je8=?$4sC2Ae1~PNm zkyB|Ris!aZ_hPDCl?(Dfj$El!-*B3QbX5BkWRF@8%5h&6>M{6rWI0I02ny)FT)-AY zQeFN4UTa)Yz_Sk?uU={hQ~qq7DZmXZZ>IH*%rY!TvXiB%gIPw+1NNjT(m=}2NSj_M z#YJ!0e0%}x%EEw&SgJuVx#g*wVXUd|#@m>3h05p@222t|>Xe7C+cknuXr#^5_T6xLyWf%7?yktOwikiJ`p2s%WSi7@a8NS5bDxO-A3COvjl7mjyK?d zi4>`i$5I)3kd!@BrHuVW=XUu3j=sm8$%NQh60IuOQ~ZSvKmK3PH$RJjJZ;T^t`zg) zsrqXY1p48qm?yZ#)vYLqKpH&7g88_Pl7}WRUN{S3OqU^cS&=?-W0{Hjfrwd_x>D5c zu{+FDEY%hBkhmj9N2+jB?I{;JTg5uk2h}s)JK}g+ap0BS;-Ce*F28|z&A`u%z&=F~ zV?n2xcmTm^tZ-+Nix|?b4E*4xYdOC;qc(?%+ll?Vq!i;ucuq=HaJutTjA~ z3WCupj3mL-q&0G+*fwa(3PvluOYvj$Vuq$?%c@u5zPJUXK?fxyc>DVRW^=4m?C3jz zso`1eA92?;3-jV9+X7~dF@Y9n(|HobG@t>{Q)FQ7r*DRaAAnAy zVn)=gBQT z5PCdppy8JxLvc&AqT8=JYz@-R$Ffw4YZ@1&Jhh7|h8G=lFhbkS@d}q76YZosQF=tF zWHiw|X@v?g5niFLGvTn-(JEW^4~(%;f|&FzFQAD2Au$OdBUz(`4sX;=L&og)A@-3S zk6V*)ECMXDZ=tRW5ZXIA9blHxR7K!+eOykpEFux zPc#l~p5{f^YuX-%@(?taTRzzp!7GORVfHAB60{afMQo%`DT)v_#G22lm`?^?=lv^W zC5`CIc!Z2_>wqNAr^K^PoNYO+P9XrZ)(kLG?&Q~Pr1TF{G)M&|u@T8`Ij3u2%%JuG zIYJ#sJQzcqK0oDp#)t!Dx0Wmy7_X8qBaY^I$6Vf#xL}l;b+Bm=5j-~G$~U7~R;DG2 z^JWC@0INupyOyf7gi-Jni-Xqz`q;7cA`1{gdHw5NRzN28!`#x2M<^!=y@4s3&iBVQ z4oDaP{gi!prqoN@>y=i-L3LdP_Lk5OH{C1^DTtrpCUk2pzzM5#JE;^Mea>yo=i04+ z-Cl3W52e3jSyn8vB=`xFSRg=@0C9pJUbZTQUV0P&ZQC|x+qP}nwr$(CZQHhO+RRc4$>CPN^;RuI-Q08A2#Tn}nb1^maJ|(>UlT(Fzv6^jWJ?-d{fFGbUn=K&%`VQH zZ%BJ$&EK~yndzRRETT0Y0-DHRVS*2wyEAQ(Mz5YEQW&rky~!LwkYwuaUSM9vbJiNp z2kd@HmV!4zv$&^MvD<0JrE!2&#HAMFa%jI^QHz0W5Zn&BmCrc;y9-A*l9>}v;dpW}+H(Y% zTWG#L{Q+TD_LW`a6IU_$*utYwSrBe6qSxM>KRMzjQ$}P@sK;JSOI;CUDR>qcS6@*u z@w{YHqdDXq(I5a%2-UKE&vt$fK6m@Tqb`z2=uf{0Wpn78#9s!s=vi@;pJd!5lV*PP zTt70`E8;~dI{j{U9ZdFX0*!G3>O*7v3_OYgFygX#4%p$RNK8)r&@gTLtmYitwl-ah zeg~pPCIgQTnRt|sV~7|bVix#_?LL>RU}_f%TYb7LI2WQwNC+YLJJc-}vQ14r5b0jJ zsns>{%Eos|9^pVDJT7b5UW2`Tmiswf$|x!Ya;Uju_W{u&r~qlyYaZA?$ISW-)#QK3U1gnV0t7C{@mhHm!^Q(}A`=_<|A^3CQl()J<2 zX;<6bnD9u8Tg#UHAVIVmF&rSvgOVg=)6iywX7zHYgv5l?Fos^#3Nf28v(kh*XNQ)4_4 zb%JtwpLdSu4QR~m?@IGYcVyu0V7KiJw$Ep@{eDHQSK98UiPUp{?Cuud`=ov1zcm!t z!R~I-;^XbY!etBRwvW|8-kI2&uct*>(cb%X9$u%`W;f4T2Tzlae<{ztg_A>uxB2F% zT>Ill<8k{w-p6k1qmF*Q`Sm5_Dc@P}P-}zfd~jiVQ}U+O$%zHVvn0G`$NNBz_gVSp zN>7YciB-i@lx$SAW524FHwzp7hVrkV@_vnGOrxd8n}vELsqgp8CSJ^kv5wQd<#V^C z?oc2XxbN`q?kz@-yK3>lK(_R_u;cO?iO)^?TI*ZMMJ?QfXa!rY`8B{{w5!zhVO&m- z@1gr^`S8{;!OgrVpYBHc z=d-PE=L;*42mlPl)1;)~d?((ZTqA z!&uit`TH_>Zr651MlTf}6XVTQHuvPEhouVZ$_NpEK)YCvOv(NJ9Jhmh)*~0wscq=V z09WJ1CMyThm9k-l+357Gn>kD}1~+eg<4SPw;3WM0RpLauH!$GYARr#UE>o+1G+wGp zjInhV2YEOw2F&MM(Tf~L0s5)nv^3C)bcv(15?~q%)hPu?3O93Y{p&=q-WL8XtSYQQ zb3?YQ$=Njac$=+?o4wq)FkIv*)z<^Q#>64G*As57HSesJRwp9V?O~yQ+~}!c0mcm; z9*zD*Vy*h~|z3;-!B;U^`-;d%-A|EVhmzcMs-;g0T~FBvL}eSj>j@%Ak+8PqC}-#2RUcWZ8qx3frIqGF z?l5LfQIPmy{7lRtSDYhw9&PrOrf#Oo=~IAf%I88%U$EFg9GP4<^HD$rwQA zOFh1^$1&I%>wSdCxQ1)Jw+3#}O6^GLf->t@8C)KYS$&F~AlY3t{{Fm?!3}0WR<_x5 zfj1mYVRUXrk21b2(peb7eTr%kK_*7MSm9k~!#ifvmcTBdc&p70xPFcM%E7A(CRv`G z*KBBU!r3VzLt^khQENoX%wk%Crs8qendzRpmQ%CXFmo@1exW#5gz*n+r7YCkE@6IQ zJQP?>D(!I7(BbYr-)k|G%wtSjQYv029t`~p8*A!Dku~l&gv=$Ml;jST&U8AxQ!6}f zbHEn_PxuC>PgoumcrKuY<};t@UYjqU4YKI^603dGyiqV(V?J=${8A;Dwvsi-zzQm` z;^XISJ6={BN)C}4++jqj-SNI^Mvn{%#0E1bj#X^}anp#-Yi`rX#g7B%Lx)qNnB_to z4dd@)RGn7TjR5&Tg^awo^YD=90`sPDW{eO<`<1Cs)ocS~8gLD3K!gq_*OZ`x0Q z7SMOy=kieTSz755*}+Myc%p03xo=g+hHI$fC*lLJOcw34$GWm6-)2(i9%?x ztYeDL)dxapFrw?lmoh5IP0zRKbTazRExNOOX&p0m!%85WU&atTsJ2H`tq!*KTT@X-5ylT zE1U=MHT=`i5dwk&5I#35FYwQXEx(X(+$&k5#4njrnFM9}J@hNlw^SVd9hyCP^)9?8 zKp=Y%FHV6H%?1FUS*_sW!$vOcu1qt8u?V^yRq?65@}TzoVH`lL5o&ngQ|bcs%Tt-G zZIIe>!dn2+R`mjg#9A>N%u7{*B`A~&;s?+~D@5vx+v^^|-bIunxR|P!mEd~wb2}>; zFrgLmZ0c}IDUfu4aPViyH}UiN!_5d#1L$MQp9kYAquz(!FtqU@C?Z+w)6YsJKhKgA}!iabCo7RX8$k=nkYW08SJj}WwaZ-EyJA}>njU5Ch zk{*A=pU)@OQp517RIKop^nQds$7BOWLOo?ZMH)tSk?6xbbRM^8f)O^DcLk z{D?G$ST4QM{W=NvHIS>zdT@!1ibaZ=GRp=WG0wse$+aaXYtT1mPnix!${N(WDC<>P zZ*5c|j?tBFXXp4tYCy#iBtK+pPGd8LJ63TP9C65RHD3L}q=oc$-77?;`VR=CK}Px( z0aj$jC9XPFuOW25^$IC#D<*LY@7Zaw-)Wpo8S#1@6!OIC-$2iw%J?F?G-M8l3oCEKz??c#`L4z=FSseTD~_!lB5p5x4UZs6){;C)nZZ;O z#5Ou7ZcKD8O{ibOR7w+t0k|iodSDck_XUae>3v7IC%8VJN2Bf^xr%^95$Nj--8`?b z+bPHDC7?ce6*(XPLFS(7;R9ghptL|Kh=<4n3~K?5xk!ekiLock5eqz$D}?Vun9W?% zijZP?nxZ~}1B5Qj6vd%0ieQWd0SP`cUH@%&cCf~t$|HYOsj1SI+v-+G)loyN$rcy0T zsEvk^@K*$79y6i>d-M4%@mf+rNDu3k1Fok%2-euEReA(P6tsbeW`whfI6}z2z*E%X zY6M2eI`LM3jKyo{k?6-Qu1_FL#((9FyC%)&zU6WQUWvv_-mMAf{ZFnCVi$h@rWf4v z#_YOq4F|(rgsp@NX&bXu!;f= zN(S@!YMv0MM`v1r<0Q&slwJfJj{J9dK|&M{c-h+fUJ^RNh+gwVv3ZBXdfsNg?pp=X zPg8`m->DB;PVd(}>iK$LPM`XK%4zYrr`2XUT|~W>AJx|HgYNtAqJ11B80BM7SE3)4 z`D57oLVy+9BFPXd&Bs^)w>S&vE-M7gAZU0cz+Lk)OE~KMO8IrDdD4K1+z3Cb3(tUO z+>a4`Ekd^o$Pl2n1{Yn!)ruH5f}u$nY6P5wgNeYb`h6`$9bJfl7fDesZ+@fXhBl)e zAU{u*lyFXlYrs-MZ-DoyPR50lKr2ozoJFJ5hHc!N-J0k8>YOy&u2)o~0l&skF|1Gi zNWOP`^4ZcF_t_RX;*mi_w(IH{&^f;$P`jc|?o@M4%=(haiFz zU)~0mHMk|c_g95hUsVeqM;qj7L1*FU}W zHQ*mq^&uPb44zyq#IXCgK~ph--=%%Yf{zAMBz3mmpBkLbV4ZOF(8Eh7p6fQe#m&UW z7Dn==Ek#x7hheCU?8Z<|t9RkR%%M8bjb+unx)8sWA}u84>|X%5d?zTUAW;`7kP|DX(LXEx7MNDNyC>Pm4o71)P~7 zKZ3AfdU4)toDIl~r+Ac6k2`Jj(O6635Q*Di4W8bP7T86sj>~?i@E~Q7YBM%JCPtf9>Z0%2h+=e+86@8=^s`#1r%VOO zCcPYA?EdCCU5#VDDiwlC82`d7uBY-$HWRQIA!~d`Vg8LCCWCNhwdMuXW?}&;2Ce`@ zA=}b2%Ljg{xqj|d82jkd_$O7Plqib4cx(3jvK0o>4FO$V;UU+Za&Ul_TJgb260+y( zzD)KBi3rf%fmCqz$AVxww)T>{xfAuE;7T#nB(9T^)*jF-aX$PVdaQ~Vlf&8BDu770 zxn2b^@YD(o=RJa`C1q1qAX~;+%PJ6mC*{PFTJIr9ihUFx$s~6)OLqQ`j3bzrNLjLh zKBMva^M|y6JyuxdNo=2+QQqy3kP81pk=%Ws{0FwZMR3#U+O5ITfNQ?~T2n9-!k_-g zxfL5;SRfW|1!A95rtUE9i7mkkBo%Lxnwi6fK}e;jEmm?zDjX7l01Tk^IqzQ--pF#qQNKtjF454tTmFyqIQznH8({eN0HX+3Rf@W+q z^{D?sN3k)Q+OEMoSm_>Scrk{0gpM>A;yQAMvFu321&BF#R3(wkVQ){6Cr8-w>eAq^ z>gD9&#I_a%%!zP74MIsd>_9>+hx%t~2T;(~=&R=x>)n^S1$(D=J(g{I9gz#zZ(X+l z>2t!Z1{2VE)z4&$u?E6(K+>&!2^fXw#Z9m-n~Rif6`z5Cq7K+1neIVzd_eoOC%rr1 z;>zx@6K!kX^HZT`k6jflm~%aOfiuE%nfSLB6+s0}UJ-^ulEvCQa_N_JeGi-{hRMu8 zIZ+;uWSG*vGaI8NxSF`Jy=Bb+cUa}SPuiHCho`#k2RB}q|H=qfmok(oc*&9bZPZV3 zK5RoD-D=_`b0n$*VSMPFUm~Kya5>Ry&KA)eY5KRVl#Ds@3cM=c+s zB=D}O{oHM5ltGz{NMWIticwD!=o$yfGkG554PcOsUHze6Ng|Ij2`rCuVfXW8s(UOb zV{z6pipOXa-qgMDT~o$j#y_!SG*T}^ok|sCv!f8#^Z7!BLQJg$l`y#oCIgC6ZXBI@Yt{aYB*3Be7+-xDkqdEv@AmTUeth_% zWgM|*xSIWyfY)go6MI+s)VJX$#dx-UO^|CcVuJYV`hGJhfj!XT(V$wCDN;;gZKF=~ zO1obB5MsxNTXH?~;_r(yYngQKR&K}bZ;+1!)NFuuaw<->s@7qeuM_N&ENH^x5-(mE zlrss-!Q`sR;0mYvl=kxHWU3XgIsF7#fnH239uCPlg}s??vjMy~_3gc3)+)=fy+7-< zd=)I@^veU=^DlkOWnk-77F=IfngPE(@~Q()wEz$_v`_21)Ea4OI9`e3y`7=Ope1IC z=&5@UKHEeK51cv2pOjD>?0VMaY%Evh7cf`kSw;&-3EH0~~vCM<)IX$N5v_fyZaJBh{tB zKw&y`RP}t@JMHe!DjSp8nq+_akM#Tz==dk8Vw;wuz1I+)oV91>@cdL}fNhb-y(z<; zGO`)SR8ehlOU;0p2}|bv=e4p>%J_1eCK3HAv&%_AA(yChb~=1A%3gbq3<7I(ZNkQR zd(cyKl5{QuT6IzXAiaM{k^9m%Y6{7t4oxQ6x!FT63Lc<@_oDv8ieEg$mFQGcAQuJb z{vCD+UZ*z4liB~~&7hFB+eOnVIq=3BnRE81pgMUcTpRB*cb0h%gdY1>%n$COM8*oCt zqb*lwW@ph(dv%+(Pd3nWeZQZZbKj>>c%2HN-ky_{yA+Omw>#RS^_?$IukGgq$yGnLn`B4|~1wa!CZm9JVE;8Y{_uX%kOjl=lhS7$zcBnHg_g6Lpf8h1lUe<2FEGMb07 zaSymQYPPNhNq^qqb+LKIW>d6bI^Qcy@Iq=}R2lk}t>`V-3>sNp*i`8eie}NKUe$dK z6?@oqs;w2TY__*bIdW46UuKOJ;f&KtE_RD!%Q4)haqwC%B1?_QX-7KPaX8QT>!F{; z=X0$m*N`h2QFlWdt+n9<*PgsLnd{d^9_~^Jqb>`AR8V3E*r_A9-jJXNbf+!YyZAOo z;1mY()?}`jLjs0m-#D1gUedcbq@hXqel5xHk_P zd$>0r@(Zw9k4ayKBQNeI?fg|)gv%mV)kt?33?M)4S_a{*{sQ}W50s<2-qU%<{xztt ze99#YeciNxNE4y1n>sk)P8sfQ8O_^mQ68Ih{Rs?lybOg(To>lX8~F+0>&yK`&uFM< zic+&W__*t-X#2{n?^&+hlvW0_qH4*fnw>eAwtRaNGPseHa2aaK?a#W4TrhHZy_;O8 zbxB(yy}^IVkK>nxnrd9Ay?bDJDKn!d`E6mRyWjK)OPap9i!sneex={aHVH4keUp%Y z-W=4G4=~id%BbHJ{HLDZDz?%O5u|1lRu;Kp7jA>{{=>}riV^I{@RDC+sHpGY0gXG~ z8L66q9OSf~rtG+wG@-DLmhyKDfP0wpnlCQ0riWct^p`$)uGeFtqiPyqS zvB?e26Qjep2xyDOwXOu|ypz93r}bCy z$y#2Rf*Ex@I487b#AiLQ0m01s=;xja!|$4UIkGltyW{$fMH#_Y06yhsHWl60inS#( zZiK%bmW>%Jra7nrh>~FD5eZ%*F7PlvU12;~>z1$we+m zLm?ii&zHgn!ldu=raA5B9AV~QvkLbusL;@IGM^5=X#eXDn$1obdxx&P!HW$Ub8rod z{s7L#Y;Ga%C2fwM$-=BW@_1N{JB87oI0rnSHq7-KaSgucH?1eRgl~@~r8# zVm}3%&myst=DdVDWlm8ubQ34}s*W^6f%4_&;cc5M@E?H5{SclN~0JJi~Zv(asM` zYGx#wyD8JdWofPci|==pLsp!wv{QKiJ7R43A*ks7jPi2*QUo>9)MXhYN%hs2{c5K_8Jk_!e$|kX&%f(GBSS-qciAp+Ry>Pw~X(!eJR1ciA)KG1ol^l3)`IX z9)$YM_3{oMIvC+_p=JVq9^)#vRCogL{F%VW6e0}U3CP6=W_9GdVwUB`=;3Zr6wwf7 zV(Xl_`|$mL?TjPgeW`j%!}*OV-a9i&_(jr5Jvr@Swg1g0Jz6e_ltaFFGn_sOaXv!gk3*f&!U6di`c$%+7y$K`-xJI)&A(8fwZ*#l+c)~wYh4X| zx#9G!^^uzo#nI=t-C*X{af%}%U+V-X&8{)1HCe)XljNIiYZ}5a^w@UdcrQjo?tSTL z8{w|8?GH9Ta{-3=YblC+(@T!3Q?!j`t!PImtVy)g3t@)SO|*C^K3>-|#360Oseq_k zqPL|+N)ml=X0jHMONCY~cC>|?!X32VSn?7Zy6G;aX?oR-+m~1kvzd`hz1dU6aX!j$%bMGP= z)wqj2@yL-Rr46QIf=h48`xmic%Hhacv~;c$AqU#%Zy`w$Z7S z@)<==PhINl-InxI7EGKP=ki=ud!&$uXq5(oJ)$()Vvh4|S8g||i8Yw%apX|fOJ`t+ z#Nz#N9usi`aSr_B$Ty(xS8?v>>+m2@SyYu2xYvIxo`E?4bH-?{cfGjr5vfb~7i+Xj z3u;~ZD9JvSCeHPUdBey#&3#4x=-m-#SGU$`?joUJ{Q#hWJhSkUZe|i1%Yo7nhxzeq zg|FR|eCPZDRv*FN$Z9pTrhNF`g^!jnr4|Ny`DjgU3*)0F|JEX#4F+|g2}ww#d9x~agbqwx zl{87u#Y!qxn8G$2!@Eor#$RoYw3zKTJgxn=jN6LfdA=G#Ch^KnMj!r?bF*#gq@!w3 zX7J}RiZdCT!K_$p4(VztN?%NzA(;@rm z7e_R{6^Zwk;=R7jJC5``s;rT)7V&2u!1b6_9v}mPxML7RFN_qJxJ;nkcDj`Fq_N5- z#hlQ*i2wk}bxAzIm+03#xLw`0a|^nJNHp!|ctRgT4T*uG<5(W?S{|zx!E#hm=SWQu zeu>Vm2J2_{55klwG*S%aXF7CDhaO{kX#SNxvPreG73x_qEO3D(zDqG(4yhxmpEBa-lch_oc)H&4yiK%pD- z!O~l{3(c$^Ej$3l!0o8fW{QPsdW13ZAieXUPil zlnu+6n-f?A)zPrg`n;=FGXpAap-lhxjOT}08Aaep+IZZO)0ScE?A9uAJ0#RuCm1Gb zRtU;K#QYGt#Qv;&fTVp$jexc(JJ^3l6MEB*My#*En{y&JPW zKZMWCY5&(d)bcWV1#h*;`GEd$N`N94irx23>tAWbu~+rSyp6MqESeGAu&4oVV!ZQ& znuuAt>|(H%gGr<#6@UL>NXp;0Z>U^y4C-WlU-)VT0JX6>Ma6F{el5TFo$W1A#0*%> z_KhoEot@Q+f<@mSNzw*KPriZFi0rwt&3+Ez*^qn9`Q#^Bfg_Yf+l~qgI8=jxe|SyM zSnS)-U3&|k5fR!mO%2i`OA(sO{6M>4mfSTo*vty*qjb>ocur1alD9POY^)788Gitf zPjaq_ptXfgT3e>oj-Xp#t+hy6vzqh(HxdIYk|XL}>b5ym$L0cu*0o3slgc#M#x^g^ z;tM3LnP8(>o*eW!E!IyP>o`4%(-weqtFh>WK{f~`>ne)CuQBOjHd_wrYmR{t%bTCt zKaecR6O3XLGg{LSuq~C@^n42B9dzo}ouyyj^Kcy~ng(<83&Mn_VIhgsCpX501qjPc zy+GZi_)k@bU;q=jI(b{hRS3mQ;sU8u=D8WYA4RBcm^W58z(1US zr>zaAyQ+)ztbe+NRg|eF2qi`i9(6-vB}rw;n%bZ9xP4>RHu_vQuFR}TBR%5JhaP_k zzl|vttF;t@E!~)Y$VwH>xHwD)XAA3I@1EuABV)t2sBHA zxe_`TLiC8+d(O&Njs3wc$qDtGh6nSjhJHK78!)=bw4Ji{H7ZAt3`7#3+!?^r;pbsW zsvKJ`e;u&Td;)OE^D1;(J`DF7-6si658|HBN-WF<76V5@fD}WjReQLxY3+lrm`UYD}lcbz8vy!v1D9<5ki%+FV`Z= z!uF6!3*xkyr%ky{fgEI!3_Mhn*9z^aeYZhA2x`}*bR8`xd@%BTtV(AR#;T_&(fxN9 zVft2^%QbDgFhdIkWE)bBX(OGT7br6dBxG4zm^o_z47r_8xh9aR`l`=L># zs^22sU}%N|aVi*VdP~YuCgc`HDj>>n&Q#^BN^Ya+fx*1FwN?;sl&NSbNj_4MZ#m(iD+;t_9lVD-Nt!ibj7TrVQP+ z7JV*`%cHDQ%Ih%-S7)rBQYOa{1*cb_0HiK&k^#rLUomqYwpus;4$I0XN3z|yOyO}R z`rd~X^Dm+h_dtT;tI!HD07cgV9Yj6A*q4v44+%)_k#Ec1vkg0{$mJ^K+bDMuSQ*5@ zqGnGUkv9q7m&$K8MJT33#?h8WxAt`_H?0p-GZAuhhc++3itEfx1J;LtLNvrrh9Sto zrf|qxM~Rh)nnn(Zjb;C1IJV=7WO>lF)oMfEUcWjnG4FH4%9;6Q-iP{wG@p$ zgC2O5{-l`WNDpAsZS*L?XQOCO)8{~P&yA8sA`GNeOi`q>zY1MW@8c-CddZr}N7}?H zaylsC{3ykJTsVT3*E+;`TziuM1%$e0Dy=n#2^@(^#vPvs;3Lg;6noi3VsqRV^jaLl znO12_@G(G7V|(B7N6kU&0ApFeavpRs#m_1ujKape#>Jq^Hv2`R!Rzm=Ae?l=I}BY| za0&DdZ`T#vOZ%i>P2&35w#8wD1?#tLFW}T{?K<8{Sq~$~Q4E{bsS8}#QJAC|6`10;h|r33gFqwGw*vGjA;p$V_}i;)u9^En02Fo*o*c1$(zAaeMf&)?C+BY~=WXhs z2VatYiWh7KU)hob|i!cn!@V1}JRDIkB3mh^isW?oCHQ203Po{2(9G3)M0h-Ajjuv+Vx; zq*Vf^pC0!P3uMq#&eAYN&io*`kB;{#r;6f>*+w28Xo%397@sRM4! z9agJoW@1*IIdSt1W&=>?U=qH4y1BUXnWfKpy8f$tQ_EYn;hoDm-3pYMzo@)vOD!~z2V*uTQB9;s(Jt}jFnU^teu<~Jc2@99S(fEV2ZF zy1B{ANZO)lOX{UK$O&orDGBM2gc_1aEoAV|gVG}+h4p^;+38=j@!Qf3V=&W0@0(w&*Tly%e=9qE%T&K z1kYL>bj~XE0ry26@>IofeOx;o2SeCuqY_jAkv{I`8E?{dFGke;{1FY64>eCBB{f3Nt8D&y(%}P^NY?fTqrp;<14=?p z1_B)hb zbcY+027zDTKA~3r<2a$sx}ApCA6!yOv7hd67ZT25vhXq=uHXj8Sz06#Ul`kFB#DYkWB>VG`Qr z0v5i=E6eI{H9%`4HkR_av_#c0W#4}q`Fvzw!aKnmDe^=l0%$K=Yi_j*^;OF3KOd|> zD^EBJ=o8;MNhYFCI4utYf8Uiac=-*GDOG5jLSN&ZiA4X%UD|pjn0$UX3WwJ^Cb@~V zxiDA-uj|CV@xiB$ci+q2l)MmG_X%P=pWNlp$Z_%X)$}f_Rl_tzm*-Bs%spDy+(>V- zh$8yi$v?Fuzz<_ty;njs?vA}&Iij_9eaew~M_9wjSG^_vNNCM$w@3>skue$9rY)*z z&Nks=DJN`JpQu`?PQ;Slg3)(1XJcgUOlc~1alKIIm?a7it6hl?*H)=|wYOqS=P!0Q z?5gfp%kL=~CJ*l<`Gt*G#f(E=l*7ds;fb6R?6xXJA<%M!7}gZ3Eyj?iFFzS})ozG--_pMR%Jywa-ycH;8VM3mpD?EpRBzpeC3TZ7MiBd>JkxJdlM>2aHjy? zfvA`YHFT9tY>hvAuc02T4;hxmPrV4k;SR1B1cTybcl3v}87U?ymU#e9oWnnIP zhSfwmK(;jYfW*Q>58<<&W%>$tu^j0K@Z!6WQ^!x|EOIuzT!ajolQ=*0k{u?$8D~y? zqn{;?Znz6d6w5{$I1M_F!fN93Zu5?3w#D$u9kCVD*K6;$ZW`4}x*qF6RQ5|Hp95q$ z(oZq?Yv>gL@|x)ju&h!Ml4nZMk%+m&dF4*q)`BsJbXV{LsT#xN}htYR@iQ3&-~LB$<{>nlr|?sV{X%xu#!>7q9j~`5$fJOmdbDF!6 zf2m1cY&NL7`Kbi)=~9@j@oCwxBBP)txUun-v7De+^?^=ydpo526jY>-5leGh{dS09 zLz!&{W;F>Pk4?1pDEQ6B^WHu*tqhKGN|#Kj56@p@f!gkqG&H&6tk~nqX@_|jmC^D(0fWZa<&qA zMpuXtpaZy4uWX}iLW#>eme0g<(#_vB+n3Fs_<1Q@ySVjBS()w@&JF0) zS*Raj*$BxjT^A79?`G|fW})k!2Ml@IYy7FTyq4?7Ca1@|6@*VcccS^b30t40l1(q+ zW%?@#fjfii{@wXFTz+EL4BpSB4wH#Vbb^5$h;l=79;tp6?dzoHuv}qhz^Y5l(PVw4 z^%|)=hi3cu=0TNlGVs5;{YPbF&hc(sWZ4N;-PG`&P@3AvOxGX5zQQ|!M;`)Zc z6HeHB3gYpza2KJLC&3E1Az|5U*=ajijOpm?!Bj$b8#1fz&}X73Ech`knxk9%QwOb3 z745Al#&gBebDXFqM*-r8g~;wrv|_dO3+rlNwxHsN3{=Un5O^!r#--CGMPfWN)Z{WC z4dcf0bvAY@M?10n6**7z&-T)Gn$zkR($IcJHV!wmc3* z7*M*is|^kB__%94z8$sW?Y<{_JweD{8V3_aGSs`CtL0r72kBh!Z=0Gy#OW2AVH&|t z7UBfj#anBO3g47;vE~)~M#{e>n;)dRCM+h>S2v8@5pZgu>4!%V0+E=O;EmuVRSst+ zZJOC9fa@k9pj-sZMBs~NYLvl0NiFKl$qP9u=H5s^$;8v4SYEWDaCW0nmQIYJ8DP9Q zO%>6kjhH>;RGL@1B!0Tw=I@=<$p)QGEm3whU$i<7hL0o_V^qea#<}~57U^_cJEH}Z&o zCSTASITo_iPRWExiH=sscUxx>$iah$J-b3XGK;+^P(H^0Xgrs3Hrea(xDbhGr^gJ9gW?CZE!(-x^vI|rEr)41n~ zOZz5mOlld3I=>nrhTk{7oMES)_b=%Z;{Kh;4=Dn?e`1SUKsvbGcV<@^W%^9tCb3;l}n4$7FnfrhOS8y>Xl12*?O@= zlKjcTMfL%-S3X+|Mf8R|ti;zsYTumZ^zML35$D30JyjQ&U8HsW0e@p-Lmvxy6eC?T zG2a5n5>q>0=YriVdxVt2gQG8_Zz9w*J0qFcxLJV@?g)qdv*voaJ$WN?=r415 zehDIIZ6#<{aNT$VNDw_cUrOy%2#uI`t^~9W3q#G|%vv3$Bi1foI%|JLf?I+hz3@ ze$9`TwQ&aF=K?Adz9Ao~&2;FOo8y?gNomNcED4{E;`3uej-~?2w^eBd7iWE?NOOam zBv>*>F`kv{1r-a4OyVbP7O{tVsd*`l5n_X)<|%jSM&omm1(a5G2nE-~a3THtjE8BE z!BYidqmTKxceb-6S(PF%{HIBAV3hb{%#RZt=Jw_la)ZE`BH~@nA&U#n=9*kei9Hy8 zIHH3s)RjOIzXZQqRt$m01X*fa2CAue0FybCtVJG{iFV75x>?(c%pe?;r(^4i=J5S* zt?P!?uhuJwR_-oRU-tCfoQ4OZU*H1Hj_oyJ#G17pB-#r3r~}&mKsWKf1p->_S9V*P zd1<~AzuXY5{iDMnl*hiRbTP&5<9l*L`O>XL1=n4xj|f3+8DMU;V_YH@@KO;i3u@Wr zihS1RF5Z^3*+~X{$Z~*}{o2T3pz;rw4t8<#a$%z9zWW)mkSa>or>rv|@5}8(XwrRg!Du`-)!j4QQ%k{%>#~>V@ncj-icI(T#PVH~s zIb}vk#?PIu2V@Cymye7o9B||aimY-+e4eHX+Zl|!AZ)u7{J~8{`7)Q)_eq*9L2P52 z%@~&X+U3XDF1j>(vdX2(b&m`zQgA*9dS8dut#U{_7XHly%7^|zjuF40J|xMBAbjOy zsWpaKgrXLync+#6o5tu#?#Ts5R7&A2LqEU=b zdvRs}+Ox|jAi@M$b1?L`)99$-(EC0LC=*iM`|7**Z&(Ruj$dzpkQp1h89v~0p}4aP zgIl-^W>z#BKyI!ZX>5TUx9Du!AA4++JwNiU^}NbR`rsxPmiidx5M399EA+`lctkb= z0Hc;bIaQmO_KsPJ?2q;%)*Del>TrV0EROK9koY3A9n36RI9Bi(M3v+#A;)02?4dB^ zj;XzIFq=N?%DQIaIb9}}HNK?af|o8%JU~5Nu0Mm2O`SAWoX(yg{$8)nmHE4we$oV` z`=lkxha%0pN&>L@OCL!(>$+b}k&#@Rrf%P%Sg}(V&nLs-xsLBz87(&n$}90JeqMb< z%t=3U?KGJ>fAz)@t77f+il}( zetQDO-isy`zkeJSUa`+F-3VM?YEg>A;FA!9cxxaUDaUFb+XIr-=fq^77bH$r0Xq15`aWl8NDGO$ZTA zj4j^Nkux&LC-a?3T->WIX9JH%_wB zR|0>0!1vbG^$3>kGlQEMX7Srf)LyFP9VQRW{#H28BYD^5*;z+slPx!N!UpVDm7jK# zIQbSyV2dO2sA=_S=4S+k;<`H*!2Rh`5B`ufnbh@CbX}5lb#_2j?Zw*zQRhSgx)*x% z;#_)`kB>9zaJwq+;8&oyjJ5g^#q3WnWZ?2JwX9?hIo98fB%#w4iDpgH0p-&5;2ro| zXOtbQoLV0Rhx|j5`0yY&l{0ebnMoZ0NuaPOsG&z078UL|@1)F0oaNMi8GRL{utCDC zqvI6)Pst7()>+2xNv!Ys_0Q_tugBiXFTnr*mi+%DOrZCP2WNNy04b9Hg#={(4+*H% zneb1-^!$t>%vFZ*hC`eTeqT-;I9_C zgJ}l>{Z00fz;n7aRgnRhf{KjHu^3x5_4&_XDmoLb*~{wuG7;Kyv2n}S>+*Dbnr=JW zA-#;c>&pxGj<)ONb9sVilLX8g65I0qsyd;+=I#1?@&5ik|Gp}!Ov}0|vgI2p}oZC6;cVU6nb{hjRNrv2IT zs-iN6s^MW6!LeK@ArKG?0tjNy;Ud2^1c8n z`STCf)*EVND8j_b#;#t!U>q-A-BP1(m|~3%cXj!ASSFjR#q8;_{7Y>-U ziRMT%6`R~aNAj$v+gqufiT&Gg75A&k{-#We!+QAd9ts=mn?KegFV_n%wn^(~BO}+V zO(u_9C*!7m@}|+Qn%Qw&cVK-I%F*RWj^0Quknhmn=*q@{*PbCmlIPxunbEp?4Bo5H zs$t6JT2?W(nj8DF%v--swf)ZiXqj_I&B<$59W}Gf*I!+O#o@h1vgAqE=l$!t(aU2> zCzsshFgA70%leIt!*`d}!+k31+3kIM?eja^Xg{?($gDEU(U!CG39~i!CB*}wb>FGK zeY4Bg3NJsco$9weP*ztsw|hf8sP2H(FJ8VKwfK}(NnDbkj*FIIt=IFPexr|DP;2lp zK{oEz@Nly^A+)uY;rn->TKRSN$kzB?Th|ZJrEVw+k2gbON(Z++M6J& z?7m40r7@antd&*v*Swei0G$QMVWGN>P6RME5*zPC;*N zH;+5s&H2o`du_z~bse}e+-b-VA2^joe%^H*>w602NEcAG zr{?xQInV;)gwAEqy!67{Q2&jLLHavt;7sJllzm7LA8B_t$xc z3P&eFg84*a1OSkagP9$;XGq*+U&c1#>d!*Km7r24a$lNcAw>agL)ENaE6*r`u3+tl zk&ci(LeM(AJYEv^6Z>8dwjb>@0k!?^aCRFqD)1}~o0s$_bIOS-0e7=tKshTcQ=tA} zam7l`LlERODKVsXM`Q=9p-%39Vo(9*yeAYu%Q zsvYx}!_3lS`bU#v1jl7Lt00Ms(+?8KZ~{VPg`fy+w-TA4=q*Ns7N5C-!Pg3GEJf57 z5bst>F1(P6oG&k3`0&HW#!-+LIA=Q@`c_mwhM5``-c0Wn4G*>u7r8wG(OEY%00+ zf=8@3`^`5Al!g7A&II$T++>h)n_i3v_L}Jd_Eiai@7Bx0&5WRysx?C*xrA*h2y1?3lQ@_SJp68;ZhWNrl_2|ByFrPW^6aeL z)XiXwO1c@(_S@Y?4QBN_!q47rx=V=SoBLW2{_dHLfsD1SeOMgVYvJ(pVV;;nmtkf? zOf-;%vAMf$XOOvgufhADPsbhL*ho)sfoS5pvv6}Xg^-Mu3-a z5FoSb+k!ZG{MP<{ef!lldd+)~G1sgABb*74AX9l++wo%SPD+3^I5~}6_2Bsch}unelH-I1<{!OVlB4NWqQFBiJ1O&kzDAY^ zpNq)w+>Kxu2=i854st09F~GMmpva!CQJ;+xVPod}=Jx)&{jN&`iJ;ufr-x1u&GceF z(j&D8-jFRQ{7oWNMF?;OgWYQ##Fp6kb$tViLkvK*K!Gd6SN5;$lL~oIKs zhc;BD8u;AL1&Fv;6=hJFG$~?(qI{wy1aOBWHff{#1HDUDColfn41Xc?>lq>+s{AKo z5DroY65BA7p$^S=6CuvsA5BNg1?h-Wk)Dx7tS|GdX2$md3Me^|7C7`TCBX{Za~tmj zZu2}e+n@M+re!j7wpMS|PJ`ZtCR3&b*V%w|9$0YUZkB9e3^{2=>gc{ro?*a9h{1(H z#LCKe{(gVU(lxs2c1MY52$X-FRL1Z%C`stPIC=>YsM(oK+^+h1b)Ms9#%9%4*W(-@a`W}_JVC7BGyAR_OXZ{nPPUNVzgwI- z=iwAo#X=KxBKcz=wMghS17h;l+icsKN&0^?6k{S>$DbPWaR#!q!d5$U#^=j#A#^zV zCb)vbBGMoi(?xF1;K-0;%p(7wKF|{1jw_QSHr7;^$5vgh+Ex&ru>B*!90F|0|^CZ(JBJduKqhB97anuB61^Z zyJp7c**p2e`jMX+Edxog%|1Hd?yp6*MPX?wS0XO@*A>f&_=wepff~dA0+!+LROL>J zS=jicT-x8WWHer2Q}b|p-dRLZWM8J0qlOe}{;@>W8|9K{WP)<|oR2IJ0%1GRe>cBRwLZ8_ex`y zB7bXWt5k=+dQ%BiECZHs-&o#Er?3-9%l{a^5ZgkYAPE$pV;28;-?y2Q+pVt>SthI@ zH&ZOa2UFp0TGW^iQi!$~S8R2&IHj`b04w2fJ~6FQ;J<1`&E;0XUe3&ea7+i24)*~P zt5Y6fj1w(#g(a}UM=g>N^tDuN5!1$r68yQ$8|R&@ zXHzA}Qk%h?hNSzs8XOV9zmx$hN|f8C*GzuAQ)Nlx7!zMS%tC$8Sfh**6k!mC2YJJ- zp+7_>$Bf+$ZB^ z0t1Uc&8p4aNX3e7=KlB{Za@(!vvbaN2Q5f_!3#qRLVmlK+F~ff`I7! zT#3={o|fKFQlW$jf$v(9ME_kckM1qfwT&mR=tJ*rjZ`LQl-Qt zyR20VZUxoBU{**_Tr$t_9_;kr-9c94859W?#>NQuu{e9DJh~OS5P%}V`Nzv+`lpK# ziW6gN#Jy)&UbL6)sq>fz+QAauRt(;YsO$Owz9+OE3XIY4?nq%45)>Iw4^%_ zOi2M!v-vj8_Xo9dExr|1R5djKX6-0MZhJPAZEtM}u|J0A)M_1lLQM5=#u8s1vaYiL z<5}b8HHSWiMhGQ2yL45z_#doE%@mfPPk$2CO5Hx%7W=;7x z^N#c#87NaM;b$AS_xkC!)VkGPg@Y0l>;$}%bXc%sd8Mr51r>>q_YB85j7$-gYL?`W zX5RNg7uCaAA(ek0g^%~k-@tmxDAQHE9l}$KDk}zomyhqGa*Ah&@t>U_Z}1`Haur5eB?7?$^FHv*vuEf4`)2=6ylFjD!1 zhV+E6rW+HY&drJ1kz6X|oR)5(Oem1xMcw->!?y|orfSL59Z$QZA1)+eLPHyA{7e_C zz)%vOAO(c1gmQdKY;>$jUr@qzghN#?ncX(HaVdD2Tw$@ijt1wo_7{ypuadu90r6sV zHN1&SU)TsS5BaP~OAxn$K-s@b0pC*!CDXESsfmUpj|1ZsUvN?TqKuSjR##FW(2Xf; zwQ#jY#z)05nLSBhyw=+YJ8A%%AlHsoZju*ny68y$t=?5?fCzIlS{L9s23dXdR=s9T zbQz@`9v#?emP2`|kujj_7+qtgy0Y}g+8`KRLl8fbVMMRp~ltSP8zQH2iK-G+`}0-ejYdK}x;RF}tiljgg3^STnDO5~$(1J`u2eWgXQW zyb&ErD)LaRB)Z!REbGOp1mWhgPXaV~yleO)%cmt}sd1wR0u?kG4M zltLj}GBypM-Y7CzN$EKEnkjdem8-{;b#4c)qrt4x9mSI+m#H;_>o6%j?D$}5&OAeb z#aPSTzIWUw;D8k0!goXp4R!}*xTOy;{ZKde><_DF>yn=iQq0>6H+uUY3tDKx4XcNg?h=0zRs1jPW$_ho|2?sozZ)^j_U~9 zf+&xPyg{{spS&}ueK=U|0~re(t3Xke%B-MEB~(2{bC;rpRkEO`3G|dY@j$Tp^8mY& zO;0xEXhAi!ZoI46t5xaJkD1ynXWpMl&NpVom9FPOv4?jf{bVVB!^_MuaWzpD2UG!o ztd=NPGMk|mBv^gtly*!ee9g7Vc)Cc3B3fJO{H;O6`e-K$}Y#y z@cBt(vcI1D6(*8s{;nQNc+vZh>T(+krtR+eRTtH2ZhL_9OQ zlW{sBzp;Hm6@mwby2mw7UIQwE5?7-sAi0u3{#L8ZScU9X86!Gv39p!Q5F!VlLmReQ zgL)-1U+y6Ktm>H@AUG1hp@oq-82MpZ6=%oehZWnSfENw{2F&4_QqT& zQwmdwm#_WySeWvnb0oE(U)KOH!+suWphs;T60jXF6=~Vfxnyy|y>VR+8A(Pt3p#o7 z#*azU(iiOv;|ZT)#`uHBU>S!TF=~n8fKOIj08Nd0M=J|bs3ghfsX^p1l}~GyEYK1T zx#eL=Cv52qvaqT&J{TK?BG$H&fd#`9(;I6Z`{vK(F%pyxCSLca`M&$-Qb=q)xq!p? z=~UI#E(BHP=zctNz0 zBEx@aia%j34!irn>9@RUr>`Y$$PuCvS|~%V`B+RsG3`TT8UbAiZb2ru2_3nry0Np; zWEhY(REa;Bfm+2Mb0X3ZFx~GSR}SmpuarCpVe=6K$&_j+w8d?8NQ*#7f~OKNsSKl| zWylLGdPXbWzE;b64n?vQU{oEd=X=qUJnVgi<4Jz<52Hvplq`>CMPEaGRWg}s--Y9( zdr?>3Vt-H^?qG`q!|EdYN;@7?G>8)vbyz&F0(~?D#4C4(9emv>8m)N%=b8ohm1>Hv z-Bu?0sUdEQtS=vit)`DXuopn=GTC9wd#BXX+I6l5{1M*~e(%!uD~K?Ia0nUh!9QoS zHqD`ekTL4x2zTOn|t-m4SDmz1esFBQljRQDg4v2$fL|enT@tW z)#w@>?6*TOq@t#>meXtMuu%H5IrK*ZR;kWEKH9h1EAk;2pvKZ#5RbTnnC|YBOt`Ec+6v| zH|R!L&%7!j$=FQG9y&p4E;ls!YP0C{!mnK?wZw&wTss&|bou5hQbeXNXLa!Ah!4WC zn=)S}HIy&%$m+XqEVqN2C=ynkmVG9JMF&x5s#}(J>f6MqU=vraWIS&|^2);5U3xPl zIh9{amrPP`ec3Kf$L_0TFfg;`>JK@tSIMFp-BhltrzE_V6L6?NY=U%G6E*8JM)Odt zPvFvsU2g1JiGJTJiInouW+*70F|~4iSv8ycC?b~kY0E5E;P{qu)c|v+inb`CaMX9N z0is7htR&QlqT1uW92nKkKFkqA6tpcLC+i^1RYVf;%b^tuX@(l2+f4b;vxy%Y$gNp%w8(OJu*0op{)w0Lh6$X+foQa1gnwKPu{uL92*~m?Egtzq0xy;+a)j@q%Bf;*<{HB8ZxvI!eP8aR@1#utc7sH ztlgOUJ{D1A!pl6+E7Lg-UtIzym9kz4Jnu78`WmlNAm!i|9qOFh6sHIY$se_8oy;CC zpk;a10D;1O4v&z#N|gWka((w)bsclDM$SZGWjrY-bF*dRF^mB={R0GRp-q*dXf#@= zh~3Cp!vGa?p8K9}sVGmOZYb{a{@PoN!Eb)6tF?3#lTZY%L^9R`b5z}OGk~8P2eE)Y zV*Z_-JkU9;&&igTkc5f^?_DQ~&6KInePSGZ19$Cgr&e~dL>3PSyFUv}aL#&gM!C$; zCLFve%`mOb`>Z~Ceh#Lah=1byZB5L_DY`XlpY>8@TxMXdarHVl5Ug6K;5(PJj*qu% zJu4Z3P4Qcg1uo5`OI>h8q%Hh=HYwbq1;25V%||k&8+=q^J)0>=M_le^Hc-Kch)wYi zwhR$y)cWY#hX%mT`j-~ALdHl90<@0IqnwC;>OWG00I^r`(n{?6j@;uZ z#AQ;cRw4bg!2T7UO9FEd#n0Nt@!JvXmiR7mCM+>QA{A ziiaDPV4a8Ec$W`FC4G_tk#QU9O@&)%6s&4e*{b&$)KNly@jdeRCTd=tBBPg*VyqLK zoe4Fx;d}LUVhR=O`a*nb0@uSvNfNqovBp(ThA28_qC4tZ(jtoxCe&CAQ~Y_-%;U53 zHK%tIA-v&^Cg$Wb{nA?DNrZ@59^|asUWx)$)ye|eG^9w^s3jZ-o2wC^n>rMzY_t=# zcNXwZzQY|`;(AIq`y9Dk#Tcfai*1+8;~!q{1En3Te&4f^-T`;t`pyPH;M+umra)CX zEG?_+tAURs5itVYR}Wn>AgjYBW~ns}5j}ytG&MPT((N}Re}4qy#&=mf`Uj2pN_8M` zCD<5`q@C^nsA8yZG$a$KRiF<%yIJ%<*h%s(nz;Fiv=zOx9@Fd+({1AX&t(IeF?H5_ z)67P2vqAb@Eu1?@hF?fW^&0Sy0```OKdX#gtX(xxy$logWUwt%>x&?<*56~3tc+bI zpajAYN=y#QTxyh;+@B8=#plGBd+Zuw?-Hnp63^rx$Q=B?|v0 z@(hcA`fagv&ec19=HJpXRG%%d4-Bu=#3lo}R9WM7_?0MEhL*0upEIB6YhzCZeSYo9 zW+s)(2EuATC@k;$d1N}2G0p&3%v?QuXBUZQ$~9b$Fu*u491L%^O+b)?M(7^~S|^a) zCb3ZId@77Qb{S1KtBL9lr)Gh0RKHh235DHll>_yJ1E3ixPT28!svOWB@@MgwDNLX6 zQAe}11S%ud?F_+kAc_uo?~9FFSFVtuaI4W~J zoy1|$)Ul?r^@X14eD)K3s#8&08oHt@o~>-hI@{fBjT-c*f37T59-Aeuu%H>O+ER0q zHngO1Vu+$N^)D}{$zLx?s-qR!Ate1ek%=G1eS4sylDq15{Vg~V#%)W#&r9}|A!_aZ zcn%lQn7d|vV4gm+dI&5&Xm4?xho+lrTyN2fB9$oJ^QtwQq5w6LwwC$1T8KhFO@g(X zbbT{#xi7bU(95-Zcw8_iei{pT7>_sXWZ4nY`$7Oxz=tuiJ&~W-Y~BggL^Z+b6G4mQ z3ynZKE@oCn!yskNBledtH+1YkLJ~u*+Ag4S-fCcv3Xm1|U#^r-s%fDGUAvl`>=hr- zjld$COgGh~{pHBAIF8+cCiSyYk#3f-AAl$)pwi?m>b1ygaLk-&Rox5Uw*K^DqGyu1 zpDCPhpmyTG8+4c`FpY>2OAvSjr?lNhvJ!sFvX#7WZK=!cx^J0iH|^pMBuOob9nCB4 z2I3l+bXm2^BzRVK+yUGgr5GRNL;iY0Px-or!>Ur0I+rMF#q9SaY^Dgb8f>^^X7^yv7u?W_R+xI0J!1RR7I zF;3dw6g~lCKe7OAk!f)wC*8#jPHiLcr=Lu$3;f;RJ+}`@ZinwawQH&(XB}j^5SajR z?fSf?W@2KZV*g!@&#k}9iQzrp?`3^`{4^J1br&xAHq$IOx}DeeVO3nf9xBVnMvIiPf4o~G~Y>H1Ot93>d?R5Qgk5+f1 zd6qVf?6mZw-{bCkLKrOvr}#_CzTAZtFa2wBgNJM4=G5CWcOl-Quo6x!Ypk?~G8d=R z`g3CB;_T_*OBqfZc9{un`^~G@M`4x`*bbuP=CwmvM8Om*x;t=vij7%~q_R z=Yu%`pO&bZT39RR+nlIftbzWq=M|E-xI z^z3zP&+GbTclmMWxe?*v)!9MG)nzqA&G^h4Yer}CuB}cl_N~^Um)L2nk4d0g=PvXV zi&pO8TxXAiL4@9ILv7=^H!Cde)s$-$5#Au=Bjeih#_-NseTrG{E5zmsEAVP=+O7Ro zE3K_e=Vx7wLk~`3d6(20s96W*OGjH1f}C#HcG#zirFQq{9Oz<4_%M{xI<1aocBfi}SHyLq@9QLEY!{$Q4$1Nk0Te?_Vp`anlN&vEY6pEt>Mlip{+!+(Gq!gjGpp{ z^@O&YZ@!V2`-HR)Oo11)a4dNyg=?PrzfRc7kN!K{t9Ic>hPJz!Ln=O;>Bbl4pVv1& zgu)TqzWzKEUhgoz%I=+0R{mt!d59cw`x~gc9vWSLq-W$-#m6EyImj>p?dGa&tG=2I zZIi$kTEjeAanR_^+<_x{4jx5op9Wr~2|@Y|W$7Tu)v7~ry-bJ+tB34(d>+jDxX|Fn zHQB+}+vm)}QPQ#m6e;%0O<#543C{b4@!qJigF?W8APjo0hUohVa*l8b9QxXG39m|f(G2*qAwHYI%;Wy{+ymi*H|h;&mOw4y#D!X|I>fyZnPx{; z8i!m?B{(aQqhmLDwb>>1jc#qXc81~4!k5&BdR|1z4F4V@;Llkikz&jT+ zI{^I^>w|Aea=SIs4W9(JgkV9habVZ)=ckH#;@EYO)i9389uDOK^l-*q174iC=N|;f z;=J2&ReC6;v?|R#Ow;t%=z1)IMP&Xv zauZ-!3@^aET2>fO3P}*B*KQ-X3Cq5BeG`yNc`6502UY_yJOcDipaJ&^Im(7qfN>sC z1sd^q;{*SCg*&nlLOo7T4VNtf2CUmUN4?apC?@p%f5c2Vd?RjE@ z#vMT6O58AorHekGKH>0$qq}~9?Njs6zXf4gN80BcL&q@w$S3x?V!$<3;H-SJNQli8 z?Nbjs7_wWm8dD=5Lc?7YHvMg6yS4!kUk~9<5K7pBk?)%K2?mz_-yW2N2XC+q9=PzA zXFvlZ#tSa`KuLDPpR68;YL$qQB?;DZ*x&Wmj<(==>W!0q@l<8r&Q~=|(!d4D=(dkP z>Cu-O8*9}O_%XREx$YrZ??;nAOypIiq5#$RC)`6Cz8XL6Rbm(vRbtQ*ylUs*b09eb zEP(Guj3XVQAZ!q#v8*5+xL0Ot=yK5!ptQ<;G)8!YQC^sX9gk36Va{}a;86KZ>H;aE z8c&l7RWc#b5s)BO2Z}8FGP`hL4L^-fG8v@GY+2wviuG_La40q~9DwdC0)F`JD<0cD zbDt{m)rGyp%zuJOcSHV5Ou_I;sx!%>F23}IwBK&51@SCL*iDItqYsskohIgCSp&4I zIgSxtEN)4?aSBRuKI9GaX)Wc0F6vY;j%O zu>1kg0Jc&v>QrzvEbob9mL+dDLqVkkA+E_qOBRO9N_#M~fQ15XVVdGJ+OyehN6f^E z3Q)Q!H>Jf$8We$?cpJ>C;iA0hdSW>?Nc8btv2`A13rkQTd5F)SP`07cw0%_8!~M~X z0w@sH3iOy9HnGBOFL7`^u9TE&r%#{L-HGS;Gh6#BeKPCX$+8>lP>!kOaTgo{S-O7_ ztwU)(j|TWezBtj9YE-!Kx8ybXN0_svti=QBwSwRIJoW?y1kz}oqHgRV(2!bP8j#XH zgL96hg|RiJjD{2VTCiq6n0wz}*^z3Gm<>hHoA-p~{f@=TPF+yL8SMJbinu*{A+O0F zLC$6=H-pCRd^W~!Pi+_i1h#@1d#*10ys+t<&|h+0uMVGs%xm;@Y*yQ5 zuQSeh^02>$Ltn)#tNi-=NTP7Xu{fMU?nJ}I&=|^?3;+bPf15Jv^JaoernCrd0!ik5 z{k<1FX0W(ir^JjOdK7|ldl|uw0z4N`KkThV?l(&-7S?Z7l4njTg2@x)iggqok|KM9 zxM6z&ssxW6yi|2K5fFtF-n>d)1>YoPupmspsVD&f%+vF@WT)WP{MBhVd_?Y*u=z{l zh=>uAVPR=96U$;cU#rFUH5{ZCZHnMFf$sSq!@W(-NF^F!J6}Dh09HJ~(^#z?jmH+- zU3(Fu9}ztgK2)4U z_-Ng8j&`&9k)(Q)PbPbnpu7X%*EAne+6$@Uyjw}%el;1bj^?Zf&@bneOE`84f}=U( z$$4L^w=gKPz6CHm`eyQ%qN1-kSoI9;s=Y1rz(ZLAv0y$Rl-NR99Z9?1gS|O zda-b1M#Pf5P>c~r#^F8vEtUw{j96XvlC(Q&qYsM|OB|TEJOnXcu~NXkiOB3iolvvN z3Nd4b#8(*qBvOV#J%C!ra`5?&Ln)_Bgn-cM$h;jbMLah4#xzZO#H8uY%x2=;2v`sjEz}*B;VSc!AV7YzM=CZ+U#lc)Zb;SJ`vu;AxmqjwBB#ixA z@JD+fZSK`-7M7Myk~Vp&@(WrQu`j)f+pN@-9EYj0ZZc;GGT>B9zb51AzqyP=5G`{|Z z{iWkkl#8dBN#PMm18}9JnY4D-N_lS#`uhUXeF}1deYSlS-K`cJsIw$~5QUJ2Z7epp zP}Z<$o?UWYdK{1*VM(`QVq62!8Q%1^XJ+Kt?JL?Y5B0EIDm=nh4JZtmh4O^E4%Ie% z3$pmeCt3vMn08Xmzd};fdb|Llh_O1>@2AZCsND|VOw7VUKuuh*48|=sxU1)L$cxqn zWh9OBq2l5-h@P*Yeu9pOGBz}&uVePIeRf(Zr`ds2xNfjg*3_Aq6-jaz<-oCYMN9pxZ&$uPQw4Fl#O zb(ok1jfa0XWcGA-M_1&73&nsETlpvSF!7)#=c4hxE!NYmQ-8kiMu?CQRO}Z!nZt&W zpAqNBn*|+^LoEyRsay6>ip>j&|LO#!RQ$LNL|+QqXU+@GhS{R-EbPf}KsaRP#(FdM zzkxVpmYM~9vFBF*0m@$t2EQ^2I7WNB@PZN$k%oVs1+6 zREecvL5OVvs9swXHN}D>aTS^z@`CQp`XHxGX_j7Ql^J{S9-7+?2S{+Dp<03-j`UHj zZz)M0=zce%G0p?Z!WMFjbC9i}Vmal~)LS~9hk2VP0g2qcmSJOgjZsqdsd3)7xwB9R zH#YT%d{W;)4D|Ri`aKoy$pfAf*&%RLw)6V=Mu>dEYnqJ_U8K2JU;_v};&eJUm<|mi zE5j(7!L03=QK(T}^~KsxV2q)>rFHz#sNWdhx2MgJd#98E1{m%m=<9uKSj!|s3Ndgn z)Wk}xsEVitg+I8p3;0;p`3%_jk;54c{wN%W=`7ngIuVLvOwh1uuCX9T;B73Qmo%pj zjOzL(xX;^p5a`$N+S`gYjOlVq_G_ULCCtJd`^n(1jpF(L9A*n3992kpU>nlzDCCU3 zl`~D!jqXZP0b@wnukWP0`TDr{UhQQP0$%c!AJ!yXnb-hl2xNqLXBW)MgBYOkjvaju z_b}T6%Mx^cYQKYLtHpy`Qj#ZnvmkQzw?njnkHYucA7=y;%g+0x6wsxf-tHFYjqyax zzjJ)>P7v<-6}Awi1u*Q32Wee>(gPbkn>EmjAJ{eCJr4{@(y53i*%($c1Z+b8J7x1` zpZ;rAThREN6N2xj9A%MGh8|OJ*va{WNJg9ou7bw z0o2*?L?C3#Wy&@c5;WInNSxsprghQT)P9`}9Pfd9rHYboGK&LG{Mq9)qOljxIf+QB z$c>iDy=_=(E^EjO#TG9nd=CX-8GZz%&k7k;I8IeBG#*j>5Kt0)u3@tDEGT;z1$Xmu zyyXv>@;e<_ZD2C6leKW$7zi>l@lMkZ@!b?h$Z!g+Yp=m-x=TMXBE zxYI~n)ZQu5sfeQ4Oa~*GsPH0~AV)dTw1Zd)+CKI}*ZYT;Ht4wL8g0XZA&e_o9Ve&) zh{bB0Yi*mhP*z1krqy>G5{#oG^8*T-q1g)3bQRfmoDz)V1{}vCzS(!26O7{y^2K3H zJ?~Ac?BWvj5_6`iXRw89o+{E4_~sS=HEG!*!UeW-Cr9}u+dJ2n?S;3YE6*|8p^Gd- zDNjCUZJLhLsA<;>%}E#D5~fw2>THzp`ITWhPksvQMlsX`yv?;nlwhmzV~x z|IZ2R?82;?m<$PXbr(v&nplp4}ua!p9i$l9k?{a&K&Wf?6sC7`?XgSM_Se z<0kv^t%xuCIATASSne4%qIUPc5V7D0LM|$QmRN#nb3@OGm18a2z3DiZN-H-vm+3Up zs%v)j(6=IS>Ai4IEYt_g5o;_*lQ4M_cwh_ZFl5G{TwR>r_b1<T=Wb&kU4K_xZEHI6!E=(+J7IEa&D9Ugdv#Jc$4{2vPa9^FE@sQ7Fy97Ds28o z1g=nZk4!`2Zr9bY60hb;an1sFBCc$k{UR^<{_08~5tBX*zq5!mLs_dj3sEbw*Buib z5W+;~jVw=WgkUZAJ@!IqAFlXeyPWJSx8cM{(4?-m;mnM0f>HXnVJU0!Xc=CxIkDu< zKyR}DGrIX!=u5LLUqTmc%yqvylecs0)$D;e z(M9`cerjI!(J|#9Ge9^}#VWBl=yXk8T6i&;sFX9wC&Uk^f-0Nr(nqPEah;izEuxA! z=|%t(Evs}Wp>$YPUjHK9*rB}*^z;1^6zS_>y1V6TuSYjKow*5TtMl3B+54TxxdAqg z>7xl^tu$wyIA^^$XN@#(tu$|)IB&f;Z;iBIt+ZhIFQSK8Nvi)}am`BdU!khiN@4MT z#W}XJGSMGJitLz`PcEG5U&pSm|8Rhn{s*Yk2zM9J0|Ef- z{u}?9a=Dr~{!cVTMPb`E2p_$BR|(#>OVHV7<$TC=o$1O_12w63EL0!B>hlH2CgnM_ zZ{OaRH{;M`=?r>?%1T}JL?pEDNtK*PgEb7vV|GSy@}RmV2F z$V5fuDS@3m-g5fTiW;D>S7#HtPh=Aqg}DjOj@8qb)tQS`Gac`UpXq8)B?u4TkLW%p z;2Yg*}6rVoht^r4BXK(t8Xp0n3CJI7jAG z@bx&%9w&WQOlX&D_JScRW2hs~pyd%Fw+~%!#URsqeCc-%vc=6&oS&RyHMY!Q24(5b zJ==!fe`mC6|CYBfmoZ2a6aXL*^FQ$_Cua|96DM;M6K7f@C#PlgP1`M2c%K(vkoY|Q z1I>n}7AFlLkvJ`cCz9~ZJUb}K1IZ~xLMeqFke|k$=TXk0F&&+<=IkMUEPQ`A_ACyj zEDr1o`(J~f>6dvj-+ri)xy(kUrjJv*h#jA=Lzg>LDnW@5$}H3~qLk;{Gxq>rl4Rn3 zGir(&WPw@;BVh?ms*W5UctM!^Q_+iZ`EERhQs9T3W`}w=!Rdb2bMRL!SgUz0)3Lu!i zAxV)`5|4rbCaDXv!i-sXc~K|I2BE@<^qOc*6ABYj0?6fxjGKOSOV@Zay4CK*fhe*N zADlvCKa>=mnt5VoGKxqjUCCLdXHnuEp3WCZmM+6%e^j(n(rk**gu~WQRvC5jL>tIF zyLp*gqRRJ>#<4<8#+EP6&#z88^UshMo-*^i>9zdO6C#R;vrIZ2xT~oq{L}oAuG*Nuo-vsx$7cBvYT>0TJ`?27liHGnnNK(-$oR2%{zT zsDm!pdNrj)#p0z<0CKRO&^5{zJBtnhJaY|1sA{@{j5F~(Va_8Y%1NSBiOH>P5AM=a zbmpS;mY|qd`Pz^{YBu!PnCd}Q}?We!>x1dmwqqs;r!{T+w}6Z4RX_w3S|RlP6P+XJeR zI{ClljWbb+w%X{)cpmPG0aNsJnmx7p^u#DuFtgS}HdL+hYJjsOL=`Q$MhWG$pA23a zJ}ZbZhQU);RqAxR=|wr9nzwiR_ZU-yo8&uZ^1|Oh;{CB@RWp0i>5FFt?T983)nK$u z%MA3vmj9^jvyg%`mgAC60qi6>$$2&o)}$;}^x3mKRkes2MU!d^ifCw1(<)43Ab*Pp zpg8nHQ`!_55A1lhvJ9B@oUA3qCd|Q8;d9`_6NF1U*l3q#IkfY~CLWSU%evCvhq9O# z>!8bw)X!V^!9HM!l64O_n*dG~%?^Md3StcZo|=2Bu>ZBUtuz|z)-=W8N_k?~p+}J2 z0K>=)pUm0vhc37?=jFq&cHps4jSZ{pzPM)W`nfK24c4brVjiBV_P0~pAjR^u9JJP2 zQ4#}RB%9L(@LE{0KyOtJZ53hUmHQ>J#0C^_hFuNjflv_{tbJ7gqf#FRBhewOkvbR}F!D%ZUaJpOId6y_!E#{Wd<2 z#?`_>VD;3!yKv!Y`{E*7ahB5PFd!XmWpLY`S<5#;y=CXBNx*Fnr8{1VW5wqBwpil{ z=iCxo9BobfXLOnl#G5PZ%e06zm;n61Y6|>4%v3Bpg|zK+ zLYm`dRqO=g3>4MfKdkiy6uBE_X6boTKJcc;dI$RJDv8e4^m}!i7A^p5lP;6jqZVFt zwG>ketLSU{2&JW5&res7JL2!j$i{EJKOL3wz9x>{j*}`N*W_Ul3St|);hJM)pIBkE zi2xzH+I}RH402~ZCh?iW;&p% zxY~pRN~rGVyMP->7JROjsd*rJe;+w5MK_uVeD=&q`pre}G`hdFoe0F68Ct);AH1Kk z;zfd+BmSDCJo)KZIeY2qdzN_eSW}2ib^P(JO81zpYioCCj#TI|oh+EpVLLJ3edV}M zWV@>dVO6W?@cX$5!jyf>i@NKQ&({|Gw^Zuep(Okh&wazet&AC0-?Mf5+t%XO4Oz-{ z?}nj`<@VF5CCaO5?qQC5!45T+vheV$Qy7j{ppCwj_3DU|+WHr)cU*1YDYH-Wsc+=) z2zNUGFiC&EBYw4Hnhm?|9rRyrJ>e7~A~0SgnurQvhx}c6e{lqCs|$&CphZ1^!E!xpOg46OePb(KBEWw& z44_*g&`#Ik^|(0;C>%JcWUFP12uSXk-Xz$!Y-w@1Jm2_!*Azl!YjAVt!RyI!TQShF zxYl?K3+^_wwzt-GMnJcO@8N#4vQh4K1nG8k6GD*IdU`>ypmTGaw;f+=dGB=Q zO8OT`}dH_!sN{{ zF&qgV4hR6H0Q`{>I-PXBJBho29J~@w&xiK3d)(ATEuGuTgNyipo4nSyn*^=rju^}M zC4BB3d=J;>+ao)kp7)44_j_`-Bl!EvO}w5bx36{X4)>4l&U%h|4gyfY+iioMb8n)*1e?UBP~e1ptF?q~*|X01rt*Qy+0pvKsgCV<{(#s0W^rf!pxg4H6vJ`kp^J~n=6y8y zc{=2-D)8OAC-84?T;1fgoVg;o$&CX`Xd9sl9A2FP2fDUqZh*K=N8F-SQ&J6YGUWb- zbw}I+eK}4z)c6#}_~$-uKteA(Q{##gxrI9gJZ}G*f8s)!0UK^Nm#gza8426& zEPRiW>32=juWI-};(L{z816`R@jwwr)y)UXJew>yDO(_E2n2Gr>FtrGXti(+ox;W zr)S%zsCnZv^V_?7r)ztsXM3lpwd1pYCAXK~R@9D1)Q(Trj?3MNMmMJpFAcLV4XZ5= zvs-he{ukust>f07<(S-ptg&TYWi3;9Ez?vjlk9&cjm!QN9@e$|cVxx`9ncl$rqueD zROcN_U=UcldxL9xgJ*k#sI^Qp{{=ac{;np1MQ-8eN)fe8)3r=(d$)Owh2J&LZJTrt zjPMVPN)C*?8?TZ>l3RJ-G=1Zfkv<1(904}20pxYbp7#;+2bRlPeD}Kn1&w_^5I)~ZMT-+Y)7mT01ir*Jg&({JoyJOjb?70)oxJX!x`_m z{CLgL{r7kgHQCHy_nGgK19;6T;O0H?YldggQvlZoUDsvJ^t)HKn{oqlVxyW?BinMd z{uVU~-Ls5<)FxW?lhXk0HFl-$D@K4;J8j+lsj=P~yJ~kABLJ_LHW2I%d6u0n#=1UK z)6o{zMZnXBHC)PY!Nz`mb6GPI`5L_1I>p8*oe!QbTr=JQHi_SJm^C~(###z}4r)Vl z^x5@Vt#yhbq~@1VUa@q3oGrO;-PV$L=6ympPVQjtU-^n~x~cpQbCC9wE}o-#Kfskn z*ybR$pk=vZ@_7j!670dR#Ry(12A*TxLBI%ju3~hs|A6g)@F)R9_)j?K9t88UhbzIX zND<9J-Jw!K+?B7e%ToEi@-s<)kjp?i%?n!lp?s&N3+9)>_ZGM3$I^Mvn1Ir=Yd@v= zgcAgawjxMvG4s%f;{>bHX$OJY6tNw3@-WCi;}N(<^3d1dgTS}~)nLXvP#Am!N7Kzf zu5(R3DVBX0Igk)mUYK&00~?h7Z130ATaDaT+rHy+rYJjY5Yw1 zZXefH?6H<4(x(!>N$f>HBc2fq{b@V<10JPtncoZokX{F_g&G5-EBr9Ka})#L09`4o z0QVEGK?1E+4_vFs5DF&BoCuh4A{(GFhC!gQ*+*j_kwf20TGJpV>MJ6+~MkW2yS?hKvZ zObKi`l-~?68^F|p=o-&7PjHlSLsW(mC6sb4lyZxQlm|#={Q*|}H+jtZ8rTf>bkB$x z%A+u+WF$#*$xxJhlyT&PBuY9zD(h>!WMI*+ewvuDE-fudo=b+R)S-$q8YHpb`O!{a zgOhCeSer2HN5T4eChT)ESk~?=dQaQq&t$FmEM|YhH9T zsGD{*Rq5|?{imz)>2X3yG7Di?x*cHi9RPfx-4>KfO-sQeP_Y}&P;;bpaZ3)|+Po>!%> zt-(;MLdeWjS&TVNRXjsmJX5VgDBWnF$xt-^2mKaA10yKc)F}TR0eDh8Q~tYnOk;Nb zrBOm&r+#gx{o2%$61oWL5jhl7&8#&z+=0Eub-O?>jrql!MzQ< zI8_qxcXrLex&aD_X7Cb$1tR00+(_zn`O*k6&K`mI%Of$Gzz4u7w(+1O>D-A_ie9>JSMf-IOb zwg-7p5cuNj-SfiH_v6sGGBG=fxOFVh0C8^|nYK3J=RTTaU#HmXh!6qH&|;|70sa$t z{#6ZxF96K2V!&0Pm2*+ksRLB|xmalHy zam;_BW5##{8319SIE-te*^i+0+SJ!NA`SpE-XjRS2XzF_@tP>O4M>w=eF~|bNCd!4 z0)zhwd}hW=Qw zo}Cc(qDgo-uu@dSi`WuuZ@+|zZkuGC9|CXs*r9?!Iv$q0&B`s&PMQJ`$BpLxQ18;Kx zEaf-=z8XhyPqY#Ux_$<@w*v}cEA~X!9B|Tb4Nxp=SLchLItsNfnyfyC)W3*r%eKA{ z=D+_K?_#l@qu9)%$=)OQbur1wk#s4H`~U=IEftqLitR3%Tp*B39xuYU*BUM3%{pcu zae)eQ>1g(33Hd#n#%EAkVZ3W|zv59jWn*!JKyfECv?XLewz>94Frap01<%K24wF@QkK0MSSU)qNW!#mNEleUyem>ok7V#KAGxmB4Mb`<^|R&%DC_3?Z0p^I6| zQdB7$_RM3?mDl?3;t{!K$MS%Z!|!VLWhttPEp5&Rl)0MP+&w%~*R}e)Lukb4rsfw` zmNE-mC>Pz)uAp5ma4|K}Ok!`z-3SFLx09vJ64!@|?r|XKiuKwZ=XD|Mmy7O`N7<*B zQxGjAUY6W#kFvg&GAmq)m)%Ua)>-R^#r$q&D9cfuY-y{H>vq@X9^sj~t#R-s0G)d8 zW=6am)ytN){s{Kh<{snayRE4|f}h>Y7?-04+0r&1!QtB66TEG=HRnh0iMyHLa?~hW z+SViZr8f5zkIH>5kvHK}^I=)bQQ71(3HP;p5P4qKasedO-8YNx>Bq2|?f3+J`Hu8g811icA@W~g!oR|1 zD1U`%{sIGM%CDt$nt8b)27dSMmF{Cc3lD~NxGJuPTmA8*flXV~!d7_DyTkRs=m08I z`Sns!3rXR@E%j_0s84@|_R8q5%4vU9{_t1j!nwaHn}d`m9BY6}9TxB1n$7nF&4tW= zPo7VnbiCYmxc|1Nn{|GDetmzgf^iFZ@#<5^Im*Q~Iw*@RJ*hR}DP%vjZ=7^t=X_d(!!=g%G+S0Mn6nqO73ID4EXKdbalpu1CA z_;3CAPZ4E<&O$#s=6?qI1bvvi_%m^j<3nW`SkAX+|CH5#3m$Zw*uAN^*8YzX5dfR? zw{X3RT7C=n2iPXux8n-xU=PB=gWu`_RdEe07D1Zc>QATd_(9eF!!N|YIQ_p2>Snz? zYX&tDU*x3Y+|C~<2UmChE#?2aU<;xgna#h;1--)0l>Zl5{iDPFF6Dm(mjm)p>i>_! zO`ueFe+6oy|Dqne+|RpzZHxcx*B^W4zX~@8_%jv{=0cz>l*L(35Rv*Fr3zmX$SWVv zC{m37*Ca1@3=wG|LD!C0<+WFl$0%^OD(|5DZ;_yl|I;x`pkp5Z6xakCNs=GLJK!Q<%v!`6>!{ln+~8_+X_^0#FDqZj|y#s40xxn{WB ziY)R#DtQ9XMKK4>aX$ge*zjrHveOz{8<5$ zpR?wVE&>gOY_&TR&`?19H54L@&cN00GJc+R{yzqRoA38FXF%HjAEfxldGKH4|6hO< zf2|zxUn=(l{G)Q|k6Y28?D|)V<$mtPpD7kr;rlJc|F437Rxau2!38>{R%Ha;au{65YMLxvXIG<$Jjp>-?KB26{dIX7*}2c zv;5_8Jb(EAf#id1PyH}CqJLJYeg|ycA6K4yfBN||)8?Qu$o-lRzk>Mx2J9hpRjRmF zFY;h51okJzui5x#<{q2({}!}7`*H61VfOgfiRqVFTir@3^*b6B;Da!LyE?k&T9>%& zn&2UQS&PT*cEt6hgY5zF&u>bBzKGV48k!IZ{8&2I=*bh{5Bz_A_aF4>w3CUQg?Vi1 z5CEqSOXR{C##`Nqtg^7+%D5MoF!2e)2N5KQVPfdeni+H)KorF6v0NHi#D~QuwHD2a zw@J(PTGmWV>l2yclMKnci?5sRzYS>dT~FYLF9L3^MV!=|F{|g37aQi6T0E@z-0C!% zE)CBbzYpnlm~Wk5x-?<=-xc<)pKOl2;>(L~?ARlvi67|02*u)qbD7*fSbm_d&^+K< zFE20Hh+e!;5Np}Nx#3u|=fdZ?o8EC5XZ=2THVW_FcwKEKMsQOzUz1&{wak_c;BsMN zcAo~6QXmSI+yHK@?M!Z_*VYcJEhCa^@Vc{CzPGsZ;LpA4Sl=+=1K67IrGz^r9_&pm z?>BNH3^^>~PObIrxEvp%Egekhh_SibR;lvr0+uY2<(ynHZ;N&xbmn_+M@7TLE)AQm z&+V*k%D(UMO*bY}FH}K=7P8IDj3f3e-(TP>Syy81>aFg$O!M7e-YY%Og&t`T9MsRw zR?YGZ)vCr>wz?(wO}5?#YCg22F`w&S@5jtDU);2L*jjjk1?=qH+{qyxZ{{^_k+?VU z-9oi4NB0CxPOde}MI6t2?ump=X}Ow5Wb-X7n|nBw9heuC@Y)NVbT(JxoNhWe-UzvJ zFD<9uer;%QX}H-&UgBOliB4COD`j0gx1GnEKPbJL$IGtfnXlc;v;;)(wOO(bd6*!s zMBN$Jwlpp;p+oibw0WAIUv`BHT03zP;D>a4KUv9VcXQ!wqC-eeMNCHz7#Rr|3GTqy z?AYvD88}%9IVOF*xfcKJs7*%sHRSDJTpnv(J^Z&mcz}bDvx`sivV7XtuSV=KdF*u@ z2;U?S0C7UjNj}M&@@ZRJ0xjBPxhd%UmJAl{g>K2i2tB2YrfIrk5VSYu9}q0{tptyXFR`tNz_ z_tmo=+^n^HJneM3ssW3ei@6W?V`~S9wQ}Lh(OQ-dWf8`R>0`3Iz%Q}RpBEg2cWgs3 zFC-oeq<^_Ls=a?#i_e!5%ZqU9;kX6xYE2GTT^*U?U?3>%OpmqIXV4C+?XuP9&E^8rUdu4fVpxU$!qA6#guk6Ihk3-hjhQTMEqyvTh@fsvz|8wpBsBmrtwZ5!)^AD52D06&l<*LV=zdh|5Z znJ_##4Jemc=>YmWEnH&5i~YR|P^U*8q(i?0(vbk^_~e6hxX*xc2>Bo#g-NCjftRlI z_My&^{rK#;tcW`mP(a`xUYU9lpw24q$=%u$pzLSCfmZ+awMTl$$8^@G-e3^;4@heK z(O9k_BDVp)^Z>pSB*A%FtcWb;iLS=^XQqv|s$DPR-(YS*t=C%P)H_dVui>qX zywnM4^c!t|$o9|-`iMNLggmOC6KAR*Fe0N9XS?)Ds|CjF5Gm;q*%Sl}`uT|$;4@;O z6BoKbKVNZ%zk^`JLnr>oWn#)pBO-kf`MexWU{T1ZQxS8;X6Q?(8Vm{dTTvQ6WPC=F zxOQm7L}V#F-+;lu9QyVjLPT~so2eQcv{D?j&nck&8F zQOQ0ZCsWY0fUcTEIZ$RY#{>9_^!$d2NO|Cm=Gu`_P!v*M>OD6NDqBy?TahhaAoL@H z@FClY!EMtG;$#q`SId$eL57R_6m17$E8~IKdO$XDKWT?m2qvLa&p=%ym1 zCJ3Y?$w8JAL5jv8k&hse0uU2A8A50dF3SSMZ31y&C_thqZIdhVo8vm|DBf)-QJh$i zQo?(0F=>$7qV>vzndSU}OrGcdhgiZ_Anp-}d-}-b2Z=s|r)vx_<&}F$Lj*)=V}R(o zJWxkL7=)scVOE$RX@R&O6+m1u5SP#pC>q9GhYI;LmN`(mzsyZg>(O_8DxgDKIY8fu z6H(yCm;>MS1Kn%~aZU2ty7u0?U<>ntl%K@{Eeb0GEsiN*#g#T8#UTNMN&-oHzif+C z_Aw~{87TyY`l&(^ScbU*>e;8(ET0-c#Pv&H9bOgzOHxpdLZg#K0`grUb$G_C~>a+D4nw3@0n3NVZi0pRizXBnVI`XKM!_Q9Agk-bYdsDXaM;OdLKy#*yO zC=FqOGB>ZSuDEqG;Yn{8px4z!-avD-C4@jjQZ&#&6N0cn_Lw%P5UymHb7p9Jpk!7} zZw)JmR83RPQFk22c0M-4Pa#mkf5@nU68=w`zj4Fv-(7O**w8&T!$0Z#Fr*8NwdyyW zKg~~z$C0mBKmQkNduKL_{#-oFgZ9}Uj{j~-O}mr$pVofve~vBU`sXsgEBqGPw@KM{ z6vuO-tUs3dEjxd!156n&Fma%i0UNXwZeU>57qtJgfaTv~2|fq4<4ZPBmF7puMszMPUB)6moz|b~HSS<-}$+ zGr|>8zji$XR#b5>R@b?>xXc$=`D)eaSfDnD1tLIwtPSd8VCiWTerNLdpC|pnbyhg< zipyvw|3}&42}gIv%x3axwRBzJ%+p*<(JvFWa9S&GGSRVc6#}*_Yb$6kX?{hbDP6*t zX9sS}PkUCNw##J)X6Bt4t}2|8c3&xLFKAr+>=0mO$^WL;zFFY^Oebh!{hm$GaC^*g z(0S6EDQS~ZiN9$mXFepo=fFJy%o0faHydrE+R-MZebv*x=Sjl_(y!wF zx#VwUeY8wo;fVN0EI)QgoFgX6<4F4H^^X;QNVj63{HP{y)BSB*srr8_{^UzWXGUH% zO$wYIkKX=c3_m&! z1je@ka+XJoJb{Ebr2RC@CIlG(w; zr%rjYr8h-VlP|d_?F|$ZgrBt$21570l!|;U>`UoQ3y@O~kVjUw%AZ^H21|kg1K8K9 z70YQhs=3QGHaWH@yAdoy%r{-!wJgWql2@i)r85~D4W}?AVxTZ0Hv7Ot;htTjGIZRR z5g#B3Zaoo9igRuYr@Qu7uS7;M#S@{G3X)x0(!)XiKtAeXD`;*fy*yHTO~Op-KgEM$ z($NUz;!WvJRE#Jm-uI^7fnz%TTy^aFBxWntw3jIoJt}87M>MY!fs^x`Qc&ZWV5n3Q zFG*z{a=rZRvS}-iV9ZqXIiVjM1Kf$W)zp{JnL+FEFK0mvZROiR)@yF3eGG9W<+-|V zVf3V7mqf@@2hm=#!7E3q*{&e9xkEdK;Spb+aWM$LHe(V_;CUjGYa-77k~9l3k|`-L zH`|#Kj#h|@5(-P6YR>CCv*Xj#>I?)s93H{t?CDR*QB3ZM7YUhz0ij$>v58#}Od*L* zM$e*qii~UMUr5uQP}#;^dDnL@7~l6d>3SI4OLY%G_A*x>Gm6dH%{t7o%#zF^BII8W zCd}07(Rrei->O?VRKyjf4wp=QNUmN7&^oJ0trh2Zt~qNst4C?26q8XSVo+CvyqN6@ z-qjazC?{@Ii_$7~DpBE9EgURSd8_&znvFU&xq5o2A9O5AZUVY&Ys0O8$HN75;m3Uy ziN#_!o+8e}GT_sqqIimW@m1a;Qdb1LnC%E=TLK;hz+0NG|2krhRIbR?>SfAmoHcq} z8n*SvnNZI1&xa9YWzVH5QKAiYQ&YPy(w^LO!rhqM44!T!%*1S+lDfL5G^cA5q~n?q zq+%PSqokU(GEedHu<|mHFtPH)eaM@86(TbdntOFzblMr3&}o>6#@V5#q3@<|wE9vK z1vM4RqE$LQE;$V|J<^nb;hlP?i7N&LMMSx$;LXnX`04gooEL&+&K6JLd7RHBfjycr zhk>jK`dq}5L@X{BK!3vBAW^QDseb4n?S|uq&Z#u%z_Fo7g-nG-MQTNMMRbKyg>6M) z1>LN{tkkR-R@8jI*Z|%-L0|K?`{Vj!n=76xp)01V1DoiDqOCl6s@)eIFAUHSVA%ZP z+vONk8FY~I16AHq!Udyr(RFEygsp~VN$4q8Q3ELPDO(iW3NICoM33Y|5DRs0%CJ@R z#mWIi7+mS_hHL6P$sHS&BD;_dsEuL8x))_<=HRa3&Am0RM|AZ{%6&uLXr1{%%sXS! zH%HB&P7zH~+`iej-HYwF#h|kYNyvv^;bAMo)R3m0EM|F1Al{jLvl%C+smWrvQB5KO z_io$-_#tud@d(Q|(GP|5-KmS|wM}KDmF#jFf}$I=3z5}y)`yTKA06(>n{vlSnS0Z5 z1b8)H0MxXbQfe?fHLOf!lyGMdUe0PMR*&z`v{XP^)Fb<3ZzH=JjHGG7CpC*IW)`jt z?^BCYzG>C(cqt+F;RI~T>4hj99dDd1TXwXG46BbDJ7e$eYa}JiR@Qe`M~S;PW*SC< zOBt)pT`Y~1JNu9p@FMPvil0N6h*5IQy2Z318}*;#>wNt@`3;BBo1M#D9IV`>m@*9M zXihP^1U1~TJy-4N8$Fbb-BF;j@BBVoYqm0_DWn=y&b+28i+G)_+(?iuop}~o5p8; zM}4}m9fNO)p7P9=wN*QCDiL$-jcj_$5T)0A9yh6{Oxw~k&1uVCT#2)HuQRT1vh~g( zdg!pp4EZtgNU;t2^HmzdZN=JWXSJ$O<*9XSDn~y_>`#yu;XoA=!@0RS!MvGTbqy&WlNK@S+pUd} z*&P|E^EvhD*HSHBc59HljAmka5PELYZ8)iWlOYRVI_vj3HU@RRS4%g>nT@DfeHKGS z5;ap~i1oNoM&1lL{AQWMp|0_^p`&e3GHxl2Njt!sL>nXFUKtD_n`q&B~aLLm)teg|JXjd1(j`mq~2OtqLZZJC35}*yr$4(og?k_R7-zyqi++Y!F zzvQQnXsbnA0-rNInG>v0`23(bQs`XP(L$UDyk+g??d-_8y>2sQz=3(#Gj1)z@AwHs ztD=~B0{a9#$!-$4fo4)M+%JmDui)MLPmPZg=NWZoH!Jdv4Uf%^dyXlN z^N!hI!UUClsTE)N1>1B9h@`H@t!g?z;`E7@JI)-`jipf3h8Aun)x$0*?Hjke;`4Xh z(7LL>#rDAQERt*GHMns)J=#Sb-{en+b#J*7H$7KQS|&jl9sc~4U_H`V1CL0$p_arU z>l5>ZRy;*NDn!mo!}gHRgN}_CPQhgC*hurgxJ`y(jTd7Rr1blkxb`xPD-$uu=3dK7f zdvfD7u?0n;J*vLbV9LwwOePGGbvkNXTxa^TPb%s#j7m~@L!0zSxt{}qiVN6sCv&BC zbod%1MWdpYp0>1LjJJFN({a5r8ei$mC;8wm!N}wZ<99xGWoQ@7B+4?EnU0*Bq zDz`(CUAYFNJHHg6lhVYra_0?=ika|0Y|;Dh@FvLs+*tQxLCF2^>ydApomj-xE_k;_ zZ#qP}_v(o4?;Q*hOsS%rY`)-*41cp+miK{VRGXBGt)?9rh&ZJ}xO8&Kz&rXzi@Mb$ zFiBEr>I88`KYRuo`&`BT6U9d@v)K0NN@6e#A6@3tXE&^e{(2<)NC7z^!Bd7(^PX?n z*Z@4OW3p#lomOH4$4oVn^Qg0|C78GBl^>*tJ^A7X_KWx$ibb*+-RGOOz`s~}EYL`p z);+!8BFamh8_O(vB8r5(l!JNE*pnajjcG$-8IQ-gz#=N@Qy-Yvs?e9-ooR?R%AkIh z{gq{1%o*7oV)wf&8`WG1dS}=15gjv>J}Ue9BM}H>UMlmIl-?es3W0)R^Aes+1r_6D zkEi||(?kJ7HS)_m;TEi=Uqd8t=iBab{CH{%N77KSKdtv_pS&viGHSF_Z*GgpEG&?d z{FF7O`lE{n=I!Kx=QmM{(D{KI`maZ;1M73!K4a^wa{BA-xyN(<(cH+g>ktI z?9Z*_O5yc*Z@@Ng(tyk%+|RdvO0n0(qN!}rv+sCrMs=T%~Zx<*`d zB=Dwk97SItubQEzglT=*H7@ySkj}hKk1eWwwn!weypOT${Yw&BveV>WNUMnW1{SPq z=Ly);s1eGszh*Q~ECj5@$q#VICWx__*mL22oOo9Ix^(ALu_6xw@+Vt{0BSV7=a_Rr zUaHOBK41IOITLc`$t|=xmvXtt-@gVR>E=bv()H4I*yUX*fY~#Ji-dfASz4Jx&YFZH zlNgEfam(gHCv5QGD{%yo$PQ{sY2*M^Sj_0Nlnj-9Ldw+6a(^u_VWCz%dU1QXGu(nt zkQDd#Jf9v~GQt9jKNJk8EAu>v%NxNAB0L@Di=2mTR>jRLDj43!x2U4pOOtYFmz^Bn z7xydi2R?T>usD)%Y+iAnyE_;mnx&HRS_A{*SCpjx0hmg{l zEQO}NuC6^R_6rc>-^}=s+T}X1hp;=}qUt)_OC?j|Nq;phvI@>ykXN3yGi9g1p?#}X zhgjkaM)Ohht-ZbDr|ZF>YJm^+-su$fdZs+q3Y43h8dqzpr8)@tdBGGKV*;w)I5KcneJ9f zdx}YND|`vOt76c(VmPL24E|Z>)0U5|Xc!{#PUU6F%6A$T4JHNhrD#CGEK1sK|y z`PLFryX|sDDZS$b+RpXpBAr)rvCsuN1r#t7bt)LpRrckS`5q2#zK;o8mzdSZs!dOjagU!Tjne2!O)Xs4^cvcv zybhM0K>(Lscyi(UjGb_BK~JUd>q-Injre;Jd6sq(&ABNS*{V9Du9O1nfz*fzlah4M(A{IyGm!T2aFtfk86kuAg|@F@{kFXx)1kzP}y=2J$S@WyT2 zgGp@0YUjLau8`pn#Zh9nFB+HT2=3ll(&BF0?P(`O5KX|HF{^%I7{GiJN-Co|GO1iL z@%mPQf?qCPQ!BK zo8H$vIhP*FA1_2~!j*U?kNV$4nVR}gEO~bs_M$apv<@K<(F)BR^4o8YtcivRp!>Q} zeoo`qVaOsIjfxo;mgE$&8$p5=dS-dvkMg>($wYc|S41@4iI%h%;U&M(*+~$t%S6FK zJLXeSZ3RzCx~kAx4#aRTEJ1qqf_=CgO_I@dhBweJS_AH1fQh7udZ7Z-p;u5LTu{+r z_Uv^HS12AGrb9w_tk0%wI9lwnXxl0+VEK5zk-p}5u_brPYcYC~LYeYlFPWcv?tQ;J z8E43TcKjARi2-{q0aM(Op2KNN1`AX1Ane9LsCsS`d@NohOJB=}f%TN8(p&KQJhx!C zoF@JjRc&fM8a}#K;)4&KB%VYMjkg5BnZZ#oo?T#F?{+F*Q=U^|zZhcPZ!Ne~w3a(k zJMwAoWMtl{HAtNaVqQ(}gDfL5he+-;s_*F2{{G| zfj1tQwblS&viaL?b2s2WYYC-g=c3a7f}!qLtz;>n+$Q z{W-T#KHLAZ0w0p<>bF&4Fp00rxZBlhXSZU|6G>6Da9nn^g@wcMa3n%!N_nzlp3j7; z*_q6yGy5%|YE&f8M${-*!aY9&sAd{CN9brP3B_=-J2cHRQ?#FZtzteMUqrRI$*c=o zB4(AwrPwNn}F|cD|z6jNcrv$*}E2DP*A^q<6Oy zuW{0eww?jM-@tEUmwYu6QH+>{!5Bdi7_ybCi06pIgm3olXkX6ZVz%3FnvL8u$Lj*X=YupV<0`tF zD@?kjn1dpF#(qI0g}zf`oj!@PA+eF|CU2)uP{ZFN;AL8w1cq2pf3f9~iijoc|8XdV zgX#p*q`Lo^zIq`Eg)42aHPz zwN@MBGq2{xLI+742YlMa;-}j?cWg51w5DfYrYssCDwHZMTwByx3 zPOoA}oFzs%9Q8?fRK{1`zD`C`-r}odffE&X8p4a~+-9{k{!T;vC58IygbB7!?Eukw zE_RYk^eoecsoT?|GWN{sqH;IK*UgZkHXr-AW3}E%uGO~FU^^Dc>4U?bROmCu@v~Vn zhCLOLuk~(ydwsRHIz1_GJy`0jkAZ}h(Pgzsf}A{lbq2;eR1aOJ=cs3w0|7q7OGA%) zc!-919P_Mmg^$+MlCm&oeHhF^4S9>8uHY;meSf8a$*u?ZKN@D++=VjFcc9ks#gUp*r>|CbPe0hnboLA3p}g_)V(a7I;`8cplrj!+s?jYO&Z*U{V3(yiuHjZQ zFLL@GjXUGC`yS8f1DNz%e<&my_->t^fluoAfRoUMm%|e@jw*>ZTVXt!gcb%O(NI)h zO`E(>0~a!a8s z2ABQ?ZIF0xVqO}g&~#QF4X z#t79g)6}xH%yBWTi4pD+OV_Q#s^_#naFeV=E32#dSW{a8At^lHKH2HzcvPrQ2s$~L z;adYxv6Alwjn2;EQq#>c0Wm!AjCNZpz|7Rwx&f5}3;z;F zCao^@ox&nQwECc0nmwhf>YG|^?jeH^j*n8B4WgajJD2i^c6{rXd`&IjC`~M?`L&=i zq&@6EDh`+gy)z)PIH0$8{Bjs!|3vfMs}OHe^OFy(^X5-2&97=BoRf2RkDSXsE`RhS ztiPp@I>BgM3?zFfk!;TCIckN1*N6g+30ebERMTQboO44C<+5IMdq2(Th^Fg8X?Zuq{fkYs)zl;vKyym4GQ#y`g@ zk1l08t>jFP-Fxd>HHh#rch8|h+;<(;^Ay@iLhH3{PnL}sEic#AYQzBT4<$xO?H7^lghFq2T$G($8K#}BwWyLh`HyW7*Z zaRE)(&DRDzk>-)R?+#jv;`DHnq{JA59ZfhgF}f6uMy)hlHRCdQP1XnuIV@h?WEb%p zC;&pB-$udZ)oU<|YOw%Qo6NLK)Z+~3 z^WKOrTc(zbcoq?ErW~o^<+q|2Svv|ZZTQe&m(a9qPhwj+xdRxrt&~W%q*rijKslg{PgT#iebe<)+#481m@xoVYf*lHaALo;fL?hojgKEDw$RFfNU za1eEd1{?5hhtXg4NlIG3gvR&wN5yi$aEM(b8}R;w)&`}|Q2tJ^j8Odu89w8(of(_V zl&n*%I*cbEtut3N8b$8ieD;wnV~Y6!o#2P_)8VTNj|azxo4d+~g;~#d8l4u1_DqB- zdh51!KSib2>%>pkp+EOa9V?D6Qg|F8^P7--3#O5+$K?@Zd)jWS*g6P^F4n{QZaI2J zzhgW{g?!GokAGG?5mC+6JQ?Nr9&aKY=P=dAp2PQ54$|DGa=Ka55OkR%J9p?OJevC@ zhu4jSsXI4Y4G{bW9osOzCQpb+*I%Qn&NNZg^-&lW{K=!NRZ!KL;K7yJ7h_%fLW}y}sEiCI{beSvt67S*0<>FC z&C;F1-WVRw-ooTAR@YVQB22qlZ)sVx&C9pAFV1ak$~D};zhiUO5UV1H#1NlZ0Z%T_ zgmYj?jw-Nuy{CAW)bHa%+~N!pBdb?PIl5ql;xFUr2nnY5;Tv zV@w`G$W3q8j->7`8zgiM5j)zQ@30Lco^sdG>7y)P8KXE#cxKHu2;%~upSb3|W(5d- z6M337^I88ulq8@w4lo}+FiA@gDb09){-pdvP!NGW0W#(pnZtOrU^CPRt;U}Ei#>J| zK4r7d@jHAf(yCVOkO2|ZsxNpqS`?WVF}+3TVImFU5!hf*izocr zxE{A(FLXTn5xiQ<31oR(|EORN}*CF(SEc+ zGlspL7Ag12A?-&WLhB5q*|$Z(aSp>wCpx(#y4RVGpTV~lR4~qC<1d5btGzg_nBhHVWAQwTXab82~Qsn(IHPF7+<9H=IonJ zRNQxp;pDc+_Cu1EsC}~o1)52MH|!|EH|JFmIAVgX-C-0FSus!zYuwUU&WjXnuk@%> z{2W&<=*1BaFsu;wvxQyEH#5PM{R`x2=e%pO7eBq&6HDEK*bzC%xKQA0@CRhIv6mRx z#`21M9+}3lq?=kRlmTC#33w|Oo}nfY*B{Ms8|hd9#<7q`J^ac9*>U&nWuxcvLmqEd zSWCLCfDFs0`0@Jgq;3rcK;4IxfYoOWmWggfodOBjR#vz&ISK>;QY3mE5x5k!}1jVKp$(rZ;fN94j?KSj~hYjIr z&F|+Jr8L%aDa0jPM(>)~gP0KI4CyQLZmO3ZL=f4RnMQi46SZ__`d3W_VMAOs!n|ws zd;)Raz$b*Ql*Q51mykHdBo1LDt~l?$WQoSo)miF0#haNP&!gZj^k7XaDPjPR{)X^v=j4k{X%(b%RL1*p!{%`v zmQO@OaN%!6t#}0LNk2dfQ$(fT@56}Zi8DI;cbYH^AdCRMP}FPo0<-G;ke81@S7 z>6n&Ic$3$Gj|z#45k0|9e~=o|79U-|zENO!YwCuSmnb^Ko>e$`Ng;^Pp#)F1u7{bS zbnkKL;X975n$Lj<_nNcx>V=_0=-?K*g)Aa-#+dKZ0scCpQ|%tnxu&LP^nMNlXCxd| zyqE8oMNfdA)#*~en;YmcG+Uwxa=pBx3h2QUpg9vQgCrjZ@OW3p95{sv>7t+Vb(mJLeZe;i#D+Q1?#6Q&qgj={GGrgvj2FiTz4hZAU*g0N01cCt|Q*R~@<^r~9-E zzk%YA3hMRZS1^)w0Wvh9XJJQzFhe_;O(Y4l5jIcnP!i*=wDwY{CR~C>*B12)-&aJ0k=3l{-URsy@k<04wWUTE*p9uwhlb_eMK-$$IF2y z9WNU*pzA7Nf_rnpz`(M1>$-T5*OE*o*0BvHNXg$7luK+B3ZyQ$E^pqgb>tQ86ew+` z@Y?T894L=qQ{=HEU`loQ&h$(T#3i=O+8NRK>%GQg9R`H0O>FDUrwz83ja0~|$6J1? zookhl)}4Xi8M@==vwRWD?Z%Yl9+pN6rT}$Db_p?7IC?VkSzhK%n6wjKN4H!%y_?D> z#}sT$iwOU+yHAmNOPLd*q91%}-Dx5n9M;a;m8%;!qdy3#8DP=rT}DaseBOVrO|tx5 z5wcm&u)dDIW7$FZ<_wN>K!`Qf@YgkKCO5hkG##JD)fOj8{E)mA4yUIcNPNMyUl%W* z-Ew*$J|I89A7DT~6M}dkxfG^XpjRrBFH`(VIYS7IBn-_8%lNDj;szqt+rT^8d)%Aa zThlwhJN;QHgy-`dLCY0hz0||bm@=!d{t?f?Q^YVV0&H{w>^K7KN?v9oPm=^0rm8_W zT5u>PTOqStfpEQUJD=Wdf2?tMrrZanj*MPAAM$bd0%^7_#*WX<{sQq>4^43b-Ecmk zSddsuaEwNnZwKjn6Z9hW0AJ1j#lb!P*)rE_SsJ`G5z>PR{?-Wla)|jb+4QTiUYWn2 zfHABOT!^R2EMZ6cUym<@9sh6~6I?L%mNEAx7=C3N_-q-c*Ind^JC@OA-Vr(rSzifn zV~n#t%xaZrQNQ$x@g*hq;DmX9m1!>Tm;ljBrApH{pT=co%KnLYWz_BBW7xCsg}2!I zmJQt8+=QJY6I{}U*gJTZJ8Q<++Zae_IY%L`_7gE= z0#5~!G9ZMrj;EZGul)ya73cw>%erpOS`}i>Cs+&I3#X*-s<&0j`W-t<6(>&RrnWY!7nvTw*e2>sSgY@V75 zm5`D2DKkbFQE>I*A8Q^zzw+P3SjoyH&hHhhQd}p4LGugA68?YaI)@-lfHnzFd)n@= zZQHiZY1_8l)3$Bfwr$(C&7FTY_OOS&RphY_^+sj9`Q%+b${edgv{_53e0@j64<%<>x&Ox2S z+GV}Pyyd=xza+bg-6YA-!i^1-{yDM4cQAJbcMf$`s{)tQOYArXc{68n!%wg$|w zjiA2siQwS|j6cZWu~|t67`L%ZB%IJxU8&s6?Gc;erbZ>EMYU)k1(4h1<2FPw6r}BJ zkII+jQR3&*y-^Mi@R2YoZX?V)U79WxZ={|D zZ3TCk`FWfq<$+-8a~p=phq6!IJYUyGpgp+V&LB{$PD>>5< zm_h{JvpU2HZH!v82dnK#X~fPqy^Fpsnjyd%ojzS(4e4JKm^iDPGYmrAtz1se&Zf&& zzJjoAq>|af#ATeVrP!T*VAmwiL?KqCwGSe6XKKGs*y$N+Rqxt!k%@Vs* zD{vwldNFuMd26u%MiW?AonxngZ5y}T4Nc3*AVDjze;p}?qP;cG3@_g8$BFfA9ly^E zLshf7A1gjv-nKrONpyuJZ`zqkUpjpLUIM=q83vHQ2)S1bxb5 zap{c9;*;2&7G>Cp@<5AdQT5T0J&~I6q@q-_2~cu5>tXc4t3q&9$`g}ZuV(cEzj7zC z2K(|ZaEBP?RAfu7{L7G-r^<j{;ViVQja{{Du|5;2PEJtGUO0ZHh z*YE#?U$*{}Wo`qhU+AOaWTRuFqeDuhtqT%GV?HKfCc~bP(e=B8ov*3DUsue(iMa<> zHa^MA{d93prTpo3F2EUT7MhKqJyc{cJ+)UJ0Cpoe%xE1HLP;BA;)myrF&gQVQq(n5+0S$$2{vIj1^Be~IJldXy za@EYy7-*8aXOqEJft0rSpPf@8P9+e2!O+id(S|UsOdjscl3##D<3eAkkGixM; zbl$?xr{Kw$jp1}io`=Ju0@6{?Zg#Zu{1oGTIrSQbQg(;qr)K?cNf(&I{*KL!nUk82 zg=w-;&H8KyJUcQ#PuhC)$?fgy+VscVu;*ZFmS(E)gI-CKuhP|&Qs0m(ncPrJ(keV= zm7UJk>v?F9oowOuiQh=ta?Z_{z%@SFpj0Jpb9-7HK&co=+UD^n{-t*F75owwg&ZXz z=k+Y8QkV9$6hME#!Z!JbE21qdq$`qpnVnDhJo!BRRb1Oq-qDtEZo{jy#C*Cqrzte= zrEcdZt6xah=D;p{EcE04n$o~muXufz*4=!glHUf@7}!9Q#}yFc{w`(#Yygc6M?x`? z0F|J0#4E5jftlKxMu9hsg4y_Y54F(`Q_8&-C+WVO3 z`?!!~i*r`0k)gG!mgE2>{SiXRg0lEiZs$<1>aLAM2{_%aJWxC9^E971bGx-`DANKk zGJkV?EU}C{`gxbyBAnKbHnFNH6aJcXAUAp<&>zHEO9g&g6QI70X`^1C;D!a@R^}_g zo?lDsrqE!$t>+HY@bY&;yVkW&dg>}^z>$6_5`36lU#EX*Kv#WR%4_xro$K7 zy|?uQHrgU~@>B7=aD&o7tUgrUj{a4@TuziFlP;OmheO=W?2Dw2f^SK-r&jH^OMx^> zh?snL9LHn@H&%S0)>|Wj3#L-6eZ1`A|2668hf8uvWy1s%HQMh8N=F<~gV5`Cvo)-{ z_sK{24Q4gh5jXqY@?po#uH;f#ECkdj!Jw6nwr&4Fr;#!P=-Ln zfcDT&SqE1MeKC-|mvGkw+_oFLn`l>RmwC&y2dZCQEB)FsM^2<#P$jAy7?~y{J9Q8V?AP)@=_T zDOKj~4#VrGI_z9~n~QZ(Imd_;gwaFUr_cB8x{O!7+Gn_zsN+5!03o5IqAqSNc8?A; zx{C2uC6Lt)Qo~8)55ksh@ts=W2^~`R!LIDf$>E!kIE6I z>{%nUEaP3@^GD(Bg?E?QRcfUtV5{U)HIago{>s3oO^C;~{;5>^WM@+xmBG-Ts?;3j z$KYhK9_5&B=9P`ZQj`G>Kd{8KoWSG$b4{3_9lugiox`WcJkO)tQ+J1FgZ%=| z%KPdwBr(9^Rq(lW#W2}1U(Spi3n^dHNp*5#)-mA;26D^np$H!P`zi%O({pWm`JB#X z0E*y4ob!-GoVmR^=H=R!2hHpTd2cyJ0=d35-vr(ENh@&u(UQ-cnQ2s zDoyTz^r-lNC!>Zk_h^F44u#6wd+WnrBn1iX#=7VBci5Ld*=t$y@+ZQE$4CY4IG=`* zR0i;d+{8`Rb(e3^nr+gO=*Zc(WJnSt#ml77MVqvZ%>}n{wdThagf_s(TDU?t7!5;3 zsK_1%`x+ud>LZtijW;-smk}#9eWG%O%f^xoPONWl_7gzB4O}y^TluiF%@0BN%R4F&_pgwS8Q!LmEw7muNXSIq z(<;4r}BwCeC6P z?zO`Tn5HUcSe!+(6S6uxb4onjp|Q3M+Tw}v$;e~UM6uiDbWlifQWo6aqVI|CS` z$QUW_NVTym(B_AsXJkxP+*I zqEYDucrxAL0^H`i?N$vLW8J1uSvnOaLrNU0wP~S+Q@UNfBImPpGQA7vri5%U$t)hv z%g@Eu!%3s?kd?vkd_0E}f%T-dcR;PvQ>goBh9Ck$V9ZC!sNxw|;b3z2toVUz>rRks ztEf61M?i8Q)2riQo9n#M?E_v^_IO>DvqDeI z%=noVa!8f?m7joy`Q{;?>u*cc48m|qL-jEa&R|i4g*0prLRbn}tZ^eNxy^F@h0PXI ztB4&;14T^S%#$AsBJ~5Ag38yYkjhjc^*hT%R7aOaP!Y{TyW^8wZ?0+YXMVTXH32@# zDy!>pz2WuBy}!XSQH3Pxj|AYfX8A=uiGaCzwj+wh#}x-W6AmKpgQmc}s@H;g*z|NJ zvIq^TboDbj9YhaFTT#Vn?4lxj`pgVMDh^Gr;!|m+Mx3$`kF?XOfyc46ok1lel8zfj zZRE1zlb+hHMr+P+kfm7CaE}+}BzS}JBbRIwS;;V*h6vFxV7L<@$=?M7XF#8HHUPsh zaY-gg409|kNJpb0o+bI&-zQ%sdPX+H9&|L;T)WQV+F8;h$}J|@_9ny-so!H7pZ{V- zjYen-xROLq+POr+by7{~acD%^e^g2>>1BK*C0Q5d9@$0fQ`fjs`E-sm*AXO9j%O`& z5{)vFE~h*r11n-(&H-i+_*r20ht4~U&NOO`9`jzOJpy5|&IS{2i5rQH<{-j#uE6UaU`CcAUb{9b@zPjA=l^aDrTtMt2+7QR%}WDw ze^@-z9DX>J$&SzuCiC?lANkvEu$ z_Rjk@)~n+GlXDwuXqMpv4|#yx^U}@vwRxQ6w2PeH66|O?H{bGL*2qG~@8}5Hx9eJu zcF&X^AIKoD?YHAb+8LEBks~g^W=5=6cCqU}@J@nww_mH&HC6M*t@V_@38@N9cAPIxE-cyF0&pBZq!Y$)NRde z4Oju_2$+UI%`RY%KCjEJYgP)KuoAHw;XG1U)J60n3OLFkay;rhDjWUF;4v9pkeYBa zjF~WERcH}`W-w-uX`ju&4_i!@G)o+yDDxc07fUzFH`*ftj7Wk>$cPq&r{ZC?2qNkN{EZ=O#uyqQeg(77tLkh#AILKoWs7qzI)h}OI3Lw>L85zd z2!)vxXI<0D*{*LJKpqz>R<-6*qvorn>k(b6%25&ko-X1OAC4evm(v)eO+V#J2aM5B zsyek(YI9W!`*?DvaX6>=SSYi+f=B7e(j52Y z=G=EYDZ5;JqGFv?^rI@kpign(Jl;SZl`eTZB2Mk?rTl`-l725nX)>wZwYUIm@tnA# zMKY5Ftbnz?S%YGksnOs1wTAy9eepjf=l;_ap3PmGzB8Uz+c+K!4({XzmyBqKyQY9~ zm6nv1oi%C_^ceu%=d11s^)=m3ZvQiKs>cWt)p`!_l?YoP4tbGscgRh?m57RQ`D1ie z6FH7R97*`*38JfRr;F%CeI^2OM2v|YLKQmQe?P7iuI=%WM6mwJAWhE~ApY{OabB}) z%&NNgTO7yT{TuP)^waqYWT?vp-tpOBW3HO&LGGT^i-Io&{@68uPs+UITacg;FK@)N zeDxFLBZA5@y7tzQ{e*H~wbML?R00<(>9j(6$@0(NLy`o7bP(7u>K{a_5X(F~`#Y<* zZc&kLog_QqMr4|w*GEzcXe~0D#aQ98tl$_UY#t2#+a`J zx&xwD>HZ-mYLfy3O`wEp89xdq7DhEwaM=0N6Jj~|N2D9=n=Nev>IZ*rck*E>drvDB z(2wnFfVf@rk==;-8*B@5a==T@_>c3?8h^kDf=|iJRvJO*+bgS<;E=8CuF@yo$}8w`pu;;#a65 zvND|86IpM`Ml6DDH%xuFeKg1}A75ayzPyI&hn#vZUP+GTIeK{3e5-Tt&onbKU8gpg zT`_9yA>V$BLISu)yjJGi8PmvsqA@Z@g|@!mH2M*?O~+MDPaD46IdWn;>i!kY-# zxQhKO5LF5gRrhKq4FTg=J7Mt5Owg*NhUT@q9NJ?(wiB`pDgdZ^r=h3RNV0}` zOl{d#myR@Xm{IBkpnjj(8wxD(ovFw84_O3LxWyGG3Oyu_*oTz3@9?(pMK~Wd@q5C| z{eVRqsBiqSqi5)_K3lN~^x9zA>2MLVe=~bVQH@%8%2f~NI7nSO>EX{w_{T26V}iR4 z)ZHTo`eMGx5=}`$HO1~FV5c|El`R{~G0wRhx>A<5Bz~NUGG_E9^QyZ9^lzSiww1TJ zmtPSX9rFPOYsBVqq7%b85EzQ?lBcZU3>)56XY(bf+}-{Rn{?L5bVmNZ{kGaP-KQb2 zRwZaRbI(K~I91xIxaOC))%&h9Kce8w1Y)?0U=tltnCa(N|0;cwXM7iM<+0|=TvU06 zwRMrR^>`pDp#n~Jo~#LN{{bkrAX*mDD}fOUwxkt)$!mvOrJ`SS_!PmeM>GwH1(jrl z#o>^;J4Q$1uF35ly=$8`e`r&a>j{XlpT*@dz^{%A7T`_!t)$1_rm z_xhT=qPzhp9?&^Ua|zMtWXHMvx=ruB9HL#&((aiGNOE6*oAQ|mAb-`^?#{9lf7%tB z+(rc@p@`fZQ#QZ$unoaDrW11AWynZL;QXBOnUXIGZ(5Gza?5Z5SS#(1tso%tutAWmpoJe{G^m|oG#Q8$`d62gn9q?4W^4imim9%HMebEeQ*Wef;osmp z$(RU@y>Y+B2|II$$Wzb?w$-5g0m;sedbyd{}TFN#wWWLw)V=%8-JX4 z?Xo(ZH1*$cNytMCA$`m-9Lr7ML1fJ%C@s`;Ck=Y_qEQCDntn6}oYC9}9>M0BOJ5ms ze+<_IG3^|#mDbV*lzFbsp-OsZ7gK+;5_0y7S<4m0?Ya%k)tiWT2Ca`V4T&9$yqgQ| zf1@RzUR;gR;O21 zU=qM~(L^vjBycUCcOI(ZZ+Z9tzJtMC*PjeQ&5zX>2o&D?3L<0N@whSv%8#&*#^9!0 z^)^uc>(ATy&FY*u2`5XhEN=mHJCDa4Bon^L9NeR753NRQJC8lqt{uAq_-yC9>aV|7 zShJmZ2xUx6SJ;z_{W)?#-NHG>8kRue2`3%;QE2=!?6C6P^H5vaUiL|BWREYGb8$nF z->jQx>wR^zX?7&;5Zjc73Exs9qT3 zugLG?#DoY_!MG4Q+*Mguw%JYm9*F;T^ea}1vHbF3yZJp z-gKkNaXNK&yzNo|v|?k2!NJy=|1**-2rI)xB zDI+lBoDxi_&fdSQeMkNcy2(6qNcwJN6|K*FOQcVB%TWNugtj&4-0qJ`fdd8;ApJD^ z;1uI!;SI7Kd_?EBr86BUH>Dhc_wVwSvuj9chPYn%22`&IcSuSG2qKJQ%Fz{VWMMrQ ze^~Ki7FGp%9Hm{pJj|v$U3vA~h2NxS-N@`jU&Z>+w+yH5&w8Fk^r#tyHvnq>#|Y;y zfAi39Qp}41X*-r?l&C4R(K`KpjMWnVIq{Gf=j>M5l7$U^{NCdNMn#082&PfNPYCxs z_gBj;-Bry=fzx1_c}+R;S?|axqDUw9bf1v^TQqI>=b0UgN%30Dov3&u=~f?#~wCe z#Xxi$V$myp7|)&Iy1LUdZB0M#z@u(kXa(Q9k7h(x*b9#xQiu(yT72qXsIZifsd&YL zjDJ$uJf1~qbg8kG4DZwq@s;tQ{`fDjtiO{0n^b|rx17t)Mi4=TibD6~!OHOWLs<0C={nxvH1o$AB222c(#mnI_ z*@S*R6?hJQ4&UHM#(w%7XJc2nD&SW%^=n!CY4bgx<_CW#=;i3;7%Cy&sEeNqPU1QW zsZfmk%L`l*JfnYLRE_4W`jss%4mxGZvb7TC5KyIdmFPxt;G6%DbzOUI@ocfRceH1; zW3^kh*Es2()1Fc~4Ygl!`ewyUE1l#yE>`(4U(7{{9qd$n{EXmvP;FWMX?)+w`o8J; zf%v~W$1CIDHtheFjZtWS{UZGTw}}*uO`Wau9saX$oa6zahNAlNGC4gBGrhD#UmfJ^ zQah+)Hg83)K%HAE5dNDQM?oN*5Z@n+1)W6&g~jF4zdihqNB~XU2$CnW=(d@G)O4(r z&bKQ+oBPhs3(w9&-OSN;8`I0@bf(M9TE_wJj~Dh*8H+H)(cDoPu+Lne$YT_#z<|`WEE1Ex7 zG)7l6PFFO6S2T$@)QLEkG(^zB0bm1t{(E|TcC~u!YV_FD=x}H-V$i__U;}rybN>Vy z^yvQ;=KS}}`t0iU*wyJXsnKP9CwBbzjQ&R;=TawsX^}s(&71$RWzi^o{Lgu>u_s8! z7n;Wux?~znHj4&*8V$x2I{0Cy*`Uv^S&vSalX>(GtAluJnPv)!;?dHx;zGBLKr_vnz`#^< zh2~<6xaI{JN2`GXtAu=m{dlGP`25iWCM%-+ctz>Lob+^*6l@GYoS-<_%NI2*DJ=NA;3+2ysfRpr zDaj(kIpCZHvJBh0&~x7Ktjr0CCt|u#>P+kr3u%PZvN-N{bMj#2M7l>XVO%-aLX5o; zI3p3d?QjaDVSZ}TB&P|HVk<0R({mVu^GI1j9HDP zuKAAng*wefru9^_DM>Ta#k5Bq?3#0#M2sOlB1bF}4%>lWv&+6!+x2(K6ZpzBrQ(}*`R=D_rp!V9w}RCl=M znC*`1&D#r6SA`Abdr=6|Db(W?oOKff#w>n?ts|vYnTf16z)JN04TA6euJJH}L?nYcqf9EZ5Vz;2n zG{<2#bHlMKhznrur~|hZ5^BZfURIt+$4^MtzAx}qWWsK_t6bTL+%xX|5@^_wSP^|@O6V;Pi z*;&@ed|X8RsRn{nM@jlts439d)aexDd!7F0w)HDXDVoHc2F-u?qDOowQK@l-hShbD z(#fS!2f1nsr%)t1&!~E(=`U*h*r<4=Vw>YhNXdZiyg^Ygo6a*McPCBGI_tjyq@wh@M*r@{n^KQvRR|cHwS#WjE(}S`eBgGk;!&QAu>;@_JIybOWveKQs&D0 z)OYgsSqZ#3ScG9^0mSxbFo)CDF;G_oOLPZLWs2UYY=V*ueMK{1Ma=yC3-^<;+E7i# zR3y2BDH+7AM%kFOy}1$GpxPfG=|UL-e7k=cc}K%u8c6PrO!SeK4KBw1s*%b0YsiLF zjT61>w6tj`I-J~H&+!h|dv8Sh9yntXQ9omeSpDIIVua0f{R^m1uk7^(~V-!;t=xFX@a)=1n({m$`4sMdSFt!2K zr!1$xi6*G7wYIs(#H!ac<^RFI{ix79qXw1OBpERYQ)9jDwFHu6%=i9IuyhcKVM@7P zvuhz5U5Ba1@N8Ts_FejV`1~{!FpgPnb*n5 z=Q~6?a9uOcc$Dvd!0Mwgmwg?!qs2lhX7Uc(gYuA`Ds!<@ zu2)#u>56uK;bw(}vc41QMa)zm{9H3PesCF7 zmzO;p)CYD5hR5t+9|_Pkgvta+eYo0CQpl{MFbqS)z;|V}k!2SVSW+DxW1ew&43kwI%~Jhp?n+b9tt%6a1v3KQ!3K!`I65iG zet)8t?x6D31}Vf;2P`E}02mkzlGS2z{3f0KF`^Lf!7#eG4_Q>InQwS~%+)Ziqce%K z%->`Q`>D!+p(IjynEFX8?T)Xhi8M%#GUo6&N-ka(Mm68T_RuT)ci%N(;#~1UJL19S!50hbCt53LrR6 z&Y4Y;JXul&@VFzZcH8>{SLpx39?Bc{7q6}cKK?=>UCXz11PcvFgPA9T3jLNO42aD- z`-oGAq$gU+^dd3p`tp&!3XPy|W_=PEr$Dmcz<~kNw2BBZfVVmev*Mnm?wp0`PC<#0 z`YoH_Aj(bOXCaFuzu=9y3cJZ-=P&%GxxvAsH6}2C0TVRD z7ie&xeY;BT9k7bZy;9#q(~#X$0DD|yTPLt!QsQ^hH_s};*z@y+4SXK$R23W=ypPQh zPLPTQJ$-*f0itO34sD{|6P%+p?*3K+QqLjTe)zB~0fdsN5;cs3z}FGbU3x=y4I{Vj zLkermLIl^Dfw6`B1}oKQ)V$XvpF zMBvo(LF;#Ym~^fNLy`m}n@~^2#+7TQU1C%$@eDlAUX|Ru!1pocpA9LM%Cl_EDRLi4 zSLKJyHk<`Gk$8vuL~&W<>qZ*|_Z zsrD~~%emijW7`fWgbsPL^a@a>s<2TxQ|VzbOm8wf?@ue`CIFXEH!&J&&h^y&VJ1Cj>1yi zYUt>D$vy}lt!&v81z8y+(OJ_}zzi02k$>0fy)=FjJ1ELy2jbHO$SC@=p}G%S6%^>Q zAzh#l-e|;rjy-nB;b2IOR{pzlNjQcN<3PE?#Xt?C zuHVeU0KHq3U6%_wp|!0%LUmBr^^*g)1P#S}tihF449@tNO#Dk+Q9w*W4~ z{(>)K!E}eg4x?o`=dkXP9^|rj3>+I;oQ{V%`F3?=06D@f4pzqrqy+>|Zi4gHedMwR zdMV&g!|$rL0M=z3zw6KNAK&0cQ&hVP_a$h6*~=m6uY}1LwSJu6 z4vNI`OXza{brzY$`g&n;Eh$SJ`A}A|)OKI6Yh-;j!yGn@_HVxryZDYc?gz{pCyn17WGROFmI+#TMZ%ZoflQ#?oRK~F(s2p^nRsjnIg6eUkJ5Z)nteb%Bf z=-BeyEt77p6Hg~A&k!(Y0H$^#8{FV}6>D_U~aY=>M~C#e`Inb>RgQ;19N-z$n! z_^aAxvsDXqueXO~svW)t_p5u@=HaTY-*_U96IgGpU36}CH;4z=QFlNe9Dha-jG}?2&b4K`7eKthHVNy+F$qcP?jz_PP$Or6CdFQtyVt*v3fA-vdjZ*B zGhV9hRr}Y+ho_DzhprUPk99pfofIVy*9wBmZ09GD)km9A28F+1M;J(LJ(!E$THn-1_=%CB? zEYB5fhS2ec2cRswi@H4<;kTvRP9%qk%9)2pl|7erz6M<=Pe4T{qniqdvYi*?M6b(9IzAGqwzorl(n> zaGl`&Q${;nQ!XnQW6k7O_Hn(x(LpjcdI8S3m)Y-OUbMI(sagtsxLV!D3;G~qH}=oE zG-}$@W1QY)Ph%-UmIPmGtta~p3A;r%UMp#d>{~jUz!!L8*;hIyC^ws28s3*>Q#ILa zVQr63_U9)K7W-H91+SI9tEIKstg&HS7dXY4?rs-mPeUM#joE5w`^HRe{laARC~n3D zKChQ{F=hn=a};7Wt6DrN?iX`9Id!7iE-Xfiy$crY_cVvy`uJCY+g#0~++x#{Q<(`y zhU<7x)UP|ikO*K89-YJBR!q56Wn-M1c#tY9a=7e`E1@OSFz0_U0x+U4AjGnN!7_7s zoV{O_6TCJY-79W0lTkY~3WVqaB*Jl=@X;J|+)R7Dm$)7>I+=3kxKO#O&@;$mCyaqv zV{f@yH{V|e0`#_SK4)yjaq2K>FY=U+nkx7=e(i`kV|~4j84AMBP_pQ(IbQEwf%NHI zD+JKh4+oRbiX%fb+jT;ch5XEQ{V9;%B7Az@v<1dZb{z0oXvw1&v7S{g4 z5Q{~C4;hAPcNeBab;jfaiq1h=;I(6sN091H9%QELm*s=hsA$Un<_0-t{PCqeBg)YyicB*e#C^+!{oJzaWDY={fRLsSNTdl^ z$j0mY{muGQ{_7^$nFm4MT=GPElj2uCMK4cnLlF zu7B7wn6b|^Ix!~{lQP(`9nBt)kuC z5Zv-`NMDYZ&dWK$wUOgzk~zb^0&ml-*=c_V^S4thI^EEQ6Q7|?Mx&V|vXbaqp{Vg6 zR3w`N3-q=cRjNRoU`HKEN*i=bL$PE<@LP((QB}LuC;gY~=5fcRs<1mG@aEv!dr3&h zf$S=)NvP6@d5c8wj`7cuYrRb#ziLlls%d0~uz0M#PnB9Vb&Y26$aeA40Vtc#b_(P~ z{6gXPD!g2$z;g*#k=XQ2oT{C{F_Z-L$QkkzT-{1ufqK98zL-<8a{?BHNw*271ZSsl z#;%1Y zv7`~V*3;Id$IJT;;nL9#IZ&QIEuEaqvnpi9SVfx3g8)(ubS!TQuo4)$HvV66i$wUA z^v};;Pzm#ai*OQf%KIWtEbi<@E{J>L*3^~6%9+X_b72+vIg=hxhEBH~Vl7$Ro`H>B z9u7xw&@!T-`z0iWqxDYjc(r;hgd6q*ohr#p9%5~$f<%`tqjm&mC|${KlMB+loscJv z_ZUVUq-T+TkwD*VGETBV_9al|!g3qsI z{;_2?6`-hg^F<{?WBiL+%WQRwudH{%E}c*jh{f=AE7{+G-fX~)bn;++qptd9id}e@ z<2cHK#6^4r^36ag*1Ow= z#5!B~D5pdDp&PGa+uD9P%M$xbP5!iswJK381uD`JgnO2a_{D1pJ_Ym)H|dPCR$ais z2Ychnn~0p@szU%OI4LoxdKoar$C?-Y9LL>U_PP|8LtAzOHQQk&nTlxf>{VY`yZRab zz-Ot}O^~vcd8sbF&hx&DwCS;SK+9cQAn0jJs#sHqPVn-H0w81?zLG0!Uh-o& zzq~4sbvKd-=2*`Zc^9;&N!Z=oznS)`U1IH0v(?D3<3`@c-9bG>S-~q$r{fg!aowJY zoyI$M;PA?IYIpqcGIER~zCjVO@_e)N9l`7rr1>H&CLa3kml(9rZ3>E+8V&F0-{JV0O z`@5)DVo4CmF^WxV?C@XpyTyne4hc6jh=!!31rqMODS%+O6G-DDhFcIK#kiy zZ@)Yqljv1AA!OC#F&C(orJ{5J7-CR#j!${>zxq<@hs5-V)f-#RX#^ zAb-wqiN8}kTYv9oUQUHabT{}Ng&BgXPd<(UBHM9{@M;4O5}cLF23#y{+na@ex zc>wCCOettx1PgB?D1FOWvp3TesD=^ccBHs@qTSxN1I_`n3O!!(1gyROn4GHWL*%-G zMcqD0HTB^{B1YPym+&k`ICA0Q;yS-^%oK(Em6R;A+-^E~bLqck(fWRit$&`J?qJcQ7%yJC8Kt%&68-3dgC^0Q);Q|bKyQs6fPQdmu)|GL zrPZD5e0u|_SZ1}&%QV+sQPd??gkJi`04gQ=!{VIvTqrgl_xOi1<=bCJ!ZzP^-jlhC z*_&lLogp1&3Vcd`s)yN@#h395ooqNHZ89~L{Fnv=W_eyig-e7>j7zsetwY;W_(So7 z%yLMh0cj)XYWi7!YqjrRs5bt|gslGC3KVN#xS{M)%Z2v?)-&V_AZDO?pe`>~&9#z) zHSX@{qlFKcCb3KVXHavgj$WO}+8u3DT*J7gb&T=s`RwaB*kZ~Btp9VTuf24))9@zc z4!_)y@rFhoFudS$Mr!t;Uu)j7ya;?l`KD9uOWqznT|b?_34Q{9qI_q5jEkBCRdUpt zn$C@up7aDnA5}2CZeOTzXG$Pt#2|O42KdQMXK+3}9&lOI=oqf{qOGPfW@41enk z1gsD+Nw-r7*$yRHfnKm;Gf}f0h%ekbO(P7zvB9v0k%Vk3~O#KxCnuOcngvd%5I+ zdkkMt$y<%xX??LH(L5P8p_84GNdd9{Su;EaKay3}hcDKdCcgkby6SA3ZsjB*_rCNm zetW!7H}0dCmw93>yR1}TBg+htMS(}2Egv?F2s*D55p0YB`Vdey%mUVAM?va3&X1f_ z*AhN{HzYRCDq^k;V9)&XlZlg%$-*}8=K=M0YA~0ML^O_4n_|w9Ls0~Is#I2J*4+~6 z@!Oo$@TE&o|U0KCy3BEQSAP`y*5PZ>K-NRC~kz{Z)>2cK!$k*J4nU z1F39L19*Hl3O5}G?mUu03B}|nTYf04fp!3u$1FzfVvdRwm@Pr9*F@Hp)x_4#ssB>^ zU^T;%(2B4`4v%NTY##`Ry6s~WJdPX;dHpfveoNhsSt6=38Rh78ls!|7k1@QOR)tRr z3i+^hRZqzkw!yf>eLm*;%gZJVQl|&Wpg4e@b4&xe&n3;;tkG46azEwC3!ep#t z`xk}Tm7p*tP<(AQtR;gP^MOYcJH$kEDENjVx1sR9FD!Rxi{RmIDe8k3OP|5`K>O%ygCSk6=dO5z<(CKi<7w zZ&~F**?!RtEY_q{Ywh4xiGeY7pVRYtG*^=Es^9ieJmrivHX|JdF}{^E;r-KhL4~R< zWA-j!Mp850>UVbCO?V_Njp^3g_jkf3UryT#p@kyuimD*8BG^R|Jqo;X_mD2Xznil$ z)*aa74(XJ7m$znLv~$LxWex2{!-sUmvGIE0^mH`+ak?H3L+armteDAYD;8)MSXdQr zv-1?vCuXmf{lDW$^wLh%gH?PfkVZ*YJc zpWG7|HjusB91uV>GEGl=Jov%ESGSswy6l!&PUgClf7kXk_pJ_`Sc04t6+K6c8V7%LIa;Owy_kRB(ipk%h}%(lY)lfW1qY&ehicu{BN>r3)= z6bi7n5+-sm_fYLk;eoU#pcQ5^Mn}0t1)&SEY1R0<0;wP4`C8iUBA>BClBKZMajElc zH~<9q%rJaWE`#6nr+*qzp;Tw$-zE9(c2s}<3vED>zlQBuyR*9&fws{GL#FLfZLmEA zUHgHpsWKldHJI^C6Mvv!NqXA6)Ue4i{sc?xm*y|cX5yC5cAdEN?apw!{>hP}$0Qzk zY(zNmJ@Jvr(EalH%C8r!&t8S@?tJw8@z*{c1p*}S_jX@>bZ3p^UDM6mj}$$|1svju zq57%?5z5QCeiMeZlwl|-EADSy=BRmJUI7$>CDDKFbK+LL)L~e&%XGVR;qGpB2aqffXoxTjm~Q zISkH{&_PM}A4jOjl)saxY(rtMXR--5!%AVtjA(Tav zg>y*#QDbAX9@A!QXv=}WQw;M${bA(kjZSaX{^=(DiU#+8*J>X!H^?PJX&P5h^n1#I z){@?biqZ6=x@(?OUFaanjWk>8Ps&I;Q|)OZI zd$dfACp3F$PE(X-In`AYO}S}qlRkm8v7}w3+?e)MSDIYYQ4POq%A4*n`$&&TdrrA( zftNpDNpX`-msn(wHVnjI9SZA&%N%xu6KU#g47k#ZpPt?8G9k7&}`QZDpN%Am2K z+G;Y$ya&~m?%nWSGm4CzsTNEz)j_j}w4sg9w@}y6x2cZw8LAH*Mu}uiTa72BWkM)g zGmK(2{V6ToK=oARL--iW_>grPYG`9q-%sUH;TS#S*k~%@<^5SyN9xpd6@o z8cL(#D2^o^m91*^AAj~kCwfvIl&!6M69%)Ddf9|YXtg7HP=67tQGYi}jU_8-Z8I{C zZL|$_OjBLRRnu5Q>8NEN#tfO?_+hN2I#HD$#$4n0Gb)aXAuWZpbSjF9Bp8vDiCmk= zD1u6$5~(>Og|7r8-a@sm@east4iHof<;MV7Ox=%f(o>8?#A8)BYsCrw`w!LjvTla>BMxCguyAxU1k<~+~K*HI7uYN>Uzxc1! zZVe3$PZ}OKJZyN-aIfKqhFcBaH{5Kv+_1M{N5l4pZ4Ij$zG#@!kkXLUkkBx#VQNEE zLwLiK$6k+zJ$8QF<$u}T|KHySyK6A3zqS6~fByqeO9KQH02T-c0PhGgTHN&kiJNf% z06c^M04o3h08d3iP*X2yZDD6+b1yP5FgP(cUsP0IOmAmzUs6XxEpuaNcVTjRE^uyV z?7M|mRBzNae1IW_9vY-UK_ms~Zc##|BnOq266qR-RFDuUNrQF>X{kXJR8o)@7#bv{ zoA=D%@AYP-PlAyQ2>K1PCOABm>MT0_k7Bf zl0+~HKT>I`VgLX_JftAxDQBB|mFGc+2N_+BRYBMV=qn^No4T-yDYJ2FQmFiy?8#{M z1OYHo7d08!m%>8LPC&As?zg6mor_4N=Eb~=mi{x1=;%Xlt~fUk0HQinx46Pq@^V|f z?1Ei(@Ns);AtB_mhXt^a4 za_P}iaD%{sHtH)5s4UxsY7|bCHELed%IFanRMUVW_*wtS00H4*4Fz_UQkYrebW8bPq6!7{2WW$+@{%@37AXVGmi>2T~KSUEO`N7Q>cZq`$0P!PO5lX-UFm!JG@X; zL9kXD+^uNc%$YCU&v6kuj5)R%eW$PS#nE|9NfneulsN!ZJ;gKgAzqjOJKn6qqrwOp zA_89a1qqtfi)joRC%!$ljx{nmwYxbH?#u1yd)?7j^=35q=!)Ax*SVG(_r+rP&?f?-C>7`F;3R(AJh5IQ=$aahNUn zP7LLKP+RR?6ajubP?17a^Vr}PEjabRqu`#&t@ggA4t|tx-P~@orMirj9KCwGCXtg{ zFH)v}Fy(VjWWlGDoTX1EpPMa0_ND+Jc97cPbWC^Y^z7)QcQ4ahhN>wYnwER z?dzbFi>T^a!j$X8CZ`IDk$~%QiS0t_XYklSE%iWlN$I1{8xd5JYH7GA9Zfe($Tf+l zV?`;t6qJw~MG|>wT8=Q~-l*kNLA;1AXpunIs}}CRtTlN~ z26f%8P+!4r4*#gh#!Jn8kl)cBO4bVMo?Q~MpvWM2@I}{-oz9F37XiN?U10Wx`1X6WEN-)TO=j$7Ukp(GlWhcMU>J_1ozhbd#Hrz-ed$oO@CUyOw>C^Bh^Dj}cv@rSecu15ZHO6(ld^gD!5J9cj0 zrH5oa*S9~R{Xw9|936yl8Eo1S$w>t2DQz)hqXTi3SvLXR&V{sj+IpYE(%l-a07j1* zHWEoEbx%A`bg5_$8nJt#d1JY?MF*%`1J*z>ZmX!T)(l0aU{lDXI@NBFT{fL5E^{=R z9&)OLJYV*|!i9{QRCLcyuO%D;S6riq@zGM!VX;g&gi8)0cV)Hvax7S0lUOmD_Q+09 zOovV?=Tg!Gi0>H=xo{F94iZAF#-iS~VGwaBjGU2W%FhW3AY}gJ98T>H8?t;Wy}n&| zVLr^L75(I=N+{?$pj8A_9mIu?1-QfPkFGb#nB3|;8}4y;CRoA0vwMv{g7A){ZdD=^ zv}Fqx`;3i90q(e?Z)I0wNSyy*Swx{A*oIu%oI_BYfp^qtoFQ-)_mm( zuRE}lm{51Y7#FjUXw2*j{MBmdy!PIj4$Moz%5HphOozQhO3b#{3Xf(=hSI2iadlqv ze!zvaKI$?7rG9qQOQM#Baep7M-)A;Htc{yEV#wkmx>xWb#j<+n>=rhuWV_Yj<)o{L zw~Fvgv`;T)RN}AT0*CJ^j5j)Z0H$QSQ~xFc!!KUuECe!!_9Eh^A%FA_;=9KcKjSjK z=EIeD6i2HAQ+%73JqOI>VAyoDyCgLyqBZi!doY6@2SK`;G3|1R?We23-CYD&1DfWX z`5os*`F6~e6BpwBH-#FO%ERHf*=J6YPaO&Fb7v`ZZrc9YFpq3SL)UMS3kV*RqHcid zHY9=`Daefr2a7Yj^7?l0fuQ0?J7iO|^ws~FCqc6_njaE-;5%76G`UL#<^(iDY7Lt|~)lAn8Nv9n&){`^VA!|o_*@k;(j*9yKfxVNJC$DA8yiRq00Kw(|Atceth zlc44Xm6|zP+|AK^qPIc%0XNv}^bq6){{|Dkb#c|51Vc&`Vx!;v^M%Nmb^<5&p4P#y zZe8a!WvtuUdBpXP><|Cw1>VQ*VPN!VVJwva)^^e>#d9Q3x2y}dVn5GJ8lMZ``bq7;Hu;0jq>sbFfmA^HRI&)d20Ip zKkIRz@)EK7({Udd;R+$j|K4k3To%^3KkN`znaH{w)x|n+K#0Zt_3e+)W~iCD|8{hYmcxBG`JjeXlVY<3)uVKo6k= zwfn|NC}TL5!Q(AMy}*a#cVtc;H{z7L{NZCFoZJNhmQ`yw8y28+ZkIs_6XAr?1*@04 zu^SJVrOR+8A1SSTd#n^IHS$kvJ6EF@kil^h*Xy3-FTgT}e!YwMYxFZnauNp}RDef9 zZY``)DEO6tDu`a&MGc?XLNp7m-qjmP&@^6aj?lz@%mIO?y=mZXB7w78xt9nj&CX#~ za?W1MHTiQo?8!06;}%*N@r75=u}xJVK{2x{*xYOC>^jC_^-mFt?0+ZwJ0@VNHvd}M z+I{5%`2qs}h@`3kY0rft>1bmGIWXGWzM`5wcbNFifzC8&^K12_=EWJa#HwH0;863l zEZxr>YZPS{`Y?zb%)>!HhqZp-Owg`iU)9?1wnM_=K<*mum_T9D(h*-=Xw=Ne zs32$GYURBEKlqk*BISGxF0jY5}8s*brVKm`3~cY1vn-abw6uiJWd zlQl!G&zs6l@trTk36=(J)({Z}0Sg^AKaG1;3~ub^wBbhIWrH^J`p|lOwnL3=NDNus z-2XeU>s}ay-jN4e<5ezGc)jO`G=cy4j0}+=^?o9-KDo!^dpw*g!lCR$?x%yk_PNrf^aw=xPwZB z^KpA$WD5lIp(~ikC}XkxsNGvL9+d%Hxw~shITNGgxI?Wi-W^ zQvCW5XDHTCaLeL|6ha(Z8!2=nf*uL>3=_uBy~PTKa4crv6&=HA_u|M3w_(P=@P@xG zK5eWp|7VSF`$&iuVeL#KZrO7G1tLFa*ah#NYJJ({?Xjw$IBL+uop%&ndycAVO=l)d z!MXf)U^O-ukwuc=v=|Z)-zZsgS9iFK^TEUB8)LaMreQG`M%ySJk^3!l5z2O|Si|Qw z2iZe#D#u>cc27+o#s$;uDccGk{tGeM1I4g`p;6rQpu=EIl^wYFx!p6&0;MEvzN3N_ z>t6Bc$sLa!R_qAvZZ)UM*BC=a942r-Ns=j=Slut6&t94(j(zG0PHeTQI2Fat8%aZ| zEI28>!zv|e69V!F^=e7v6|4-8Tf=m*Bn2MV{7ah?`viWGs>E+Za<=NWn%%)#SYV7D zI|&VW!KIyxh4@IMQ|Q9PKd2Hl)A33R?$r!F1H~Q3*yDOsyX7QKm7m48UqJrJS8 zQr(agx=Qex9i-lF%!V4NOh+nn3;pfzulo_0TveRu9~{1r;mjpzQ;rh?y#3# zuN>3HRii5oGTH{q`1d=z_{+)dN~I{t8J**g%QR_$lbnX3F%2quixEcnbI3(Q^e$cn z8CjX}1oRJ@KkvvhMw60c*|xCMsyD6-oAx8d3BwX~&%nO?g&l>=nNpEo9G^ zSr(Zk1+o`)LrxiBs<>_%5WQP=^wB3q==>9!C9N)cH=pM(6R$LXjfKAOM@h9~wEMjhDeDuvKs@wVlMCvU9aanb>q_!u^a)&j zos|Ix@$KTJ<3Vlo4+{M@%`diY989iGYa_OZ7c6GhXHCEE8n{%^pi`L|aAbH@o(Nhz zNa4&2w@tx^wA2n!t_dnb)pA#qU>-KBIK%_L-X)j(s^*vb&TCY7_=umft2|UaQ5!24 zcQ$}z*^C3hLki!I(bA5niJGA^$9>?+^x9^S0{5hh9&XCW2a`Wx%$3tCweeyHsOp+o zQM@a*2hC?2(RFdrJX#la$`F&FF(jk;&0tEv19Iom7h*tK<1ngvD(dfzi>nF%ePqPy z!l{jxqL51Do>3*kL$8w0I!AgV3A8SNyCM#O%8zz9>||)Ek+ohbAQHV5fT~vFp853` zmxIy%;F~gKOT38QR%E;cDAo>`9fLZKGG7d1QwUAkOMlBY$DA5LT)k& z6=c|h3|~t)#pBVt(U|H=07KmLBD(X;jpQQYZqI98!WJCcat)BgH=?IE-J(S=93^jE z&xyBvMIAtsHZokf$OwzHyt(8c=QVaXsGXDKE`H&Ti$KH{1X`#b4Iqrhmb)RJFH+Pd zL@gn=|Lbl8zB8PRd&UABzQObvve?dgAzXaGph&ri$I9vgAGe;lv)f`b74V^ZW%4%X z?F*wQp&bZn!0yl7SxJr%7`mNy@i;hv6VH6W-Z)1N50HFBLYq1I829`@QU$-}trE=N z>TwkjFtA?}|La1LX4M3Qi_DsSBtBRySz&zM7hY|?oq%`|6a8*zOleIXFn>CvwR&+t z&S3_HP12Ee7+J;{uN12K7=~gTi6fYOko{<+WSi@EN_un0#Vsg}3clppuNS2nqL`28 z8!LIa=;}*mXn`Hf&@Ao#v9<5o=u$k7caNF#e>!6q*hTVCtov(YK1C6^if`ATKOvZx z-n{R0YZ^EU@@pZcj5~U;Hu@vGYvrlZeu}#jtoF?XIBe^!oLpl z*GoD{ja8F%^|%>Vo`Db=UN{f;%!GQ*)6>2%0>&{S#MPx~WISG&BKve*6lolv{A)X3 z>%~)r3k_DGH09o>n!lFAy^l(3uaQszNkch(N*iU<$A>ptM$hb!8^^lptd~44OoM9r zNcl`Qy@JvcyOqYQ`&nC@|^N36G=NhA?aP#3q5U6R1&B9YE zn%Gfl&VvBE>_EqCY4mS$mEtaWHlz`%I_C-<|46!N807`%VmR?uyk%!3ktKOR=pG(I zWJ!qd9x2^PWfbOO#~N_Q3@fTr?{GQ!-z3LccI;4U;3O?ixwXa2nTltsW*aPEf2f7A z`oX=y$pv8V$kfin`e;ETv>J%jv&-JiaBYb@*rDW^DMZU6SoSh;LF&n)jW*knM2ZnY z+5O2{McXmWXn#P{`9Se?dRq(Lxx$PGalwB)!JJDQ{VB6*$XoMc1NQ1p2m+KOr>ClQ z-f|0IzI4$716?VgGS^ciksZ{nUf|ic_1yTFKHDno?xl+T)VV-}An1T6r_dg;u9rdN zFeY1|+%DZuF|e2Ie%ilI8>r;fM$2Z#!c8Jb0Lc%vEv!2mtq(7_I#{D&yzo5iMdDt~ zK`AK=czn}ta?cJ~5e|(sM*idCAmadM4aUW6EEyC93919-3a0^^X`dlxxKahA(W~Ga zqmE3&X3r!90dt9uqOBfozj22n?o)#)-hX%7W}5BvvbYFHMiKgL5UQ{H5A7i@XMX(&-QR|5-H;C_3gleV9S%h@cs)a2|+3IoYqzhl3m{8 zp{2>E$~H*Ls-A3LAm>9YCtk_j8`|zei*5u47U#j1hehWKvlIxSfscg$i6{WJLTZ;< z?}G$;GYn)c2iT4pZdDxAPM?6C1m}T3eJgO+^TKsWVJh!Fw9 zrlKcSARU&!LlxR|?UP#>&x4kWMizj(fPjm5u7aexXujmt>?m!@8{P&KBm)cY%-okg z{c8j8KwYMDF~Uwf08`7r+YL+|ng!9#PtPk_gS96@w}^pv6LKic#$djyW@m-H#S<~8 zOIGH&fJBlc1jv z%VyC}SgPQsMK!5z^j~xbl6E9C77SzSI?mG_uU=moKl|{Rffq=NR-`%!YV~>8`0u#g z;=X}#pY)GIJCZa8>m%PvpW^crIfngnLSo|N%0$QSR<5+l_?&_fVIfy(#dgDA`yMbb7nq9 z6FhLwYbw=t?C@%V8#IqS$#JzseCK9DuF{%M;~O#~wP?&2#)(3sk^p+pur*Foi`HOg zR!#&HgG6|fuAzGCamM(y_yQ82oUUfH(aplhtu9J2nEge9n*cucV?ujH>Qd-(5kuOp z3?nX>k8UO82C-Z@D4+RCu1kDQ!<`oEUr1_9Wd;a$h%xI=KgU{5r!CeFbbK=KpbjxMnj8ukWjLM$ntu z$II!nl#{hXXL924M@ix3lq;-X@s!!XUY7-mZ4J+Ba^B(WU)XZGWSx?}h^pR>W>O{W zIGq^_E~^a*ynb4I?msHBV@=sj6!(f^(~C%yYOr}Km1UdYLzhhj>Q_7NosH(HdjjT; z8@*^Ye8E2#0!VguOTba2!979LJy;;X2b$%^fabSjgvL@Sz`~ocZi!aewCr~eHopCH zsa^u2X!8{VTAqXkSn)P^9QCi+l?K~BxWx4ViW~3=5RzD?hjS7Swms`Ji;12X8e4e~ zz@>~!6YaRWuahFPORarhp4^AyXjT`PT)?rMVnV3v#myu39VYne;9fOnXvGDdBd~Ks z1F&ye11ukNT=W4Wq}Zkt;qL;`y|_GZfnnDhPF_A(1|0D*TkXm=GDnJffDbc>K z9`oQ@W&lA7X4YrpIt`4Vq$zlSvd5|C?D*RfiHlJbnEiFI7CV3yX!tB&5x*7Tg%vK1 zPX*s<=F`YJ8%~}GjW2hmC6U|zdQ@<1u6bl{4d>BnBNrZ~|HLMt+2kH{GKt4J3-OkF z=6$ud=~KT8BN{|<;)&c@Q!T*ep};%pktrTsZj^SobS!7lK+Ru-7kWzFo89*8jc>fHmD-{$^?5KaD|se2YpR$oU##?@s7` zYOxq{T*9^c0OBro%n1d-x>K-$U$Gyu2EsqMk61F*7;A zW-?VAt9S*Lpj(yA`%sC@mOTB&6||ODh{4h_kecXlbVJ6h|dp z9}fIja44YV#b_Kw^hP~sIB54J01$qExR7sdINL)mxtsmFu4P0*J|O>s`aZU#O0tUO zRd-KKr&rR#p@xi0mqLE2s%HYKjsOX86C1Einy0*W_xKMjxJ1ELslEaQ~Npbw1NSE<8#mCO4&5AEjRd?{8QW#RQ&FsF|sXM zS{Qq!l6{psG7$)=8nTLiN>z5f^3NhJTo1xQs$qEedFjv~40pvU-`b~24O2TF?B$t~ zy3i*U1lhHLobqDXNqB*8ABe)sY9vqbg&^_4YwyswEK3J+h3X$tD^W0Fd#rWPQtDrB zI=hexK~Tgl|GifXP6N*}J}o*A*&`bOQA7*V3W{xYLsd6D%j^ZY9^=LPy%SN8P!z{Y z)m>{YX@Sy$ZT3$BNGjOH@`<*?M~%({$+5HEaf3`UcKSgP*y5p6C~`W$-aU#|F5c#S zXm18i>X#s6b(ef;Ne?!BBjwmz1|OKmxE9lGA?3{_OS{P-Q|uRI0Qnc7cEciR!A#$K zC~c4fSQ3|36)hbdy*)IxdH?SeC?B+C3S>c67q`xvf}m+TP0gT0N?KpOZa%dD=`e6x zQ+-vWn(E}IS-`m2c=`c!irEpD)J8PyWYve>T8pv|B-wE+j@aR-`zAf?&T?C)ksUj| zDe)_@aAGs(j#Im%73S=&5ZeVW+@&diu5{#uXSGXShx^K|hxp6228Zr~dZ}`li%L+D zOZA-(Xfbw)sc(vK;b4&uGAidApN)}PR6+7>_w6Q!O=$pK9=un5TB;N%0-Z;y<=x3hx5{cDi7YJ)bxE+^+P!-u+sQkWX`TcPCWC(bTBHcR}}$3 zW1?z^G8}gglE(9nVx%~_&H>fr0pgo(OHo{(6*uCUmxyqYThdTJ8P#6)sIV@a7_dEA|Sj_b~Ec3?Zpd)dUwMOpb@FoVJa{=_Q{9 z4zDnVMA;$t^~k`Dm=wi927`P14vxla;%i>!)-!W%k-33=hYKNz+(e^Z;HXk6*!n%i zeWS(o7npcfnQd?fI&*5H`8B?*Z(^_ba`dRdc75F+fw4f~Mve6o5O-pt-%aY3FY@96 zS2onBs4S$NutTOCD)?8pxFfxhKA?ttq=4vEwPUmfhqe2P1MYSBDFm7p8$Gf?U+b1B z0HBweIPf83xI78p28S{g*WnKQ(oa8u8FA}PEfuI{fEI3e94zmTuwR>sMQ-AxpaZMz z9QMJhtxYCY2b3i#?#5490SW2SRA;Rknyen0l=T8h`6m`tf+jD_81`EgfU*lXu7~|H zhMs>Ryw?Q8>W_&X47yL+-6jAhq6H{Nwc;L}gr2o_$a|rg0|0tOV+HE0NGUDGaOh@| zQo&yWV}Y179K>YvdNDDvVsoqjE>4zVya*mQwtyg==Meg-KRQWzl8~j zT-k6}Rhu#@_@<%JO!$Pyx2BQP`(y~pZ zF@@Q=_(K{1QPS%Tm!a$PH^nrcpDBu$*|$8zMXMQ4_(*HFK#SAz~SgO?uP;L-$Ml91p&qy z_~Kn14ldOHJN193{y#YN;CyvL*Om3=(3L-%sy*pG?C!q#TX9}7( zLVQRr78OQt;-RG^bhn>Wn7&sc250Qcoi~+yeel<#!ZdR~C}iFD0&fN%^EU$cs5v{6 ziQ~3&vMAzikUT$;7!%q6A_VEg$8>IN1K&yTPW${ zt@E+|Pm7ixK40~bj!UgK`=(O8l_0|+sMnYGJ^S;==iQO{I}?0&k4 zAD;QSuk^mUM793uM+TST0zA}tQ+aD2V|%te6MC*=G`#u7W%DF4P`jgU#n^s6c&p%h z2g)p1?yq0(@7JTIsPVHMRFmm6AJj%6{rLKHr%e!(Lt2xXUJ6HZ496jZETO{}3c%uvu-6 zhb#zB5!tE`dhk&&B*$uUta?q6sblRJQ*XIu-EgBKXfs-4mPFW1_ro|v%Vn2_+rt~P zd{!OLKSjnn-sAR*MkIW`I58|m+|>K!B_X$SbM#KRg{E0RD`V?`h6C5Q_g;H=t*|n zq}VCL3?Q`?7iq0y;d7UP}pUmQwj(Hk>gei`%IYVO_Fuif*OP8}ANAN+C8Q^xq(^0<@6UNkEkAH;J`1e*b|?9% z$e~Yn%QzjU!?^7yw=?_5UiXGWnZ<3^vTmwGf-7oKBn*e2WQIv$4~4Frrfl5%3gc$_ z;#x|xtF+9HVL5m>DXu2l)hqfnZOPyG$MJ#je2V|W#;~*bkz#GYu*C88j_A&ms^XNF zt4A(5;|bz9B=+lEk6`%J*HI;xhS7x^R&$F`oV8O zTf3r8*WjdM9#b`)S4&iS^RKr;T1G=A3`OrH0)=3jRnl(?SWN7{wR)dj3J}XAg&A(t zHeM6@_{M+#BU{;aDZ*gu!Pp31)V6&6o$3?jj^JMDp2eq+7fY1}<%GPXHY`CG_9T_4 zLPC@4)*>q5aTs>!ri}>)uOI9b|0yT@Pd2734B+8aS-}AZw5s zz6DAkt2=NzD?H$NTfXDYCVtxFsz0iG#1(UveucS{`mdbCpsy99!TiIAhn2cFmSy+e z*RJ#iuBIL}bT?qmN|3+8@*=823TVEFqx3}Qy3f#nGugk=#}n5Hq2kP`e9ZZoeML_~1w!(#s@cgs)Q!78mzMXIfv$f;Y=2hhbRtB+ zarSG0*_fHUdUK?{<$TdzL_-l{gN~o;ULZ$Xa5H6(m&(L`Ics9eyPxge#vaNJ#eHSq z!KwL<`Aa6U;SzrXQk1BG*?Y`(!QSt5^B0w4Xu9Wp*&X^H{K@(%mu&1MLs4F*I8=Y5 zUS3H=2MWv|?{*+ds5KKy?KuccY{zOyhO5WQQ1?Qbf8zV-&yCS*`P-e|FyTw^wB1o#PkHkq#pN-%4p3|(;in1Udi&Q2{ zdQBi>hspg4`|o`AiMwj{6i14fs_ObuOFG^}7M{mGo~m z2xc$#LILuQFYNmBerwJewbI`n=9s64Bz1;!tBV#3v_V?EFAp6xGA~Su6!pbtwU!sihGN+|$l^5U96(U-2V4 zBt$v!b^cA;fyu7b)zdMF7mscLs&)~pzp zMr_kRcqyBj7|agmpIfQP3It-dY49ryJGT!98uyNaSilYWK?6cY&$@cYV!*_74Z;+c zTIKg-((id^sdHoY4DNPvAW^ia5EZmg2t^V`M z6>jSe)fx~t&l^o87ks+Z4^INW8KqxI@@Wbnidpue^aHv^w`(j(jm0F%Fynt!V_tTH z?Tv=R>xFbEsw`7V_uUsxbjtk49>%zp556*sSNnw%4PvZ8)AV+y;zd5mDHNjQu9c|! zu?X_K;}6}vjp}t&nr9RrO*5T5fO6k~np>9|m^zaa=8e<$M-xDwJ@-r^wH~D}1(;&9 zh_*eLU0`W5tb}atbH=7`%vd3Aj^$}fatn&m9E>vRGU<(Kt6zWXtGhRpk^$DHv5y2h z?wQ0E-!2xQ*_}|3P{HSH1hasrwPJJ4l*EfvKZH;x?Vk=(eXiBl7~+~P$8QW zkJ=1uYN)21?Ux(C?&@6!6*|Rh;*YeuqkGM)5w^!jdAt;;cGl%7edt%e5SBB2FYgb?FaIIx9cHplb~6DW0ojGU_Z9gO zzX1t$I9|;Lnp>yZ%Fz)`+j!09318~xSoxksKbQy2;Z&T(;i|)rC;5j{-W(qWyqc-> zCi*eH(6t}iyi&khyQ2F>%`ba@}QTMq43L-t{+uf&_^uk*v~GWhiMgF6CSsv}14EnQ^{Q_Xr#JA=x7uQJs$zCr1043Y?Mc?4yI z@SLBt=hPndY7n-(o2apDCKshdT+REcJ*=AjM?i^VRf7c9`)!)eX7BE)#6AJ=Wk5pL zpCn-I*W)?e0SS)d=2~U^a$CQ@n_y2C|D&wft2#%M?;~n<8kFM8 zm-gr!xumTd&S;-TTbr>yop5?(@F9gL<9kxZ;$g#6!2`?Kl0Xi53U3a+X=Y*nXC9;7?E7^CCxY!%pyl6yU3eG4NK#h8 z?8tsl-FGbn%iLYCcJNugKAC9P)$*HM&V!y!ZO0sH4HDPP$fmYRe!o+`W9~3M-+&IC z_%#FH{9c7`#?lxQJn_kkqwzk8Zb-J!Z{l~_`>nlxFJ-qNUXFt#lWyX#($2HTdtY_P z6n<)W(GmhV23g%^CZR^gd&YoZh6YDyd1?+9B`F1ea8cg_zQd%(e(!{5zA1j3V8Fcg zOw!k{Ns51`&W1*8x&Hia?Yphs)dAn{?QGl>{AC=)!-aIpoC6GhMHE-czmeZ*fejid zYH8FpQOnNzdPam#A=xT#GT7@R_TIm`acWLM{hLooByZ~MCTRNY5aH;lt9CRri0=7k zY1%RLCaRD@58-QxA*qRsQukuQ2Hu=)Va@V%EwE7@@AOtKmnA9e!~ojC7r}j=*fXCd z#P!M5>os4MQtYmqVylhS0l|;E*K2hC`z`>jFmGmdXum?!im{{3*+#wFi5KF{X|(h7 zLik|%m@B2n78{sINpuHT356@oiluZ18Z(bofV5}YWcoQm;VKsOPiM!`YJpigw_T4# zxK0yUsd?6% zj?raENmq+%yVvNXQ*M#RJ^qzr`pu)N38oWX`pS3y^tq-JJWHVp3nN%v3M%Sp_4i;ⅈ5zeao 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 q?uLZJX=KEkh1<5dMTaJNY2l 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