summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors <[email protected]>2025-11-13 22:25:02 -0500
committers <[email protected]>2025-11-13 22:25:02 -0500
commit07662d9403eb85b39e1ffcf91014bbf36efd1c5a (patch)
tree1181435223899bae039a947c5fc4fdeec085f91b
parent239936e87183a10a33ce593709eb16c92a04af98 (diff)
downloaddborg-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.go44
-rw-r--r--cmd/breachforum.go39
-rw-r--r--cmd/bssid.go43
-rw-r--r--cmd/buckets.go74
-rw-r--r--cmd/crawl.go37
-rw-r--r--cmd/dns.go7
-rw-r--r--cmd/files.go47
-rw-r--r--cmd/geo.go46
-rw-r--r--cmd/helpers.go27
-rw-r--r--cmd/npd.go14
-rw-r--r--cmd/osint.go349
-rw-r--r--cmd/reddit.go54
-rw-r--r--cmd/shortlinks.go48
-rw-r--r--cmd/skiptrace.go38
-rw-r--r--cmd/sl.go12
-rw-r--r--cmd/username.go59
-rw-r--r--cmd/x.go44
-rw-r--r--resume.cfg2
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
+}
diff --git a/cmd/dns.go b/cmd/dns.go
index 130f394..f5de4f9 100644
--- a/cmd/dns.go
+++ b/cmd/dns.go
@@ -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)
+}
diff --git a/cmd/npd.go b/cmd/npd.go
index c8b0b28..084d6af 100644
--- a/cmd/npd.go
+++ b/cmd/npd.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"
@@ -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
}
diff --git a/cmd/sl.go b/cmd/sl.go
index c30725a..8c43506 100644
--- a/cmd/sl.go
+++ b/cmd/sl.go
@@ -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
+}
diff --git a/cmd/x.go b/cmd/x.go
index ba18aa8..c5c18e4 100644
--- a/cmd/x.go
+++ b/cmd/x.go
@@ -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