diff options
| author | s <[email protected]> | 2025-11-13 22:25:02 -0500 |
|---|---|---|
| committer | s <[email protected]> | 2025-11-13 22:25:02 -0500 |
| commit | 07662d9403eb85b39e1ffcf91014bbf36efd1c5a (patch) | |
| tree | 1181435223899bae039a947c5fc4fdeec085f91b | |
| parent | 239936e87183a10a33ce593709eb16c92a04af98 (diff) | |
| download | dborg-07662d9403eb85b39e1ffcf91014bbf36efd1c5a.tar.gz dborg-07662d9403eb85b39e1ffcf91014bbf36efd1c5a.zip | |
refactor: break down large osint.go file into separate command modules and add helper functionsv1.0.1
| -rw-r--r-- | cmd/admin.go | 44 | ||||
| -rw-r--r-- | cmd/breachforum.go | 39 | ||||
| -rw-r--r-- | cmd/bssid.go | 43 | ||||
| -rw-r--r-- | cmd/buckets.go | 74 | ||||
| -rw-r--r-- | cmd/crawl.go | 37 | ||||
| -rw-r--r-- | cmd/dns.go | 7 | ||||
| -rw-r--r-- | cmd/files.go | 47 | ||||
| -rw-r--r-- | cmd/geo.go | 46 | ||||
| -rw-r--r-- | cmd/helpers.go | 27 | ||||
| -rw-r--r-- | cmd/npd.go | 14 | ||||
| -rw-r--r-- | cmd/osint.go | 349 | ||||
| -rw-r--r-- | cmd/reddit.go | 54 | ||||
| -rw-r--r-- | cmd/shortlinks.go | 48 | ||||
| -rw-r--r-- | cmd/skiptrace.go | 38 | ||||
| -rw-r--r-- | cmd/sl.go | 12 | ||||
| -rw-r--r-- | cmd/username.go | 59 | ||||
| -rw-r--r-- | cmd/x.go | 44 | ||||
| -rw-r--r-- | resume.cfg | 2 |
18 files changed, 504 insertions, 480 deletions
diff --git a/cmd/admin.go b/cmd/admin.go index 3c20068..b0c3e13 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -2,12 +2,11 @@ package cmd import ( "fmt" + "strconv" + "git.db.org.ai/dborg/internal/client" - "git.db.org.ai/dborg/internal/config" "git.db.org.ai/dborg/internal/formatter" "git.db.org.ai/dborg/internal/models" - "strconv" - "github.com/spf13/cobra" ) @@ -74,8 +73,7 @@ func init() { } func getAdminClient(cmd *cobra.Command) (*client.Client, error) { - cfg := config.New() - return client.New(cfg) + return newClient() } func runAdminList(cmd *cobra.Command, args []string) error { @@ -89,8 +87,8 @@ func runAdminList(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatAccountList(response.Accounts, IsJSONOutput()) @@ -98,7 +96,7 @@ func runAdminList(cmd *cobra.Command, args []string) error { return err } - fmt.Print(output) + printOutput(output) return nil } @@ -124,8 +122,8 @@ func runAdminCreate(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatAccountCreated(response.Account, response.Message, IsJSONOutput()) @@ -133,7 +131,7 @@ func runAdminCreate(cmd *cobra.Command, args []string) error { return err } - fmt.Print(output) + printOutput(output) return nil } @@ -148,8 +146,8 @@ func runAdminDelete(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatAccountDeleted(response.Message, IsJSONOutput()) @@ -157,7 +155,7 @@ func runAdminDelete(cmd *cobra.Command, args []string) error { return err } - fmt.Print(output) + printOutput(output) return nil } @@ -177,8 +175,8 @@ func runAdminCredits(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatCreditsUpdated(response.Message, nil, IsJSONOutput()) @@ -186,7 +184,7 @@ func runAdminCredits(cmd *cobra.Command, args []string) error { return err } - fmt.Print(output) + printOutput(output) return nil } @@ -206,8 +204,8 @@ func runAdminSetCredits(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatCreditsUpdated(response.Message, response.Account, IsJSONOutput()) @@ -215,7 +213,7 @@ func runAdminSetCredits(cmd *cobra.Command, args []string) error { return err } - fmt.Print(output) + printOutput(output) return nil } @@ -231,8 +229,8 @@ func runAdminDisable(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatAccountToggled(response.Message, IsJSONOutput()) @@ -240,6 +238,6 @@ func runAdminDisable(cmd *cobra.Command, args []string) error { return err } - fmt.Print(output) + printOutput(output) return nil } diff --git a/cmd/breachforum.go b/cmd/breachforum.go new file mode 100644 index 0000000..366092c --- /dev/null +++ b/cmd/breachforum.go @@ -0,0 +1,39 @@ +package cmd + +import ( + "git.db.org.ai/dborg/internal/formatter" + "git.db.org.ai/dborg/internal/models" + "github.com/spf13/cobra" +) + +var breachforumCmd = &cobra.Command{ + Use: "breachforum [search]", + Short: "Search BreachForum data", + Long: `Search breachdetect index for BreachForum messages and detections`, + Args: cobra.ExactArgs(1), + RunE: runBreachForumSearch, +} + +func init() { + rootCmd.AddCommand(breachforumCmd) + breachforumCmd.Flags().IntP("max_hits", "m", 10, "Maximum number of hits to return") +} + +func runBreachForumSearch(cmd *cobra.Command, args []string) error { + c, err := newUnauthenticatedClient() + if err != nil { + return err + } + + params := &models.BreachForumSearchParams{ + Search: args[0], + } + params.MaxHits, _ = cmd.Flags().GetInt("max_hits") + + response, err := c.SearchBreachForum(params) + if err != nil { + return err + } + + return formatter.FormatBreachForumResults(response, IsJSONOutput()) +} diff --git a/cmd/bssid.go b/cmd/bssid.go new file mode 100644 index 0000000..7a9e4c0 --- /dev/null +++ b/cmd/bssid.go @@ -0,0 +1,43 @@ +package cmd + +import ( + "git.db.org.ai/dborg/internal/formatter" + "git.db.org.ai/dborg/internal/models" + "github.com/spf13/cobra" +) + +var bssidCmd = &cobra.Command{ + Use: "bssid [bssid]", + Short: "Lookup WiFi access point location by BSSID", + Long: `Lookup geographic location of a WiFi access point by its BSSID (MAC address) using Apple's location services`, + Args: cobra.ExactArgs(1), + RunE: runBSSIDLookup, +} + +func init() { + rootCmd.AddCommand(bssidCmd) + bssidCmd.Flags().BoolP("all", "a", false, "Show all related results instead of exact match only") + bssidCmd.Flags().BoolP("google", "g", false, "Include Google Maps URL for the location") + bssidCmd.Flags().BoolP("osm", "o", false, "Include OpenStreetMap URL for the location") +} + +func runBSSIDLookup(cmd *cobra.Command, args []string) error { + c, err := newUnauthenticatedClient() + if err != nil { + return err + } + + params := &models.BSSIDParams{ + BSSID: args[0], + } + params.All, _ = cmd.Flags().GetBool("all") + params.Google, _ = cmd.Flags().GetBool("google") + params.OSM, _ = cmd.Flags().GetBool("osm") + + response, err := c.LookupBSSID(params) + if err != nil { + return err + } + + return formatter.FormatBSSIDResults(*response, IsJSONOutput()) +} diff --git a/cmd/buckets.go b/cmd/buckets.go new file mode 100644 index 0000000..fcb292d --- /dev/null +++ b/cmd/buckets.go @@ -0,0 +1,74 @@ +package cmd + +import ( + "git.db.org.ai/dborg/internal/formatter" + "git.db.org.ai/dborg/internal/models" + "github.com/spf13/cobra" +) + +var bucketsCmd = &cobra.Command{ + Use: "buckets", + Short: "List public buckets", + Long: `List public S3, Azure, GCP, and DigitalOcean buckets with file counts`, + RunE: runBucketsSearch, +} + +var bucketFilesCmd = &cobra.Command{ + Use: "bucket-files", + Short: "Search public bucket files", + Long: `Search public S3, Azure, GCP, and DigitalOcean buckets for exposed files`, + RunE: runBucketFilesSearch, +} + +func init() { + rootCmd.AddCommand(bucketsCmd) + rootCmd.AddCommand(bucketFilesCmd) + + bucketsCmd.Flags().IntP("limit", "l", 1000, "Number of results to return") + bucketsCmd.Flags().IntP("start", "t", 0, "Starting offset for pagination") + + bucketFilesCmd.Flags().StringP("keywords", "w", "", "Search keywords") + bucketFilesCmd.Flags().StringP("extensions", "e", "", "File extensions (comma-separated, e.g. 'sql,db,xlsx')") + bucketFilesCmd.Flags().StringP("buckets", "b", "", "Filter by bucket names (comma-separated)") + bucketFilesCmd.Flags().IntP("limit", "l", 1000, "Number of results to return") + bucketFilesCmd.Flags().IntP("start", "t", 0, "Starting offset for pagination") +} + +func runBucketsSearch(cmd *cobra.Command, args []string) error { + c, err := newClient() + if err != nil { + return err + } + + params := &models.BucketsSearchParams{} + params.Limit, _ = cmd.Flags().GetInt("limit") + params.Start, _ = cmd.Flags().GetInt("start") + + response, err := c.SearchBuckets(params) + if err != nil { + return err + } + + return formatter.FormatBucketsResults(response, IsJSONOutput()) +} + +func runBucketFilesSearch(cmd *cobra.Command, args []string) error { + c, err := newClient() + if err != nil { + return err + } + + params := &models.BucketsFilesSearchParams{} + params.Keywords, _ = cmd.Flags().GetString("keywords") + params.Extensions, _ = cmd.Flags().GetString("extensions") + params.Buckets, _ = cmd.Flags().GetString("buckets") + params.Limit, _ = cmd.Flags().GetInt("limit") + params.Start, _ = cmd.Flags().GetInt("start") + + response, err := c.SearchBucketFiles(params) + if err != nil { + return err + } + + return formatter.FormatBucketFilesResults(response, IsJSONOutput()) +} diff --git a/cmd/crawl.go b/cmd/crawl.go new file mode 100644 index 0000000..3587eb0 --- /dev/null +++ b/cmd/crawl.go @@ -0,0 +1,37 @@ +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +var crawlCmd = &cobra.Command{ + Use: "crawl [domain]", + Short: "Crawl domain", + Long: `Resolves a domain using httpx and crawls it using katana. Returns discovered links as plain text, one per line, streamed in real-time. Supports both http:// and https:// URLs.`, + Args: cobra.ExactArgs(1), + RunE: runCrawl, +} + +func init() { + rootCmd.AddCommand(crawlCmd) +} + +func runCrawl(cmd *cobra.Command, args []string) error { + c, err := newUnauthenticatedClient() + if err != nil { + return err + } + + err = c.CrawlDomain(args[0], func(line string) error { + fmt.Println(line) + return nil + }) + + if err != nil { + return err + } + + return nil +} @@ -4,8 +4,6 @@ import ( "encoding/json" "fmt" - "git.db.org.ai/dborg/internal/client" - "git.db.org.ai/dborg/internal/config" "git.db.org.ai/dborg/internal/formatter" "git.db.org.ai/dborg/internal/models" "github.com/spf13/cobra" @@ -29,8 +27,7 @@ func runDNSTLDCheck(cmd *cobra.Command, args []string) error { term := args[0] showOnly, _ := cmd.Flags().GetString("show-only") - cfg := config.New() - c, err := client.NewUnauthenticated(cfg) + c, err := newUnauthenticatedClient() if err != nil { return fmt.Errorf("failed to create client: %w", err) } @@ -52,7 +49,7 @@ func runDNSTLDCheck(cmd *cobra.Command, args []string) error { if err != nil { return err } - fmt.Print(output) + printOutput(output) return nil }) diff --git a/cmd/files.go b/cmd/files.go new file mode 100644 index 0000000..6ce818c --- /dev/null +++ b/cmd/files.go @@ -0,0 +1,47 @@ +package cmd + +import ( + "git.db.org.ai/dborg/internal/formatter" + "git.db.org.ai/dborg/internal/models" + "github.com/spf13/cobra" +) + +var filesCmd = &cobra.Command{ + Use: "files [url]", + Short: "Search open directory files", + Long: `Search for files in open directories using various filters (free OSINT endpoint)`, + Args: cobra.ExactArgs(1), + RunE: runFilesSearch, +} + +func init() { + rootCmd.AddCommand(filesCmd) + filesCmd.Flags().StringP("filename", "n", "", "Search term to match in filenames") + filesCmd.Flags().StringP("extension", "e", "", "Filter by file extension(s) - comma-separated (e.g., pdf,doc,txt)") + filesCmd.Flags().StringP("exclude", "x", "html,HTML", "Exclude file extension(s) - comma-separated") + filesCmd.Flags().IntP("size", "s", 10, "Number of results to return (max 40)") + filesCmd.Flags().IntP("from", "f", 0, "Starting offset for pagination") +} + +func runFilesSearch(cmd *cobra.Command, args []string) error { + c, err := newUnauthenticatedClient() + if err != nil { + return err + } + + params := &models.OpenDirectorySearchParams{ + URL: args[0], + } + params.Filename, _ = cmd.Flags().GetString("filename") + params.Extension, _ = cmd.Flags().GetString("extension") + params.Exclude, _ = cmd.Flags().GetString("exclude") + params.Size, _ = cmd.Flags().GetInt("size") + params.From, _ = cmd.Flags().GetInt("from") + + response, err := c.SearchOpenDirectoryFiles(params) + if err != nil { + return err + } + + return formatter.FormatFilesResults(*response, IsJSONOutput()) +} diff --git a/cmd/geo.go b/cmd/geo.go new file mode 100644 index 0000000..6c7caf9 --- /dev/null +++ b/cmd/geo.go @@ -0,0 +1,46 @@ +package cmd + +import ( + "git.db.org.ai/dborg/internal/formatter" + "git.db.org.ai/dborg/internal/models" + "github.com/spf13/cobra" +) + +var geoCmd = &cobra.Command{ + Use: "geo", + Short: "Search for address information", + Long: `Returns address information including residents, property details, and demographics (costs 1 credit)`, + RunE: runGeoSearch, +} + +func init() { + rootCmd.AddCommand(geoCmd) + geoCmd.Flags().StringP("street", "s", "", "Street address") + geoCmd.Flags().StringP("city", "c", "", "City") + geoCmd.Flags().StringP("state", "t", "", "State (2-letter code)") + geoCmd.Flags().StringP("zip", "z", "", "ZIP code") + geoCmd.MarkFlagRequired("street") + geoCmd.MarkFlagRequired("city") + geoCmd.MarkFlagRequired("state") + geoCmd.MarkFlagRequired("zip") +} + +func runGeoSearch(cmd *cobra.Command, args []string) error { + c, err := newClient() + if err != nil { + return err + } + + params := &models.GeoSearchParams{} + params.Street, _ = cmd.Flags().GetString("street") + params.City, _ = cmd.Flags().GetString("city") + params.State, _ = cmd.Flags().GetString("state") + params.Zip, _ = cmd.Flags().GetString("zip") + + response, err := c.SearchGeo(params) + if err != nil { + return err + } + + return formatter.FormatGeoResults(*response, IsJSONOutput()) +} diff --git a/cmd/helpers.go b/cmd/helpers.go new file mode 100644 index 0000000..f53f235 --- /dev/null +++ b/cmd/helpers.go @@ -0,0 +1,27 @@ +package cmd + +import ( + "fmt" + + "git.db.org.ai/dborg/internal/client" + "git.db.org.ai/dborg/internal/config" +) + +func newClient() (*client.Client, error) { + return client.New(config.New()) +} + +func newUnauthenticatedClient() (*client.Client, error) { + return client.NewUnauthenticated(config.New()) +} + +func checkError(errorMsg string) error { + if errorMsg != "" { + return fmt.Errorf("API error: %s", errorMsg) + } + return nil +} + +func printOutput(output string) { + fmt.Print(output) +} @@ -1,10 +1,6 @@ package cmd import ( - "fmt" - - "git.db.org.ai/dborg/internal/client" - "git.db.org.ai/dborg/internal/config" "git.db.org.ai/dborg/internal/formatter" "git.db.org.ai/dborg/internal/models" "github.com/spf13/cobra" @@ -44,9 +40,7 @@ func init() { } func runNPDSearch(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) + c, err := newClient() if err != nil { return err } @@ -80,14 +74,14 @@ func runNPDSearch(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatNPDResults(response, IsJSONOutput()) if err != nil { return err } - fmt.Print(output) + printOutput(output) return nil } diff --git a/cmd/osint.go b/cmd/osint.go deleted file mode 100644 index e29ef54..0000000 --- a/cmd/osint.go +++ /dev/null @@ -1,349 +0,0 @@ -package cmd - -import ( - "encoding/json" - "fmt" - "git.db.org.ai/dborg/internal/client" - "git.db.org.ai/dborg/internal/config" - "git.db.org.ai/dborg/internal/formatter" - "git.db.org.ai/dborg/internal/models" - - "github.com/spf13/cobra" -) - -var usernameCmd = &cobra.Command{ - Use: "username [username]", - Short: "Check username availability across websites", - Long: `Check username availability across hundreds of websites using WhatsMyName dataset`, - Args: cobra.ExactArgs(1), - RunE: runUsernameCheck, -} - -var bssidCmd = &cobra.Command{ - Use: "bssid [bssid]", - Short: "Lookup WiFi access point location by BSSID", - Long: `Lookup geographic location of a WiFi access point by its BSSID (MAC address) using Apple's location services`, - Args: cobra.ExactArgs(1), - RunE: runBSSIDLookup, -} - -var breachforumCmd = &cobra.Command{ - Use: "breachforum [search]", - Short: "Search BreachForum data", - Long: `Search breachdetect index for BreachForum messages and detections`, - Args: cobra.ExactArgs(1), - RunE: runBreachForumSearch, -} - -var filesCmd = &cobra.Command{ - Use: "files [url]", - Short: "Search open directory files", - Long: `Search for files in open directories using various filters (free OSINT endpoint)`, - Args: cobra.ExactArgs(1), - RunE: runFilesSearch, -} - -var bucketsCmd = &cobra.Command{ - Use: "buckets", - Short: "List public buckets", - Long: `List public S3, Azure, GCP, and DigitalOcean buckets with file counts`, - RunE: runBucketsSearch, -} - -var bucketFilesCmd = &cobra.Command{ - Use: "bucket-files", - Short: "Search public bucket files", - Long: `Search public S3, Azure, GCP, and DigitalOcean buckets for exposed files`, - RunE: runBucketFilesSearch, -} - -var shortlinksCmd = &cobra.Command{ - Use: "shortlinks", - Short: "Search brute forced short links", - Long: `Search for exposed URLs discovered through brute forcing URL shortener services`, - RunE: runShortlinksSearch, -} - -var geoCmd = &cobra.Command{ - Use: "geo", - Short: "Search for address information", - Long: `Returns address information including residents, property details, and demographics (costs 1 credit)`, - RunE: runGeoSearch, -} - -var crawlCmd = &cobra.Command{ - Use: "crawl [domain]", - Short: "Crawl domain", - Long: `Resolves a domain using httpx and crawls it using katana. Returns discovered links as plain text, one per line, streamed in real-time. Supports both http:// and https:// URLs.`, - Args: cobra.ExactArgs(1), - RunE: runCrawl, -} - -func init() { - rootCmd.AddCommand(usernameCmd) - rootCmd.AddCommand(bssidCmd) - rootCmd.AddCommand(breachforumCmd) - rootCmd.AddCommand(filesCmd) - rootCmd.AddCommand(bucketsCmd) - rootCmd.AddCommand(bucketFilesCmd) - rootCmd.AddCommand(shortlinksCmd) - rootCmd.AddCommand(geoCmd) - rootCmd.AddCommand(crawlCmd) - - usernameCmd.Flags().StringSliceP("sites", "s", []string{}, "Specific sites to check (comma-separated)") - usernameCmd.Flags().BoolP("fuzzy", "f", false, "Enable fuzzy validation mode") - usernameCmd.Flags().IntP("max_tasks", "m", 50, "Maximum concurrent tasks") - - bssidCmd.Flags().BoolP("all", "a", false, "Show all related results instead of exact match only") - bssidCmd.Flags().BoolP("google", "g", false, "Include Google Maps URL for the location") - bssidCmd.Flags().BoolP("osm", "o", false, "Include OpenStreetMap URL for the location") - - breachforumCmd.Flags().IntP("max_hits", "m", 10, "Maximum number of hits to return") - - filesCmd.Flags().StringP("filename", "n", "", "Search term to match in filenames") - filesCmd.Flags().StringP("extension", "e", "", "Filter by file extension(s) - comma-separated (e.g., pdf,doc,txt)") - filesCmd.Flags().StringP("exclude", "x", "html,HTML", "Exclude file extension(s) - comma-separated") - filesCmd.Flags().IntP("size", "s", 10, "Number of results to return (max 40)") - filesCmd.Flags().IntP("from", "f", 0, "Starting offset for pagination") - - bucketsCmd.Flags().IntP("limit", "l", 1000, "Number of results to return") - bucketsCmd.Flags().IntP("start", "t", 0, "Starting offset for pagination") - - bucketFilesCmd.Flags().StringP("keywords", "w", "", "Search keywords") - bucketFilesCmd.Flags().StringP("extensions", "e", "", "File extensions (comma-separated, e.g. 'sql,db,xlsx')") - bucketFilesCmd.Flags().StringP("buckets", "b", "", "Filter by bucket names (comma-separated)") - bucketFilesCmd.Flags().IntP("limit", "l", 1000, "Number of results to return") - bucketFilesCmd.Flags().IntP("start", "t", 0, "Starting offset for pagination") - - shortlinksCmd.Flags().StringP("keywords", "w", "", "Search keywords") - shortlinksCmd.Flags().StringP("ext", "e", "", "File extensions (comma-separated, e.g. 'pdf,docx,xlsx')") - shortlinksCmd.Flags().StringP("order", "o", "", "Sort by property (size, timestamp)") - shortlinksCmd.Flags().StringP("direction", "d", "", "Sort direction (asc, desc)") - shortlinksCmd.Flags().BoolP("regexp", "r", false, "Treat keywords as regular expression") - shortlinksCmd.Flags().IntP("limit", "l", 100, "Number of results to return") - shortlinksCmd.Flags().IntP("start", "t", 0, "Starting offset for pagination") - - geoCmd.Flags().StringP("street", "s", "", "Street address") - geoCmd.Flags().StringP("city", "c", "", "City") - geoCmd.Flags().StringP("state", "t", "", "State (2-letter code)") - geoCmd.Flags().StringP("zip", "z", "", "ZIP code") - geoCmd.MarkFlagRequired("street") - geoCmd.MarkFlagRequired("city") - geoCmd.MarkFlagRequired("state") - geoCmd.MarkFlagRequired("zip") -} - -func runUsernameCheck(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.NewUnauthenticated(cfg) - if err != nil { - return err - } - - params := &models.USRSXParams{ - Username: args[0], - } - params.Sites, _ = cmd.Flags().GetStringSlice("sites") - params.Fuzzy, _ = cmd.Flags().GetBool("fuzzy") - params.MaxTasks, _ = cmd.Flags().GetInt("max_tasks") - - err = c.CheckUsernameStream(params, func(result json.RawMessage) error { - if IsJSONOutput() { - fmt.Println(string(result)) - return nil - } - - var siteResult models.SiteResult - if err := json.Unmarshal(result, &siteResult); err != nil { - return err - } - - return formatter.FormatUsernameSiteResult(&siteResult) - }) - - if err != nil { - return err - } - - return nil -} - -func runBSSIDLookup(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.NewUnauthenticated(cfg) - if err != nil { - return err - } - - params := &models.BSSIDParams{ - BSSID: args[0], - } - params.All, _ = cmd.Flags().GetBool("all") - params.Google, _ = cmd.Flags().GetBool("google") - params.OSM, _ = cmd.Flags().GetBool("osm") - - response, err := c.LookupBSSID(params) - if err != nil { - return err - } - - return formatter.FormatBSSIDResults(*response, IsJSONOutput()) -} - -func runBreachForumSearch(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.NewUnauthenticated(cfg) - if err != nil { - return err - } - - params := &models.BreachForumSearchParams{ - Search: args[0], - } - params.MaxHits, _ = cmd.Flags().GetInt("max_hits") - - response, err := c.SearchBreachForum(params) - if err != nil { - return err - } - - return formatter.FormatBreachForumResults(response, IsJSONOutput()) -} - -func runFilesSearch(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.NewUnauthenticated(cfg) - if err != nil { - return err - } - - params := &models.OpenDirectorySearchParams{ - URL: args[0], - } - params.Filename, _ = cmd.Flags().GetString("filename") - params.Extension, _ = cmd.Flags().GetString("extension") - params.Exclude, _ = cmd.Flags().GetString("exclude") - params.Size, _ = cmd.Flags().GetInt("size") - params.From, _ = cmd.Flags().GetInt("from") - - response, err := c.SearchOpenDirectoryFiles(params) - if err != nil { - return err - } - - return formatter.FormatFilesResults(*response, IsJSONOutput()) -} - -func runBucketsSearch(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) - if err != nil { - return err - } - - params := &models.BucketsSearchParams{} - params.Limit, _ = cmd.Flags().GetInt("limit") - params.Start, _ = cmd.Flags().GetInt("start") - - response, err := c.SearchBuckets(params) - if err != nil { - return err - } - - return formatter.FormatBucketsResults(response, IsJSONOutput()) -} - -func runBucketFilesSearch(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) - if err != nil { - return err - } - - params := &models.BucketsFilesSearchParams{} - params.Keywords, _ = cmd.Flags().GetString("keywords") - params.Extensions, _ = cmd.Flags().GetString("extensions") - params.Buckets, _ = cmd.Flags().GetString("buckets") - params.Limit, _ = cmd.Flags().GetInt("limit") - params.Start, _ = cmd.Flags().GetInt("start") - - response, err := c.SearchBucketFiles(params) - if err != nil { - return err - } - - return formatter.FormatBucketFilesResults(response, IsJSONOutput()) -} - -func runShortlinksSearch(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) - if err != nil { - return err - } - - params := &models.ShortlinksSearchParams{} - params.Keywords, _ = cmd.Flags().GetString("keywords") - params.Ext, _ = cmd.Flags().GetString("ext") - params.Order, _ = cmd.Flags().GetString("order") - params.Direction, _ = cmd.Flags().GetString("direction") - params.Regexp, _ = cmd.Flags().GetBool("regexp") - params.Limit, _ = cmd.Flags().GetInt("limit") - params.Start, _ = cmd.Flags().GetInt("start") - - response, err := c.SearchShortlinks(params) - if err != nil { - return err - } - - return formatter.FormatShortlinksResults(response, IsJSONOutput()) -} - -func runGeoSearch(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) - if err != nil { - return err - } - - params := &models.GeoSearchParams{} - params.Street, _ = cmd.Flags().GetString("street") - params.City, _ = cmd.Flags().GetString("city") - params.State, _ = cmd.Flags().GetString("state") - params.Zip, _ = cmd.Flags().GetString("zip") - - response, err := c.SearchGeo(params) - if err != nil { - return err - } - - return formatter.FormatGeoResults(*response, IsJSONOutput()) -} - -func runCrawl(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.NewUnauthenticated(cfg) - if err != nil { - return err - } - - err = c.CrawlDomain(args[0], func(line string) error { - fmt.Println(line) - return nil - }) - - if err != nil { - return err - } - - return nil -} diff --git a/cmd/reddit.go b/cmd/reddit.go index 5969f7c..bb31336 100644 --- a/cmd/reddit.go +++ b/cmd/reddit.go @@ -1,10 +1,6 @@ package cmd import ( - "fmt" - - "git.db.org.ai/dborg/internal/client" - "git.db.org.ai/dborg/internal/config" "git.db.org.ai/dborg/internal/formatter" "git.db.org.ai/dborg/internal/models" "github.com/spf13/cobra" @@ -82,9 +78,7 @@ func init() { } func runRedditSubredditPosts(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) + c, err := newClient() if err != nil { return err } @@ -98,22 +92,20 @@ func runRedditSubredditPosts(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatRedditResults(response, IsJSONOutput()) if err != nil { return err } - fmt.Print(output) + printOutput(output) return nil } func runRedditSubredditComments(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) + c, err := newClient() if err != nil { return err } @@ -127,22 +119,20 @@ func runRedditSubredditComments(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatRedditResults(response, IsJSONOutput()) if err != nil { return err } - fmt.Print(output) + printOutput(output) return nil } func runRedditUserPosts(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) + c, err := newClient() if err != nil { return err } @@ -156,22 +146,20 @@ func runRedditUserPosts(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatRedditResults(response, IsJSONOutput()) if err != nil { return err } - fmt.Print(output) + printOutput(output) return nil } func runRedditUserComments(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) + c, err := newClient() if err != nil { return err } @@ -185,22 +173,20 @@ func runRedditUserComments(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatRedditResults(response, IsJSONOutput()) if err != nil { return err } - fmt.Print(output) + printOutput(output) return nil } func runRedditUserAbout(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) + c, err := newClient() if err != nil { return err } @@ -214,14 +200,14 @@ func runRedditUserAbout(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatRedditResults(response, IsJSONOutput()) if err != nil { return err } - fmt.Print(output) + printOutput(output) return nil } diff --git a/cmd/shortlinks.go b/cmd/shortlinks.go new file mode 100644 index 0000000..0621da6 --- /dev/null +++ b/cmd/shortlinks.go @@ -0,0 +1,48 @@ +package cmd + +import ( + "git.db.org.ai/dborg/internal/formatter" + "git.db.org.ai/dborg/internal/models" + "github.com/spf13/cobra" +) + +var shortlinksCmd = &cobra.Command{ + Use: "shortlinks", + Short: "Search brute forced short links", + Long: `Search for exposed URLs discovered through brute forcing URL shortener services`, + RunE: runShortlinksSearch, +} + +func init() { + rootCmd.AddCommand(shortlinksCmd) + shortlinksCmd.Flags().StringP("keywords", "w", "", "Search keywords") + shortlinksCmd.Flags().StringP("ext", "e", "", "File extensions (comma-separated, e.g. 'pdf,docx,xlsx')") + shortlinksCmd.Flags().StringP("order", "o", "", "Sort by property (size, timestamp)") + shortlinksCmd.Flags().StringP("direction", "d", "", "Sort direction (asc, desc)") + shortlinksCmd.Flags().BoolP("regexp", "r", false, "Treat keywords as regular expression") + shortlinksCmd.Flags().IntP("limit", "l", 100, "Number of results to return") + shortlinksCmd.Flags().IntP("start", "t", 0, "Starting offset for pagination") +} + +func runShortlinksSearch(cmd *cobra.Command, args []string) error { + c, err := newClient() + if err != nil { + return err + } + + params := &models.ShortlinksSearchParams{} + params.Keywords, _ = cmd.Flags().GetString("keywords") + params.Ext, _ = cmd.Flags().GetString("ext") + params.Order, _ = cmd.Flags().GetString("order") + params.Direction, _ = cmd.Flags().GetString("direction") + params.Regexp, _ = cmd.Flags().GetBool("regexp") + params.Limit, _ = cmd.Flags().GetInt("limit") + params.Start, _ = cmd.Flags().GetInt("start") + + response, err := c.SearchShortlinks(params) + if err != nil { + return err + } + + return formatter.FormatShortlinksResults(response, IsJSONOutput()) +} diff --git a/cmd/skiptrace.go b/cmd/skiptrace.go index 307204c..b8df9b4 100644 --- a/cmd/skiptrace.go +++ b/cmd/skiptrace.go @@ -2,12 +2,11 @@ package cmd import ( "fmt" + "strconv" + "git.db.org.ai/dborg/internal/client" - "git.db.org.ai/dborg/internal/config" "git.db.org.ai/dborg/internal/formatter" "git.db.org.ai/dborg/internal/models" - "strconv" - "github.com/spf13/cobra" ) @@ -68,8 +67,7 @@ func init() { } func getSkiptraceClient(cmd *cobra.Command) (*client.Client, error) { - cfg := config.New() - return client.New(cfg) + return newClient() } func runSkiptracePeople(cmd *cobra.Command, args []string) error { @@ -90,16 +88,15 @@ func runSkiptracePeople(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } - output, err := formatter.FormatSkiptraceResults(response, IsJSONOutput()) + output, err := formatter.FormatSkiptraceResults(*response, IsJSONOutput()) if err != nil { return err } - - fmt.Print(output) + printOutput(output) return nil } @@ -120,16 +117,15 @@ func runSkiptraceReport(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatSkiptraceResults(response, IsJSONOutput()) if err != nil { return err } - - fmt.Print(output) + printOutput(output) return nil } @@ -144,16 +140,15 @@ func runSkiptracePhone(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatSkiptraceResults(response, IsJSONOutput()) if err != nil { return err } - - fmt.Print(output) + printOutput(output) return nil } @@ -168,15 +163,14 @@ func runSkiptraceEmail(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatSkiptraceResults(response, IsJSONOutput()) if err != nil { return err } - - fmt.Print(output) + printOutput(output) return nil } @@ -3,8 +3,6 @@ package cmd import ( "fmt" - "git.db.org.ai/dborg/internal/client" - "git.db.org.ai/dborg/internal/config" "git.db.org.ai/dborg/internal/formatter" "git.db.org.ai/dborg/internal/models" "github.com/spf13/cobra" @@ -30,9 +28,7 @@ func init() { } func runSLSearch(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) + c, err := newClient() if err != nil { return err } @@ -57,8 +53,8 @@ func runSLSearch(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } if params.Format != "json" { @@ -70,6 +66,6 @@ func runSLSearch(cmd *cobra.Command, args []string) error { if err != nil { return err } - fmt.Print(output) + printOutput(output) return nil } diff --git a/cmd/username.go b/cmd/username.go new file mode 100644 index 0000000..f67890b --- /dev/null +++ b/cmd/username.go @@ -0,0 +1,59 @@ +package cmd + +import ( + "encoding/json" + "fmt" + + "git.db.org.ai/dborg/internal/formatter" + "git.db.org.ai/dborg/internal/models" + "github.com/spf13/cobra" +) + +var usernameCmd = &cobra.Command{ + Use: "username [username]", + Short: "Check username availability across websites", + Long: `Check username availability across hundreds of websites using WhatsMyName dataset`, + Args: cobra.ExactArgs(1), + RunE: runUsernameCheck, +} + +func init() { + rootCmd.AddCommand(usernameCmd) + usernameCmd.Flags().StringSliceP("sites", "s", []string{}, "Specific sites to check (comma-separated)") + usernameCmd.Flags().BoolP("fuzzy", "f", false, "Enable fuzzy validation mode") + usernameCmd.Flags().IntP("max_tasks", "m", 50, "Maximum concurrent tasks") +} + +func runUsernameCheck(cmd *cobra.Command, args []string) error { + c, err := newUnauthenticatedClient() + if err != nil { + return err + } + + params := &models.USRSXParams{ + Username: args[0], + } + params.Sites, _ = cmd.Flags().GetStringSlice("sites") + params.Fuzzy, _ = cmd.Flags().GetBool("fuzzy") + params.MaxTasks, _ = cmd.Flags().GetInt("max_tasks") + + err = c.CheckUsernameStream(params, func(result json.RawMessage) error { + if IsJSONOutput() { + fmt.Println(string(result)) + return nil + } + + var siteResult models.SiteResult + if err := json.Unmarshal(result, &siteResult); err != nil { + return err + } + + return formatter.FormatUsernameSiteResult(&siteResult) + }) + + if err != nil { + return err + } + + return nil +} @@ -2,12 +2,9 @@ package cmd import ( "encoding/json" - "fmt" - "git.db.org.ai/dborg/internal/client" - "git.db.org.ai/dborg/internal/config" + "git.db.org.ai/dborg/internal/formatter" "git.db.org.ai/dborg/internal/models" - "github.com/spf13/cobra" ) @@ -79,9 +76,7 @@ func init() { } func runXHistorySearch(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) + c, err := newClient() if err != nil { return err } @@ -91,23 +86,20 @@ func runXHistorySearch(cmd *cobra.Command, args []string) error { return err } - if response.Error != "" { - return fmt.Errorf("API error: %s", response.Error) + if err := checkError(response.Error); err != nil { + return err } output, err := formatter.FormatXHistory(response, IsJSONOutput()) if err != nil { return err } - - fmt.Print(output) + printOutput(output) return nil } func runXTweetsSearch(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.NewUnauthenticated(cfg) + c, err := newClient() if err != nil { return err } @@ -123,7 +115,7 @@ func runXTweetsSearch(cmd *cobra.Command, args []string) error { return err } - fmt.Print(output) + printOutput(output) return nil }) @@ -135,9 +127,7 @@ func runXTweetsSearch(cmd *cobra.Command, args []string) error { } func runXFirstFollowers(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) + c, err := newClient() if err != nil { return err } @@ -152,14 +142,12 @@ func runXFirstFollowers(cmd *cobra.Command, args []string) error { return err } - fmt.Print(output) + printOutput(output) return nil } func runXNotableFollowers(cmd *cobra.Command, args []string) error { - cfg := config.New() - - c, err := client.New(cfg) + c, err := newClient() if err != nil { return err } @@ -174,15 +162,14 @@ func runXNotableFollowers(cmd *cobra.Command, args []string) error { return err } - fmt.Print(output) + printOutput(output) return nil } func runXReplies(cmd *cobra.Command, args []string) error { limit, _ := cmd.Flags().GetInt("limit") - cfg := config.New() - c, err := client.New(cfg) + c, err := newClient() if err != nil { return err } @@ -198,7 +185,7 @@ func runXReplies(cmd *cobra.Command, args []string) error { return err } - fmt.Print(output) + printOutput(output) return nil }) @@ -211,9 +198,8 @@ func runXReplies(cmd *cobra.Command, args []string) error { func runXSearch(cmd *cobra.Command, args []string) error { limit, _ := cmd.Flags().GetInt("limit") - cfg := config.New() - c, err := client.New(cfg) + c, err := newClient() if err != nil { return err } @@ -229,7 +215,7 @@ func runXSearch(cmd *cobra.Command, args []string) error { return err } - fmt.Print(output) + printOutput(output) return nil }) diff --git a/resume.cfg b/resume.cfg new file mode 100644 index 0000000..5e546a1 --- /dev/null +++ b/resume.cfg @@ -0,0 +1,2 @@ +resume_from=https://beautifulpeoplecdn.s3.amazonaws.com/cdn/3.3.1.118/scripts/plupload/2.0.0/src/moxie/.git +index=64 |
