summaryrefslogtreecommitdiffstats
path: root/internal/formatter
diff options
context:
space:
mode:
authors <[email protected]>2025-12-20 02:45:32 -0500
committers <[email protected]>2025-12-20 02:45:32 -0500
commitbfd971bbc8d35685f18f4b9dd3a52f04f8b4f77f (patch)
tree2003679a51efaa7c1a43fe4f6da95530de8ce8aa /internal/formatter
parentc8ad5b9ef9fdc094c2cd974d6b9a65112089922b (diff)
downloaddborg-bfd971bbc8d35685f18f4b9dd3a52f04f8b4f77f.tar.gz
dborg-bfd971bbc8d35685f18f4b9dd3a52f04f8b4f77f.zip
feat: add moon logs search command and filename filter support for stealer logsv1.0.9
Diffstat (limited to 'internal/formatter')
-rw-r--r--internal/formatter/moon.go85
1 files changed, 85 insertions, 0 deletions
diff --git a/internal/formatter/moon.go b/internal/formatter/moon.go
new file mode 100644
index 0000000..e3930c7
--- /dev/null
+++ b/internal/formatter/moon.go
@@ -0,0 +1,85 @@
+package formatter
+
+import (
+ "encoding/json"
+ "fmt"
+ "strings"
+
+ "git.db.org.ai/dborg/internal/models"
+)
+
+func FormatMoonResults(resp *models.MoonResponse, 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("moon log entries (%.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")
+ }
+
+ return sb.String(), nil
+}