Skip to content

Commit 18f7a2b

Browse files
authored
fix(s3): fix deleting an empty folder issue and filename encoding (#429)
1 parent e32cebb commit 18f7a2b

File tree

8 files changed

+58
-10
lines changed

8 files changed

+58
-10
lines changed

go.mod

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ go 1.23.4
55
require (
66
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0
77
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0
8-
github.com/OpenListTeam/gofakes3 v0.1.0
98
github.com/OpenListTeam/sftpd-openlist v1.0.1
109
github.com/OpenListTeam/times v0.1.0
1110
github.com/ProtonMail/go-crypto v1.0.0
@@ -40,6 +39,7 @@ require (
4039
github.com/hekmon/transmissionrpc/v3 v3.0.0
4140
github.com/hirochachacha/go-smb2 v1.1.0
4241
github.com/ipfs/go-ipfs-api v0.7.0
42+
github.com/itsHenry35/gofakes3 v0.0.8
4343
github.com/jlaffaye/ftp v0.2.0
4444
github.com/json-iterator/go v1.1.12
4545
github.com/kdomanski/iso9660 v0.4.0
@@ -83,6 +83,7 @@ require (
8383
cloud.google.com/go/compute/metadata v0.7.0 // indirect
8484
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
8585
github.com/google/go-cmp v0.7.0 // indirect
86+
github.com/minio/xxml v0.0.3 // indirect
8687
)
8788

8889
require (
@@ -236,7 +237,7 @@ require (
236237
github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df // indirect
237238
github.com/shirou/gopsutil/v3 v3.24.4 // indirect
238239
github.com/shoenig/go-m1cpu v0.1.6 // indirect
239-
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
240+
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
240241
github.com/spaolacci/murmur3 v1.1.0 // indirect
241242
github.com/spf13/pflag v1.0.5 // indirect
242243
github.com/tklauser/go-sysconf v0.3.13 // indirect

go.sum

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
3434
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
3535
github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd h1:nzE1YQBdx1bq9IlZinHa+HVffy+NmVRoKr+wHN8fpLE=
3636
github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd/go.mod h1:C8yoIfvESpM3GD07OCHU7fqI7lhwyZ2Td1rbNbTAhnc=
37-
github.com/OpenListTeam/gofakes3 v0.1.0 h1:QVWIaso208bNc9L2gNZrkPiluAIg9jemZRxWPh4AVdY=
38-
github.com/OpenListTeam/gofakes3 v0.1.0/go.mod h1:mWMoLOLBX5qZFe1IQHsGXD4iTmIC7nFxxeTxpYvUu6Q=
3937
github.com/OpenListTeam/sftpd-openlist v1.0.1 h1:j4S3iPFOpnXCUKRPS7uCT4mF2VCl34GyqvH6lqwnkUU=
4038
github.com/OpenListTeam/sftpd-openlist v1.0.1/go.mod h1:uO/wKnbvbdq3rBLmClMTZXuCnw7XW4wlAq4dZe91a40=
4139
github.com/OpenListTeam/times v0.1.0 h1:qknxw+qj5CYKgXAwydA102UEpPcpU8TYNGRmwRyPYpg=
@@ -70,6 +68,32 @@ github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevB
7068
github.com/aws/aws-sdk-go v1.38.20/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
7169
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
7270
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
71+
github.com/aws/aws-sdk-go-v2 v1.30.3 h1:jUeBtG0Ih+ZIFH0F4UkmL9w3cSpaMv9tYYDbzILP8dY=
72+
github.com/aws/aws-sdk-go-v2 v1.30.3/go.mod h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc=
73+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 h1:tW1/Rkad38LA15X4UQtjXZXNKsCgkshC3EbmcUmghTg=
74+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3/go.mod h1:UbnqO+zjqk3uIt9yCACHJ9IVNhyhOCnYk8yA19SAWrM=
75+
github.com/aws/aws-sdk-go-v2/credentials v1.17.27 h1:2raNba6gr2IfA0eqqiP2XiQ0UVOpGPgDSi0I9iAP+UI=
76+
github.com/aws/aws-sdk-go-v2/credentials v1.17.27/go.mod h1:gniiwbGahQByxan6YjQUMcW4Aov6bLC3m+evgcoN4r4=
77+
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10 h1:zeN9UtUlA6FTx0vFSayxSX32HDw73Yb6Hh2izDSFxXY=
78+
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10/go.mod h1:3HKuexPDcwLWPaqpW2UR/9n8N/u/3CKcGAzSs8p8u8g=
79+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 h1:SoNJ4RlFEQEbtDcCEt+QG56MY4fm4W8rYirAmq+/DdU=
80+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15/go.mod h1:U9ke74k1n2bf+RIgoX1SXFed1HLs51OgUSs+Ph0KJP8=
81+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 h1:C6WHdGnTDIYETAm5iErQUiVNsclNx9qbJVPIt03B6bI=
82+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15/go.mod h1:ZQLZqhcu+JhSrA9/NXRm8SkDvsycE+JkV3WGY41e+IM=
83+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15 h1:Z5r7SycxmSllHYmaAZPpmN8GviDrSGhMS6bldqtXZPw=
84+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15/go.mod h1:CetW7bDE00QoGEmPUoZuRog07SGVAUVW6LFpNP0YfIg=
85+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 h1:dT3MqvGhSoaIhRseqw2I0yH81l7wiR2vjs57O51EAm8=
86+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI=
87+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17 h1:YPYe6ZmvUfDDDELqEKtAd6bo8zxhkm+XEFEzQisqUIE=
88+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17/go.mod h1:oBtcnYua/CgzCWYN7NZ5j7PotFDaFSUjCYVTtfyn7vw=
89+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 h1:HGErhhrxZlQ044RiM+WdoZxp0p+EGM62y3L6pwA4olE=
90+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17/go.mod h1:RkZEx4l0EHYDJpWppMJ3nD9wZJAa8/0lq9aVC+r2UII=
91+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15 h1:246A4lSTXWJw/rmlQI+TT2OcqeDMKBdyjEQrafMaQdA=
92+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15/go.mod h1:haVfg3761/WF7YPuJOER2MP0k4UAXyHaLclKXB6usDg=
93+
github.com/aws/aws-sdk-go-v2/service/s3 v1.58.3 h1:hT8ZAZRIfqBqHbzKTII+CIiY8G2oC9OpLedkZ51DWl8=
94+
github.com/aws/aws-sdk-go-v2/service/s3 v1.58.3/go.mod h1:Lcxzg5rojyVPU/0eFwLtcyTaek/6Mtic5B1gJo7e/zE=
95+
github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE=
96+
github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
7397
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=
7498
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg=
7599
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
@@ -347,6 +371,8 @@ github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=
347371
github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk=
348372
github.com/ipfs/go-ipfs-api v0.7.0 h1:CMBNCUl0b45coC+lQCXEVpMhwoqjiaCwUIrM+coYW2Q=
349373
github.com/ipfs/go-ipfs-api v0.7.0/go.mod h1:AIxsTNB0+ZhkqIfTZpdZ0VR/cpX5zrXjATa3prSay3g=
374+
github.com/itsHenry35/gofakes3 v0.0.8 h1:1AgOl04IgoUV5r/WSK7ycnvwfpgharYLfVTmnzk5miw=
375+
github.com/itsHenry35/gofakes3 v0.0.8/go.mod h1:gQwOJ7LoH5QSpCVmjzC6oKp+MS71utLS7GHtonsvD0c=
350376
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
351377
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
352378
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
@@ -438,6 +464,8 @@ github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwX
438464
github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA=
439465
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
440466
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
467+
github.com/minio/xxml v0.0.3 h1:ZIpPQpfyG5uZQnqqC0LZuWtPk/WT8G/qkxvO6jb7zMU=
468+
github.com/minio/xxml v0.0.3/go.mod h1:wcXErosl6IezQIMEWSK/LYC2VS7LJ1dAkgvuyIN3aH4=
441469
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
442470
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
443471
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=

server/s3/backend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
"github.com/OpenListTeam/OpenList/internal/stream"
2222
"github.com/OpenListTeam/OpenList/pkg/http_range"
2323
"github.com/OpenListTeam/OpenList/pkg/utils"
24-
"github.com/OpenListTeam/gofakes3"
24+
"github.com/itsHenry35/gofakes3"
2525
"github.com/ncw/swift/v2"
2626
log "github.com/sirupsen/logrus"
2727
)

server/s3/list.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ package s3
55
import (
66
"path"
77
"strings"
8+
"time"
89

9-
"github.com/OpenListTeam/gofakes3"
10+
"github.com/itsHenry35/gofakes3"
11+
log "github.com/sirupsen/logrus"
1012
)
1113

1214
func (b *s3Backend) entryListR(bucket, fdPath, name string, addPrefix bool, response *gofakes3.ObjectList) error {
@@ -17,6 +19,21 @@ func (b *s3Backend) entryListR(bucket, fdPath, name string, addPrefix bool, resp
1719
return err
1820
}
1921

22+
// workaround as s3 can't have empty files in directories, useful in deletions
23+
if len(dirEntries) == 0 {
24+
item := &gofakes3.Content{
25+
// Key: gofakes3.URLEncode(path.Join(fdPath, emptyObjectName)),
26+
Key: path.Join(fdPath, emptyObjectName),
27+
LastModified: gofakes3.NewContentTime(time.Now()),
28+
ETag: getFileHash(nil), // No entry, so no hash
29+
Size: 0,
30+
StorageClass: gofakes3.StorageStandard,
31+
}
32+
response.Add(item)
33+
log.Debugf("Adding empty object %s to response", item.Key)
34+
return nil
35+
}
36+
2037
for _, entry := range dirEntries {
2138
object := entry.GetName()
2239

server/s3/logger.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"fmt"
77

88
"github.com/OpenListTeam/OpenList/pkg/utils"
9-
"github.com/OpenListTeam/gofakes3"
9+
"github.com/itsHenry35/gofakes3"
1010
)
1111

1212
// logger output formatted message

server/s3/pager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ package s3
55
import (
66
"sort"
77

8-
"github.com/OpenListTeam/gofakes3"
8+
"github.com/itsHenry35/gofakes3"
99
)
1010

1111
// pager splits the object list into smulitply pages.

server/s3/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"math/rand"
88
"net/http"
99

10-
"github.com/OpenListTeam/gofakes3"
10+
"github.com/itsHenry35/gofakes3"
1111
)
1212

1313
// Make a new S3 Server to serve the remote

server/s3/utils.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@ import (
1313
"github.com/OpenListTeam/OpenList/internal/model"
1414
"github.com/OpenListTeam/OpenList/internal/op"
1515
"github.com/OpenListTeam/OpenList/internal/setting"
16-
"github.com/OpenListTeam/gofakes3"
16+
"github.com/itsHenry35/gofakes3"
1717
)
1818

1919
type Bucket struct {
2020
Name string `json:"name"`
2121
Path string `json:"path"`
2222
}
2323

24+
const emptyObjectName = "ThisIsAnEmptyFolderInTheS3Bucket"
25+
2426
func getAndParseBuckets() ([]Bucket, error) {
2527
var res []Bucket
2628
err := json.Unmarshal([]byte(setting.GetStr(conf.S3Buckets)), &res)

0 commit comments

Comments
 (0)