diff --git a/gh-recon/deep.go b/gh-recon/deep.go index f966707..4f1b668 100644 --- a/gh-recon/deep.go +++ b/gh-recon/deep.go @@ -13,13 +13,6 @@ import ( "github.com/google/go-github/v72/github" ) -func folderExists(path string) bool { - if stat, err := os.Stat(path); err == nil && stat.IsDir() { - return true - } - return false -} - type AuthorOccurrence struct { Name string Email string @@ -31,6 +24,19 @@ type EmailOccurrence struct { FoundIn []string } +type DeepResult struct { + Repositories []Repositorie + Authors []AuthorOccurrence + Emails []EmailOccurrence +} + +type Repositorie struct { + Repository string + Owner string + Name string + Size int +} + func findEmailsAndOccurrencesInDir(rootPath string) ([]EmailOccurrence, error) { emailLocations := make(map[string]map[string]bool) emailRegex := regexp.MustCompile(`[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}`) @@ -87,14 +93,8 @@ func findEmailsAndOccurrencesInDir(rootPath string) ([]EmailOccurrence, error) { return results, nil } -type DeepResult struct { - Repository string - Owner string - Name string - Size int -} - -func (r Recon) Deep(username, excludeRepos string, refresh bool) (response []DeepResult) { +func (r Recon) Deep(username, excludeRepos string, refresh bool) (response DeepResult) { + repositories := []Repositorie{} excludeReposList := strings.Split(excludeRepos, ",") repos, resp, err := r.Client.Repositories.ListByUser( r.Ctx, @@ -134,7 +134,7 @@ func (r Recon) Deep(username, excludeRepos string, refresh bool) (response []Dee continue } - response = append(response, DeepResult{ + repositories = append(repositories, Repositorie{ Repository: repo.GetCloneURL(), Owner: repo.GetOwner().GetLogin(), Name: repo.GetName(), @@ -162,7 +162,7 @@ func (r Recon) Deep(username, excludeRepos string, refresh bool) (response []Dee } } - for _, repo := range response { + for _, repo := range repositories { destination := tmp_folder + "/" + repo.Owner + "/" + repo.Name if folderExists(destination) { r.PrintInfo("INFO", "Directory already downloaded, skipping "+repo.Owner+"/"+repo.Name) @@ -198,7 +198,7 @@ func (r Recon) Deep(username, excludeRepos string, refresh bool) (response []Dee authorOccurrences := []AuthorOccurrence{} mapAuthorToIndex := make(map[string]int) - for _, repo := range response { + for _, repo := range repositories { destination := tmp_folder + "/" + repo.Owner + "/" + repo.Name if !folderExists(filepath.Join(destination, ".git")) { r.Logger.Error( @@ -275,21 +275,25 @@ func (r Recon) Deep(username, excludeRepos string, refresh bool) (response []Dee } r.PrintInfo("INFO", "Now searching for emails in cloned repositories, this may take a while...") - results, err := findEmailsAndOccurrencesInDir(tmp_folder) + emails, err := findEmailsAndOccurrencesInDir(tmp_folder) if err != nil { r.Logger.Error("Failed to find emails in directory", "err", err) return } - if len(results) == 0 { + if len(emails) == 0 { r.PrintInfo("INFO", "No emails found") } else { r.PrintInfo("INFO", "Found emails:") - for _, email := range results { + for _, email := range emails { r.PrintInfo("Email", email.Email, "found in:"+strings.Join(email.FoundIn, ", ")) } } + response.Repositories = repositories + response.Authors = authorOccurrences + response.Emails = emails + r.PrintNewline() return } diff --git a/gh-recon/utils.go b/gh-recon/utils.go index 6ade6c2..29c5d0e 100644 --- a/gh-recon/utils.go +++ b/gh-recon/utils.go @@ -165,3 +165,11 @@ func (r Recon) WriteJson(data any) { } r.PrintInfo("INFO", "JSON file created successfully", "file", r.JsonFile) } + + +func folderExists(path string) bool { + if stat, err := os.Stat(path); err == nil && stat.IsDir() { + return true + } + return false +}