From 84b377075dbbb1ed269a6a923a6f5c331b8d2c4e Mon Sep 17 00:00:00 2001 From: haesuo Date: Sun, 3 Nov 2024 13:50:29 +0900 Subject: [PATCH 1/3] refactor(context): Added a third, optional parameter for permissions to the SaveUploadedFile method. (#4068) --- context.go | 9 +++++++-- context_test.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/context.go b/context.go index 1e8c8e27..3c5bc7f2 100644 --- a/context.go +++ b/context.go @@ -7,6 +7,7 @@ package gin import ( "errors" "io" + "io/fs" "log" "math" "mime/multipart" @@ -677,14 +678,18 @@ func (c *Context) MultipartForm() (*multipart.Form, error) { } // SaveUploadedFile uploads the form file to specific dst. -func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string) error { +func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string, perm ...fs.FileMode) error { src, err := file.Open() if err != nil { return err } defer src.Close() - if err = os.MkdirAll(filepath.Dir(dst), 0o750); err != nil { + if len(perm) <= 0 { + perm = append(perm, 0o750) + } + + if err = os.MkdirAll(filepath.Dir(dst), perm[0]); err != nil { return err } diff --git a/context_test.go b/context_test.go index 62a1e14f..3d3b5757 100644 --- a/context_test.go +++ b/context_test.go @@ -11,12 +11,14 @@ import ( "fmt" "html/template" "io" + "io/fs" "mime/multipart" "net" "net/http" "net/http/httptest" "net/url" "os" + "path/filepath" "reflect" "strings" "sync" @@ -154,6 +156,49 @@ func TestSaveUploadedCreateFailed(t *testing.T) { require.Error(t, c.SaveUploadedFile(f, "/")) } +func TestSaveUploadedFileWithPermission(t *testing.T) { + buf := new(bytes.Buffer) + mw := multipart.NewWriter(buf) + w, err := mw.CreateFormFile("file", "permission_test") + require.NoError(t, err) + _, err = w.Write([]byte("permission_test")) + require.NoError(t, err) + mw.Close() + c, _ := CreateTestContext(httptest.NewRecorder()) + c.Request, _ = http.NewRequest("POST", "/", buf) + c.Request.Header.Set("Content-Type", mw.FormDataContentType()) + f, err := c.FormFile("file") + require.NoError(t, err) + assert.Equal(t, "permission_test", f.Filename) + + var mode fs.FileMode = 0o777 + require.NoError(t, c.SaveUploadedFile(f, "permission_test", mode)) + + info, err := os.Stat(filepath.Dir("permission_test")) + require.NoError(t, err) + + assert.Equal(t, info.Mode().Perm(), mode) +} + +func TestSaveUploadedFileWithPermissionFailed(t *testing.T) { + buf := new(bytes.Buffer) + mw := multipart.NewWriter(buf) + w, err := mw.CreateFormFile("file", "permission_test") + require.NoError(t, err) + _, err = w.Write([]byte("permission_test")) + require.NoError(t, err) + mw.Close() + c, _ := CreateTestContext(httptest.NewRecorder()) + c.Request, _ = http.NewRequest("POST", "/", buf) + c.Request.Header.Set("Content-Type", mw.FormDataContentType()) + f, err := c.FormFile("file") + require.NoError(t, err) + assert.Equal(t, "permission_test", f.Filename) + + var mode fs.FileMode = 0o666 + require.Error(t, c.SaveUploadedFile(f, "test/permission_test", mode)) +} + func TestContextReset(t *testing.T) { router := New() c := router.allocateContext(0) From 75fe2b9d001286be38e53eb1e408cc5b364840dd Mon Sep 17 00:00:00 2001 From: haesuo566 <102643523+haesuo566@users.noreply.github.com> Date: Wed, 6 Nov 2024 12:33:44 +0900 Subject: [PATCH 2/3] Fixed part where permissions could not be changed due to umask settings --- context.go | 7 ++++++- context_test.go | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/context.go b/context.go index 3c5bc7f2..0ccadca5 100644 --- a/context.go +++ b/context.go @@ -689,7 +689,12 @@ func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string, perm perm = append(perm, 0o750) } - if err = os.MkdirAll(filepath.Dir(dst), perm[0]); err != nil { + dirPath := filepath.Dir(dst) + if err = os.MkdirAll(dirPath, perm[0]); err != nil { + return err + } + + if err = os.Chmod(dirPath, perm[0]); err != nil { return err } diff --git a/context_test.go b/context_test.go index 3d3b5757..c62ba232 100644 --- a/context_test.go +++ b/context_test.go @@ -171,7 +171,7 @@ func TestSaveUploadedFileWithPermission(t *testing.T) { require.NoError(t, err) assert.Equal(t, "permission_test", f.Filename) - var mode fs.FileMode = 0o777 + var mode fs.FileMode = 0o755 require.NoError(t, c.SaveUploadedFile(f, "permission_test", mode)) info, err := os.Stat(filepath.Dir("permission_test")) @@ -195,7 +195,7 @@ func TestSaveUploadedFileWithPermissionFailed(t *testing.T) { require.NoError(t, err) assert.Equal(t, "permission_test", f.Filename) - var mode fs.FileMode = 0o666 + var mode fs.FileMode = 0o644 require.Error(t, c.SaveUploadedFile(f, "test/permission_test", mode)) } From f21bac2f9d6b2dfaa76b3dc32eb8d3235fe2035f Mon Sep 17 00:00:00 2001 From: hso Date: Thu, 7 Nov 2024 15:04:53 +0900 Subject: [PATCH 3/3] fixed lint --- context.go | 7 +++---- context_test.go | 3 --- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/context.go b/context.go index 0ccadca5..f926bd2e 100644 --- a/context.go +++ b/context.go @@ -689,12 +689,11 @@ func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string, perm perm = append(perm, 0o750) } - dirPath := filepath.Dir(dst) - if err = os.MkdirAll(dirPath, perm[0]); err != nil { + if err = os.MkdirAll(filepath.Dir(dst), perm[0]); err != nil { return err } - - if err = os.Chmod(dirPath, perm[0]); err != nil { + + if err = os.Chmod(filepath.Dir(dst), perm[0]); err != nil { return err } diff --git a/context_test.go b/context_test.go index c62ba232..e3f3d89d 100644 --- a/context_test.go +++ b/context_test.go @@ -170,10 +170,8 @@ func TestSaveUploadedFileWithPermission(t *testing.T) { f, err := c.FormFile("file") require.NoError(t, err) assert.Equal(t, "permission_test", f.Filename) - var mode fs.FileMode = 0o755 require.NoError(t, c.SaveUploadedFile(f, "permission_test", mode)) - info, err := os.Stat(filepath.Dir("permission_test")) require.NoError(t, err) @@ -194,7 +192,6 @@ func TestSaveUploadedFileWithPermissionFailed(t *testing.T) { f, err := c.FormFile("file") require.NoError(t, err) assert.Equal(t, "permission_test", f.Filename) - var mode fs.FileMode = 0o644 require.Error(t, c.SaveUploadedFile(f, "test/permission_test", mode)) }