Compare commits

..
5 Commits
Author SHA1 Message Date
Hadi 66030c1c16 add details to close friends
Signed-off-by: Hadi <[email protected]>
2025-09-17 19:31:54 +02:00
Hadi bb8f34055d fix nixos installation step
Signed-off-by: Hadi <[email protected]>
2025-09-16 19:35:38 +02:00
Hadi 26a1cfdd37 Change the way token is retrieve
Signed-off-by: Hadi <[email protected]>
2025-09-15 14:54:51 +02:00
Hadi 3064cdbf7a Change/get defaults
Signed-off-by: Hadi <[email protected]>
2025-09-15 14:40:55 +02:00
Hadi 52f9f1f3e7 Change settings
Signed-off-by: Hadi <[email protected]>
2025-09-15 14:37:21 +02:00
5 changed files with 66 additions and 29 deletions
+2 -2
View File
@@ -98,7 +98,7 @@ nix run github:anotherhadi/github-recon -- [--flags value] target_username_or_em
# then add it to your packages # then add it to your packages
environment.systemPackages = with pkgs; [ # or home.packages environment.systemPackages = with pkgs; [ # or home.packages
github-recon inputs.github-recon.defaultPackage.${pkgs.system}
]; ];
``` ```
@@ -123,7 +123,7 @@ github-recon [--flags value] target_username_or_email
--trufflehog Run trufflehog on cloned repositories (only for deep scan) (default true) --trufflehog Run trufflehog on cloned repositories (only for deep scan) (default true)
-S, --silent Suppress all non-essential output -S, --silent Suppress all non-essential output
--spoof-email Spoof email (only for email mode) (default true) --spoof-email Spoof email (only for email mode) (default true)
-a, --hide-avatar Hide the avatar in the output -a, --print-avatar Show the avatar in the output
-j, --json string Write results to specified JSON file -j, --json string Write results to specified JSON file
``` ```
+17
View File
@@ -13,7 +13,11 @@ import (
type CloseFriendsResult []CloseFriendResult type CloseFriendsResult []CloseFriendResult
type CloseFriendResult struct { type CloseFriendResult struct {
Name string
Username string Username string
Orgs []string
Company string
Location string
Score int Score int
} }
@@ -96,8 +100,12 @@ func CloseFriends(s github_recon_settings.Settings) (results CloseFriendsResult)
// Add candidate if they matched at least one condition // Add candidate if they matched at least one condition
if score > 0 { if score > 0 {
results = append(results, CloseFriendResult{ results = append(results, CloseFriendResult{
Name: candidateDetails.GetName(),
Username: candidateLogin, Username: candidateLogin,
Orgs: candidateOrgsToNames(candidateOrgs),
Score: score, Score: score,
Location: candidateDetails.GetLocation(),
Company: candidateDetails.GetCompany(),
}) })
} }
} }
@@ -130,6 +138,15 @@ func checkIfUserFollows(s github_recon_settings.Settings, sourceUser, targetUser
} }
return isFollowing, nil return isFollowing, nil
} }
func candidateOrgsToNames(orgs []*github.Organization) []string {
var orgNames []string
for _, org := range orgs {
if org.GetLogin() != "" {
orgNames = append(orgNames, org.GetLogin())
}
}
return orgNames
}
func getOrgs(s github_recon_settings.Settings, user string) ([]*github.Organization, error) { func getOrgs(s github_recon_settings.Settings, user string) ([]*github.Organization, error) {
orgs, resp, err := s.Client.Organizations.List(s.Ctx, user, nil) orgs, resp, err := s.Client.Organizations.List(s.Ctx, user, nil)
+44 -25
View File
@@ -32,7 +32,7 @@ type Settings struct {
Silent bool Silent bool
DeepScan bool DeepScan bool
MaxDistance int MaxDistance int
HideAvatar bool PrintAvatar bool
SpoofEmail bool SpoofEmail bool
Trufflehog bool Trufflehog bool
@@ -42,7 +42,34 @@ type Settings struct {
Ctx context.Context Ctx context.Context
} }
func GetDefaultSettings() Settings {
return Settings{
Token: "null",
Target: "",
TargetType: TargetUsername,
ShowSource: false,
Refresh: false,
MaxRepoSize: 150,
ExcludedRepos: []string{},
JsonOutput: "",
Silent: false,
DeepScan: false,
MaxDistance: 20,
PrintAvatar: true,
SpoofEmail: true,
Trufflehog: true,
Client: github.NewClient(nil),
Logger: log.NewWithOptions(os.Stderr, log.Options{
ReportCaller: false,
ReportTimestamp: false,
}),
Ctx: context.WithValue(context.Background(), github.SleepUntilPrimaryRateLimitResetWhenRateLimited, true),
}
}
func GetSettings() (settings Settings) { func GetSettings() (settings Settings) {
settings = GetDefaultSettings()
//// Flag settings //// Flag settings
flag.Usage = func() { flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
@@ -56,74 +83,66 @@ func GetSettings() (settings Settings) {
flag.CommandLine.SortFlags = false flag.CommandLine.SortFlags = false
//// Flags //// Flags
flag.StringVarP(&settings.Token, "token", "t", "null", "Github personal access token (e.g. ghp_aaa...). Can also be set via GITHUB_RECON_TOKEN environment variable. You also need to set the token in $HOME/.config/github-recon/env file if you want to use this tool without passing the token every time.") flag.StringVarP(&settings.Token, "token", "t", settings.Token, "Github personal access token (e.g. ghp_aaa...). Can also be set via GITHUB_RECON_TOKEN environment variable. You also need to set the token in $HOME/.config/github-recon/env file if you want to use this tool without passing the token every time.")
// DeepScan // DeepScan
flag.BoolVarP(&settings.DeepScan, "deepscan", "d", false, "Enable deep scan (clone repos, regex search, analyse licenses, etc.)") flag.BoolVarP(&settings.DeepScan, "deepscan", "d", settings.DeepScan, "Enable deep scan (clone repos, regex search, analyse licenses, etc.)")
flag.IntVar( flag.IntVar(
&settings.MaxRepoSize, &settings.MaxRepoSize,
"max-size", "max-size",
150, settings.MaxRepoSize,
"Limit the size of repositories to scan (in MB) (only for deep scan)", "Limit the size of repositories to scan (in MB) (only for deep scan)",
) )
flag.StringSliceVarP( flag.StringSliceVarP(
&settings.ExcludedRepos, &settings.ExcludedRepos,
"exclude-repo", "exclude-repo",
"e", "e",
[]string{}, settings.ExcludedRepos,
"Exclude repos from deep scan (comma-separated list, only for deep scan)", "Exclude repos from deep scan (comma-separated list, only for deep scan)",
) )
flag.BoolVarP( flag.BoolVarP(
&settings.Refresh, &settings.Refresh,
"refresh", "refresh",
"r", "r",
false, settings.Refresh,
"Refresh the cache (only for deep scan)", "Refresh the cache (only for deep scan)",
) )
flag.BoolVarP( flag.BoolVarP(
&settings.ShowSource, &settings.ShowSource,
"show-source", "show-source",
"s", "s",
false, settings.ShowSource,
"Show where the information (authors, emails, etc) were found (only for deep scan)", "Show where the information (authors, emails, etc) were found (only for deep scan)",
) )
flag.IntVarP( flag.IntVarP(
&settings.MaxDistance, &settings.MaxDistance,
"max-distance", "max-distance",
"m", "m",
20, settings.MaxDistance,
"Maximum Levenshtein distance for matching usernames & emails (only for deep scan)", "Maximum Levenshtein distance for matching usernames & emails (only for deep scan)",
) )
flag.BoolVar( flag.BoolVar(
&settings.Trufflehog, &settings.Trufflehog,
"trufflehog", "trufflehog",
true, settings.Trufflehog,
"Run trufflehog on cloned repositories (only for deep scan)", "Run trufflehog on cloned repositories (only for deep scan)",
) )
flag.BoolVarP(&settings.Silent, "silent", "S", false, "Suppress all non-essential output") flag.BoolVarP(&settings.Silent, "silent", "S", settings.Silent, "Suppress all non-essential output")
flag.BoolVarP(&settings.SpoofEmail, "spoof-email", "", true, "Spoof email (only for email mode)") flag.BoolVarP(&settings.SpoofEmail, "spoof-email", "", settings.SpoofEmail, "Spoof email (only for email mode)")
flag.BoolVarP(&settings.HideAvatar, "hide-avatar", "a", false, "Hide the avatar in the output") flag.BoolVarP(&settings.PrintAvatar, "print-avatar", "a", settings.PrintAvatar, "Show the avatar in the output")
flag.StringVarP(&settings.JsonOutput, "json", "j", "", "Write results to specified JSON file") flag.StringVarP(&settings.JsonOutput, "json", "j", settings.JsonOutput, "Write results to specified JSON file")
//// Parse //// Parse
flag.Parse() flag.Parse()
//// Setup
settings.Client = github.NewClient(nil)
settings.Logger = log.NewWithOptions(os.Stderr, log.Options{
ReportCaller: false,
ReportTimestamp: false,
})
settings.Ctx = context.WithValue(context.Background(), github.SleepUntilPrimaryRateLimitResetWhenRateLimited, true)
//// Tail //// Tail
nonFlagArgs := flag.Args() nonFlagArgs := flag.Args()
if len(nonFlagArgs) > 1 { if len(nonFlagArgs) > 1 {
settings.Logger.Error("Please provide only one target (username or email)") settings.Logger.Error("Please provide only one target (username or email)")
flag.Usage() flag.Usage()
os.Exit(1) os.Exit(1)
} else if len(nonFlagArgs) < 1 { } else if len(nonFlagArgs) == 0 {
settings.Logger.Error("Please provide a target (username or email)") settings.Logger.Error("Please provide a target (username or email)")
flag.Usage() flag.Usage()
os.Exit(1) os.Exit(1)
@@ -143,11 +162,11 @@ func GetSettings() (settings Settings) {
} }
// If token is not set via flag, get it from env // If token is not set via flag, get it from env
if settings.Token == "null" { if settings.Token == "null" || settings.Token == "" {
settings.Token = getToken() settings.Token = GetToken()
} }
if settings.Token == "null" { if settings.Token == "null" || settings.Token == "" {
settings.Logger.Warn("No Github token provided. You might hit the rate limit. Check the help menu for more information.") settings.Logger.Warn("No Github token provided. You might hit the rate limit. Check the help menu for more information.")
} else { } else {
settings.Client = settings.Client.WithAuthToken(settings.Token) settings.Client = settings.Client.WithAuthToken(settings.Token)
+2 -1
View File
@@ -9,7 +9,8 @@ import (
flag "github.com/spf13/pflag" flag "github.com/spf13/pflag"
) )
func getToken() string { // GetToken retrieves the GitHub token from the environment variable or config file
func GetToken() string {
token := os.Getenv("GITHUB_RECON_TOKEN") token := os.Getenv("GITHUB_RECON_TOKEN")
if token != "" { if token != "" {
return token return token
+1 -1
View File
@@ -143,7 +143,7 @@ func PrintTitle(silent bool, title string) {
} }
func PrintAvatar(settings github_recon_settings.Settings, url string) { func PrintAvatar(settings github_recon_settings.Settings, url string) {
if settings.HideAvatar || url == "" || settings.Silent { if !settings.PrintAvatar || url == "" || settings.Silent {
return return
} }