summaryrefslogtreecommitdiffstats
path: root/internal/formatter/sl.go
diff options
context:
space:
mode:
authors <[email protected]>2025-11-13 14:43:15 -0500
committers <[email protected]>2025-11-13 14:43:15 -0500
commit344a6f6415c3c1b593677adec3b8844e0839971b (patch)
treeb05291ecdf21917b27e9e234eeb997c2706966d5 /internal/formatter/sl.go
parenta5fc01a03753c9a18ddeaf13610dd99b4b311b80 (diff)
downloaddborg-344a6f6415c3c1b593677adec3b8844e0839971b.tar.gz
dborg-344a6f6415c3c1b593677adec3b8844e0839971b.zip
created pretty printing for all commandsv1.0.0
Diffstat (limited to 'internal/formatter/sl.go')
-rw-r--r--internal/formatter/sl.go125
1 files changed, 125 insertions, 0 deletions
diff --git a/internal/formatter/sl.go b/internal/formatter/sl.go
new file mode 100644
index 0000000..d7d293f
--- /dev/null
+++ b/internal/formatter/sl.go
@@ -0,0 +1,125 @@
+package formatter
+
+import (
+ "encoding/json"
+ "fmt"
+ "strings"
+
+ "git.db.org.ai/dborg/internal/models"
+)
+
+func FormatSLResults(resp *models.SLResponse, asJSON bool) (string, error) {
+ if asJSON {
+ data, err := json.MarshalIndent(resp.Results, "", " ")
+ if err != nil {
+ return "", fmt.Errorf("failed to marshal JSON: %w", err)
+ }
+ return string(data), nil
+ }
+
+ var sb strings.Builder
+
+ if resp.Results == nil {
+ sb.WriteString(fmt.Sprintf("\n%s\n\n", Gray("No results found")))
+ return sb.String(), nil
+ }
+
+ resultsMap, ok := resp.Results.(map[string]interface{})
+ if !ok {
+ resultsJSON, err := json.MarshalIndent(resp.Results, "", " ")
+ if err != nil {
+ return "", fmt.Errorf("failed to format results: %w", err)
+ }
+ return string(resultsJSON), nil
+ }
+
+ hits, ok := resultsMap["hits"].([]interface{})
+ if !ok || len(hits) == 0 {
+ sb.WriteString(fmt.Sprintf("\n%s\n\n", Gray("No results found")))
+ return sb.String(), nil
+ }
+
+ numHits, _ := resultsMap["num_hits"].(float64)
+ elapsed, _ := resultsMap["elapsed_time_micros"].(float64)
+
+ sb.WriteString(fmt.Sprintf("%s %s %s\n",
+ Cyan("Found"),
+ Bold(Yellow(fmt.Sprintf("%d", int(numHits)))),
+ Cyan(fmt.Sprintf("credentials (%.2fms)", elapsed/1000))))
+ sb.WriteString("\n")
+
+ for i, hit := range hits {
+ hitMap, ok := hit.(map[string]interface{})
+ if !ok {
+ continue
+ }
+
+ if i > 0 {
+ sb.WriteString(Dim("───"))
+ sb.WriteString("\n")
+ }
+
+ username, _ := hitMap["username"].(string)
+ password, _ := hitMap["password"].(string)
+ url, _ := hitMap["url"].(string)
+ filename, _ := hitMap["filename"].(string)
+
+ sb.WriteString(fmt.Sprintf("%s %s\n", Dim("Username:"), Bold(username)))
+
+ if password != "" {
+ sb.WriteString(fmt.Sprintf("%s %s\n", Dim("Password:"), Yellow(password)))
+ }
+
+ if url != "" {
+ sb.WriteString(fmt.Sprintf("%s %s\n", Dim("URL:"), Blue(url)))
+ }
+
+ if filename != "" {
+ sb.WriteString(fmt.Sprintf("%s %s\n", Dim("Source:"), Magenta(filename)))
+ }
+
+ sb.WriteString("\n")
+ }
+
+ if resp.Credits.Unlimited {
+ sb.WriteString(fmt.Sprintf("%s: %s\n", Dim("Credits"), Green("Unlimited")))
+ } else {
+ sb.WriteString(fmt.Sprintf("%s: %s\n", Dim("Credits Remaining"), FormatCredits(int64(resp.Credits.Remaining))))
+ }
+
+ return sb.String(), nil
+}
+
+func formatSLResultsData(sb *strings.Builder, data map[string]interface{}) {
+ sb.WriteString(fmt.Sprintf("%s\n", Bold("Stealer Log Entries:")))
+
+ for key, value := range data {
+ sb.WriteString(fmt.Sprintf("\n %s:\n", Cyan(key)))
+ if valueMap, ok := value.(map[string]interface{}); ok {
+ for k, v := range valueMap {
+ sb.WriteString(fmt.Sprintf(" %s %v\n", Dim(fmt.Sprintf("%s:", k)), v))
+ }
+ } else if valueArray, ok := value.([]interface{}); ok {
+ for i, item := range valueArray {
+ sb.WriteString(fmt.Sprintf(" %s %v\n", Dim(fmt.Sprintf("[%d]:", i)), item))
+ }
+ } else {
+ sb.WriteString(fmt.Sprintf(" %v\n", value))
+ }
+ }
+}
+
+func formatSLResultsArray(sb *strings.Builder, data []interface{}) {
+ sb.WriteString(fmt.Sprintf("%s\n", Bold("Stealer Log Entries:")))
+
+ for i, entry := range data {
+ sb.WriteString(fmt.Sprintf("\n %s:\n", Blue(fmt.Sprintf("Entry %d", i+1))))
+ if entryMap, ok := entry.(map[string]interface{}); ok {
+ for key, value := range entryMap {
+ sb.WriteString(fmt.Sprintf(" %s %v\n", Dim(fmt.Sprintf("%s:", key)), value))
+ }
+ } else {
+ sb.WriteString(fmt.Sprintf(" %v\n", entry))
+ }
+ }
+}