Merge fe12f4df2909c62310db9c963bb655ee0adcde77 into d3ffc9985281dcf4d3bef604cce4e662b1a327a6

This commit is contained in:
Mike Ma 2026-05-06 22:01:56 -05:00 committed by GitHub
commit 862abb338a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 44 additions and 11 deletions

View File

@ -728,11 +728,18 @@ func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string, perm
mode = perm[0] mode = perm[0]
} }
dir := filepath.Dir(dst) dir := filepath.Dir(dst)
if err = os.MkdirAll(dir, mode); err != nil { if dir != "." {
return err if _, err = os.Stat(dir); err != nil {
} if !errors.Is(err, fs.ErrNotExist) {
if err = os.Chmod(dir, mode); err != nil { return err
return err }
if err = os.MkdirAll(dir, mode); err != nil {
return err
}
if err = os.Chmod(dir, mode); err != nil {
return err
}
}
} }
out, err := os.Create(dst) out, err := os.Create(dst)

View File

@ -246,16 +246,42 @@ func TestSaveUploadedFileWithPermission(t *testing.T) {
f, err := c.FormFile("file") f, err := c.FormFile("file")
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, "permission_test", f.Filename) assert.Equal(t, "permission_test", f.Filename)
dst := filepath.Join(t.TempDir(), "uploads", "permission_test")
var mode fs.FileMode = 0o755 var mode fs.FileMode = 0o755
require.NoError(t, c.SaveUploadedFile(f, "permission_test", mode)) require.NoError(t, c.SaveUploadedFile(f, dst, mode))
t.Cleanup(func() { info, err := os.Stat(filepath.Dir(dst))
assert.NoError(t, os.Remove("permission_test"))
})
info, err := os.Stat(filepath.Dir("permission_test"))
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, info.Mode().Perm(), mode) assert.Equal(t, info.Mode().Perm(), mode)
} }
func TestSaveUploadedFileWithPermissionExistingDirectory(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(http.MethodPost, "/", 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)
dstDir := filepath.Join(t.TempDir(), "uploads")
const existingMode fs.FileMode = 0o700
require.NoError(t, os.Mkdir(dstDir, existingMode))
var mode fs.FileMode = 0o755
dst := filepath.Join(dstDir, "permission_test")
require.NoError(t, c.SaveUploadedFile(f, dst, mode))
info, err := os.Stat(dstDir)
require.NoError(t, err)
assert.Equal(t, existingMode, info.Mode().Perm())
}
func TestSaveUploadedFileWithPermissionFailed(t *testing.T) { func TestSaveUploadedFileWithPermissionFailed(t *testing.T) {
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
mw := multipart.NewWriter(buf) mw := multipart.NewWriter(buf)
@ -271,7 +297,7 @@ func TestSaveUploadedFileWithPermissionFailed(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, "permission_test", f.Filename) assert.Equal(t, "permission_test", f.Filename)
var mode fs.FileMode = 0o644 var mode fs.FileMode = 0o644
require.Error(t, c.SaveUploadedFile(f, "test/permission_test", mode)) require.Error(t, c.SaveUploadedFile(f, filepath.Join(t.TempDir(), "test", "permission_test"), mode))
} }
func TestContextReset(t *testing.T) { func TestContextReset(t *testing.T) {