2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 07:57:21 +08:00

feat(文件): 解压时只设置压缩包内文件的权限

This commit is contained in:
耗子
2024-10-31 18:20:54 +08:00
parent 6423953aeb
commit 526f192200
3 changed files with 82 additions and 12 deletions

View File

@@ -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)

View File

@@ -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) {

View File

@@ -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))