package main import ( "archive/tar" "archive/zip" "bytes" "io" "os" "path" "path/filepath" "strings" "github.com/Luzifer/go_helpers/v2/str" "github.com/pkg/errors" "github.com/gofrs/uuid" ) func buildAssetsTAR(uid uuid.UUID) (io.Reader, error) { buf := new(bytes.Buffer) w := tar.NewWriter(buf) basePath := pathFromUUID(uid, filenameOutputDir) err := filepath.Walk(basePath, func(p string, info os.FileInfo, err error) error { if err != nil { return err } if !shouldPackFile(path.Ext(info.Name())) { return nil } tarInfo, err := tar.FileInfoHeader(info, "") if err != nil { return err } tarInfo.Name = strings.TrimLeft(strings.Replace(p, basePath, "", 1), "/\\") err = w.WriteHeader(tarInfo) if err != nil { return err } osFile, err := os.Open(p) // #nosec G304 if err != nil { return err } if _, err := io.Copy(w, osFile); err != nil { return err } osFile.Close() // #nosec G104 return nil }) if err != nil { return nil, err } return buf, w.Close() } func buildAssetsZIP(uid uuid.UUID) (io.Reader, error) { buf := new(bytes.Buffer) w := zip.NewWriter(buf) basePath := pathFromUUID(uid, filenameOutputDir) err := filepath.Walk(basePath, func(p string, info os.FileInfo, err error) error { if err != nil { return err } if !shouldPackFile(path.Ext(info.Name())) { return nil } zipInfo, err := zip.FileInfoHeader(info) if err != nil { return err } zipInfo.Name = strings.TrimLeft(strings.Replace(p, basePath, "", 1), "/\\") zipFile, err := w.CreateHeader(zipInfo) if err != nil { return err } osFile, err := os.Open(p) // #nosec G304 if err != nil { return err } if _, err := io.Copy(zipFile, osFile); err != nil { return err } osFile.Close() // #nosec G104 return nil }) if err != nil { return nil, err } return buf, w.Close() } func getAssetsPDF(uid uuid.UUID) (io.Reader, error) { var ( buf = new(bytes.Buffer) found bool ) basePath := pathFromUUID(uid, filenameOutputDir) err := filepath.Walk(basePath, func(p string, info os.FileInfo, err error) error { if err != nil { return err } if path.Ext(info.Name()) != ".pdf" { return nil } osFile, err := os.Open(p) // #nosec G304 if err != nil { return errors.Wrap(err, "opening file") } if _, err := io.Copy(buf, osFile); err != nil { return errors.Wrap(err, "reading file") } osFile.Close() // #nosec G104 found = true return filepath.SkipAll }) if !found { // We found no file return nil, errors.New("no pdf found") } return buf, err } func shouldPackFile(extension string) bool { return str.StringInSlice(extension, []string{ ".log", ".pdf", }) }