mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 07:57:21 +08:00
feat(文件): 解压时只设置压缩包内文件的权限
This commit is contained in:
@@ -332,28 +332,19 @@ func (s *FileService) UnCompress(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
oldList, err := io.ReadDir(req.Path)
|
||||
if err != nil {
|
||||
Error(w, http.StatusInternalServerError, "%v", err)
|
||||
return
|
||||
}
|
||||
|
||||
if err = io.UnCompress(req.File, req.Path); err != nil {
|
||||
Error(w, http.StatusInternalServerError, "%v", err)
|
||||
return
|
||||
}
|
||||
|
||||
currentList, err := io.ReadDir(req.Path)
|
||||
list, err := io.ListCompress(req.File)
|
||||
if err != nil {
|
||||
Error(w, http.StatusInternalServerError, "%v", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 取新增的设置权限
|
||||
for _, currentDir := range currentList {
|
||||
if !slices.Contains(oldList, currentDir) {
|
||||
s.setPermission(filepath.Join(req.Path, currentDir.Name()), 0755, "www", "www")
|
||||
}
|
||||
for item := range slices.Values(list) {
|
||||
s.setPermission(filepath.Join(req.Path, item), 0755, "www", "www")
|
||||
}
|
||||
|
||||
Success(w, nil)
|
||||
|
||||
@@ -89,6 +89,31 @@ func UnCompress(src string, dst string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// ListCompress 获取压缩包内文件列表
|
||||
func ListCompress(src string) ([]string, error) {
|
||||
format, err := formatArchiveByPath(src)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var out string
|
||||
switch format {
|
||||
case Zip:
|
||||
out, err = shell.Execf("unzip -Z1 '%s'", src)
|
||||
case TGz, Bz2, Tar, Xz:
|
||||
out, err = shell.Execf("tar -tf '%s'", src)
|
||||
case SevenZip:
|
||||
out, err = shell.Execf(`7z l -slt '%s' | grep "^Path = " | sed 's/^Path = //'`, src)
|
||||
default:
|
||||
return nil, errors.New("unsupported format")
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return strings.Split(out, "\n"), nil
|
||||
}
|
||||
|
||||
// formatArchiveByPath 根据文件后缀获取压缩格式
|
||||
func formatArchiveByPath(path string) (FormatArchive, error) {
|
||||
switch filepath.Ext(path) {
|
||||
|
||||
@@ -175,6 +175,60 @@ func (s *IOTestSuite) TestUnCompress() {
|
||||
s.NoError(Remove("testdata"))
|
||||
}
|
||||
|
||||
func (s *IOTestSuite) TestListCompress() {
|
||||
abs, err := filepath.Abs("testdata")
|
||||
s.NoError(err)
|
||||
src := []string{"list_archive_test1.txt", "list_archive_test2.txt"}
|
||||
err = Write(filepath.Join(abs, src[0]), "File 1", 0644)
|
||||
s.NoError(err)
|
||||
err = Write(filepath.Join(abs, src[1]), "File 2", 0644)
|
||||
s.NoError(err)
|
||||
|
||||
err = Compress(abs, src, filepath.Join(abs, "list_archive_test.zip"))
|
||||
s.NoError(err)
|
||||
err = Compress(abs, src, filepath.Join(abs, "list_archive_test.bz2"))
|
||||
s.NoError(err)
|
||||
err = Compress(abs, src, filepath.Join(abs, "list_archive_test.tar"))
|
||||
s.NoError(err)
|
||||
err = Compress(abs, src, filepath.Join(abs, "list_archive_test.gz"))
|
||||
s.NoError(err)
|
||||
err = Compress(abs, src, filepath.Join(abs, "list_archive_test.tar.gz"))
|
||||
s.NoError(err)
|
||||
err = Compress(abs, src, filepath.Join(abs, "list_archive_test.tgz"))
|
||||
s.NoError(err)
|
||||
err = Compress(abs, src, filepath.Join(abs, "list_archive_test.xz"))
|
||||
s.NoError(err)
|
||||
err = Compress(abs, src, filepath.Join(abs, "list_archive_test.7z"))
|
||||
s.NoError(err)
|
||||
|
||||
list, err := ListCompress(filepath.Join(abs, "list_archive_test.zip"))
|
||||
s.NoError(err)
|
||||
s.Len(list, 2)
|
||||
list, err = ListCompress(filepath.Join(abs, "list_archive_test.bz2"))
|
||||
s.NoError(err)
|
||||
s.Len(list, 2)
|
||||
list, err = ListCompress(filepath.Join(abs, "list_archive_test.tar"))
|
||||
s.NoError(err)
|
||||
s.Len(list, 2)
|
||||
list, err = ListCompress(filepath.Join(abs, "list_archive_test.gz"))
|
||||
s.NoError(err)
|
||||
s.Len(list, 2)
|
||||
list, err = ListCompress(filepath.Join(abs, "list_archive_test.tar.gz"))
|
||||
s.NoError(err)
|
||||
s.Len(list, 2)
|
||||
list, err = ListCompress(filepath.Join(abs, "list_archive_test.tgz"))
|
||||
s.NoError(err)
|
||||
s.Len(list, 2)
|
||||
list, err = ListCompress(filepath.Join(abs, "list_archive_test.xz"))
|
||||
s.NoError(err)
|
||||
s.Len(list, 2)
|
||||
list, err = ListCompress(filepath.Join(abs, "list_archive_test.7z"))
|
||||
s.NoError(err)
|
||||
s.Len(list, 2)
|
||||
|
||||
s.NoError(Remove("testdata"))
|
||||
}
|
||||
|
||||
func (s *IOTestSuite) TestRemoveDeletesFileOrDirectory() {
|
||||
path := "testdata/remove_test"
|
||||
s.NoError(Mkdir(path, 0755))
|
||||
|
||||
Reference in New Issue
Block a user