diff options
author | wxiaoguang <wxiaoguang@gmail.com> | 2023-03-22 04:02:49 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-21 16:02:49 -0400 |
commit | ce9dee5a1e8ae670c97621bca409d8cf43a90102 (patch) | |
tree | 6c9d8922dfae4bdcc1785340f2a866f805259988 /modules/storage | |
parent | 253a00aaac6b17346927e42c709f3f96672caaf3 (diff) | |
download | gitea-ce9dee5a1e8ae670c97621bca409d8cf43a90102.tar.gz gitea-ce9dee5a1e8ae670c97621bca409d8cf43a90102.zip |
Introduce path Clean/Join helper functions (#23495)
Since #23493 has conflicts with latest commits, this PR is my proposal
for fixing #23371
Details are in the comments
And refactor the `modules/options` module, to make it always use
"filepath" to access local files.
Benefits:
* No need to do `util.CleanPath(strings.ReplaceAll(p, "\\", "/"))),
"/")` any more (not only one before)
* The function behaviors are clearly defined
Diffstat (limited to 'modules/storage')
-rw-r--r-- | modules/storage/local.go | 17 | ||||
-rw-r--r-- | modules/storage/local_test.go | 20 | ||||
-rw-r--r-- | modules/storage/minio.go | 2 |
3 files changed, 21 insertions, 18 deletions
diff --git a/modules/storage/local.go b/modules/storage/local.go index 15f5761e8f..d22974a65a 100644 --- a/modules/storage/local.go +++ b/modules/storage/local.go @@ -5,11 +5,11 @@ package storage import ( "context" + "fmt" "io" "net/url" "os" "path/filepath" - "strings" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/util" @@ -41,13 +41,19 @@ func NewLocalStorage(ctx context.Context, cfg interface{}) (ObjectStorage, error } config := configInterface.(LocalStorageConfig) + if !filepath.IsAbs(config.Path) { + return nil, fmt.Errorf("LocalStorageConfig.Path should have been prepared by setting/storage.go and should be an absolute path, but not: %q", config.Path) + } log.Info("Creating new Local Storage at %s", config.Path) if err := os.MkdirAll(config.Path, os.ModePerm); err != nil { return nil, err } if config.TemporaryPath == "" { - config.TemporaryPath = config.Path + "/tmp" + config.TemporaryPath = filepath.Join(config.Path, "tmp") + } + if !filepath.IsAbs(config.TemporaryPath) { + return nil, fmt.Errorf("LocalStorageConfig.TemporaryPath should be an absolute path, but not: %q", config.TemporaryPath) } return &LocalStorage{ @@ -58,7 +64,7 @@ func NewLocalStorage(ctx context.Context, cfg interface{}) (ObjectStorage, error } func (l *LocalStorage) buildLocalPath(p string) string { - return filepath.Join(l.dir, util.CleanPath(strings.ReplaceAll(p, "\\", "/"))) + return util.FilePathJoinAbs(l.dir, p) } // Open a file @@ -128,10 +134,7 @@ func (l *LocalStorage) URL(path, name string) (*url.URL, error) { // IterateObjects iterates across the objects in the local storage func (l *LocalStorage) IterateObjects(prefix string, fn func(path string, obj Object) error) error { - dir := l.dir - if prefix != "" { - dir = filepath.Join(l.dir, util.CleanPath(prefix)) - } + dir := l.buildLocalPath(prefix) return filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error { if err != nil { return err diff --git a/modules/storage/local_test.go b/modules/storage/local_test.go index 2b112df8f1..9649761a0f 100644 --- a/modules/storage/local_test.go +++ b/modules/storage/local_test.go @@ -20,29 +20,29 @@ func TestBuildLocalPath(t *testing.T) { expected string }{ { - "a", + "/a", "0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", - "a/0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", + "/a/0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", }, { - "a", + "/a", "../0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", - "a/0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", + "/a/0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", }, { - "a", + "/a", "0\\a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", - "a/0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", + "/a/0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", }, { - "b", + "/b", "a/../0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", - "b/0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", + "/b/0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", }, { - "b", + "/b", "a\\..\\0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", - "b/0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", + "/b/0/a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14", }, } diff --git a/modules/storage/minio.go b/modules/storage/minio.go index 8cc06bcdd3..5c67dbf26a 100644 --- a/modules/storage/minio.go +++ b/modules/storage/minio.go @@ -121,7 +121,7 @@ func NewMinioStorage(ctx context.Context, cfg interface{}) (ObjectStorage, error } func (m *MinioStorage) buildMinioPath(p string) string { - return strings.TrimPrefix(path.Join(m.basePath, util.CleanPath(strings.ReplaceAll(p, "\\", "/"))), "/") + return util.PathJoinRelX(m.basePath, p) } // Open open a file |