func UnzipToTempFodler()

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
}