summaryrefslogtreecommitdiffstats
path: root/utils/extract.go
diff options
context:
space:
mode:
authorChris <ccbrown112@gmail.com>2017-09-11 10:02:02 -0500
committerGitHub <noreply@github.com>2017-09-11 10:02:02 -0500
commit402491b7e52c4d836c1274976cdb387852cfd17b (patch)
treee8adcbdf0af5370f8af11e3fc1021a328c971a5d /utils/extract.go
parenta69bed712d53e9a7984915fffffc8a2fd1647a7a (diff)
downloadchat-402491b7e52c4d836c1274976cdb387852cfd17b.tar.gz
chat-402491b7e52c4d836c1274976cdb387852cfd17b.tar.bz2
chat-402491b7e52c4d836c1274976cdb387852cfd17b.zip
PLT-7407: Back-end plugins (#7409)
* tie back-end plugins together * fix comment typo * add tests and a bit of polish * tests and polish * add test, don't let backend executable paths escape the plugin directory
Diffstat (limited to 'utils/extract.go')
-rw-r--r--utils/extract.go33
1 files changed, 13 insertions, 20 deletions
diff --git a/utils/extract.go b/utils/extract.go
index 0559c6ce8..bc8e07f75 100644
--- a/utils/extract.go
+++ b/utils/extract.go
@@ -13,19 +13,16 @@ import (
)
// ExtractTarGz takes in an io.Reader containing the bytes for a .tar.gz file and
-// a destination string to extract to. A list of the file and directory names that
-// were extracted is returned.
-func ExtractTarGz(gzipStream io.Reader, dst string) ([]string, error) {
+// a destination string to extract to.
+func ExtractTarGz(gzipStream io.Reader, dst string) error {
uncompressedStream, err := gzip.NewReader(gzipStream)
if err != nil {
- return nil, fmt.Errorf("ExtractTarGz: NewReader failed: %s", err.Error())
+ return fmt.Errorf("ExtractTarGz: NewReader failed: %s", err.Error())
}
defer uncompressedStream.Close()
tarReader := tar.NewReader(uncompressedStream)
- filenames := []string{}
-
for true {
header, err := tarReader.Next()
@@ -34,50 +31,46 @@ func ExtractTarGz(gzipStream io.Reader, dst string) ([]string, error) {
}
if err != nil {
- return nil, fmt.Errorf("ExtractTarGz: Next() failed: %s", err.Error())
+ return fmt.Errorf("ExtractTarGz: Next() failed: %s", err.Error())
}
switch header.Typeflag {
case tar.TypeDir:
if PathTraversesUpward(header.Name) {
- return nil, fmt.Errorf("ExtractTarGz: path attempts to traverse upwards")
+ return fmt.Errorf("ExtractTarGz: path attempts to traverse upwards")
}
path := filepath.Join(dst, header.Name)
if err := os.Mkdir(path, 0744); err != nil && !os.IsExist(err) {
- return nil, fmt.Errorf("ExtractTarGz: Mkdir() failed: %s", err.Error())
+ return fmt.Errorf("ExtractTarGz: Mkdir() failed: %s", err.Error())
}
-
- filenames = append(filenames, header.Name)
case tar.TypeReg:
if PathTraversesUpward(header.Name) {
- return nil, fmt.Errorf("ExtractTarGz: path attempts to traverse upwards")
+ return fmt.Errorf("ExtractTarGz: path attempts to traverse upwards")
}
path := filepath.Join(dst, header.Name)
dir := filepath.Dir(path)
if err := os.MkdirAll(dir, 0744); err != nil {
- return nil, fmt.Errorf("ExtractTarGz: MkdirAll() failed: %s", err.Error())
+ return fmt.Errorf("ExtractTarGz: MkdirAll() failed: %s", err.Error())
}
- outFile, err := os.Create(path)
+ outFile, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.FileMode(header.Mode))
if err != nil {
- return nil, fmt.Errorf("ExtractTarGz: Create() failed: %s", err.Error())
+ return fmt.Errorf("ExtractTarGz: Create() failed: %s", err.Error())
}
defer outFile.Close()
if _, err := io.Copy(outFile, tarReader); err != nil {
- return nil, fmt.Errorf("ExtractTarGz: Copy() failed: %s", err.Error())
+ return fmt.Errorf("ExtractTarGz: Copy() failed: %s", err.Error())
}
-
- filenames = append(filenames, header.Name)
default:
- return nil, fmt.Errorf(
+ return fmt.Errorf(
"ExtractTarGz: unknown type: %v in %v",
header.Typeflag,
header.Name)
}
}
- return filenames, nil
+ return nil
}