diff --git a/core/pkg/resourcehandler/filesloaderutils.go b/core/pkg/resourcehandler/filesloaderutils.go index 7f9ec407..bfd8eb97 100644 --- a/core/pkg/resourcehandler/filesloaderutils.go +++ b/core/pkg/resourcehandler/filesloaderutils.go @@ -18,7 +18,7 @@ func cloneGitRepo(path *string) (string, error) { var clonedDir string // Clone git repository if needed - gitURL, err := giturl.NewGitURL(*path) + gitURL, err := giturl.NewGitAPI(*path) if err == nil { logger.L().Info("cloning", helpers.String("repository url", gitURL.GetURL().String())) cautils.StartSpinner() diff --git a/core/pkg/resourcehandler/remotegitutils.go b/core/pkg/resourcehandler/remotegitutils.go index 47a45d09..1dc4922b 100644 --- a/core/pkg/resourcehandler/remotegitutils.go +++ b/core/pkg/resourcehandler/remotegitutils.go @@ -1,16 +1,45 @@ package resourcehandler import ( + "errors" "fmt" + nethttp "net/http" "os" giturl "github.com/armosec/go-git-url" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/http" ) +// To Check if the given repository is Public(No Authentication needed), send a HTTP GET request to the URL +// If response code is 200, the repository is Public. +func isGitRepoPublic(URL string) bool { + resp, err := nethttp.Get(URL) + + if err != nil { + return false + } + // if the status code is 200, our get request is successful. + // It only happens when the repository is public. + if resp.StatusCode == 200 { + return true + } + + return false +} + +// Check if the GITHUB_TOKEN is present +func isGitTokenPresent(gitURL giturl.IGitAPI) bool { + if token := gitURL.GetToken(); token == "" { + return false + } + return true +} + // cloneRepo clones a repository to a local temporary directory and returns the directory -func cloneRepo(gitURL giturl.IGitURL) (string, error) { +func cloneRepo(gitURL giturl.IGitAPI) (string, error) { // Create temp directory tmpDir, err := os.MkdirTemp("", "") @@ -18,9 +47,31 @@ func cloneRepo(gitURL giturl.IGitURL) (string, error) { return "", fmt.Errorf("failed to create temporary directory: %w", err) } - // Clone option + // Get the URL to clone cloneURL := gitURL.GetHttpCloneURL() - cloneOpts := git.CloneOptions{URL: cloneURL} + + isGitRepoPublic := isGitRepoPublic(cloneURL) + + // Declare the authentication variable required for cloneOptions + var auth transport.AuthMethod + + if isGitRepoPublic { + // No authentication needed if repository is public + auth = nil + } else { + + // Return Error if the GITHUB_TOKEN is not present + if isGitTokenPresent := isGitTokenPresent(gitURL); !isGitTokenPresent { + return "", fmt.Errorf("%w", errors.New("GITHUB_TOKEN is not present")) + } + auth = &http.BasicAuth{ + Username: "anything Except Empty String", + Password: gitURL.GetToken(), + } + } + + // Clone option + cloneOpts := git.CloneOptions{URL: cloneURL, Auth: auth} if gitURL.GetBranchName() != "" { cloneOpts.ReferenceName = plumbing.NewBranchReferenceName(gitURL.GetBranchName()) cloneOpts.SingleBranch = true