in backend/Backend.go [61:128]
func UnzipToTempFodler(src string) (dest string) {
dest, err := ioutil.TempDir("", "IntelliJLogsAnalyzer")
r, err := zip.OpenReader(src)
if err != nil {
return ""
}
defer func() {
if err := r.Close(); err != nil {
panic(err)
}
}()
// Closure to address file descriptors issue with all the deferred .Close() methods
extractAndWriteFile := func(f *zip.File) error {
archiveFile, err := f.Open()
if err != nil {
return err
}
defer func() {
if err := archiveFile.Close(); err != nil {
panic(err)
}
}()
path := filepath.Join(dest, f.Name)
// Check for ZipSlip (Directory traversal)
if !strings.HasPrefix(path, filepath.Clean(dest)+string(os.PathSeparator)) {
return fmt.Errorf("illegal file path: %s", path)
}
if f.FileInfo().IsDir() {
err = os.MkdirAll(path, 0755)
//log.Println(err)
} else {
err = os.MkdirAll(filepath.Dir(path), 0755)
if err != nil {
log.Printf("UnzipToTempFodler failed to make dir %s. Error: %s", path, err)
}
destfile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
return err
}
defer func() {
if err := destfile.Close(); err != nil {
panic(err)
}
_ = os.Chtimes(destfile.Name(), f.Modified, f.Modified)
}()
_, err = io.Copy(destfile, archiveFile)
if err != nil {
return err
}
}
return nil
}
for _, f := range r.File {
err := extractAndWriteFile(f)
if err != nil {
return ""
}
}
entities.CurrentAnalyzer.IsFolderTemp = true
log.Println("Temp folder to work in: " + dest)
return dest
}