Skip to content

Commit

Permalink
Add elasticsearch to tui (#2915)
Browse files Browse the repository at this point in the history
Co-authored-by: mcastorina <[email protected]>
  • Loading branch information
hxnyk and mcastorina authored Jun 4, 2024
1 parent 96a1eda commit 3d7f9d9
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 0 deletions.
1 change: 1 addition & 0 deletions pkg/tui/pages/source_select/source_select.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ func New(c common.Common) *SourceSelect {
OssItem("Git", "Scan git repositories."),
OssItem("GitHub", "Scan GitHub repositories and/or organizations."),
OssItem("Filesystem", "Scan your filesystem by selecting what directories to scan."),
OssItem("Elasticsearch", "Scan your Elasticsearch cluster or Elastic Cloud instance."),
OssItem("Postman", "Scan a collection, workspace, or environment from Postman, the API platform."),
OssItem("GitLab", "Scan GitLab repositories."),
OssItem("AWS S3", "Scan Amazon S3 buckets."),
Expand Down
116 changes: 116 additions & 0 deletions pkg/tui/sources/elasticsearch/elasticsearch.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package elasticsearch

import (
"strings"

"github.com/trufflesecurity/trufflehog/v3/pkg/tui/common"
"github.com/trufflesecurity/trufflehog/v3/pkg/tui/components/textinputs"
)

type elasticSearchCmdModel struct {
textinputs.Model
}

func GetNote() string {
return "To connect to a local cluster, please provide the node IPs and either (username AND password) OR service token. ⭐\n⭐ To connect to a cloud cluster, please provide cloud ID AND API key."
}

func GetFields() elasticSearchCmdModel {
return elasticSearchCmdModel{textinputs.New([]textinputs.InputConfig{
{
Label: "Elastic node(s)",
Key: "nodes",
Required: false,
Help: "Elastic node IPs - for scanning local clusters. Separate by space if multiple.",
},
{
Label: "Username",
Key: "username",
Required: false,
Help: "Elasticsearch username. Pairs with password. For scanning local clusters.",
},
{
Label: "Password",
Key: "password",
Required: false,
Help: "Elasticsearch password. Pairs with username. For scanning local clusters.",
},
{
Label: "Service Token",
Key: "serviceToken",
Required: false,
Help: "Elastic service token. For scanning local clusters.",
},
{
Label: "Cloud ID",
Key: "cloudId",
Required: false,
Help: "Elastic cloud ID. Pairs with API key. For scanning cloud clusters.",
},
{
Label: "API Key",
Key: "apiKey",
Required: false,
Help: "Elastic API key. Pairs with cloud ID. For scanning cloud clusters.",
}})}
}

func findFirstNonEmptyKey(inputs map[string]textinputs.Input, keys []string) string {
for _, key := range keys {
if val, ok := inputs[key]; ok && val.Value != "" {
return key
}
}
return ""
}

func getConnectionKeys(inputs map[string]textinputs.Input) []string {
keys := []string{"username", "password", "serviceToken", "cloudId", "apiKey"}
key := findFirstNonEmptyKey(inputs, keys)

keyMap := map[string][]string{
"username": {"username", "password", "nodes"},
"password": {"username", "password", "nodes"},
"serviceToken": {"serviceToken", "nodes"},
"cloudId": {"cloudId", "apiKey"},
"apiKey": {"cloudId", "apiKey"},
}

if val, ok := keyMap[key]; ok {
return val
}

return nil
}

func (m elasticSearchCmdModel) Cmd() string {
var command []string
command = append(command, "trufflehog", "elasticsearch")
inputs := m.GetInputs()

for _, key := range getConnectionKeys(inputs) {
val, ok := inputs[key]
if !ok || val.Value == "" {
continue
}

if key == "nodes" {
nodes := strings.Fields(val.Value)
for _, node := range nodes {
command = append(command, "--nodes="+node)
}
} else {
command = append(command, "--"+key+"="+val.Value)
}
}

return strings.Join(command, " ")
}

func (m elasticSearchCmdModel) Summary() string {
inputs := m.GetInputs()
labels := m.GetLabels()

summaryKeys := getConnectionKeys(inputs)
return common.SummarizeSource(summaryKeys, inputs, labels)
}
5 changes: 5 additions & 0 deletions pkg/tui/sources/sources.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
tea "github.com/charmbracelet/bubbletea"
"github.com/trufflesecurity/trufflehog/v3/pkg/tui/sources/circleci"
"github.com/trufflesecurity/trufflehog/v3/pkg/tui/sources/docker"
"github.com/trufflesecurity/trufflehog/v3/pkg/tui/sources/elasticsearch"
"github.com/trufflesecurity/trufflehog/v3/pkg/tui/sources/filesystem"
"github.com/trufflesecurity/trufflehog/v3/pkg/tui/sources/gcs"
"github.com/trufflesecurity/trufflehog/v3/pkg/tui/sources/git"
Expand All @@ -23,6 +24,8 @@ func GetSourceNotes(sourceName string) string {
return github.GetNote()
case "postman":
return postman.GetNote()
case "elasticsearch":
return elasticsearch.GetNote()

default:
return ""
Expand All @@ -45,6 +48,8 @@ func GetSourceFields(sourceName string) CmdModel {
return circleci.GetFields()
case "docker":
return docker.GetFields()
case "elasticsearch":
return elasticsearch.GetFields()
case "filesystem":
return filesystem.GetFields()
case "gcs (google cloud storage)":
Expand Down

0 comments on commit 3d7f9d9

Please sign in to comment.