Skip to content

Commit d7098d0

Browse files
changed the approach for persisting the repositories for legacy json printing
1 parent ddf368b commit d7098d0

File tree

13 files changed

+725
-619
lines changed

13 files changed

+725
-619
lines changed

main.go

Lines changed: 25 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"os"
1010
"os/exec"
1111
"os/signal"
12-
"path/filepath"
1312
"runtime"
1413
"strconv"
1514
"strings"
@@ -710,34 +709,31 @@ func runSingleScan(ctx context.Context, cmd string, cfg engine.Config) (metrics,
710709
}
711710
eng.Start(ctx)
712711

713-
tmpDir := filepath.Join(os.TempDir(), "trufflehog_"+strconv.Itoa(os.Getpid()))
714712
persistRepo := *gitNoCleanup || *githubNoCleanup || *gitlabNoCleanup
713+
clonePath := ""
715714

716715
defer func() {
717716
// Clean up temporary artifacts.
718717
if err := cleantemp.CleanTempArtifacts(ctx); err != nil {
719718
ctx.Logger().Error(err, "error cleaning temp artifacts")
720719
}
721720

722-
if !persistRepo {
723-
if err := os.RemoveAll(tmpDir); err != nil {
724-
ctx.Logger().Error(err, "error removing temporary directory")
721+
if *jsonLegacy {
722+
// If JSON legacy is enabled, that means the cloned repos are not deleted yet
723+
// because they were needed for outputting legacy JSON.
724+
// We only clean them up here if the user did not request to persist them.
725+
if !persistRepo {
726+
if err := cleantemp.CleanTempDirsForLegacyJSON(clonePath); err != nil {
727+
ctx.Logger().Error(err, "error cleaning temp artifacts for legacy JSON")
728+
}
725729
}
726730
}
727731
}()
728732

729733
var refs []sources.JobProgressRef
730734
switch cmd {
731735
case gitScan.FullCommand():
732-
if *jsonLegacy && !*gitNoCleanup {
733-
if *gitClonePath == "" {
734-
if err := os.MkdirAll(tmpDir, os.ModePerm); err != nil {
735-
return scanMetrics, fmt.Errorf("failed to create temporary directory: %v", err)
736-
}
737-
*gitClonePath = tmpDir
738-
}
739-
*gitNoCleanup = true
740-
}
736+
clonePath = *gitClonePath
741737
// validate the commit for local repository only
742738
if *gitScanSinceCommit != "" && strings.HasPrefix(*gitScanURI, "file") {
743739
if !isValidCommit(*gitScanURI, *gitScanSinceCommit) {
@@ -765,22 +761,15 @@ func runSingleScan(ctx context.Context, cmd string, cfg engine.Config) (metrics,
765761
ExcludeGlobs: *gitScanExcludeGlobs,
766762
ClonePath: *gitClonePath,
767763
NoCleanup: *gitNoCleanup,
764+
PrintLegacyJSON: *jsonLegacy,
768765
}
769766
if ref, err := eng.ScanGit(ctx, gitCfg); err != nil {
770767
return scanMetrics, fmt.Errorf("failed to scan Git: %v", err)
771768
} else {
772769
refs = []sources.JobProgressRef{ref}
773770
}
774771
case githubScan.FullCommand():
775-
if *jsonLegacy && !*githubNoCleanup {
776-
if *githubClonePath == "" {
777-
if err := os.MkdirAll(tmpDir, os.ModePerm); err != nil {
778-
return scanMetrics, fmt.Errorf("failed to create temporary directory: %v", err)
779-
}
780-
*githubClonePath = tmpDir
781-
}
782-
*githubNoCleanup = true
783-
}
772+
clonePath = *githubClonePath
784773
filter, err := common.FilterFromFiles(*githubScanIncludePaths, *githubScanExcludePaths)
785774
if err != nil {
786775
return scanMetrics, fmt.Errorf("could not create filter: %v", err)
@@ -816,6 +805,7 @@ func runSingleScan(ctx context.Context, cmd string, cfg engine.Config) (metrics,
816805
ClonePath: *githubClonePath,
817806
NoCleanup: *githubNoCleanup,
818807
IgnoreGists: *githubIgnoreGists,
808+
PrintLegacyJSON: *jsonLegacy,
819809
}
820810

821811
if ref, err := eng.ScanGitHub(ctx, cfg); err != nil {
@@ -837,15 +827,7 @@ func runSingleScan(ctx context.Context, cmd string, cfg engine.Config) (metrics,
837827
refs = []sources.JobProgressRef{ref}
838828
}
839829
case gitlabScan.FullCommand():
840-
if *jsonLegacy && !*gitlabNoCleanup {
841-
if *gitlabClonePath == "" {
842-
if err := os.MkdirAll(tmpDir, os.ModePerm); err != nil {
843-
return scanMetrics, fmt.Errorf("failed to create temporary directory: %v", err)
844-
}
845-
*gitlabClonePath = tmpDir
846-
}
847-
*gitlabNoCleanup = true
848-
}
830+
clonePath = *gitlabClonePath
849831
filter, err := common.FilterFromFiles(*gitlabScanIncludePaths, *gitlabScanExcludePaths)
850832
if err != nil {
851833
return scanMetrics, fmt.Errorf("could not create filter: %v", err)
@@ -860,16 +842,17 @@ func runSingleScan(ctx context.Context, cmd string, cfg engine.Config) (metrics,
860842
}
861843

862844
cfg := sources.GitlabConfig{
863-
Endpoint: *gitlabScanEndpoint,
864-
Token: *gitlabScanToken,
865-
Repos: *gitlabScanRepos,
866-
GroupIds: *gitlabScanGroupIds,
867-
IncludeRepos: *gitlabScanIncludeRepos,
868-
ExcludeRepos: *gitlabScanExcludeRepos,
869-
Filter: filter,
870-
AuthInUrl: *gitlabAuthInUrl,
871-
ClonePath: *gitlabClonePath,
872-
NoCleanup: *gitlabNoCleanup,
845+
Endpoint: *gitlabScanEndpoint,
846+
Token: *gitlabScanToken,
847+
Repos: *gitlabScanRepos,
848+
GroupIds: *gitlabScanGroupIds,
849+
IncludeRepos: *gitlabScanIncludeRepos,
850+
ExcludeRepos: *gitlabScanExcludeRepos,
851+
Filter: filter,
852+
AuthInUrl: *gitlabAuthInUrl,
853+
ClonePath: *gitlabClonePath,
854+
NoCleanup: *gitlabNoCleanup,
855+
PrintLegacyJSON: *jsonLegacy,
873856
}
874857

875858
if ref, err := eng.ScanGitLab(ctx, cfg); err != nil {

pkg/cleantemp/cleantemp.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,27 @@ func CleanTempArtifacts(ctx logContext.Context) error {
117117

118118
return nil
119119
}
120+
121+
// CleanTempDirsForLegacyJSON removes all directories that start with "trufflehog-"
122+
// from either the provided clonePath (if not empty) or the OS temp directory.
123+
func CleanTempDirsForLegacyJSON(baseDir string) error {
124+
if baseDir == "" {
125+
baseDir = os.TempDir()
126+
}
127+
128+
entries, err := os.ReadDir(baseDir)
129+
if err != nil {
130+
return err
131+
}
132+
133+
for _, entry := range entries {
134+
if entry.IsDir() && strings.HasPrefix(entry.Name(), "trufflehog-") {
135+
fullPath := filepath.Join(baseDir, entry.Name())
136+
if err := os.RemoveAll(fullPath); err != nil {
137+
return err
138+
}
139+
}
140+
}
141+
142+
return nil
143+
}

pkg/cleantemp/cleantemp_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,35 @@ func TestExecName(t *testing.T) {
2828

2929
assert.True(t, found)
3030
}
31+
32+
func TestCleanTempDirsForLegacyJSON(t *testing.T) {
33+
baseDir := t.TempDir()
34+
35+
// Create dirs that should be deleted
36+
dir1 := filepath.Join(baseDir, "trufflehog-123")
37+
dir2 := filepath.Join(baseDir, "trufflehog-456")
38+
assert.NoError(t, os.Mkdir(dir1, 0o755))
39+
assert.NoError(t, os.Mkdir(dir2, 0o755))
40+
41+
// Create dirs that should NOT be deleted
42+
keepDir := filepath.Join(baseDir, "keepme-123")
43+
assert.NoError(t, os.Mkdir(keepDir, 0o755))
44+
45+
// Create a file with trufflehog- prefix (should not be deleted because only dirs are deleted)
46+
keepFile := filepath.Join(baseDir, "trufflehog-file")
47+
assert.NoError(t, os.WriteFile(keepFile, []byte("data"), 0o644))
48+
49+
err := CleanTempDirsForLegacyJSON(baseDir)
50+
assert.NoError(t, err)
51+
52+
_, err = os.Stat(dir1)
53+
assert.True(t, os.IsNotExist(err))
54+
_, err = os.Stat(dir2)
55+
assert.True(t, os.IsNotExist(err))
56+
57+
_, err = os.Stat(keepDir)
58+
assert.NoError(t, err)
59+
60+
_, err = os.Stat(keepFile)
61+
assert.NoError(t, err)
62+
}

pkg/engine/git.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ func (e *Engine) ScanGit(ctx context.Context, c sources.GitConfig) (sources.JobP
2626
SkipBinaries: c.SkipBinaries,
2727
ClonePath: c.ClonePath,
2828
NoCleanup: c.NoCleanup,
29+
PrintLegacyJson: c.PrintLegacyJSON,
2930
}
3031

3132
var conn anypb.Any

pkg/engine/github.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ func (e *Engine) ScanGitHub(ctx context.Context, c sources.GithubConfig) (source
3232
ClonePath: c.ClonePath,
3333
NoCleanup: c.NoCleanup,
3434
IgnoreGists: c.IgnoreGists,
35+
PrintLegacyJson: c.PrintLegacyJSON,
3536
}
3637

3738
if len(c.Token) > 0 {

pkg/engine/gitlab.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func (e *Engine) ScanGitLab(ctx context.Context, c sources.GitlabConfig) (source
6363
}
6464

6565
connection.NoCleanup = c.NoCleanup
66+
connection.PrintLegacyJson = c.PrintLegacyJSON
6667

6768
var conn anypb.Any
6869
err := anypb.MarshalFrom(&conn, connection, proto.MarshalOptions{})

0 commit comments

Comments
 (0)