Skip to content

Commit

Permalink
Parse http headers as array of strings instead as string (#64)
Browse files Browse the repository at this point in the history
  • Loading branch information
hidde-jan authored Mar 15, 2024
1 parent e728839 commit 260b7eb
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 40 deletions.
6 changes: 4 additions & 2 deletions internal/capability/http/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,10 @@ func (httpCapability *HttpCapability) Execute(
return cacao.NewVariables(), err
}

for key, httpCapability := range command.Headers {
request.Header.Add(key, httpCapability)
for key, httpHeaders := range command.Headers {
for _, httpHeader := range httpHeaders {
request.Header.Add(key, httpHeader)
}
}
if target.ID != "" {
if err := verifyAuthInfoMatchesAgentTarget(&target, &authentication); err != nil {
Expand Down
18 changes: 9 additions & 9 deletions models/cacao/cacao.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,15 +155,15 @@ type ExtensionDefinition struct {
}

type Command struct {
Type string `bson:"type" json:"type" validate:"required"`
Command string `bson:"command" json:"command" validate:"required"`
Description string `bson:"description,omitempty" json:"description,omitempty"`
CommandB64 string `bson:"command_b64,omitempty" json:"command_b64,omitempty"`
Version string `bson:"version,omitempty" json:"version,omitempty"`
PlaybookActivity string `bson:"playbook_activity,omitempty" json:"playbook_activity,omitempty"`
Headers map[string]string `bson:"headers,omitempty" json:"headers,omitempty"`
Content string `bson:"content,omitempty" json:"content,omitempty"`
ContentB64 string `bson:"content_b64,omitempty" json:"content_b64,omitempty"`
Type string `bson:"type" json:"type" validate:"required"`
Command string `bson:"command" json:"command" validate:"required"`
Description string `bson:"description,omitempty" json:"description,omitempty"`
CommandB64 string `bson:"command_b64,omitempty" json:"command_b64,omitempty"`
Version string `bson:"version,omitempty" json:"version,omitempty"`
PlaybookActivity string `bson:"playbook_activity,omitempty" json:"playbook_activity,omitempty"`
Headers map[string][]string `bson:"headers,omitempty" json:"headers,omitempty"`
Content string `bson:"content,omitempty" json:"content,omitempty"`
ContentB64 string `bson:"content_b64,omitempty" json:"content_b64,omitempty"`
}

type Step struct {
Expand Down
6 changes: 3 additions & 3 deletions test/integration/capability/http/http_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func TestHttpConnection(t *testing.T) {
expectedCommand := cacao.Command{
Type: "http-api",
Command: "GET https://httpbin.org/",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}

var variable1 = cacao.Variable{
Expand Down Expand Up @@ -56,7 +56,7 @@ func TestHttpOAuth2(t *testing.T) {
expectedCommand := cacao.Command{
Type: "http-api",
Command: "GET https://httpbin.org/bearer",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}

var variable1 = cacao.Variable{
Expand Down Expand Up @@ -102,7 +102,7 @@ func TestHttpBasicAuth(t *testing.T) {
expectedCommand := cacao.Command{
Type: "http-api",
Command: "GET https://httpbin.org/hidden-basic-auth/username_test/password_test",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}

var variable1 = cacao.Variable{
Expand Down
2 changes: 1 addition & 1 deletion test/unittest/capability/openc2/openc2_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func TestOpenC2Request(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}

cacaoVariable := cacao.Variable{
Expand Down
46 changes: 23 additions & 23 deletions test/unittest/utils/http/http_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ func TestHttpGetConnection(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "GET / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Command: &command,
Expand Down Expand Up @@ -72,7 +72,7 @@ func TestHttpPostConnection(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Command: &command,
Expand All @@ -99,7 +99,7 @@ func TestHttpPutConnection(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "PUT / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Command: &command,
Expand All @@ -125,7 +125,7 @@ func TestHttpDeleteConnection(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "DELETE / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Command: &command,
Expand Down Expand Up @@ -153,7 +153,7 @@ func TestHttpStatus200(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "GET / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Command: &command,
Expand Down Expand Up @@ -186,7 +186,7 @@ func TestHttpBearerToken(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "GET / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Command: &command,
Expand Down Expand Up @@ -219,7 +219,7 @@ func TestHttpBasicAuth(t *testing.T) {

target := cacao.AgentTarget{
Address: map[cacao.NetAddressType][]string{
"url": []string{url},
"url": {url},
},
AuthInfoIdentifier: "d0c7e6a0-f7fe-464e-9935-e6b3443f5b91",
}
Expand All @@ -234,7 +234,7 @@ func TestHttpBasicAuth(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "GET / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Command: &command,
Expand Down Expand Up @@ -281,7 +281,7 @@ func TestHttpPostWithContentConnection(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
ContentB64: base64EncodedBody,
}
httpOptions := http.HttpOptions{
Expand Down Expand Up @@ -313,7 +313,7 @@ func TestHttpPathDnameParser(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST /url HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Target: &target,
Expand All @@ -335,7 +335,7 @@ func TestHttpPathDnamePortParser(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST /url HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Target: &target,
Expand All @@ -357,7 +357,7 @@ func TestHttpPathDnameRandomPortParser(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST /url HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Target: &target,
Expand All @@ -379,7 +379,7 @@ func TestHttpPathIpv4Parser(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Target: &target,
Expand All @@ -403,7 +403,7 @@ func TestHttpPathParser(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Target: &target,
Expand All @@ -427,7 +427,7 @@ func TestHttpPathBreakingParser(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST / HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Target: &target,
Expand All @@ -445,7 +445,7 @@ func TestMethodExtract(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST /api1/newObject HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
method, err := http.GetMethodFrom(&command)
if err != nil {
Expand All @@ -458,7 +458,7 @@ func TestPathExtract(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST /api1/newObject HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
path, err := http.GetPathFrom(&command)
if err != nil {
Expand All @@ -471,7 +471,7 @@ func TestVersionExtract(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST /api1/newObject HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
version, err := http.GetVersionFrom(&command)
if err != nil {
Expand All @@ -484,7 +484,7 @@ func TestCommandFailedExtract(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST /api1/newObject",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
version, err := http.GetVersionFrom(&command)
if err == nil {
Expand All @@ -501,7 +501,7 @@ func TestDnameWithInvalidPathParser(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST /url HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Target: &target,
Expand All @@ -523,7 +523,7 @@ func TestHttpPathIpv4WithRandomPort(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST /url HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Target: &target,
Expand All @@ -545,7 +545,7 @@ func TestInvalidDname(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST /url HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Target: &target,
Expand All @@ -568,7 +568,7 @@ func TestInvalidIpv4(t *testing.T) {
command := cacao.Command{
Type: "http-api",
Command: "POST /url HTTP/1.1",
Headers: map[string]string{"accept": "application/json"},
Headers: map[string][]string{"accept": {"application/json"}},
}
httpOptions := http.HttpOptions{
Target: &target,
Expand Down
6 changes: 4 additions & 2 deletions utils/http/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,10 @@ func verifyAuthInfoMatchesAgentTarget(
}

func (httpOptions *HttpOptions) addHeaderTo(request *http.Request) {
for header_key, header_value := range httpOptions.Command.Headers {
request.Header.Add(header_key, header_value)
for headerKey, headerValues := range httpOptions.Command.Headers {
for _, headerValue := range headerValues {
request.Header.Add(headerKey, headerValue)
}
}
}

Expand Down

0 comments on commit 260b7eb

Please sign in to comment.