From 4b244e96fb26b42056c160bf6d199c4ba7cdaa44 Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Sat, 17 Apr 2021 13:13:37 -0700 Subject: [PATCH] Fix .rar file decompression; closes pterodactyl/panel#3267 --- router/router_server_files.go | 7 +++---- server/filesystem/compress.go | 6 +----- system/utils.go | 21 --------------------- 3 files changed, 4 insertions(+), 30 deletions(-) diff --git a/router/router_server_files.go b/router/router_server_files.go index 097da2f..2ae03c5 100644 --- a/router/router_server_files.go +++ b/router/router_server_files.go @@ -383,8 +383,6 @@ func postServerCompressFiles(c *gin.Context) { // of unpacking an archive that exists on the server into the provided RootPath // for the server. func postServerDecompressFiles(c *gin.Context) { - s := middleware.ExtractServer(c) - lg := middleware.ExtractLogger(c) var data struct { RootPath string `json:"root"` File string `json:"file"` @@ -393,7 +391,8 @@ func postServerDecompressFiles(c *gin.Context) { return } - lg = lg.WithFields(log.Fields{"root_path": data.RootPath, "file": data.File}) + s := middleware.ExtractServer(c) + lg := middleware.ExtractLogger(c).WithFields(log.Fields{"root_path": data.RootPath, "file": data.File}) lg.Debug("checking if space is available for file decompression") err := s.Filesystem().SpaceAvailableForDecompression(data.RootPath, data.File) if err != nil { @@ -412,7 +411,7 @@ func postServerDecompressFiles(c *gin.Context) { // much we specifically can do. They'll need to stop the running server process in order to overwrite // a file like this. if strings.Contains(err.Error(), "text file busy") { - lg.WithField("error", err).Warn("failed to decompress file: text file busy") + lg.WithField("error", errors.WithStackIf(err)).Warn("failed to decompress file: text file busy") c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ "error": "One or more files this archive is attempting to overwrite are currently in use by another process. Please try again.", }) diff --git a/server/filesystem/compress.go b/server/filesystem/compress.go index 1069f75..9782c67 100644 --- a/server/filesystem/compress.go +++ b/server/filesystem/compress.go @@ -121,11 +121,7 @@ func (fs *Filesystem) DecompressFile(dir string, file string) error { if f.IsDir() { return nil } - name, err := system.ExtractArchiveSourceName(f, dir) - if err != nil { - return WrapError(err, filepath.Join(dir, f.Name())) - } - p := filepath.Join(dir, name) + p := filepath.Join(dir, f.Name()) // If it is ignored, just don't do anything with the file and skip over it. if err := fs.IsIgnored(p); err != nil { return nil diff --git a/system/utils.go b/system/utils.go index b32dec1..681ac2a 100644 --- a/system/utils.go +++ b/system/utils.go @@ -1,23 +1,18 @@ package system import ( - "archive/tar" - "archive/zip" "bufio" "bytes" - "compress/gzip" "context" "encoding/json" "fmt" "io" - "reflect" "strconv" "strings" "sync" "time" "emperror.dev/errors" - "github.com/mholt/archiver/v3" ) var cr = []byte(" \r") @@ -41,22 +36,6 @@ func MustInt(v string) int { return i } -// ExtractArchiveSourceName looks for the provided archiver.File's name if it is -// a type that is supported, otherwise it returns an error to the caller. -func ExtractArchiveSourceName(f archiver.File, dir string) (name string, err error) { - switch s := f.Sys().(type) { - case *tar.Header: - name = s.Name - case *gzip.Header: - name = s.Name - case *zip.FileHeader: - name = s.Name - default: - err = errors.New(fmt.Sprintf("could not parse underlying data source with type: %s", reflect.TypeOf(s).String())) - } - return name, err -} - func ScanReader(r io.Reader, callback func(line string)) error { br := bufio.NewReader(r) // Avoid constantly re-allocating memory when we're flooding lines through this