Repository: gitleaks/gitleaks
Pull request #1748 (2025-02-10 18:39:34)

Add option to disable Git finding links
### Description:
Any bugs or edge cases like #1747 shouldn't prevent scanning. 

### Checklist:

* [x] Does your PR pass tests?
* [ ] Have you written new tests for your changes?
* [x] Have you lint your code locally prior to submission?



Patch:
diff --git a/cmd/detect.go b/cmd/detect.go
index 43d5f69..67c6e35 100644
--- a/cmd/detect.go
+++ b/cmd/detect.go
@@ -99,7 +99,7 @@ func runDetect(cmd *cobra.Command, args []string) {
 			logOpts     = mustGetStringFlag(cmd, "log-opts")
 			gitCmd      *sources.GitCmd
 			scmPlatform scm.Platform
-			remote      *detect.RemoteInfo
+			remote      = detect.NewRemoteInfo(scmPlatform, source)
 		)
 		if gitCmd, err = sources.NewGitLogCmd(source, logOpts); err != nil {
 			logging.Fatal().Err(err).Msg("could not create Git cmd")
@@ -107,9 +107,6 @@ func runDetect(cmd *cobra.Command, args []string) {
 		if scmPlatform, err = scm.PlatformFromString(mustGetStringFlag(cmd, "platform")); err != nil {
 			logging.Fatal().Err(err).Send()
 		}
-		if remote, err = detect.NewRemoteInfo(scmPlatform, source); err != nil {
-			logging.Fatal().Err(err).Msg("failed to scan Git repository")
-		}
 
 		if findings, err = detector.DetectGit(gitCmd, remote); err != nil {
 			// don't exit on error, just log it
diff --git a/cmd/git.go b/cmd/git.go
index 514e0d5..59e3fa3 100644
--- a/cmd/git.go
+++ b/cmd/git.go
@@ -74,9 +74,7 @@ func runGit(cmd *cobra.Command, args []string) {
 		if scmPlatform, err = scm.PlatformFromString(mustGetStringFlag(cmd, "platform")); err != nil {
 			logging.Fatal().Err(err).Send()
 		}
-		if remote, err = detect.NewRemoteInfo(scmPlatform, source); err != nil {
-			logging.Fatal().Err(err).Msg("failed to scan Git repository")
-		}
+		remote = detect.NewRemoteInfo(scmPlatform, source)
 	}
 
 	findings, err = detector.DetectGit(gitCmd, remote)
diff --git a/cmd/scm/scm.go b/cmd/scm/scm.go
index 7af656c..6a31b4c 100644
--- a/cmd/scm/scm.go
+++ b/cmd/scm/scm.go
@@ -8,7 +8,8 @@ import (
 type Platform int
 
 const (
-	NoPlatform Platform = iota
+	UnknownPlatform Platform = iota
+	NoPlatform               // Explicitly disable the feature
 	GitHubPlatform
 	GitLabPlatform
 	// TODO: Add others.
@@ -16,6 +17,7 @@ const (
 
 func (p Platform) String() string {
 	return [...]string{
+		"unknown",
 		"none",
 		"github",
 		"gitlab",
@@ -24,13 +26,15 @@ func (p Platform) String() string {
 
 func PlatformFromString(s string) (Platform, error) {
 	switch strings.ToLower(s) {
-	case "", "none":
+	case "", "unknown":
+		return UnknownPlatform, nil
+	case "none":
 		return NoPlatform, nil
 	case "github":
 		return GitHubPlatform, nil
 	case "gitlab":
 		return GitLabPlatform, nil
 	default:
-		return NoPlatform, fmt.Errorf("invalid scm platform value: %s", s)
+		return UnknownPlatform, fmt.Errorf("invalid scm platform value: %s", s)
 	}
 }
diff --git a/detect/git.go b/detect/git.go
index 37968f5..b1347de 100644
--- a/detect/git.go
+++ b/detect/git.go
@@ -62,7 +62,7 @@ func (d *Detector) DetectGit(cmd *sources.GitCmd, remote *RemoteInfo) ([]report.
 					}
 
 					for _, finding := range d.Detect(fragment) {
-						d.addFinding(augmentGitFinding(remote.Platform, remote.Url, finding, textFragment, gitdiffFile))
+						d.addFinding(augmentGitFinding(remote, finding, textFragment, gitdiffFile))
 					}
 				}
 				return nil
@@ -90,20 +90,25 @@ type RemoteInfo struct {
 	Url      string
 }
 
-func NewRemoteInfo(platform scm.Platform, source string) (*RemoteInfo, error) {
+func NewRemoteInfo(platform scm.Platform, source string) *RemoteInfo {
+	if platform == scm.NoPlatform {
+		return &RemoteInfo{Platform: platform}
+	}
+
 	remoteUrl, err := getRemoteUrl(source)
 	if err != nil {
 		if strings.Contains(err.Error(), "No remote configured") {
 			logging.Debug().Msg("skipping finding links: repository has no configured remote.")
 			platform = scm.NoPlatform
-			goto End
+		} else {
+			logging.Error().Err(err).Msg("skipping finding links: unable to parse remote URL")
 		}
-		return nil, fmt.Errorf("unable to get remote URL: %w", err)
+		goto End
 	}
 
-	if platform == scm.NoPlatform {
+	if platform == scm.UnknownPlatform {
 		platform = platformFromHost(remoteUrl)
-		if platform == scm.NoPlatform {
+		if platform == scm.UnknownPlatform {
 			logging.Info().
 				Str("host", remoteUrl.Hostname()).
 				Msg("Unknown SCM platform. Use --platform to include links in findings.")
@@ -123,7 +128,7 @@ End:
 	return &RemoteInfo{
 		Platform: platform,
 		Url:      rUrl,
-	}, nil
+	}
 }
 
 var sshUrlpat = regexp.MustCompile(`^git@([a-zA-Z0-9.-]+):([\w/.-]+?)(?:\.git)?$`)
@@ -167,6 +172,6 @@ func platformFromHost(u *url.URL) scm.Platform {
 	case "gitlab.com":
 		return scm.GitLabPlatform
 	default:
-		return scm.NoPlatform
+		return scm.UnknownPlatform
 	}
 }
diff --git a/detect/utils.go b/detect/utils.go
index d03ca95..664024c 100644
--- a/detect/utils.go
+++ b/detect/utils.go
@@ -18,7 +18,7 @@ import (
 
 // augmentGitFinding updates the start and end line numbers of a finding to include the
 // delta from the git diff
-func augmentGitFinding(scmPlatform scm.Platform, remoteUrl string, finding report.Finding, textFragment *gitdiff.TextFragment, f *gitdiff.File) report.Finding {
+func augmentGitFinding(remote *RemoteInfo, finding report.Finding, textFragment *gitdiff.TextFragment, f *gitdiff.File) report.Finding {
 	if !strings.HasPrefix(finding.Match, "file detected") {
 		finding.StartLine += int(textFragment.NewPosition)
 		finding.EndLine += int(textFragment.NewPosition)
@@ -34,7 +34,7 @@ func augmentGitFinding(scmPlatform scm.Platform, remoteUrl string, finding repor
 		finding.Message = f.PatchHeader.Message()
 		// Results from `git diff` shouldn't have a link.
 		if finding.Commit != "" {
-			finding.Link = createScmLink(scmPlatform, remoteUrl, finding)
+			finding.Link = createScmLink(remote.Platform, remote.Url, finding)
 		}
 	}
 	return finding
@@ -46,7 +46,7 @@ var linkCleaner = strings.NewReplacer(
 )
 
 func createScmLink(scmPlatform scm.Platform, remoteUrl string, finding report.Finding) string {
-	if scmPlatform == scm.NoPlatform {
+	if scmPlatform == scm.UnknownPlatform || scmPlatform == scm.NoPlatform {
 		return ""
 	}
 


Test patch:
diff --git a/detect/detect_test.go b/detect/detect_test.go
index da92fbc..3587423 100644
--- a/detect/detect_test.go
+++ b/detect/detect_test.go
@@ -614,9 +614,7 @@ func TestFromGit(t *testing.T) {
 			gitCmd, err := sources.NewGitLogCmd(tt.source, tt.logOpts)
 			require.NoError(t, err)
 
-			remote, err := NewRemoteInfo(scm.NoPlatform, tt.source)
-			require.NoError(t, err)
-
+			remote := NewRemoteInfo(scm.UnknownPlatform, tt.source)
 			findings, err := detector.DetectGit(gitCmd, remote)
 			require.NoError(t, err)
 
@@ -688,8 +686,7 @@ func TestFromGitStaged(t *testing.T) {
 		require.NoError(t, err)
 		gitCmd, err := sources.NewGitDiffCmd(tt.source, true)
 		require.NoError(t, err)
-		remote, err := NewRemoteInfo(scm.NoPlatform, tt.source)
-		require.NoError(t, err)
+		remote := NewRemoteInfo(scm.UnknownPlatform, tt.source)
 		findings, err := detector.DetectGit(gitCmd, remote)
 		require.NoError(t, err)