package sources import ( "github.com/salvacybersec/keyhunter/pkg/providers" "github.com/salvacybersec/keyhunter/pkg/recon" ) // SourcesConfig carries per-source credentials and shared dependencies read // from viper/env by cmd/recon.go and handed to RegisterAll. // // Fields are populated from environment variables (GITHUB_TOKEN, GITLAB_TOKEN, // ...) or viper config keys (recon.github.token, ...). Empty values are // permitted: the corresponding source is still registered on the engine, but // its Enabled() reports false so SweepAll skips it cleanly. type SourcesConfig struct { // GitHub / Gist share the same token. GitHubToken string // GitLab personal access token. GitLabToken string // Bitbucket Cloud app password or OAuth token + required workspace slug. BitbucketToken string BitbucketWorkspace string // Codeberg (Gitea) token — optional, raises rate limit when present. CodebergToken string // HuggingFace Hub token — optional, raises rate limit when present. HuggingFaceToken string // Kaggle Basic-auth username + API key. KaggleUser string KaggleKey string // Registry drives query generation for every source via BuildQueries. Registry *providers.Registry // Limiters is the shared per-source rate-limiter registry. Limiters *recon.LimiterRegistry } // RegisterAll registers every Phase 10 code-hosting source on engine. // // All ten sources are registered unconditionally so that cmd/recon.go can // surface the full catalog via `keyhunter recon list` regardless of which // credentials are configured. Sources without required credentials return // Enabled()==false so SweepAll skips them without erroring. // // A nil engine is treated as a no-op (not an error) — callers in broken init // paths shouldn't panic. func RegisterAll(engine *recon.Engine, cfg SourcesConfig) { if engine == nil { return } reg := cfg.Registry lim := cfg.Limiters // API sources with constructors. engine.Register(NewGitHubSource(cfg.GitHubToken, reg, lim)) engine.Register(NewKaggleSource(cfg.KaggleUser, cfg.KaggleKey, reg, lim)) engine.Register(NewHuggingFaceSource(HuggingFaceConfig{ Token: cfg.HuggingFaceToken, Registry: reg, Limiters: lim, })) // API sources exposed as struct literals (no New* constructor in Wave 2). engine.Register(&GitLabSource{ Token: cfg.GitLabToken, Registry: reg, Limiters: lim, }) engine.Register(&BitbucketSource{ Token: cfg.BitbucketToken, Workspace: cfg.BitbucketWorkspace, Registry: reg, Limiters: lim, }) engine.Register(&GistSource{ Token: cfg.GitHubToken, Registry: reg, Limiters: lim, }) engine.Register(&CodebergSource{ Token: cfg.CodebergToken, Registry: reg, Limiters: lim, }) // Scraping sources (credentialless). engine.Register(&ReplitSource{ Registry: reg, Limiters: lim, }) engine.Register(&CodeSandboxSource{ Registry: reg, Limiters: lim, }) engine.Register(&SandboxesSource{ Registry: reg, Limiters: lim, }) }